void cparse_list_prepend(cParseList *list, void *element) { cParseListNode *node = malloc(sizeof(cParseListNode)); if (node == NULL) { cparse_log_errno(ENOMEM); return; } node->data = malloc(list->node_size); if (node->data == NULL) { cparse_log_errno(ENOMEM); return; } memcpy(node->data, element, list->node_size); node->next = list->head; list->head = node; if (!list->tail) { list->tail = list->head; } list->length++; }
void cparse_list_append(cParseList *list, void *element) { cParseListNode *node; if (list == NULL || element == NULL) { cparse_log_errno(EINVAL); return; } node = malloc(sizeof(cParseListNode)); if (node == NULL) { cparse_log_errno(ENOMEM); return; } node->data = malloc(list->node_size); if (node->data == NULL) { cparse_log_errno(ENOMEM); return; } memcpy(node->data, element, list->node_size); if (list->tail == NULL) { list->head = list->tail = node; } else { list->tail->next = node; list->tail = node; } list->length++; }
cParseQueryBuilder *cparse_query_build_related_to(cParseQueryBuilder *query, const char *key, cParseObject *obj) { cParseJson *inner = NULL; cParseJson *pointer = NULL; if (query == NULL || obj == NULL) { cparse_log_errno(EINVAL); return NULL; } inner = cparse_json_new(); if (inner == NULL) { return query; } pointer = cparse_pointer_from_object(obj); cparse_json_set(inner, "object", pointer); cparse_json_set_string(inner, "key", key); cparse_json_set(query->json, CPARSE_QUERY_RELATED_TO, inner); return query; }
cParseListNode *cparse_list_head(cParseList *list) { if (list == NULL) { cparse_log_errno(EINVAL); return NULL; } return list->head; }
void cparse_role_add_role(cParseRole *role, cParseRole *other) { if (!role || !other) { cparse_log_errno(EINVAL); return; } __cparse_role_add_dependency(role, CPARSE_ROLES_PATH, other); }
cParseListNode *cparse_list_tail(cParseList *list) { if (list == NULL) { cparse_log_errno(EINVAL); return NULL; } return list->tail; }
void *cparse_list_get(cParseListNode *node) { if (node == NULL) { cparse_log_errno(EINVAL); return NULL; } return node->data; }
cParseJson *cparse_query_build_json(cParseQueryBuilder *query) { if (query == NULL) { cparse_log_errno(EINVAL); return NULL; } return query->json; }
void cparse_role_add_user(cParseRole *role, cParseUser *user) { if (!role || !user) { cparse_log_errno(EINVAL); return; } __cparse_role_add_dependency(role, CPARSE_USERS_PATH, user); }
cParseListNode *cparse_list_next(cParseListNode *node) { if (node == NULL) { cparse_log_errno(EINVAL); return NULL; } return node->next; }
void cparse_query_where_all(cParseQuery *query, const char *key, cParseJson *value) { cParseQueryBuilder *builder = NULL; if (query == NULL || cparse_str_empty(key) || value == NULL) { cparse_log_errno(EINVAL); return; } builder = cparse_query_build_new(); if (builder == NULL) { cparse_log_errno(ENOMEM); return; } cparse_query_build_all(builder, key, value); cparse_query_build_where(query, builder); cparse_query_build_free(builder); }
cParseQueryBuilder *cparse_query_build_new() { cParseQueryBuilder *builder = malloc(sizeof(cParseQueryBuilder)); if (builder == NULL) { cparse_log_errno(ENOMEM); return NULL; } builder->json = cparse_json_new(); return builder; }
void cparse_query_set_where(cParseQuery *query, cParseJson *value) { if (query == NULL || value == NULL) { cparse_log_errno(EINVAL); return; } if (query->where) { cparse_json_free(query->where); } query->where = cparse_json_new_reference(value); }
void cparse_query_build_where(cParseQuery *query, cParseQueryBuilder *builder) { if (query == NULL || builder == NULL || builder->json == NULL) { cparse_log_errno(EINVAL); return; } if (query->where) { cparse_json_free(query->where); } query->where = cparse_json_new_reference(builder->json); }
void cparse_list_foreach(cParseList *list, cParseIteratorFunk funk, void *param) { size_t pos = 0; cParseListNode *node = NULL; if (list == NULL || funk == NULL) { cparse_log_errno(EINVAL); return; } for (node = list->head; node != NULL; node = node->next, ++pos) { funk(list, pos, node->data, param); } }
cParseError *cparse_error_new() { cParseError *e = malloc(sizeof(cParseError)); if (e == NULL) { cparse_log_errno(ENOMEM); return NULL; } e->code = 0; e->message = NULL; return e; }
cParseList *cparse_list_new(size_t elementSize, cParseListFreeFunk free) { cParseList *list = malloc(sizeof(cParseList)); if (list == NULL) { cparse_log_errno(ENOMEM); return NULL; } list->head = NULL; list->tail = NULL; list->free_fn = free; list->node_size = elementSize; list->length = 0; return list; }
static void __cparse_role_add_dependency(cParseRole *role, const char *key, cParseObject *ref) { cParseJson *users = NULL; cParseJson *objects = NULL; cParseJson *pointer = NULL; if (!role || cparse_str_empty(key) || !ref) { cparse_log_errno(EINVAL); return; } /* only allow certain values for key/pointer type */ if (strcmp(key, CPARSE_USERS_PATH) && strcmp(key, CPARSE_ROLES_PATH)) { cparse_log_error("can only by of type users or roles"); return; } users = cparse_object_get(role, key); if (users == NULL) { users = cparse_json_new(); cparse_json_set_string(users, CPARSE_KEY_OP, CPARSE_KEY_ADD_RELATION); cparse_object_set(role, key, users); } objects = cparse_json_get(users, "objects"); if (objects == NULL) { objects = cparse_json_new_array(); cparse_json_set(users, "objects", objects); } if (!cparse_json_is_array(objects)) { cparse_log_error("objects is not an array"); return; } pointer = cparse_pointer_from_object(ref); cparse_json_array_add(objects, pointer); }
cParseQuery *cparse_query_for_object(cParseObject *obj) { cParseQuery *query = NULL; if (obj == NULL) { cparse_log_errno(EINVAL); return NULL; } query = cparse_query_new(); if (query == NULL) { return NULL; } query->className = strdup(obj->className); query->urlPath = strdup(obj->urlPath); return query; }
cParseQueryBuilder *cparse_query_build_lte(cParseQueryBuilder *query, const char *key, cParseJson *value) { cParseJson *lte = NULL; if (query == NULL || cparse_str_empty(key) || value == NULL) { cparse_log_errno(EINVAL); return NULL; } lte = cparse_json_new(); if (lte == NULL) { return query; } cparse_json_set(lte, CPARSE_QUERY_LESS_THAN_EQUAL, value); cparse_json_set(query->json, key, lte); return query; }
cParseQueryBuilder *cparse_query_build_nin(cParseQueryBuilder *query, const char *key, cParseJson *inArray) { cParseJson *inner = NULL; if (query == NULL || cparse_str_empty(key) || inArray == NULL) { cparse_log_errno(EINVAL); return NULL; } inner = cparse_json_new(); if (inner == NULL) { return query; } cparse_json_set(inner, CPARSE_QUERY_NOT_IN, inArray); cparse_json_set(query->json, key, inner); return query; }
cParseQueryBuilder *cparse_query_build_all(cParseQueryBuilder *query, const char *key, cParseJson *value) { cParseJson *inner = NULL; if (query == NULL || cparse_str_empty(key) || value == NULL) { cparse_log_errno(EINVAL); return NULL; } inner = cparse_json_new(); if (inner == NULL) { return query; } cparse_json_set(inner, CPARSE_QUERY_ALL, value); cparse_json_set(query->json, key, inner); return query; }
cParseQuery *cparse_query_new() { cParseQuery *query = malloc(sizeof(cParseQuery)); if (query == NULL) { cparse_log_errno(ENOMEM); return NULL; } query->className = NULL; query->urlPath = NULL; query->limit = 0; query->skip = 0; query->trace = false; query->where = NULL; query->results = NULL; query->keys = NULL; query->count = false; query->size = 0; return query; }
cParseQuery *cparse_query_with_class_name(const char *className) { char buf[CPARSE_BUF_SIZE + 1] = {0}; cParseQuery *query = NULL; if (cparse_str_empty(className)) { cparse_log_errno(EINVAL); return NULL; } query = cparse_query_new(); if (query == NULL) { return NULL; } query->className = strdup(className); snprintf(buf, CPARSE_BUF_SIZE, "%s%s", CPARSE_OBJECTS_PATH, className); query->urlPath = strdup(buf); return query; }