actube/src/cw/cw_kvstore_add.c

39 lines
834 B
C

#include "kvstore.h"
#include "cw_types.h"
#include "cw.h"
#include "log.h"
const char * cw_kvstore_add(mavl_t kvstore, const char *key, const struct cw_Type *type,
const uint8_t * data, int len)
{
mavldata_t mdata, *mresult;
mdata.kv.key=cw_strdup(key);
if (!mdata.kv.key){
cw_log(LOG_ERR, "Can't allocate memory for key %s: %s",
key,strerror(errno));
return NULL;
}
mresult = type->get(&mdata,data,len);
if (!mresult){
cw_log(LOG_ERR, "Can't create kvstore element for key %s of type %s: %s",
key,type->name, strerror(errno));
free(mdata.kv.key);
return NULL;
}
mresult = mavl_add(kvstore, &mdata);
if (mresult != &mdata){
cw_log(LOG_ERR, "Element already exists %s", key);
/* element already exists */
free(mdata.kv.key);
type->del(mresult);
return key;
}
return mdata.kv.key;
}