This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
stellar-stellar/infra/exdata/exdata.c
2024-09-14 17:41:23 +08:00

154 lines
4.2 KiB
C

#include "stellar/utils.h"
#include "exdata_internal.h"
/*******************************
* STELLAR EXDATA SCHEMA API*
*******************************/
struct exdata_schema *exdata_schema_new()
{
struct exdata_schema *s = CALLOC(struct exdata_schema, 1);
return s;
}
void exdata_schema_free(struct exdata_schema *s)
{
if(s==NULL)return;
if(s->exdata_meta_array)
{
utarray_free(s->exdata_meta_array);
}
FREE(s);
}
int exdata_schema_get_idx_by_name(struct exdata_schema *schema, const char *name)
{
if(schema==NULL || schema->exdata_meta_array == NULL || name == NULL)return -1;
unsigned int len = utarray_len(schema->exdata_meta_array);
struct exdata_meta *t_schema;
for(unsigned int i = 0; i < len; i++)
{
t_schema = (struct exdata_meta *)utarray_eltptr(schema->exdata_meta_array, i);
if(strcmp(t_schema->name, name) == 0)
{
return t_schema->idx;
}
}
return -1;
}
static void stellar_exdata_met_copy(void *_dst, const void *_src)
{
struct exdata_meta *dst = (struct exdata_meta *)_dst, *src = (struct exdata_meta *)_src;
dst->free_func = src->free_func;
dst->free_arg = src->free_arg;
dst->idx = src->idx;
dst->name = src->name ? strdup(src->name) : NULL;
}
static void stellar_exdata_met_dtor(void *_elt)
{
struct exdata_meta *elt = (struct exdata_meta *)_elt;
if (elt->name)
FREE(elt->name);
}
UT_icd stellar_exdata_meta_icd = {sizeof(struct exdata_meta), NULL, stellar_exdata_met_copy, stellar_exdata_met_dtor};
int exdata_schema_new_index(struct exdata_schema *s, const char *name, exdata_free *free_func,void *free_arg)
{
if(s==NULL || name==NULL)return -1;
if(s->exdata_meta_array == NULL)
{
utarray_new(s->exdata_meta_array, &stellar_exdata_meta_icd);
}
if(s->exdata_meta_array == NULL)return -1;
unsigned int len = utarray_len(s->exdata_meta_array);
struct exdata_meta *t_schema;
for(unsigned int i = 0; i < len; i++)
{
t_schema = (struct exdata_meta *)utarray_eltptr(s->exdata_meta_array, i);
if(strcmp(t_schema->name, name) == 0)
{
t_schema->free_func=free_func;
t_schema->free_arg=free_arg;
return t_schema->idx;
}
}
struct exdata_meta new_schema;
memset(&new_schema, 0, sizeof(struct exdata_schema));
new_schema.free_func=free_func;
new_schema.name=(char *)name;
new_schema.idx=len;
new_schema.free_arg=free_arg;
utarray_push_back(s->exdata_meta_array, &new_schema);
return new_schema.idx;
}
/*******************************
* STELLAR EXDATA HANDLE API *
*******************************/
struct exdata_runtime *exdata_runtime_new(struct exdata_schema *s)
{
if(s==NULL || s->exdata_meta_array==NULL)return NULL;
struct exdata_runtime *h = CALLOC(struct exdata_runtime, 1);
h->schema=s;
unsigned int len = utarray_len(s->exdata_meta_array);
if(len > 0)
{
h->exdata_array=CALLOC(struct exdata, len);
}
return h;
}
void exdata_runtime_reset(struct exdata_runtime *h)
{
if(h==NULL||h->schema==NULL||h->exdata_array==NULL)return;
unsigned int len=utarray_len(h->schema->exdata_meta_array);
for (unsigned int i = 0; i < len; i++)
{
void *exdata = (h->exdata_array + i)->exdata;
(h->exdata_array + i)->state=EXIT;
struct exdata_meta *schema = (struct exdata_meta *)utarray_eltptr(h->schema->exdata_meta_array, i);
if (exdata)
{
if (schema->free_func)
{
schema->free_func(i, exdata, schema->free_arg);
(h->exdata_array + i)->exdata=NULL;
}
}
(h->exdata_array + i)->state=INIT;
}
return;
}
void exdata_runtime_free(struct exdata_runtime *h)
{
if(h==NULL)return;
exdata_runtime_reset(h);
if(h->exdata_array)FREE(h->exdata_array);
FREE(h);
}
int exdata_set(struct exdata_runtime *h, int idx, void *ex_ptr)
{
if(h==NULL || h->schema == NULL|| h->exdata_array == NULL || idx<0)return -1;
unsigned int len=utarray_len(h->schema->exdata_meta_array);
if(len < (unsigned int)idx)return -1;
if((h->exdata_array+idx)->state == EXIT)return -1;
(h->exdata_array+idx)->exdata=ex_ptr;
return 0;
}
void *exdata_get(struct exdata_runtime *h, int idx)
{
if(h==NULL || h->schema == NULL|| h->exdata_array == NULL)return NULL;
unsigned int len = utarray_len(h->schema->exdata_meta_array);
if(len < (unsigned int)idx)return NULL;
if((h->exdata_array+idx)->state == EXIT)return NULL;
return (h->exdata_array+idx)->exdata;
}