Added some more convenience queries
This commit is contained in:
205
src/db_query.c
205
src/db_query.c
@@ -6,6 +6,8 @@
|
||||
|
||||
#include "db_connection.h"
|
||||
#include "db_column.h"
|
||||
#include "db_value.h"
|
||||
#include "db_where-builder.h"
|
||||
#include "strext.h"
|
||||
|
||||
|
||||
@@ -278,3 +280,206 @@ char *scalarString(struct stored_conn_t *sconn, const char *qry, size_t qry_len,
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
int64_t countQuery(struct stored_conn_t *sconn, const char *table, where_builder *wb)
|
||||
{
|
||||
char *qry;
|
||||
size_t qry_len;
|
||||
int qry_ret;
|
||||
str_builder *sb;
|
||||
|
||||
if ((sb = strbld_create()) == 0) {
|
||||
return -1;
|
||||
}
|
||||
strbld_str(sb, "SELECT COUNT(*) AS `C` FROM `", 0);
|
||||
strbld_str(sb, table, 0);
|
||||
strbld_str(sb, "` WHERE ", 0);
|
||||
compileWhereBuilder_sb(wb, sb);
|
||||
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
||||
free(wb);
|
||||
return -1;
|
||||
}
|
||||
free(wb);
|
||||
|
||||
qry_ret = scalarInt(sconn, qry, qry_len, 0);
|
||||
free(qry);
|
||||
|
||||
return qry_ret;
|
||||
}
|
||||
|
||||
int deleteQuery(struct stored_conn_t *sconn, const char *table, where_builder *wb)
|
||||
{
|
||||
str_builder *sb;
|
||||
char *qry;
|
||||
size_t qry_len;
|
||||
uint64_t qry_ret;
|
||||
|
||||
if ((sb = strbld_create()) == 0) {
|
||||
return -1;
|
||||
}
|
||||
strbld_str(sb, "DELETE FROM `", 0);
|
||||
strbld_str(sb, table, 0);
|
||||
strbld_str(sb, "` WHERE ", 0);
|
||||
compileWhereBuilder_sb(wb, sb);
|
||||
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
qry_ret = simpleQuery(sconn, qry, qry_len);
|
||||
free(qry);
|
||||
|
||||
if (qry_ret == (uint64_t)-1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return qry_ret == 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int syncIdMap(struct stored_conn_t *sconn, const char *table,
|
||||
const char *primary_col, const char *map_col,
|
||||
unsigned int primary_id, size_t n_maps, unsigned int *map_ids)
|
||||
{
|
||||
str_builder *sb;
|
||||
where_builder *wb;
|
||||
char *qry;
|
||||
size_t qry_len;
|
||||
int qry_ret;
|
||||
size_t idx;
|
||||
|
||||
wb = where(table, primary_col, EQ, TYPE_ID, 1, primary_id);
|
||||
qry_ret = deleteQuery(sconn, table, wb);
|
||||
free(wb);
|
||||
|
||||
if (qry_ret != 0) {
|
||||
return qry_ret;
|
||||
}
|
||||
|
||||
if ((sb = strbld_create()) == 0) {
|
||||
return -1;
|
||||
}
|
||||
strbld_str(sb, "INSERT INTO `", 0);
|
||||
strbld_str(sb, table, 0);
|
||||
strbld_str(sb, "` (`", 0);
|
||||
strbld_str(sb, primary_col, 0);
|
||||
strbld_str(sb, "`, `", 0);
|
||||
strbld_str(sb, map_col, 0);
|
||||
strbld_str(sb, "`) VALUES ", 0);
|
||||
for (idx = 0; idx < n_maps; idx++) {
|
||||
strbld_char(sb, '(');
|
||||
db_value_sb(sb, TYPE_ID, 1, primary_id);
|
||||
strbld_char(sb, ',');
|
||||
db_value_sb(sb, TYPE_ID, 1, *(map_ids + idx));
|
||||
strbld_char(sb, ')');
|
||||
if ((idx + 1) < n_maps) {
|
||||
strbld_char(sb, ',');
|
||||
}
|
||||
}
|
||||
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (simpleQuery(sconn, qry, qry_len) == (uint64_t)-1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
int syncIdMap_va(struct stored_conn_t *sconn, const char *table,
|
||||
const char *primary_col, const char *map_col,
|
||||
unsigned int primary_id, size_t n_maps, va_list args)
|
||||
{
|
||||
unsigned int *map_ids;
|
||||
size_t idx;
|
||||
int ret_val;
|
||||
|
||||
if ((map_ids = (unsigned int *)malloc(sizeof(unsigned int) * n_maps)) == 0) {
|
||||
return -1;
|
||||
}
|
||||
for (idx = 0; idx < n_maps; idx++) {
|
||||
*(map_ids + idx) = va_arg(args, unsigned int);
|
||||
}
|
||||
|
||||
ret_val = syncIdMap(sconn, table, primary_col, map_col, primary_id, n_maps, map_ids);
|
||||
|
||||
free(map_ids);
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
|
||||
int hasIdMap(struct stored_conn_t *sconn, const char *table,
|
||||
const char *primary_col, const char *map_col,
|
||||
unsigned int primary_id, unsigned int map_id)
|
||||
{
|
||||
int64_t qry_ret;
|
||||
where_builder *wb;
|
||||
|
||||
wb = whereAnd(
|
||||
where(table, primary_col, EQ, TYPE_ID, 1, primary_id),
|
||||
where(table, map_col, EQ, TYPE_ID, 1, map_id)
|
||||
);
|
||||
qry_ret = countQuery(sconn, table, wb);
|
||||
free(wb);
|
||||
|
||||
return qry_ret > 0;
|
||||
}
|
||||
int addIdMap(struct stored_conn_t *sconn, const char *table,
|
||||
const char *primary_col, const char *map_col,
|
||||
unsigned int primary_id, unsigned int map_id)
|
||||
{
|
||||
str_builder *sb;
|
||||
char *qry;
|
||||
size_t qry_len;
|
||||
uint64_t qry_ret;
|
||||
|
||||
if ((sb = strbld_create()) == 0) {
|
||||
return -1;
|
||||
}
|
||||
strbld_str(sb, "INSERT INTO `", 0);
|
||||
strbld_str(sb, table, 0);
|
||||
strbld_str(sb, "` (`", 0);
|
||||
strbld_str(sb, primary_col, 0);
|
||||
strbld_str(sb, "`, `", 0);
|
||||
strbld_str(sb, map_col, 0);
|
||||
strbld_str(sb, "`) VALUES ", 0);
|
||||
strbld_char(sb, '(');
|
||||
db_value_sb(sb, TYPE_ID, 1, primary_id);
|
||||
strbld_char(sb, ',');
|
||||
db_value_sb(sb, TYPE_ID, 1, map_id);
|
||||
strbld_char(sb, ')');
|
||||
strbld_str(sb, "` ON DUPLICATE KEY UPDATE `", 0);
|
||||
strbld_str(sb, primary_col, 0);
|
||||
strbld_str(sb, "` = ", 0);
|
||||
db_value_sb(sb, TYPE_ID, 1, primary_id);
|
||||
if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
qry_ret = simpleQuery(sconn, qry, qry_len);
|
||||
free(qry);
|
||||
|
||||
if (qry_ret == (uint64_t)-1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
int removeIdMap(struct stored_conn_t *sconn, const char *table,
|
||||
const char *primary_col, const char *map_col,
|
||||
unsigned int primary_id, unsigned int map_id)
|
||||
{
|
||||
int qry_ret;
|
||||
where_builder *wb;
|
||||
|
||||
wb = whereAnd(
|
||||
where(table, primary_col, EQ, TYPE_ID, 1, primary_id),
|
||||
where(table, map_col, EQ, TYPE_ID, 1, map_id)
|
||||
);
|
||||
qry_ret = deleteQuery(sconn, table, wb);
|
||||
free(wb);
|
||||
|
||||
return qry_ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user