From 41dd937d41dd06a74965efdf1ef1423cefbb4617 Mon Sep 17 00:00:00 2001 From: teknomunk Date: Sat, 24 Dec 2022 08:51:47 -0600 Subject: [PATCH] Add hash index --- hash_index.c | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++ hash_index.h | 7 +++ 2 files changed, 156 insertions(+) create mode 100644 hash_index.c create mode 100644 hash_index.h diff --git a/hash_index.c b/hash_index.c new file mode 100644 index 0000000..54211c8 --- /dev/null +++ b/hash_index.c @@ -0,0 +1,149 @@ +#include "hash_index.h" + +// Submodules +#include "collections/array.h" +#include "json/json.h" +#include "json/layout.h" +#include "sha256/sha256.h" + +// Stdlib +#include + +struct hash_index_entry +{ + char* key; + int value; +}; + +extern struct json_field_type hash_index_entry_type; +static struct json_object_field hash_index_entry_layout[] = { + { "key", offsetof( struct hash_index_entry, key ), true, &json_field_string }, + { "val", offsetof( struct hash_index_entry, value ), true, &json_field_integer }, + { NULL, 0, true, NULL, &hash_index_entry_type }, +}; + +static void* alloc_hash_index_entry() +{ + void* ptr = malloc(sizeof(struct hash_index_entry)); + memset( ptr, 0, sizeof(struct hash_index_entry)); + return ptr; +} +static void free_hash_index_entry( void* ptr ) +{ + struct hash_index_entry* rie = ptr; + free(rie->key); + free(rie); +} + +static bool hie_reader( struct json_pull_parser* jpp, void* field_data, struct json_object_field* layout_field_data ) +{ + void* data = *(void**)field_data = malloc(sizeof(struct hash_index_entry)); + bool res = json_read_object_layout( jpp, hash_index_entry_layout, data ); + if( !res ) { + free( data ); + } + return res; +} +static bool hie_writer( struct json_writer* jw, const char* field_name, void* field_data, struct json_object_field* layout_field_data ) +{ + json_write_field_name(jw,field_name); + json_write_pretty_object_layout( jw, hash_index_entry_layout, *(void**)field_data ); + return true; +} + +struct json_field_type hash_index_entry_type = { + .reader = hie_reader, + .writer = hie_writer, + .size = sizeof(void*), + .layout = hash_index_entry_layout, + .alloc = alloc_hash_index_entry, + .free = free_hash_index_entry, +}; + +struct hash_index +{ + struct { + struct hash_index_entry** items; + int count; + } entries; +}; + + static struct json_object_field hash_index_layout[] = { + { "entries", offsetof( struct hash_index, entries ), true, &json_field_array_of, &hash_index_entry_type }, + { NULL }, + }; +bool hash_index_set( const char* index, const char* key, int value ) +{ + char hash[65] = ""; + sha256_easy_hash_hex( key, strlen(key), hash ); + hash[5] = '\0'; + + char filename[512]; + snprintf( filename, 512, "%s/%s.json", index, hash ); + + struct hash_index hi; + memset( &hi, 0, sizeof(hi) ); + json_read_object_layout_from_file( filename, hash_index_layout, &hi ); + + struct hash_index_entry new_entry = { + .key = (char*)key, + .value = value, + }; + struct hash_index_entry* ptr = &new_entry; + + /* + for( int i = 0; i < ari.entries.count; ++i ) { + struct reverse_index_entry* entry = ari.entries.items[i]; + printf( "\tentry[%d] = { .uri = %s, .account_id = %d }\n", i, entry->uri, entry->account_id ); + } + //*/ + + array_append( &hi.entries, sizeof(struct hash_index_entry), &ptr ); + + json_write_object_layout_to_file( filename, "\t", hash_index_layout, &hi ); + + for( int i = 0; i < hi.entries.count-1; ++i ) { + struct hash_index_entry* entry = hi.entries.items[i]; + free(entry->key); + free(entry); + } +} + +bool hash_index_get( const char* index, const char* key, int* value ) +{ + char hash[65] = ""; + sha256_easy_hash_hex( key, strlen(key), hash ); + hash[5] = '\0'; + + char filename[512]; + snprintf( filename, 512, "%s/%s.json", index, hash ); + + struct hash_index hi; + memset( &hi, 0, sizeof(hi) ); + if( !json_read_object_layout_from_file( filename, hash_index_layout, &hi ) ) { + return -1; + } + + /* + for( int i = 0; i < ari.entries.count; ++i ) { + struct reverse_index_entry* entry = ari.entries.items[i]; + printf( "\tentry[%d] = %p{ .uri = %s, .account_id = %d }\n", i, entry, entry->uri, entry->account_id ); + } + //*/ + + bool found = false; + *value = -1; + for( int i = 0; i < hi.entries.count; ++i ) { + struct hash_index_entry* entry = hi.entries.items[i]; + if( 0 == strcmp(entry->key,key) ) { + *value = entry->value; + found = true; + } + free(entry->key); + free(entry); + } + free(hi.entries.items); + + return found; +} + diff --git a/hash_index.h b/hash_index.h new file mode 100644 index 0000000..24f0ab0 --- /dev/null +++ b/hash_index.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +bool hash_index_set( const char* index, const char* key, int value ); +bool hash_index_get( const char* index, const char* key, int* value ); +