linear_hash_handler.c
Go to the documentation of this file.
1 /******************************************************************************/
35 /******************************************************************************/
36 
37 #include "linear_hash_handler.h"
38 
39 void
42 ) {
44  handler->get = linear_hash_dict_get;
50  /* handler->find = linear_hash_dict_find; */
53 }
54 
58  ion_key_t key,
59  ion_value_t value
60 ) {
61  return linear_hash_insert(key, value, insert_hash_to_bucket(key, (linear_hash_table_t *) dictionary->instance), (linear_hash_table_t *) dictionary->instance);
62 }
63 
67  ion_key_t key,
68  ion_value_t value
69 ) {
70  return linear_hash_get(key, value, (linear_hash_table_t *) dictionary->instance);
71 }
72 
76  ion_key_t key,
77  ion_value_t value
78 ) {
79  return linear_hash_update(key, value, (linear_hash_table_t *) dictionary->instance);
80 }
81 
85  ion_key_type_t key_type,
86  ion_key_size_t key_size,
87  ion_value_size_t value_size,
88  ion_dictionary_size_t dictionary_size,
90  ion_dictionary_handler_t *handler,
92 ) {
93  int initial_size, split_threshold, records_per_bucket;
94 
95  dictionary->instance = malloc(sizeof(linear_hash_table_t));
96 
97  if (NULL == dictionary->instance) {
98  return err_out_of_memory;
99  }
100 
101  dictionary->instance->compare = compare;
102 
103  initial_size = 4;
104  split_threshold = 85;
105  records_per_bucket = 4;
106 
107  /* TODO Should we handle the possible error code returned by this? If yes, what sorts of errors does it return? */
108  ion_err_t result = linear_hash_init(id, dictionary_size, key_type, key_size, value_size, initial_size, split_threshold, records_per_bucket, (linear_hash_table_t *) dictionary->instance);
109 
110  if ((err_ok == result) && (NULL != handler)) {
111  dictionary->handler = handler;
113  }
114 
115  return result;
116 }
117 
121  ion_key_t key
122 ) {
123  return linear_hash_delete(key, (linear_hash_table_t *) dictionary->instance);
124 }
125 
126 ion_err_t
129 ) {
130  char filename[ION_MAX_FILENAME_LENGTH];
131 
132  dictionary_get_filename(id, "lhs", filename);
133 
134  if (0 != fremove(filename)) {
135  return err_file_delete_error;
136  }
137 
138  dictionary_get_filename(id, "lhd", filename);
139 
140  if (0 != fremove(filename)) {
141  return err_file_delete_error;
142  }
143 
144  return err_ok;
145 }
146 
147 ion_err_t
150 ) {
151  ion_err_t result = linear_hash_destroy((linear_hash_table_t *) dictionary->instance);
152 
153  free(dictionary->instance);
154  dictionary->instance = NULL;
155  return result;
156 }
157 
158 ion_err_t
160  ion_dictionary_handler_t *handler,
164 ) {
165  return linear_hash_create_dictionary(config->id, config->type, config->key_size, config->value_size, config->dictionary_size, compare, handler, dictionary);
166 }
167 
168 ion_err_t
171 ) {
173 
174  if (dictionary->instance != NULL) {
175  free(dictionary->instance);
176  dictionary->instance = NULL;
177  }
178 
179  if (err_ok != err) {
180  return err;
181  }
182 
183  return err_ok;
184 }
185 
189 ) {
191 
192  UNUSED(dictionary);
193  status.error = err_not_implemented;
194  return status;
195 }
ion_status_t linear_hash_get(ion_byte_t *key, ion_byte_t *value, linear_hash_table_t *linear_hash)
Retrieve a record from the linear hash. The key and value will be written to the key and value pointe...
Definition: linear_hash.c:673
ion_err_t linear_hash_destroy(linear_hash_table_t *linear_hash)
Close a linear hash instance and delete its associated .lhs and .lhd files.
Definition: linear_hash.c:1507
ion_status_t(* insert)(ion_dictionary_t *, ion_key_t, ion_value_t)
enum ION_KEY_TYPE ion_key_type_t
This is the available key types for ION_DB. All types will be based on system defines.
ion_err_t linear_hash_open_dictionary(ion_dictionary_handler_t *handler, ion_dictionary_t *dictionary, ion_dictionary_config_info_t *config, ion_dictionary_compare_t compare)
int ion_value_size_t
The size (length) of a dictionary value in bytes.
Definition: kv_system.h:256
void linear_hash_dict_init(ion_dictionary_handler_t *handler)
Registers a linear hash handler to a dictionary instance.
ion_dictionary_handler_t * handler
ion_status_t linear_hash_dict_update(ion_dictionary_t *dictionary, ion_key_t key, ion_value_t value)
Updates the value stored at a given key.
ion_dictionary_parent_t * instance
ion_status_t(* remove)(ion_dictionary_t *, ion_key_t)
ion_err_t(* destroy_dictionary)(ion_dictionary_id_t id)
unsigned int ion_dictionary_id_t
A type used to identify dictionaries, specifically in the master table.
unsigned int ion_dictionary_size_t
The implementation specific size of the dictionary.
Definition: kv_system.h:264
ion_status_t linear_hash_dict_insert(ion_dictionary_t *dictionary, ion_key_t key, ion_value_t value)
Inserts a key and value pair into the dictionary.
Struct containing details for opening a dictionary previously created.
ion_err_t linear_hash_close(linear_hash_table_t *linear_hash)
Close a linear hash instance with proper resource clean-up.
Definition: linear_hash.c:1466
ion_status_t linear_hash_dict_get(ion_dictionary_t *dictionary, ion_key_t key, ion_value_t value)
int insert_hash_to_bucket(ion_byte_t *key, linear_hash_table_t *linear_hash)
Map a key to the address space of the linear hash. Used to map records to buckets with an index less ...
Definition: linear_hash.c:1358
ion_status_t linear_hash_update(ion_key_t key, ion_value_t value, linear_hash_table_t *linear_hash)
Update the value of the first record matching the key specified in the linear hash.
Definition: linear_hash.c:774
#define key(k)
Definition: bpp_tree.c:75
ion_err_t error
Definition: kv_system.h:291
#define fremove(x)
Definition: kv_system.h:56
char(* ion_dictionary_compare_t)(ion_key_t, ion_key_t, ion_key_size_t)
Function pointer type for dictionary comparison methods.
char ion_err_t
The error type used to store error codes.
Definition: kv_system.h:226
int dictionary_get_filename(ion_dictionary_id_t id, char *ext, char *filename)
Given the ID, implementation specific extension, and a buffer to write to, writes back the formatted ...
Definition: dictionary.c:41
void * ion_key_t
A dictionary key.
Definition: kv_system.h:241
ion_status_t(* update)(ion_dictionary_t *, ion_key_t, ion_value_t)
void * ion_value_t
A dictionary value.
Definition: kv_system.h:246
ion_err_t linear_hash_close_dictionary(ion_dictionary_t *dictionary)
A dictionary contains information regarding an instance of the storage element and the associated han...
ion_err_t linear_hash_create_dictionary(ion_dictionary_id_t id, ion_key_type_t key_type, ion_key_size_t key_size, ion_value_size_t value_size, ion_dictionary_size_t dictionary_size, ion_dictionary_compare_t compare, ion_dictionary_handler_t *handler, ion_dictionary_t *dictionary)
Creates an instance of a dictionary.
ion_err_t linear_hash_delete_dictionary(ion_dictionary_t *dictionary)
Deletes an instance of a dictionary and its associated data.
ion_err_t linear_hash_init(ion_dictionary_id_t id, ion_dictionary_size_t dictionary_size, ion_key_type_t key_type, ion_key_size_t key_size, ion_value_size_t value_size, int initial_size, int split_threshold, int records_per_bucket, linear_hash_table_t *linear_hash)
Definition: linear_hash.c:47
ion_err_t(* close_dictionary)(ion_dictionary_t *)
#define ION_MAX_FILENAME_LENGTH
Since the arduino conforms to 8.3 syntax, that's 8 + 3 = 11 + 1 (null terminator) characters...
Definition: kv_system.h:73
ion_err_t(* open_dictionary)(ion_dictionary_handler_t *, ion_dictionary_t *, ion_dictionary_config_info_t *, ion_dictionary_compare_t)
ion_err_t(* create_dictionary)(ion_dictionary_id_t, ion_key_type_t, ion_key_size_t, ion_value_size_t, ion_dictionary_size_t, ion_dictionary_compare_t, ion_dictionary_handler_t *, ion_dictionary_t *)
ion_err_t(* delete_dictionary)(ion_dictionary_t *)
ion_status_t linear_hash_delete(ion_byte_t *key, linear_hash_table_t *linear_hash)
Delete all records with keys matching the key specified in the linear hash.
Definition: linear_hash.c:867
ion_status_t linear_hash_dict_find(ion_dictionary_t *dictionary)
ion_dictionary_type_t type
#define UNUSED(x)
Definition: kv_system.h:102
ion_dictionary_compare_t compare
ion_err_t linear_hash_destroy_dictionary(ion_dictionary_id_t id)
Cleans up all files created by the dictionary, and frees any allocated memory, for an already closed ...
ion_dictionary_size_t dictionary_size
Header for handler for a linear hash .
int ion_key_size_t
The size (length) of a dictionary key in bytes.
Definition: kv_system.h:251
ion_status_t linear_hash_insert(ion_key_t key, ion_value_t value, int hash_bucket_idx, linear_hash_table_t *linear_hash)
Insert a record into the linear hash.
Definition: linear_hash.c:573
ion_status_t linear_hash_dict_delete(ion_dictionary_t *dictionary, ion_key_t key)
Deletes the key and associated value from the given dictionary instance.
ion_status_t(* get)(ion_dictionary_t *, ion_key_t, ion_value_t)
#define ION_STATUS_INITIALIZE
Definition: kv_system.h:107
A dictionary_handler is responsible for dealing with the specific interface for an underlying diction...
A status object that describes the result of a dictionary operation.
Definition: kv_system.h:290