db_insert.c
Go to the documentation of this file.00001
00011 #define _GNU_SOURCE
00012
00013 #include <stdio.h>
00014 #include <stdlib.h>
00015 #include <string.h>
00016 #include <errno.h>
00017
00018 #include "odb.h"
00019
00020
00021 static inline int add_node(odb_data_t * data, odb_key_t key, odb_value_t value)
00022 {
00023 odb_index_t new_node;
00024 odb_node_t * node;
00025 odb_index_t index;
00026
00027
00028
00029
00030
00031
00032 if (data->descr->current_size >= data->descr->size) {
00033 if (odb_grow_hashtable(data))
00034 return EINVAL;
00035 }
00036 new_node = data->descr->current_size;
00037
00038 node = &data->node_base[new_node];
00039 node->value = value;
00040 node->key = key;
00041
00042 index = odb_do_hash(data, key);
00043 node->next = data->hash_base[index];
00044 data->hash_base[index] = new_node;
00045
00046
00047 odb_commit_reservation(data);
00048
00049 return 0;
00050 }
00051
00052 int odb_update_node(odb_t * odb, odb_key_t key)
00053 {
00054 return odb_update_node_with_offset(odb, key, 1);
00055 }
00056
00057 int odb_update_node_with_offset(odb_t * odb,
00058 odb_key_t key,
00059 unsigned long int offset)
00060 {
00061 odb_index_t index;
00062 odb_node_t * node;
00063 odb_data_t * data;
00064
00065 data = odb->data;
00066 index = data->hash_base[odb_do_hash(data, key)];
00067 while (index) {
00068 node = &data->node_base[index];
00069 if (node->key == key) {
00070 if (node->value + offset != 0) {
00071 node->value += offset;
00072 } else {
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 }
00096 return 0;
00097 }
00098
00099 index = node->next;
00100 }
00101
00102 return add_node(data, key, offset);
00103 }
00104
00105
00106 int odb_add_node(odb_t * odb, odb_key_t key, odb_value_t value)
00107 {
00108 return add_node(odb->data, key, value);
00109 }