diff --git a/src/db_query.c b/src/db_query.c index 1c786a1..e0473d9 100644 --- a/src/db_query.c +++ b/src/db_query.c @@ -471,6 +471,59 @@ int64_t syncIdMap_va(struct stored_conn_t *sconn, const char *table, size_t tabl return ret_val; } +int64_t getIdMaps(struct stored_conn_t *sconn, const char *table, size_t table_len, + const char *primary_col, const char *map_col, + unsigned int primary_id, size_t *n_maps, unsigned int **map_ids) +{ + char *qry; + size_t qry_len; + uint64_t qry_ret; + + str_builder *sb; + where_builder *wb; + + column_data **col_data; + size_t n_cols; + + if ((sb = strbld_create()) == 0) { + return -1; + } + + strbld_str(sb, "SELECT ", 7); + escapeColumnName_sb(sb, 0, 0, map_col, 0); + strbld_str(sb, " FROM ", 6); + escapeTableName_sb(sb, table, table_len); + wb = where(0, primary_col, EQ, TYPE_ID, 1, primary_id); + compileWhereBuilder_sb(sb, wb, 1); + + 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); + *n_maps = 0; + *map_ids = 0; + return 0; + } + + *map_ids = (*col_data)->data.ptr_uint32; + *n_maps = (*col_data)->n_values; + (*col_data)->data.ptr_uint32 = 0; + + freeColumns(col_data, n_cols); + + return (int64_t)n_maps; +} int64_t hasIdMap(struct stored_conn_t *sconn, const char *table, size_t table_len, const char *primary_col, const char *map_col, diff --git a/src/db_query.h b/src/db_query.h index bf7f9ae..30179af 100644 --- a/src/db_query.h +++ b/src/db_query.h @@ -55,6 +55,10 @@ int64_t syncIdMap_va(struct stored_conn_t *sconn, const char *table, size_t tabl const char *primary_col, const char *map_col, unsigned int primary_id, size_t n_maps, va_list args); +int64_t getIdMaps(struct stored_conn_t *sconn, const char *table, size_t table_len, + const char *primary_col, const char *map_col, + unsigned int primary_id, size_t *n_maps, unsigned int **map_ids); + int64_t hasIdMap(struct stored_conn_t *sconn, const char *table, size_t table_len, const char *primary_col, const char *map_col, unsigned int primary_id, unsigned int map_id);