Convenience functions for moving/copying column data strings & blobs

This commit is contained in:
2020-10-08 10:21:17 +01:00
parent 6035772774
commit 1c79c56d61
3 changed files with 62 additions and 6 deletions

View File

@@ -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);

View File

@@ -1,3 +1,7 @@
#include <stdio.h>
#include <errno.h>
#include <string.h>
#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;
}

View File

@@ -4,6 +4,7 @@
#include <stddef.h>
#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__