192 lines
3.3 KiB
C
192 lines
3.3 KiB
C
|
|
|
|
#include "kvstore.h"
|
|
#include "kvs_rw_tools.h"
|
|
#include <arpa/inet.h>
|
|
|
|
|
|
// singleton
|
|
|
|
kvs_array_t global_array = {0};
|
|
|
|
int kvs_array_create(kvs_array_t *inst) {
|
|
|
|
if (!inst) return -1;
|
|
if (inst->table) {
|
|
printf("table has alloc\n");
|
|
return -1;
|
|
}
|
|
inst->table = kvs_malloc(KVS_ARRAY_SIZE * sizeof(kvs_array_item_t));
|
|
if (!inst->table) {
|
|
return -1;
|
|
}
|
|
|
|
memset(inst->table, 0, (size_t)KVS_ARRAY_SIZE * sizeof(kvs_array_item_t));
|
|
inst->total = 0;
|
|
|
|
return 0;
|
|
}
|
|
|
|
void kvs_array_destroy(kvs_array_t *inst) {
|
|
|
|
if (!inst) return ;
|
|
|
|
if (inst->table) {
|
|
kvs_free(inst->table);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
* @return: <0, error; =0, success; >0, exist
|
|
*/
|
|
|
|
int kvs_array_set(kvs_array_t *inst, char *key, char *value) {
|
|
|
|
if (inst == NULL || key == NULL || value == NULL) return -1;
|
|
if (inst->total == KVS_ARRAY_SIZE) return -1;
|
|
|
|
char *str = kvs_array_get(inst, key);
|
|
if (str) {
|
|
return 1; //
|
|
}
|
|
|
|
char *kcopy = kvs_malloc(strlen(key) + 1);
|
|
if (kcopy == NULL) return -2;
|
|
memset(kcopy, 0, strlen(key) + 1);
|
|
strncpy(kcopy, key, strlen(key));
|
|
|
|
char *kvalue = kvs_malloc(strlen(value) + 1);
|
|
if (kvalue == NULL) return -2;
|
|
memset(kvalue, 0, strlen(value) + 1);
|
|
strncpy(kvalue, value, strlen(value));
|
|
|
|
int i = 0;
|
|
for (i = 0;i < inst->total;i ++) {
|
|
if (inst->table[i].key == NULL) {
|
|
|
|
inst->table[i].key = kcopy;
|
|
inst->table[i].value = kvalue;
|
|
inst->total ++;
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
if (i == inst->total && i < KVS_ARRAY_SIZE) {
|
|
|
|
inst->table[i].key = kcopy;
|
|
inst->table[i].value = kvalue;
|
|
inst->total ++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
char* kvs_array_get(kvs_array_t *inst, char *key) {
|
|
|
|
if (inst == NULL || key == NULL) return NULL;
|
|
|
|
int i = 0;
|
|
for (i = 0;i < inst->total;i ++) {
|
|
if (inst->table[i].key == NULL) {
|
|
continue;
|
|
}
|
|
|
|
if (strcmp(inst->table[i].key, key) == 0) {
|
|
return inst->table[i].value;
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
/*
|
|
* @return < 0, error; =0, success; >0, no exist
|
|
*/
|
|
|
|
int kvs_array_del(kvs_array_t *inst, char *key) {
|
|
|
|
if (inst == NULL || key == NULL) return -1;
|
|
|
|
int i = 0;
|
|
for (i = 0;i < inst->total;i ++) {
|
|
|
|
if (strcmp(inst->table[i].key, key) == 0) {
|
|
|
|
kvs_free(inst->table[i].key);
|
|
inst->table[i].key = NULL;
|
|
|
|
kvs_free(inst->table[i].value);
|
|
inst->table[i].value = NULL;
|
|
// error: > 1024
|
|
if (inst->total-1 == i) {
|
|
inst->total --;
|
|
}
|
|
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
|
|
/*
|
|
* @return : < 0, error; =0, success; >0, no exist
|
|
*/
|
|
|
|
int kvs_array_mod(kvs_array_t *inst, char *key, char *value) {
|
|
|
|
if (inst == NULL || key == NULL || value == NULL) return -1;
|
|
// error: > 1024
|
|
if (inst->total == 0) {
|
|
return KVS_ARRAY_SIZE;
|
|
}
|
|
|
|
|
|
int i = 0;
|
|
for (i = 0;i < inst->total;i ++) {
|
|
|
|
if (inst->table[i].key == NULL) {
|
|
continue;
|
|
}
|
|
|
|
if (strcmp(inst->table[i].key, key) == 0) {
|
|
|
|
kvs_free(inst->table[i].value);
|
|
|
|
char *kvalue = kvs_malloc(strlen(value) + 1);
|
|
if (kvalue == NULL) return -2;
|
|
memset(kvalue, 0, strlen(value) + 1);
|
|
strncpy(kvalue, value, strlen(value));
|
|
|
|
inst->table[i].value = kvalue;
|
|
|
|
return 0;
|
|
}
|
|
|
|
}
|
|
|
|
return i;
|
|
}
|
|
|
|
|
|
/*
|
|
* @return 0: exist, 1: no exist
|
|
*/
|
|
int kvs_array_exist(kvs_array_t *inst, char *key) {
|
|
|
|
if (!inst || !key) return -1;
|
|
|
|
char *str = kvs_array_get(inst, key);
|
|
if (!str) {
|
|
return 1; //
|
|
}
|
|
return 0;
|
|
}
|