Make const versions of strings in structs to avoid string copying & pass objects to create/update instead of values

This commit is contained in:
2020-10-15 12:36:27 +01:00
parent 880f9c04e1
commit bcd206dcf3
10 changed files with 121 additions and 56 deletions

View File

@@ -46,6 +46,7 @@ int tableRowsToGroups(column_data **col_data, size_t n_cols,
freeGroups(groups, idx); freeGroups(groups, idx);
return -1; return -1;
} }
group->name_c = group->name;
group->created_on = *(col_created->data.ptr_int64 + idx); group->created_on = *(col_created->data.ptr_int64 + idx);
if (!columnRowIsNull(col_updated, idx)) { if (!columnRowIsNull(col_updated, idx)) {
@@ -267,8 +268,7 @@ int modbGroupList(stored_conn *sconn, modb_ref *modb, int with_deleted, int with
return res; return res;
} }
int64_t modbGroupCreate(stored_conn *sconn, modb_ref *modb, int64_t modbGroupCreate(stored_conn *sconn, modb_ref *modb, struct group_t *group)
unsigned int id, const char *name)
{ {
str_builder *sb; str_builder *sb;
char *table; char *table;
@@ -277,6 +277,10 @@ int64_t modbGroupCreate(stored_conn *sconn, modb_ref *modb,
size_t qry_len; size_t qry_len;
uint64_t qry_ret; uint64_t qry_ret;
if (group->name_c == 0) {
group->name_c = group->name;
}
if ((sb = strbld_create()) == 0) { if ((sb = strbld_create()) == 0) {
return -1; return -1;
} }
@@ -285,9 +289,9 @@ int64_t modbGroupCreate(stored_conn *sconn, modb_ref *modb,
strbld_str(sb, "INSERT INTO ", 0); strbld_str(sb, "INSERT INTO ", 0);
escapeTableName_sb(sb, table, table_len); escapeTableName_sb(sb, table, table_len);
strbld_str(sb, " (`id`, `name`) VALUES (", 0); strbld_str(sb, " (`id`, `name`) VALUES (", 0);
db_value_sb(sb, TYPE_ID, 1, id); db_value_sb(sb, TYPE_ID, 1, group->id);
strbld_char(sb, ','); strbld_char(sb, ',');
db_value_sb(sb, TYPE_STRING, 1, name); db_value_sb(sb, TYPE_STRING, 2, group->name_c, group->name_len);
strbld_char(sb, ')'); strbld_char(sb, ')');
modbFreeTableName(&table); modbFreeTableName(&table);
@@ -300,21 +304,28 @@ int64_t modbGroupCreate(stored_conn *sconn, modb_ref *modb,
return (int64_t)qry_ret; return (int64_t)qry_ret;
} }
int64_t modbGroupUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id, int64_t modbGroupUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id, struct group_t *group)
const char *name)
{ {
str_builder *sb; str_builder *sb;
char *table, *set; char *table, *set;
size_t table_len, set_len; size_t table_len, set_len;
int64_t qry_ret; int64_t qry_ret;
if (group->name_c == 0) {
group->name_c = group->name;
}
if ((sb = strbld_create()) == 0) { if ((sb = strbld_create()) == 0) {
return 0; return 0;
} }
columnSetValueStr_sb(sb, "id", TYPE_ID, 1, id); columnSetValueStr_sb(sb, "id", TYPE_ID, 1, id);
if (name != 0) { if (group->id != 0 && group->id != id) {
strbld_char(sb, ','); strbld_char(sb, ',');
columnSetValueStr_sb(sb, "name", TYPE_STRING, 1, name); columnSetValueStr_sb(sb, "id", TYPE_ID, 1, group->id);
}
if (group->name_c != 0) {
strbld_char(sb, ',');
columnSetValueStr_sb(sb, "name", TYPE_STRING, 2, group->name_c, group->name_len);
} }
if (strbld_finalize_or_destroy(&sb, &set, &set_len) != 0) { if (strbld_finalize_or_destroy(&sb, &set, &set_len) != 0) {
return 0; return 0;

View File

@@ -10,6 +10,7 @@ struct group_t {
unsigned int id; unsigned int id;
char *name; char *name;
const char *name_c;
size_t name_len; size_t name_len;
int64_t created_on; int64_t created_on;
@@ -36,10 +37,8 @@ int modbGroupByName(stored_conn *sconn, modb_ref *modb, const char *name, int wi
int modbGroupList(stored_conn *sconn, modb_ref *modb, int with_deleted, int with_members, int modbGroupList(stored_conn *sconn, modb_ref *modb, int with_deleted, int with_members,
struct group_t ***groups, size_t *n_groups); struct group_t ***groups, size_t *n_groups);
int64_t modbGroupCreate(stored_conn *sconn, modb_ref *modb, int64_t modbGroupCreate(stored_conn *sconn, modb_ref *modb, struct group_t *group);
unsigned int id, const char *name); int64_t modbGroupUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id, struct group_t *group);
int64_t modbGroupUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id,
const char *name);
int modbGroupDelete(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 modbGroupDestroy(stored_conn *sconn, modb_ref *modb, unsigned int id);

View File

@@ -14,7 +14,8 @@
int tableRowsToMetadataList(column_data **col_data, size_t n_cols, int tableRowsToMetadataList(column_data **col_data, size_t n_cols,
struct metadata_t ***metadata_list, size_t *n_metadatas) struct metadata_t ***metadata_list, size_t *n_metadatas)
{ {
column_data *col_id, *col_title, *col_owner_id, *col_created, *col_updated, *col_deleted; column_data *col_id, *col_type, *col_title, *col_owner_id,
*col_created, *col_updated, *col_deleted;
size_t n_rows, idx; size_t n_rows, idx;
struct metadata_t *metadata; struct metadata_t *metadata;
@@ -24,6 +25,7 @@ int tableRowsToMetadataList(column_data **col_data, size_t n_cols,
} }
col_id = findColumnByName(col_data, n_cols, "mdo_id"); col_id = findColumnByName(col_data, n_cols, "mdo_id");
col_type = findColumnByName(col_data, n_cols, "type");
col_title = findColumnByName(col_data, n_cols, "title"); col_title = findColumnByName(col_data, n_cols, "title");
col_owner_id = findColumnByName(col_data, n_cols, "owner_id"); col_owner_id = findColumnByName(col_data, n_cols, "owner_id");
col_created = findColumnByName(col_data, n_cols, "created"); col_created = findColumnByName(col_data, n_cols, "created");
@@ -46,10 +48,17 @@ int tableRowsToMetadataList(column_data **col_data, size_t n_cols,
metadata->id = *(col_id->data.ptr_uint32 + idx); metadata->id = *(col_id->data.ptr_uint32 + idx);
if (!moveColumnStrPointer(col_type, idx, 1, &metadata->type, &metadata->type_len)) {
freeMetadataList(metadata_list, idx);
return -1;
}
metadata->type_c = metadata->type;
if (!moveColumnStrPointer(col_title, idx, 1, &metadata->title, &metadata->title_len)) { if (!moveColumnStrPointer(col_title, idx, 1, &metadata->title, &metadata->title_len)) {
freeMetadataList(metadata_list, idx); freeMetadataList(metadata_list, idx);
return -1; return -1;
} }
metadata->title_c = metadata->title;
metadata->owner_id = *(col_owner_id->data.ptr_uint32 + idx); metadata->owner_id = *(col_owner_id->data.ptr_uint32 + idx);
@@ -304,8 +313,8 @@ int modbMetadataList(stored_conn *sconn, modb_ref *modb, int with_deleted,
return res; return res;
} }
int64_t modbMetadataCreate(stored_conn *sconn, modb_ref *modb, unsigned int modbMetadataCreate(stored_conn *sconn, modb_ref *modb,
const struct metadata_t *const metadata) struct metadata_t *metadata)
{ {
str_builder *sb; str_builder *sb;
char *table; char *table;
@@ -314,6 +323,13 @@ int64_t modbMetadataCreate(stored_conn *sconn, modb_ref *modb,
size_t qry_len; size_t qry_len;
uint64_t qry_ret; uint64_t qry_ret;
if (metadata->type_c == 0) {
metadata->type_c = metadata->type;
}
if (metadata->title_c == 0) {
metadata->title_c = metadata->title;
}
if ((sb = strbld_create()) == 0) { if ((sb = strbld_create()) == 0) {
return 0; return 0;
} }
@@ -324,9 +340,9 @@ int64_t modbMetadataCreate(stored_conn *sconn, modb_ref *modb,
strbld_str(sb, " (`mdo_id`, `type`, `title`, `owner_id`) VALUES (", 0); strbld_str(sb, " (`mdo_id`, `type`, `title`, `owner_id`) VALUES (", 0);
db_value_sb(sb, TYPE_ID, 1, metadata->id); db_value_sb(sb, TYPE_ID, 1, metadata->id);
strbld_char(sb, ','); strbld_char(sb, ',');
db_value_sb(sb, TYPE_STRING, 2, metadata->type, metadata->type_len); db_value_sb(sb, TYPE_STRING, 2, metadata->type_c, metadata->type_len);
strbld_char(sb, ','); strbld_char(sb, ',');
db_value_sb(sb, TYPE_STRING, 2, metadata->title, metadata->title_len); db_value_sb(sb, TYPE_STRING, 2, metadata->title_c, metadata->title_len);
strbld_char(sb, ','); strbld_char(sb, ',');
if (metadata->owner != 0) { if (metadata->owner != 0) {
db_value_sb(sb, TYPE_ID, 1, metadata->owner->id); db_value_sb(sb, TYPE_ID, 1, metadata->owner->id);
@@ -347,13 +363,20 @@ int64_t modbMetadataCreate(stored_conn *sconn, modb_ref *modb,
} }
int64_t modbMetadataReplace(stored_conn *sconn, modb_ref *modb, unsigned int id, int64_t modbMetadataReplace(stored_conn *sconn, modb_ref *modb, unsigned int id,
const struct metadata_t *const metadata) struct metadata_t *metadata)
{ {
str_builder *sb; str_builder *sb;
char *table, *set; char *table, *set;
size_t table_len, set_len; size_t table_len, set_len;
int64_t qry_ret; int64_t qry_ret;
if (metadata->type_c == 0) {
metadata->type_c = metadata->type;
}
if (metadata->title_c == 0) {
metadata->title_c = metadata->title;
}
if ((sb = strbld_create()) == 0) { if ((sb = strbld_create()) == 0) {
return 0; return 0;
} }
@@ -361,13 +384,13 @@ int64_t modbMetadataReplace(stored_conn *sconn, modb_ref *modb, unsigned int id,
strbld_char(sb, ','); strbld_char(sb, ',');
columnSetValueStr_sb(sb, "mdo_id", TYPE_ID, 1, metadata->id); columnSetValueStr_sb(sb, "mdo_id", TYPE_ID, 1, metadata->id);
} }
if (metadata->type != 0) { if (metadata->type_c != 0) {
strbld_char(sb, ','); strbld_char(sb, ',');
columnSetValueStr_sb(sb, "type", TYPE_STRING, 2, metadata->type, metadata->type_len); columnSetValueStr_sb(sb, "type", TYPE_STRING, 2, metadata->type_c, metadata->type_len);
} }
if (metadata->title != 0) { if (metadata->title_c != 0) {
strbld_char(sb, ','); strbld_char(sb, ',');
columnSetValueStr_sb(sb, "title", TYPE_STRING, 2, metadata->title, metadata->title_len); columnSetValueStr_sb(sb, "title", TYPE_STRING, 2, metadata->title_c, metadata->title_len);
} }
if (metadata->owner != 0) { if (metadata->owner != 0) {
strbld_char(sb, ','); strbld_char(sb, ',');

View File

@@ -10,9 +10,11 @@ struct metadata_t {
unsigned int id; unsigned int id;
char *type; char *type;
const char *type_c;
size_t type_len; size_t type_len;
char *title; char *title;
const char *title_c;
size_t title_len; size_t title_len;
unsigned int owner_id; unsigned int owner_id;
@@ -50,11 +52,11 @@ int modbMetadataListByGroupId(stored_conn *sconn, modb_ref *modb, unsigned int g
int modbMetadataList(stored_conn *sconn, modb_ref *modb, int with_deleted, int modbMetadataList(stored_conn *sconn, modb_ref *modb, int with_deleted,
struct metadata_t ***metadata_list, size_t *n_metadatas); struct metadata_t ***metadata_list, size_t *n_metadatas);
int64_t modbMetadataCreate(stored_conn *sconn, modb_ref *modb, unsigned int modbMetadataCreate(stored_conn *sconn, modb_ref *modb,
const struct metadata_t *const metadata); struct metadata_t *metadata);
int64_t modbMetadataReplace(stored_conn *sconn, modb_ref *modb, unsigned int id, int64_t modbMetadataReplace(stored_conn *sconn, modb_ref *modb, unsigned int id,
const struct metadata_t *const metadata); struct metadata_t *metadata);
int64_t modbMetadataUpdateType(stored_conn *sconn, modb_ref *modb, unsigned int id, int64_t modbMetadataUpdateType(stored_conn *sconn, modb_ref *modb, unsigned int id,
const char *type, size_t type_len); const char *type, size_t type_len);
int64_t modbMetadataUpdateTitle(stored_conn *sconn, modb_ref *modb, unsigned int id, int64_t modbMetadataUpdateTitle(stored_conn *sconn, modb_ref *modb, unsigned int id,

View File

@@ -16,7 +16,6 @@ int tableRowsToMetaExtList(column_data **col_data, size_t n_cols,
size_t n_rows, r_idx, c_idx, v_idx; size_t n_rows, r_idx, c_idx, v_idx;
struct meta_ext_t *ext; struct meta_ext_t *ext;
struct meta_ext_value_t *ext_value; struct meta_ext_value_t *ext_value;
size_t key_len;
n_rows = (*col_data)->n_values; n_rows = (*col_data)->n_values;
if (n_rows == 0) { if (n_rows == 0) {
@@ -55,7 +54,7 @@ int tableRowsToMetaExtList(column_data **col_data, size_t n_cols,
} }
ext_value = *(ext->values + v_idx); ext_value = *(ext->values + v_idx);
if (strmemcpy(col->name, col->name_len, &ext_value->key, &key_len) != 0) { if (strmemcpy(col->name, col->name_len, &ext_value->key, &ext_value->key_len) != 0) {
freeMetaExtList(ext_list, r_idx); freeMetaExtList(ext_list, r_idx);
return -1; return -1;
} }
@@ -418,7 +417,7 @@ int64_t modbMetaExtCreate(stored_conn *sconn, modb_ref *modb, struct meta_ext_t
for (idx = 0; idx < meta_ext->n_values; idx++) { for (idx = 0; idx < meta_ext->n_values; idx++) {
ext_value = (*(meta_ext->values + idx)); ext_value = (*(meta_ext->values + idx));
strbld_char(sb, ','); strbld_char(sb, ',');
escapeColumnName_sb(sb, 0, 0, ext_value->key_c, 0); escapeColumnName_sb(sb, 0, 0, ext_value->key_c, ext_value->key_len);
} }
strbld_str(sb, ") VALUES (", 0); strbld_str(sb, ") VALUES (", 0);
db_value_sb(sb, TYPE_ID, 1, meta_ext->id); db_value_sb(sb, TYPE_ID, 1, meta_ext->id);

View File

@@ -27,7 +27,10 @@ struct meta_ext_t {
struct meta_ext_value_t { struct meta_ext_value_t {
char *key; char *key;
const char *key_c; const char *key_c;
size_t key_len;
enum e_value_type_t type; enum e_value_type_t type;
union { union {
void *raw; void *raw;
int bool; int bool;

View File

@@ -42,6 +42,7 @@ int tableRowsToObjects(column_data **col_data, size_t n_cols,
freeObjects(objects, idx); freeObjects(objects, idx);
return -1; return -1;
} }
object->data_c = object->data;
*(*objects + idx) = object; *(*objects + idx) = object;
} }
@@ -212,7 +213,7 @@ int modbObjectList(stored_conn *sconn, modb_ref *modb, int with_deleted,
} }
int64_t modbObjectCreate(stored_conn *sconn, modb_ref *modb, int64_t modbObjectCreate(stored_conn *sconn, modb_ref *modb,
unsigned int id, const char *data, size_t data_len) struct object_t *object)
{ {
str_builder *sb; str_builder *sb;
char *table; char *table;
@@ -221,6 +222,10 @@ int64_t modbObjectCreate(stored_conn *sconn, modb_ref *modb,
size_t qry_len; size_t qry_len;
uint64_t qry_ret; uint64_t qry_ret;
if (object->data_c == 0) {
object->data_c = object->data;
}
if ((sb = strbld_create()) == 0) { if ((sb = strbld_create()) == 0) {
return -1; return -1;
} }
@@ -229,9 +234,9 @@ int64_t modbObjectCreate(stored_conn *sconn, modb_ref *modb,
strbld_str(sb, "INSERT INTO ", 0); strbld_str(sb, "INSERT INTO ", 0);
escapeTableName_sb(sb, table, table_len); escapeTableName_sb(sb, table, table_len);
strbld_str(sb, " (`mdo_id`, `object`) VALUES (", 0); strbld_str(sb, " (`mdo_id`, `object`) VALUES (", 0);
db_value_sb(sb, TYPE_ID, 1, id); db_value_sb(sb, TYPE_ID, 1, object->id);
strbld_char(sb, ','); strbld_char(sb, ',');
db_value_sb(sb, TYPE_BLOB, 2, data, data_len); db_value_sb(sb, TYPE_BLOB, 2, object->data_c, object->data_len);
strbld_char(sb, ')'); strbld_char(sb, ')');
modbFreeTableName(&table); modbFreeTableName(&table);
@@ -242,23 +247,31 @@ int64_t modbObjectCreate(stored_conn *sconn, modb_ref *modb,
qry_ret = simpleQuery(sconn, qry, qry_len); qry_ret = simpleQuery(sconn, qry, qry_len);
free(qry); free(qry);
return qry_ret == 0 ? id : 0; return qry_ret == 0 ? object->id : 0;
} }
int64_t modbObjectUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id, int64_t modbObjectUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id,
const char *data, size_t data_len) struct object_t *object)
{ {
str_builder *sb; str_builder *sb;
char *table, *set; char *table, *set;
size_t table_len, set_len; size_t table_len, set_len;
int64_t qry_ret; int64_t qry_ret;
if (object->data_c == 0) {
object->data_c = object->data;
}
if ((sb = strbld_create()) == 0) { if ((sb = strbld_create()) == 0) {
return 0; return 0;
} }
columnSetValueStr_sb(sb, "mdo_id", TYPE_ID, 1, id); columnSetValueStr_sb(sb, "mdo_id", TYPE_ID, 1, id);
if (data != 0) { if (object->id != 0 && object->id != id) {
strbld_char(sb, ','); strbld_char(sb, ',');
columnSetValueStr_sb(sb, "object", TYPE_BLOB, 2, data, data_len); columnSetValueStr_sb(sb, "mdo_id", TYPE_ID, 1, object->id);
}
if (object->data_c != 0) {
strbld_char(sb, ',');
columnSetValueStr_sb(sb, "object", TYPE_BLOB, 2, object->data_c, object->data_len);
} }
if (strbld_finalize_or_destroy(&sb, &set, &set_len) != 0) { if (strbld_finalize_or_destroy(&sb, &set, &set_len) != 0) {
return 0; return 0;

View File

@@ -10,6 +10,7 @@ struct object_t {
unsigned int id; unsigned int id;
char *data; char *data;
const char *data_c;
size_t data_len; size_t data_len;
}; };
@@ -22,17 +23,13 @@ void freeObjects(struct object_t ***objects_ptr, size_t n_objects);
// MODB Objects // MODB Objects
int modbObjectById(stored_conn *sconn, modb_ref *modb, unsigned int id, int modbObjectById(stored_conn *sconn, modb_ref *modb, unsigned int id,
struct object_t **object); struct object_t **object);
// Objects by owner
// Objects by group
// Objects by owner/owner groups
int modbObjectList(stored_conn *sconn, modb_ref *modb, int with_deleted, int modbObjectList(stored_conn *sconn, modb_ref *modb, int with_deleted,
struct object_t ***objects, size_t *n_objects); struct object_t ***objects, size_t *n_objects);
int64_t modbObjectCreate(stored_conn *sconn, modb_ref *modb, int64_t modbObjectCreate(stored_conn *sconn, modb_ref *modb, struct object_t *object);
unsigned int id, const char *data, size_t data_len);
int64_t modbObjectUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id, int64_t modbObjectUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id,
const char *data, size_t data_len); struct object_t *object);
int modbObjectDelete(stored_conn *sconn, modb_ref *modb, unsigned int id); int modbObjectDelete(stored_conn *sconn, modb_ref *modb, unsigned int id);
int modbObjectDestroy(stored_conn *sconn, modb_ref *modb, unsigned int id); int modbObjectDestroy(stored_conn *sconn, modb_ref *modb, unsigned int id);

View File

@@ -47,11 +47,13 @@ int tableRowsToUsers(column_data **col_data, size_t n_cols,
freeUsers(users, idx); freeUsers(users, idx);
return -1; return -1;
} }
user->username_c = user->username;
if (!moveColumnStrPointer(col_email, idx, 1, &user->email, &user->email_len)) { if (!moveColumnStrPointer(col_email, idx, 1, &user->email, &user->email_len)) {
freeUsers(users, idx); freeUsers(users, idx);
return -1; return -1;
} }
user->email_c = user->email;
user->created_on = *(col_created->data.ptr_int64 + idx); user->created_on = *(col_created->data.ptr_int64 + idx);
if (!columnRowIsNull(col_updated, idx)) { if (!columnRowIsNull(col_updated, idx)) {
@@ -303,8 +305,7 @@ int modbUserList(stored_conn *sconn, modb_ref *modb, int with_deleted, int with_
return res; return res;
} }
int64_t modbUserCreate(stored_conn *sconn, modb_ref *modb, int64_t modbUserCreate(stored_conn *sconn, modb_ref *modb, struct user_t *user)
unsigned int id, const char *user_name, const char *email)
{ {
str_builder *sb; str_builder *sb;
char *table; char *table;
@@ -313,6 +314,13 @@ int64_t modbUserCreate(stored_conn *sconn, modb_ref *modb,
size_t qry_len; size_t qry_len;
uint64_t qry_ret; uint64_t qry_ret;
if (user->email_c == 0) {
user->email_c = user->email;
}
if (user->username == 0) {
user->username_c = user->username;
}
if ((sb = strbld_create()) == 0) { if ((sb = strbld_create()) == 0) {
return -1; return -1;
} }
@@ -321,11 +329,11 @@ int64_t modbUserCreate(stored_conn *sconn, modb_ref *modb,
strbld_str(sb, "INSERT INTO ", 0); strbld_str(sb, "INSERT INTO ", 0);
escapeTableName_sb(sb, table, table_len); escapeTableName_sb(sb, table, table_len);
strbld_str(sb, " (`id`, `username`, `email`) VALUES (", 0); strbld_str(sb, " (`id`, `username`, `email`) VALUES (", 0);
db_value_sb(sb, TYPE_UINT32, 1, id); db_value_sb(sb, TYPE_UINT32, 1, user->id);
strbld_char(sb, ','); strbld_char(sb, ',');
db_value_sb(sb, TYPE_STRING, 1, user_name); db_value_sb(sb, TYPE_STRING, 2, user->username_c, user->username_len);
strbld_char(sb, ','); strbld_char(sb, ',');
db_value_sb(sb, TYPE_STRING, 1, email); db_value_sb(sb, TYPE_STRING, 2, user->email_c, user->email_len);
strbld_char(sb, ')'); strbld_char(sb, ')');
modbFreeTableName(&table); modbFreeTableName(&table);
@@ -338,25 +346,35 @@ int64_t modbUserCreate(stored_conn *sconn, modb_ref *modb,
return (int64_t)qry_ret; return (int64_t)qry_ret;
} }
int64_t modbUserUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id, int64_t modbUserUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id, struct user_t *user)
const char *username, const char *email)
{ {
str_builder *sb; str_builder *sb;
char *table, *set; char *table, *set;
size_t table_len, set_len; size_t table_len, set_len;
int64_t qry_ret; int64_t qry_ret;
if (user->email_c == 0) {
user->email_c = user->email;
}
if (user->username == 0) {
user->username_c = user->username;
}
if ((sb = strbld_create()) == 0) { if ((sb = strbld_create()) == 0) {
return 0; return 0;
} }
columnSetValueStr_sb(sb, "id", TYPE_ID, 1, id); columnSetValueStr_sb(sb, "id", TYPE_ID, 1, id);
if (username != 0) { if (user->id != 0 && user->id != id) {
strbld_char(sb, ','); strbld_char(sb, ',');
columnSetValueStr_sb(sb, "username", TYPE_STRING, 1, username); columnSetValueStr_sb(sb, "id", TYPE_ID, 1, user->id);
} }
if (email != 0) { if (user->username_c != 0) {
strbld_char(sb, ','); strbld_char(sb, ',');
columnSetValueStr_sb(sb, "email", TYPE_STRING, 1, email); columnSetValueStr_sb(sb, "username", TYPE_STRING, 2, user->username_c, user->username_len);
}
if (user->email_c != 0) {
strbld_char(sb, ',');
columnSetValueStr_sb(sb, "email", TYPE_STRING, 2, user->email_c, user->email_len);
} }
if (strbld_finalize_or_destroy(&sb, &set, &set_len) != 0) { if (strbld_finalize_or_destroy(&sb, &set, &set_len) != 0) {
return 0; return 0;

View File

@@ -10,9 +10,11 @@ struct user_t {
unsigned int id; unsigned int id;
char *username; char *username;
const char *username_c;
size_t username_len; size_t username_len;
char *email; char *email;
const char *email_c;
size_t email_len; size_t email_len;
int64_t created_on; int64_t created_on;
@@ -43,10 +45,8 @@ int modbUserSearch(stored_conn *sconn, modb_ref *modb, const char *username_emai
int modbUserList(stored_conn *sconn, modb_ref *modb, int with_deleted, int with_groups, int modbUserList(stored_conn *sconn, modb_ref *modb, int with_deleted, int with_groups,
struct user_t ***users, size_t *n_users); struct user_t ***users, size_t *n_users);
int64_t modbUserCreate(stored_conn *sconn, modb_ref *modb, int64_t modbUserCreate(stored_conn *sconn, modb_ref *modb, struct user_t *user);
unsigned int id, const char *username, const char *email); int64_t modbUserUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id, struct user_t *user);
int64_t modbUserUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id,
const char *username, const char *email);
int modbUserDelete(stored_conn *sconn, modb_ref *modb, unsigned int id); int modbUserDelete(stored_conn *sconn, modb_ref *modb, unsigned int id);
int modbUserDestroy(stored_conn *sconn, modb_ref *modb, unsigned int id); int modbUserDestroy(stored_conn *sconn, modb_ref *modb, unsigned int id);