diff --git a/src/modb_groups.c b/src/modb_groups.c index c8858ae..a149934 100644 --- a/src/modb_groups.c +++ b/src/modb_groups.c @@ -354,67 +354,18 @@ int modbGroupDestroy(stored_conn *sconn, modb_ref *modb, unsigned int id) } -int modbFetchGroupUserIds(stored_conn *sconn, modb_ref *modb, struct group_t *group, - int with_deleted) +int modbFetchGroupUserIds(stored_conn *sconn, modb_ref *modb, struct group_t *group) { - char *u_table, *ug_table; - size_t u_len, ug_len; + char *table; + size_t table_len; + int64_t res; - char *qry; - size_t qry_len; - uint64_t qry_ret; + modbTableName(&table, &table_len, modb, USER_GROUPS_TABLE, STR_LEN(USER_GROUPS_TABLE)); + res = getIdMaps(sconn, table, table_len, "group_id", "user_id", + group->id, &group->n_members, &group->member_ids); + modbFreeTableName(&table); - str_builder *sb; - where_builder *wb; - - column_data **col_data; - size_t n_cols; - - - if ((sb = strbld_create()) == 0) { - return -1; - } - modbTableName(&u_table, &u_len, modb, USERS_TABLE, STR_LEN(USERS_TABLE)); - modbTableName(&ug_table, &ug_len, modb, USER_GROUPS_TABLE, STR_LEN(USER_GROUPS_TABLE)); - - strbld_str(sb, "SELECT ", 0); - escapeColumnName_sb(sb, 0, 0, "user_id", 0); - strbld_str(sb, " FROM ", 0); - escapeTableName_sb(sb, ug_table, ug_len); - joinStr_sb(sb, " LEFT", 5, 1, u_table, u_len, "id", 2, ug_table, ug_len, "user_id", 8); - wb = where(0, "group_id", EQ, TYPE_ID, 1, group->id); - if (!with_deleted) { - wb = whereAnd(wb, where(u_table, "deleted", IS_NULL, TYPE_RAW, 0)); - } - compileWhereBuilder_sb(sb, wb, 1); - - modbFreeTableName(&u_table); - modbFreeTableName(&ug_table); - if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) { - return -1; - } - - qry_ret = tableQuery(sconn, qry, qry_len, 0, &col_data, &n_cols); - free(qry); - - // Query failed - if (qry_ret == (uint64_t)-1) { - return -1; - } - - // Zero row result - if (qry_ret == 0) { - freeColumns(col_data, n_cols); - return 0; - } - - group->member_ids = (*col_data)->data.ptr_uint32; - group->n_members = (*col_data)->n_values; - (*col_data)->data.ptr_uint32 = 0; - - freeColumns(col_data, n_cols); - - return 1; + return res <= 0 ? (int)res : 1; } int modbFetchGroupUsers(stored_conn *sconn, modb_ref *modb, struct group_t *group, int with_deleted) @@ -422,21 +373,34 @@ int modbFetchGroupUsers(stored_conn *sconn, modb_ref *modb, struct group_t *grou int ret; size_t idx; - ret = modbFetchGroupUserIds(sconn, modb, group, with_deleted); + ret = modbFetchGroupUserIds(sconn, modb, group); if (ret != 1) { return ret; } group->members = allocUsers(group->n_members); if (group->members == 0) { - ret = -1; + return -1; } for (idx = 0; idx < group->n_members; idx++) { - if (modbUserById(sconn, modb, *(group->member_ids + idx), 0, (group->members + idx)) != 1) { + if (modbUserById( + sconn, modb, *(group->member_ids + idx), 0, (group->members + idx) + ) != 1) { freeUsers(&group->members, group->n_members); - group->members = 0; - ret = -1; + return -1; + } + if (!with_deleted && (*(group->members + idx))->deleted_on != 0) { + freeUser((group->members + idx)); + group->n_members--; + if (group->n_members == 0) { + free(group->members); + free(group->member_ids); + group->member_ids = 0; + } else { + memmove(group->member_ids + idx, group->member_ids + idx + 1, group->n_members - idx); + } + idx--; } } diff --git a/src/modb_groups.h b/src/modb_groups.h index d9fb5b8..c1e91f0 100644 --- a/src/modb_groups.h +++ b/src/modb_groups.h @@ -43,8 +43,7 @@ int64_t modbGroupUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id, int modbGroupDelete(stored_conn *sconn, modb_ref *modb, unsigned int id); int modbGroupDestroy(stored_conn *sconn, modb_ref *modb, unsigned int id); -int modbFetchGroupUserIds(stored_conn *sconn, modb_ref *modb, struct group_t *group, - int with_deleted); +int modbFetchGroupUserIds(stored_conn *sconn, modb_ref *modb, struct group_t *group); int modbFetchGroupUsers(stored_conn *sconn, modb_ref *modb, struct group_t *group, int with_deleted); diff --git a/src/modb_metadata.c b/src/modb_metadata.c index 6c75476..734ad67 100644 --- a/src/modb_metadata.c +++ b/src/modb_metadata.c @@ -266,7 +266,7 @@ int modbMetadataListByGroupId(stored_conn *sconn, modb_ref *modb, unsigned int g where_builder *wb = 0; int res; - if (modbFetchGroupMetadataIds(sconn, modb, group_id, with_deleted, &ids, &n_ids) < 0) { + if (modbFetchGroupMetadataIds(sconn, modb, group_id, &ids, &n_ids) < 0) { return -1; } if (ids == 0) { @@ -277,10 +277,11 @@ int modbMetadataListByGroupId(stored_conn *sconn, modb_ref *modb, unsigned int g for (idx = 0; idx < n_ids; idx++) { setWhereValue(wb, TYPE_ID, 1, *(ids + idx)); } - res = doMetadataListQuery(sconn, modb, wb, metadata_list, n_metadatas); - if (wb != 0) { - freeWhereBuilder(&wb); + if (!with_deleted) { + wb = whereAnd(wb, where(0, "deleted", IS_NULL, TYPE_RAW, 0)); } + res = doMetadataListQuery(sconn, modb, wb, metadata_list, n_metadatas); + freeWhereBuilder(&wb); free(ids); return res; @@ -526,64 +527,18 @@ int64_t modbFetchMetadataExtended(stored_conn *sconn, modb_ref *modb, struct met // MODB Metadata -> Groups int modbFetchMetadataGroupIds(stored_conn *sconn, modb_ref *modb, - struct metadata_t *metadata, int with_deleted) + struct metadata_t *metadata) { - char *g_table, *mg_table; - size_t g_len, mg_len; - char *qry; - size_t qry_len; - uint64_t qry_ret; + char *table; + size_t table_len; + int64_t res; - str_builder *sb; - where_builder *wb; + modbTableName(&table, &table_len, modb, MDO_GROUPS_TABLE, STR_LEN(MDO_GROUPS_TABLE)); + res = getIdMaps(sconn, table, table_len, "mdo_id", "group_id", + metadata->id, &metadata->n_groups, &metadata->group_ids); + modbFreeTableName(&table); - column_data **col_data; - size_t n_cols; - - if ((sb = strbld_create()) == 0) { - return -1; - } - modbTableName(&g_table, &g_len, modb, GROUPS_TABLE, STR_LEN(GROUPS_TABLE)); - modbTableName(&mg_table, &mg_len, modb, MDO_GROUPS_TABLE, STR_LEN(MDO_GROUPS_TABLE)); - - strbld_str(sb, "SELECT ", 0); - escapeColumnName_sb(sb, 0, 0, "group_id", 0); - strbld_str(sb, " FROM ", 0); - escapeTableName_sb(sb, mg_table, mg_len); - joinStr_sb(sb, " LEFT", 5, 1, g_table, g_len, "id", 2, mg_table, mg_len, "group_id", 8); - wb = where(0, "mdo_id", EQ, TYPE_ID, 1, metadata->id); - if (!with_deleted) { - wb = whereAnd(wb, where(g_table, "deleted", IS_NULL, TYPE_RAW, 0)); - } - compileWhereBuilder_sb(sb, wb, 1); - - modbFreeTableName(&g_table); - modbFreeTableName(&mg_table); - if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) { - return -1; - } - - qry_ret = tableQuery(sconn, qry, qry_len, 0, &col_data, &n_cols); - free(qry); - - // Query failed - if (qry_ret == (uint64_t)-1) { - return -1; - } - - // Zero row result - if (qry_ret == 0) { - freeColumns(col_data, n_cols); - return 0; - } - - metadata->group_ids = (*col_data)->data.ptr_uint32; - metadata->n_groups = (*col_data)->n_values; - (*col_data)->data.ptr_uint32 = 0; - - freeColumns(col_data, n_cols); - - return 1; + return res <= 0 ? (int)res : 1; } int modbFetchMetadataGroups(stored_conn *sconn, modb_ref *modb, struct metadata_t *metadata, int with_deleted) @@ -591,7 +546,7 @@ int modbFetchMetadataGroups(stored_conn *sconn, modb_ref *modb, struct metadata_ int ret; size_t idx; - ret = modbFetchMetadataGroupIds(sconn, modb, metadata, with_deleted); + ret = modbFetchMetadataGroupIds(sconn, modb, metadata); if (ret != 1) { return ret; } @@ -608,6 +563,18 @@ int modbFetchMetadataGroups(stored_conn *sconn, modb_ref *modb, struct metadata_ freeGroups(&metadata->groups, metadata->n_groups); return -1; } + if (!with_deleted && (*(metadata->groups + idx))->deleted_on != 0) { + freeGroup((metadata->groups + idx)); + metadata->n_groups--; + if (metadata->n_groups == 0) { + free(metadata->groups); + free(metadata->group_ids); + metadata->group_ids = 0; + } else { + memmove(metadata->group_ids + idx, metadata->group_ids + idx + 1, metadata->n_groups - idx); + } + idx--; + } } return ret; @@ -691,63 +658,15 @@ int modbUnlink_Metadata_Group(stored_conn *sconn, modb_ref *modb, // MODB Group -> Metadatas int modbFetchGroupMetadataIds(stored_conn *sconn, modb_ref *modb, - unsigned int group_id, int with_deleted, - unsigned int **metadata_ids, size_t *n_ids) + unsigned int group_id, unsigned int **metadata_ids, size_t *n_ids) { - char *mg_table, *m_table; - size_t mg_len, m_len; - char *qry; - size_t qry_len; - uint64_t qry_ret; + char *table; + size_t table_len; + int64_t res; - str_builder *sb; - where_builder *wb; + modbTableName(&table, &table_len, modb, MDO_GROUPS_TABLE, STR_LEN(MDO_GROUPS_TABLE)); + res = getIdMaps(sconn, table, table_len, "group_id", "mdo_id", group_id, n_ids, metadata_ids); + modbFreeTableName(&table); - column_data **col_data; - size_t n_cols; - - if ((sb = strbld_create()) == 0) { - return -1; - } - modbTableName(&m_table, &m_len, modb, METADATA_TABLE, STR_LEN(METADATA_TABLE)); - modbTableName(&mg_table, &mg_len, modb, MDO_GROUPS_TABLE, STR_LEN(MDO_GROUPS_TABLE)); - - strbld_str(sb, "SELECT ", 7); - escapeColumnName_sb(sb, mg_table, mg_len, "mdo_id", 6); - strbld_str(sb, " FROM ", 6); - escapeTableName_sb(sb, mg_table, mg_len); - joinStr_sb(sb, " LEFT", 5, 1, m_table, m_len, "mdo_id", 6, mg_table, mg_len, "mdo_id", 6); - wb = where(0, "group_id", EQ, TYPE_ID, 1, group_id); - if (!with_deleted) { - wb = whereAnd(wb, where(m_table, "deleted", IS_NULL, TYPE_RAW, 0)); - } - compileWhereBuilder_sb(sb, wb, 1); - - modbFreeTableName(&mg_table); - modbFreeTableName(&m_table); - if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) { - return -1; - } - - qry_ret = tableQuery(sconn, qry, qry_len, 0, &col_data, &n_cols); - free(qry); - - // Query failed - if (qry_ret == (uint64_t)-1) { - return -1; - } - - // Zero row result - if (qry_ret == 0) { - freeColumns(col_data, n_cols); - return 0; - } - - *metadata_ids = (*col_data)->data.ptr_uint32; - *n_ids = (*col_data)->n_values; - (*col_data)->data.ptr_uint32 = 0; - - freeColumns(col_data, n_cols); - - return 1; + return res <= 0 ? (int)res : 1; } diff --git a/src/modb_metadata.h b/src/modb_metadata.h index aa1cb5c..3440a67 100644 --- a/src/modb_metadata.h +++ b/src/modb_metadata.h @@ -79,7 +79,7 @@ int64_t modbFetchMetadataExtended(stored_conn *sconn, modb_ref *modb, struct met // MODB Metadata -> Groups int modbFetchMetadataGroupIds(stored_conn *sconn, modb_ref *modb, - struct metadata_t *metadata, int with_deleted); + struct metadata_t *metadata); int modbFetchMetadataGroups(stored_conn *sconn, modb_ref *modb, struct metadata_t *metadata, int with_deleted); @@ -97,7 +97,6 @@ int modbUnlink_Metadata_Group(stored_conn *sconn, modb_ref *modb, // MODB Group -> Metadatas int modbFetchGroupMetadataIds(stored_conn *sconn, modb_ref *modb, - unsigned int group_id, int with_deleted, - unsigned int **metadata_ids, size_t *n_ids); + unsigned int group_id, unsigned int **metadata_ids, size_t *n_ids); #endif // H__MODB_METADATA__ diff --git a/src/modb_users.c b/src/modb_users.c index 4f7280b..bc3bd59 100644 --- a/src/modb_users.c +++ b/src/modb_users.c @@ -396,72 +396,25 @@ int modbUserDestroy(stored_conn *sconn, modb_ref *modb, unsigned int id) } -int modbFetchUserGroupIds(stored_conn *sconn, modb_ref *modb, - struct user_t *user, int with_deleted) +int modbFetchUserGroupIds(stored_conn *sconn, modb_ref *modb, struct user_t *user) { - char *g_table, *ug_table; - size_t g_len, ug_len; - char *qry; - size_t qry_len; - uint64_t qry_ret; + char *table; + size_t table_len; + int64_t res; - str_builder *sb; - where_builder *wb; + modbTableName(&table, &table_len, modb, USER_GROUPS_TABLE, STR_LEN(USER_GROUPS_TABLE)); + res = getIdMaps(sconn, table, table_len, "user_id", "group_id", + user->id, &user->n_groups, &user->group_ids); + modbFreeTableName(&table); - column_data **col_data; - size_t n_cols; - - if ((sb = strbld_create()) == 0) { - return -1; - } - modbTableName(&g_table, &g_len, modb, GROUPS_TABLE, STR_LEN(GROUPS_TABLE)); - modbTableName(&ug_table, &ug_len, modb, USER_GROUPS_TABLE, STR_LEN(USER_GROUPS_TABLE)); - - strbld_str(sb, "SELECT ", 0); - escapeColumnName_sb(sb, 0, 0, "group_id", 0); - strbld_str(sb, " FROM ", 0); - escapeTableName_sb(sb, ug_table, ug_len); - joinStr_sb(sb, " LEFT", 5, 1, g_table, g_len, "id", 2, ug_table, ug_len, "group_id", 8); - wb = where(0, "user_id", EQ, TYPE_ID, 1, user->id); - if (!with_deleted) { - wb = whereAnd(wb, where(g_table, "deleted", IS_NULL, TYPE_RAW, 0)); - } - compileWhereBuilder_sb(sb, wb, 1); - - modbFreeTableName(&g_table); - modbFreeTableName(&ug_table); - if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) { - return -1; - } - - qry_ret = tableQuery(sconn, qry, qry_len, 0, &col_data, &n_cols); - free(qry); - - // Query failed - if (qry_ret == (uint64_t)-1) { - return -1; - } - - // Zero row result - if (qry_ret == 0) { - freeColumns(col_data, n_cols); - return 0; - } - - user->group_ids = (*col_data)->data.ptr_uint32; - user->n_groups = (*col_data)->n_values; - (*col_data)->data.ptr_uint32 = 0; - - freeColumns(col_data, n_cols); - - return 1; + return res <= 0 ? (int)res : 1; } int modbFetchUserGroups(stored_conn *sconn, modb_ref *modb, struct user_t *user, int with_deleted) { int ret; size_t idx; - ret = modbFetchUserGroupIds(sconn, modb, user, with_deleted); + ret = modbFetchUserGroupIds(sconn, modb, user); if (ret != 1) { return ret; } @@ -472,10 +425,24 @@ int modbFetchUserGroups(stored_conn *sconn, modb_ref *modb, struct user_t *user, } for (idx = 0; idx < user->n_groups; idx++) { - if (modbGroupById(sconn, modb, *(user->group_ids + idx), 0, (user->groups + idx)) != 1) { + if (modbGroupById( + sconn, modb, *(user->group_ids + idx), 0, (user->groups + idx) + ) != 1) { freeGroups(&user->groups, user->n_groups); return -1; } + if (!with_deleted && (*(user->groups + idx))->deleted_on != 0) { + freeGroup((user->groups + idx)); + user->n_groups--; + if (user->n_groups == 0) { + free(user->groups); + free(user->group_ids); + user->group_ids = 0; + } else { + memmove(user->group_ids + idx, user->group_ids + idx + 1, user->n_groups - idx); + } + idx--; + } } return ret; diff --git a/src/modb_users.h b/src/modb_users.h index 4ab7bf1..99b6df2 100644 --- a/src/modb_users.h +++ b/src/modb_users.h @@ -52,8 +52,7 @@ int modbUserDestroy(stored_conn *sconn, modb_ref *modb, unsigned int id); // MODB Users -> Groups -int modbFetchUserGroupIds(stored_conn *sconn, modb_ref *modb, - struct user_t *user, int with_deleted); +int modbFetchUserGroupIds(stored_conn *sconn, modb_ref *modb, struct user_t *user); int modbFetchUserGroups(stored_conn *sconn, modb_ref *modb, struct user_t *user, int with_deleted); int modbSyncUserGroups(stored_conn *sconn, modb_ref *modb,