Convenience functions for moving/copying column data strings & blobs
This commit is contained in:
@@ -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);
|
||||
|
||||
50
src/modb_p.c
50
src/modb_p.c
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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__
|
||||
|
||||
Reference in New Issue
Block a user