From 1c79c56d617dee3a70e848d7ba437a69ef0330db Mon Sep 17 00:00:00 2001 From: avsdev-cw Date: Thu, 8 Oct 2020 10:21:17 +0100 Subject: [PATCH] Convenience functions for moving/copying column data strings & blobs --- src/modb_accounting_p.c | 13 ++++++----- src/modb_p.c | 50 +++++++++++++++++++++++++++++++++++++++++ src/modb_p.h | 5 +++++ 3 files changed, 62 insertions(+), 6 deletions(-) diff --git a/src/modb_accounting_p.c b/src/modb_accounting_p.c index e82a24d..c32550c 100644 --- a/src/modb_accounting_p.c +++ b/src/modb_accounting_p.c @@ -42,13 +42,13 @@ int tableRowsToUsers(column_data **col_data, size_t n_cols, } user->id = *(col_id->data.ptr_uint32 + idx); - if (strmemcpy(*(col_username->data.ptr_str + idx), *(col_username->data_lens + idx), - &user->username, &user->username_len) != 0) { + + if (!moveColumnStrPointer(col_username, idx, 1, &user->username, &user->username_len)) { freeUsers(users, idx); return -1; } - if (strmemcpy(*(col_email->data.ptr_str + idx), *(col_email->data_lens + idx), - &user->email, &user->email_len) != 0) { + + if (!moveColumnStrPointer(col_email, idx, 1, &user->email, &user->email_len)) { freeUsers(users, idx); return -1; } @@ -177,11 +177,12 @@ int tableRowsToGroups(column_data **col_data, size_t n_cols, } group->id = *(col_id->data.ptr_uint32 + idx); - if (strmemcpy(*(col_name->data.ptr_str + idx), *(col_name->data_lens + idx), - &group->name, &group->name_len) != 0) { + + if (!moveColumnStrPointer(col_name, idx, 1, &group->name, &group->name_len)) { freeGroups(groups, idx); return -1; } + group->created_on = *(col_created->data.ptr_uint32 + idx); if (!columnRowIsNull(col_updated, idx)) { group->updated_on = *(col_updated->data.ptr_uint32 + idx); diff --git a/src/modb_p.c b/src/modb_p.c index b44542a..173a29b 100644 --- a/src/modb_p.c +++ b/src/modb_p.c @@ -1,3 +1,7 @@ +#include +#include +#include + #include "modb_p.h" #include "strext.h" @@ -144,3 +148,49 @@ void modbColumnNameAs_sb(str_builder *sb, modb_ref *modb, strbld_str(sb, as_column, as_column_len); strbld_char(sb, '`'); } + + +int moveColumnStrPointer(column_data *col, size_t row, int move, char **target, size_t *target_len) +{ + if (columnRowIsNull(col, row)) { + return 0; + } + + if (move) { + *target = *(col->data.ptr_str + row); + *(col->data.ptr_str + row) = 0; + *target_len = *(col->data_lens + row); + *(col->data_lens + row) = 0; + } else { + if (strmemcpy(*(col->data.ptr_str + row), *(col->data_lens + row), target, target_len) != 0) { + return -1; + } + } + + return 0; +} +int moveColumnBlobPointer(column_data *col, size_t row, int move, + char **target, size_t *target_len) +{ + if (columnRowIsNull(col, row)) { + return 0; + } + + if (move) { + *target = *(col->data.ptr_blob + row); + *(col->data.ptr_blob + row) = 0; + *target_len = *(col->data_lens + row); + *(col->data_lens + row) = 0; + } else { + *target = (char *)malloc(*(col->data_lens + row)); + if (*target == 0) { + fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno)); + return -1; + } + + memcpy(*target, *(col->data.ptr_blob + row), *(col->data_lens + row)); + *target_len = *(col->data_lens + row); + } + + return 0; +} diff --git a/src/modb_p.h b/src/modb_p.h index ae87e9a..51e8d44 100644 --- a/src/modb_p.h +++ b/src/modb_p.h @@ -4,6 +4,7 @@ #include #include "modb_types.h" +#include "database.h" #include "strext.h" @@ -48,5 +49,9 @@ void modbColumnNameAs_sb(str_builder *sb, modb_ref *modb, const char *column, size_t column_len, const char *as_column, size_t as_column_len); +int moveColumnStrPointer(column_data *col, size_t row, int move, char **target, size_t *target_len); +int moveColumnBlobPointer(column_data *col, size_t row, int move, + char **target, size_t *target_len); + #endif // H__MODB_P__