diff --git a/src/modb_types.c b/src/modb_types.c index afc175a..b7758b7 100644 --- a/src/modb_types.c +++ b/src/modb_types.c @@ -138,4 +138,178 @@ void freeGroups(struct group_t ***groups_ptr, size_t n_groups) free(groups); *groups_ptr = 0; } + + +struct metadata_t *allocMetadata(void) +{ + struct metadata_t *metadata; + + metadata = malloc(sizeof(struct metadata_t)); + if (metadata == 0) { + fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno)); + } + memset(metadata, 0, sizeof(struct metadata_t)); + + return metadata; +} +struct metadata_t **allocMetadataList(size_t n_metadatas) +{ + struct metadata_t **metadatas; + + metadatas = (struct metadata_t **)malloc(sizeof(struct metadata_t *) * n_metadatas); + if (metadatas == 0) { + fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno)); + return 0; + } + memset(metadatas, 0, sizeof(struct metadata_t *) * n_metadatas); + + return metadatas; +} +void freeMetadata(struct metadata_t **metadata_ptr) +{ + struct metadata_t *metadata = *metadata_ptr; + + if (metadata->ext != 0) { + freeMetadataExt(&metadata->ext); + } + + if (metadata->object != 0) { + freeObject(&metadata->object); + } + + if (metadata->n_groups > 0) { + if (metadata->group_ids != 0) { + free(metadata->group_ids); + metadata->group_ids = 0; + } + if (metadata->groups != 0) { + freeGroups(&metadata->groups, metadata->n_groups); + } + metadata->n_groups = 0; + } + + if (metadata->owner != 0) { + freeUser(&metadata->owner); + } + + if (metadata->title != 0) { + free(metadata->title); + metadata->title = 0; + } + + free(metadata); + *metadata_ptr = 0; +} +void freeMetadataList(struct metadata_t ***metadata_list_ptr, size_t n_metadatas) +{ + size_t idx; + struct metadata_t **metadatas_list= *metadata_list_ptr; + + for (idx = 0; idx < n_metadatas; idx++) { + if (*(metadatas_list + idx) != 0) { + freeMetadata((metadatas_list + idx)); + } + } + + free(metadatas_list); + *metadata_list_ptr = 0; +} + +struct object_t *allocObject(void) +{ + struct object_t *object; + + object = malloc(sizeof(struct object_t)); + if (object == 0) { + fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno)); + } + memset(object, 0, sizeof(struct object_t)); + + return object; +} +struct object_t **allocObjects(size_t n_objects) +{ + struct object_t **objects; + + objects = (struct object_t **)malloc(sizeof(struct object_t *) * n_objects); + if (objects == 0) { + fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno)); + return 0; + } + memset(objects, 0, sizeof(struct object_t *) * n_objects); + + return objects; +} +void freeObject(struct object_t **object_ptr) +{ + struct object_t *object = *object_ptr; + + if (object->data != 0) { + free(object->data); + object->data = 0; + } + + free(object); + *object_ptr = 0; +} +void freeObjects(struct object_t ***objects_ptr, size_t n_objects) +{ + size_t idx; + struct object_t **objects = *objects_ptr; + + for (idx = 0; idx < n_objects; idx++) { + if (*(objects + idx) != 0) { + freeObject(objects + idx); + } + } + + free(objects); + *objects_ptr = 0; +} + +struct metadata_ext_t *allocMetadataExt(void) +{ + struct metadata_ext_t *metadata_ext; + + metadata_ext = malloc(sizeof(struct metadata_ext_t)); + if (metadata_ext == 0) { + fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno)); + } + memset(metadata_ext, 0, sizeof(struct metadata_ext_t)); + + return metadata_ext; +} +struct metadata_ext_t **allocMetadataExts(size_t n_metadata_exts) +{ + struct metadata_ext_t **metadata_exts; + + metadata_exts = (struct metadata_ext_t **)malloc(sizeof(struct metadata_ext_t *) * n_metadata_exts); + if (metadata_exts == 0) { + fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno)); + return 0; + } + memset(metadata_exts, 0, sizeof(struct metadata_ext_t *) * n_metadata_exts); + + return metadata_exts; +} +void freeMetadataExt(struct metadata_ext_t **metadata_ext_ptr) +{ + struct metadata_ext_t *metadata_ext = *metadata_ext_ptr; + + free(metadata_ext); + *metadata_ext_ptr = 0; +} +void freeMetadataExts(struct metadata_ext_t ***metadata_exts_ptr, size_t n_metadata_exts) +{ + size_t idx; + struct metadata_ext_t **metadata_exts = *metadata_exts_ptr; + + for (idx = 0; idx < n_metadata_exts; idx++) { + if (*(metadata_exts + idx) != 0) { + freeMetadataExt(metadata_exts + idx); + } + } + + free(metadata_exts); + *metadata_exts_ptr = 0; } diff --git a/src/modb_types.h b/src/modb_types.h index e9214b2..5eb4dc4 100644 --- a/src/modb_types.h +++ b/src/modb_types.h @@ -43,16 +43,95 @@ struct group_t { size_t n_members; }; +struct metadata_t { + unsigned int id; + + char *type; + size_t type_len; + + char *title; + size_t title_len; + + unsigned int owner_id; + struct user_t *owner; + + int64_t created_on; + int64_t updated_on; + int64_t deleted_on; + + unsigned int *group_ids; + struct group_t **groups; + size_t n_groups; + + struct object_t *object; + struct metadata_ext_t *ext; +}; + +struct object_t { + unsigned int id; + + char *data; + size_t data_len; +}; + +struct metadata_ext_t { + unsigned int id; + +// TODO: dynamic extended metadata definition +// struct metadata_ext_value_t **meta_ext; +// size_t n_meta_ext; +}; + +//struct metadata_ext_value_t { +// char *key; +// enum e_column_type_t type; +// union { +// void *vptr;_ptr + +// int8_t int8; +// uint8_t uint8; + +// int16_t int16; +// uint16_t uint16; + +// int32_t int32; +// uint32_t uint32; + +// int64_t int64; +// uint64_t uint64; + +// float flt; +// double dbl; + +// char *ptr_str; +// } value; +// size_t value_len; +//}; struct user_t *allocUser(void); struct user_t **allocUsers(size_t n_users); void freeUser(struct user_t **user); -void freeUsers(struct user_t **users, size_t n_users); +void freeUsers(struct user_t ***users_ptr, size_t n_users); struct group_t *allocGroup(void); struct group_t **allocGroups(size_t n_groups); void freeGroup(struct group_t **group); -void freeGroups(struct group_t **groups, size_t n_groups); +void freeGroups(struct group_t ***groups_ptr, size_t n_groups); + +struct metadata_t *allocMetadata(void); +struct metadata_t **allocMetadataList(size_t n_metadatas); +void freeMetadata(struct metadata_t **metadata); +void freeMetadataList(struct metadata_t ***metadata_list_ptr, size_t n_metadatas); + +struct object_t *allocObject(void); +struct object_t **allocObjects(size_t n_objects); +void freeObject(struct object_t **object); +void freeObjects(struct object_t ***objects_ptr, size_t n_objects); + +struct metadata_ext_t *allocMetadataExt(void); +struct metadata_ext_t **allocMetadataExts(size_t n_metadata_exts); +void freeMetadataExt(struct metadata_ext_t **metadata_ext); +void freeMetadataExts(struct metadata_ext_t ***metadata_exts_ptr, size_t n_metadata_exts); #endif // H__MODB_TYPES__