From bcd206dcf36ced7c00af068a3d1883d78cb7c1d2 Mon Sep 17 00:00:00 2001 From: avsdev-cw Date: Thu, 15 Oct 2020 12:36:27 +0100 Subject: [PATCH] Make const versions of strings in structs to avoid string copying & pass objects to create/update instead of values --- src/modb_groups.c | 27 ++++++++++++++++++-------- src/modb_groups.h | 7 +++---- src/modb_metadata.c | 43 +++++++++++++++++++++++++++++++---------- src/modb_metadata.h | 8 +++++--- src/modb_metadata_ext.c | 5 ++--- src/modb_metadata_ext.h | 3 +++ src/modb_objects.c | 27 +++++++++++++++++++------- src/modb_objects.h | 9 +++------ src/modb_users.c | 40 +++++++++++++++++++++++++++----------- src/modb_users.h | 8 ++++---- 10 files changed, 121 insertions(+), 56 deletions(-) diff --git a/src/modb_groups.c b/src/modb_groups.c index a149934..3663819 100644 --- a/src/modb_groups.c +++ b/src/modb_groups.c @@ -46,6 +46,7 @@ int tableRowsToGroups(column_data **col_data, size_t n_cols, freeGroups(groups, idx); return -1; } + group->name_c = group->name; group->created_on = *(col_created->data.ptr_int64 + 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; } -int64_t modbGroupCreate(stored_conn *sconn, modb_ref *modb, - unsigned int id, const char *name) +int64_t modbGroupCreate(stored_conn *sconn, modb_ref *modb, struct group_t *group) { str_builder *sb; char *table; @@ -277,6 +277,10 @@ int64_t modbGroupCreate(stored_conn *sconn, modb_ref *modb, size_t qry_len; uint64_t qry_ret; + if (group->name_c == 0) { + group->name_c = group->name; + } + if ((sb = strbld_create()) == 0) { return -1; } @@ -285,9 +289,9 @@ int64_t modbGroupCreate(stored_conn *sconn, modb_ref *modb, strbld_str(sb, "INSERT INTO ", 0); escapeTableName_sb(sb, table, table_len); 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, ','); - db_value_sb(sb, TYPE_STRING, 1, name); + db_value_sb(sb, TYPE_STRING, 2, group->name_c, group->name_len); strbld_char(sb, ')'); modbFreeTableName(&table); @@ -300,21 +304,28 @@ int64_t modbGroupCreate(stored_conn *sconn, modb_ref *modb, return (int64_t)qry_ret; } -int64_t modbGroupUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id, - const char *name) +int64_t modbGroupUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id, struct group_t *group) { str_builder *sb; char *table, *set; size_t table_len, set_len; int64_t qry_ret; + if (group->name_c == 0) { + group->name_c = group->name; + } + if ((sb = strbld_create()) == 0) { return 0; } columnSetValueStr_sb(sb, "id", TYPE_ID, 1, id); - if (name != 0) { + if (group->id != 0 && group->id != id) { 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) { return 0; diff --git a/src/modb_groups.h b/src/modb_groups.h index c1e91f0..221d07a 100644 --- a/src/modb_groups.h +++ b/src/modb_groups.h @@ -10,6 +10,7 @@ struct group_t { unsigned int id; char *name; + const char *name_c; size_t name_len; 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, struct group_t ***groups, size_t *n_groups); -int64_t modbGroupCreate(stored_conn *sconn, modb_ref *modb, - unsigned int id, const char *name); -int64_t modbGroupUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id, - const char *name); +int64_t modbGroupCreate(stored_conn *sconn, modb_ref *modb, struct group_t *group); +int64_t modbGroupUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id, struct group_t *group); int modbGroupDelete(stored_conn *sconn, modb_ref *modb, unsigned int id); int modbGroupDestroy(stored_conn *sconn, modb_ref *modb, unsigned int id); diff --git a/src/modb_metadata.c b/src/modb_metadata.c index f925f32..e670c09 100644 --- a/src/modb_metadata.c +++ b/src/modb_metadata.c @@ -14,7 +14,8 @@ int tableRowsToMetadataList(column_data **col_data, size_t n_cols, 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; 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_type = findColumnByName(col_data, n_cols, "type"); col_title = findColumnByName(col_data, n_cols, "title"); col_owner_id = findColumnByName(col_data, n_cols, "owner_id"); 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); + 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)) { freeMetadataList(metadata_list, idx); return -1; } + metadata->title_c = metadata->title; 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; } -int64_t modbMetadataCreate(stored_conn *sconn, modb_ref *modb, - const struct metadata_t *const metadata) +unsigned int modbMetadataCreate(stored_conn *sconn, modb_ref *modb, + struct metadata_t *metadata) { str_builder *sb; char *table; @@ -314,6 +323,13 @@ int64_t modbMetadataCreate(stored_conn *sconn, modb_ref *modb, size_t qry_len; 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) { 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); db_value_sb(sb, TYPE_ID, 1, metadata->id); 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, ','); - 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, ','); if (metadata->owner != 0) { 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, - const struct metadata_t *const metadata) + struct metadata_t *metadata) { str_builder *sb; char *table, *set; size_t table_len, set_len; 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) { return 0; } @@ -361,13 +384,13 @@ int64_t modbMetadataReplace(stored_conn *sconn, modb_ref *modb, unsigned int id, strbld_char(sb, ','); columnSetValueStr_sb(sb, "mdo_id", TYPE_ID, 1, metadata->id); } - if (metadata->type != 0) { + if (metadata->type_c != 0) { 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, ','); - 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) { strbld_char(sb, ','); diff --git a/src/modb_metadata.h b/src/modb_metadata.h index 7299752..d3eec98 100644 --- a/src/modb_metadata.h +++ b/src/modb_metadata.h @@ -10,9 +10,11 @@ struct metadata_t { unsigned int id; char *type; + const char *type_c; size_t type_len; char *title; + const char *title_c; size_t title_len; 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, struct metadata_t ***metadata_list, size_t *n_metadatas); -int64_t modbMetadataCreate(stored_conn *sconn, modb_ref *modb, - const struct metadata_t *const metadata); +unsigned int modbMetadataCreate(stored_conn *sconn, modb_ref *modb, + struct metadata_t *metadata); 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, const char *type, size_t type_len); int64_t modbMetadataUpdateTitle(stored_conn *sconn, modb_ref *modb, unsigned int id, diff --git a/src/modb_metadata_ext.c b/src/modb_metadata_ext.c index 00676de..6db5dec 100644 --- a/src/modb_metadata_ext.c +++ b/src/modb_metadata_ext.c @@ -16,7 +16,6 @@ int tableRowsToMetaExtList(column_data **col_data, size_t n_cols, size_t n_rows, r_idx, c_idx, v_idx; struct meta_ext_t *ext; struct meta_ext_value_t *ext_value; - size_t key_len; n_rows = (*col_data)->n_values; if (n_rows == 0) { @@ -55,7 +54,7 @@ int tableRowsToMetaExtList(column_data **col_data, size_t n_cols, } 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); 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++) { ext_value = (*(meta_ext->values + idx)); 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); db_value_sb(sb, TYPE_ID, 1, meta_ext->id); diff --git a/src/modb_metadata_ext.h b/src/modb_metadata_ext.h index 0f91bf5..2651ab1 100644 --- a/src/modb_metadata_ext.h +++ b/src/modb_metadata_ext.h @@ -27,7 +27,10 @@ struct meta_ext_t { struct meta_ext_value_t { char *key; const char *key_c; + size_t key_len; + enum e_value_type_t type; + union { void *raw; int bool; diff --git a/src/modb_objects.c b/src/modb_objects.c index 323c25a..b5d63bd 100644 --- a/src/modb_objects.c +++ b/src/modb_objects.c @@ -42,6 +42,7 @@ int tableRowsToObjects(column_data **col_data, size_t n_cols, freeObjects(objects, idx); return -1; } + object->data_c = object->data; *(*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, - unsigned int id, const char *data, size_t data_len) + struct object_t *object) { str_builder *sb; char *table; @@ -221,6 +222,10 @@ int64_t modbObjectCreate(stored_conn *sconn, modb_ref *modb, size_t qry_len; uint64_t qry_ret; + if (object->data_c == 0) { + object->data_c = object->data; + } + if ((sb = strbld_create()) == 0) { return -1; } @@ -229,9 +234,9 @@ int64_t modbObjectCreate(stored_conn *sconn, modb_ref *modb, strbld_str(sb, "INSERT INTO ", 0); escapeTableName_sb(sb, table, table_len); 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, ','); - 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, ')'); modbFreeTableName(&table); @@ -242,23 +247,31 @@ int64_t modbObjectCreate(stored_conn *sconn, modb_ref *modb, qry_ret = simpleQuery(sconn, qry, qry_len); 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, - const char *data, size_t data_len) + struct object_t *object) { str_builder *sb; char *table, *set; size_t table_len, set_len; int64_t qry_ret; + if (object->data_c == 0) { + object->data_c = object->data; + } + if ((sb = strbld_create()) == 0) { return 0; } columnSetValueStr_sb(sb, "mdo_id", TYPE_ID, 1, id); - if (data != 0) { + if (object->id != 0 && object->id != id) { 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) { return 0; diff --git a/src/modb_objects.h b/src/modb_objects.h index 9f78d4b..cbe0b23 100644 --- a/src/modb_objects.h +++ b/src/modb_objects.h @@ -10,6 +10,7 @@ struct object_t { unsigned int id; char *data; + const char *data_c; size_t data_len; }; @@ -22,17 +23,13 @@ void freeObjects(struct object_t ***objects_ptr, size_t n_objects); // MODB Objects int modbObjectById(stored_conn *sconn, modb_ref *modb, unsigned int id, 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, struct object_t ***objects, size_t *n_objects); -int64_t modbObjectCreate(stored_conn *sconn, modb_ref *modb, - unsigned int id, const char *data, size_t data_len); +int64_t modbObjectCreate(stored_conn *sconn, modb_ref *modb, struct object_t *object); 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 modbObjectDestroy(stored_conn *sconn, modb_ref *modb, unsigned int id); diff --git a/src/modb_users.c b/src/modb_users.c index bc3bd59..485c0bd 100644 --- a/src/modb_users.c +++ b/src/modb_users.c @@ -47,11 +47,13 @@ int tableRowsToUsers(column_data **col_data, size_t n_cols, freeUsers(users, idx); return -1; } + user->username_c = user->username; if (!moveColumnStrPointer(col_email, idx, 1, &user->email, &user->email_len)) { freeUsers(users, idx); return -1; } + user->email_c = user->email; user->created_on = *(col_created->data.ptr_int64 + 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; } -int64_t modbUserCreate(stored_conn *sconn, modb_ref *modb, - unsigned int id, const char *user_name, const char *email) +int64_t modbUserCreate(stored_conn *sconn, modb_ref *modb, struct user_t *user) { str_builder *sb; char *table; @@ -313,6 +314,13 @@ int64_t modbUserCreate(stored_conn *sconn, modb_ref *modb, size_t qry_len; 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) { return -1; } @@ -321,11 +329,11 @@ int64_t modbUserCreate(stored_conn *sconn, modb_ref *modb, strbld_str(sb, "INSERT INTO ", 0); escapeTableName_sb(sb, table, table_len); 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, ','); - 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, ','); - db_value_sb(sb, TYPE_STRING, 1, email); + db_value_sb(sb, TYPE_STRING, 2, user->email_c, user->email_len); strbld_char(sb, ')'); modbFreeTableName(&table); @@ -338,25 +346,35 @@ int64_t modbUserCreate(stored_conn *sconn, modb_ref *modb, return (int64_t)qry_ret; } -int64_t modbUserUpdate(stored_conn *sconn, modb_ref *modb, 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) { str_builder *sb; char *table, *set; size_t table_len, set_len; 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) { return 0; } columnSetValueStr_sb(sb, "id", TYPE_ID, 1, id); - if (username != 0) { + if (user->id != 0 && user->id != id) { 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, ','); - 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) { return 0; diff --git a/src/modb_users.h b/src/modb_users.h index 99b6df2..f7df5c7 100644 --- a/src/modb_users.h +++ b/src/modb_users.h @@ -10,9 +10,11 @@ struct user_t { unsigned int id; char *username; + const char *username_c; size_t username_len; char *email; + const char *email_c; size_t email_len; 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, struct user_t ***users, size_t *n_users); -int64_t modbUserCreate(stored_conn *sconn, modb_ref *modb, - unsigned int id, const char *username, const char *email); -int64_t modbUserUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id, - const char *username, const char *email); +int64_t modbUserCreate(stored_conn *sconn, modb_ref *modb, struct user_t *user); +int64_t modbUserUpdate(stored_conn *sconn, modb_ref *modb, unsigned int id, struct user_t *user); int modbUserDelete(stored_conn *sconn, modb_ref *modb, unsigned int id); int modbUserDestroy(stored_conn *sconn, modb_ref *modb, unsigned int id);