Some changes to db
- Generic ScalarQuery is no longer used so removed - Handle the case where the column length is > 0 but the number of rows is 0
This commit is contained in:
@@ -154,6 +154,10 @@ struct column_data_t *columnFromResult(struct stored_conn_t *sconn, MYSQL_RES *r
|
|||||||
col->isBlob = (field->flags & BLOB_FLAG) > 0;
|
col->isBlob = (field->flags & BLOB_FLAG) > 0;
|
||||||
col->isTimestamp = (field->flags & TIMESTAMP_FLAG) > 0;
|
col->isTimestamp = (field->flags & TIMESTAMP_FLAG) > 0;
|
||||||
|
|
||||||
|
if (num_rows == 0) {
|
||||||
|
return col;
|
||||||
|
}
|
||||||
|
|
||||||
col->data.vptr = malloc(col->type_bytes * num_rows);
|
col->data.vptr = malloc(col->type_bytes * num_rows);
|
||||||
if (col->data.vptr == NULL) {
|
if (col->data.vptr == NULL) {
|
||||||
fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno));
|
fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno));
|
||||||
@@ -163,7 +167,6 @@ struct column_data_t *columnFromResult(struct stored_conn_t *sconn, MYSQL_RES *r
|
|||||||
}
|
}
|
||||||
memset(col->data.vptr, 0, col->type_bytes * num_rows);
|
memset(col->data.vptr, 0, col->type_bytes * num_rows);
|
||||||
|
|
||||||
col->data_sizes = 0;
|
|
||||||
if (col->hasPointers) {
|
if (col->hasPointers) {
|
||||||
col->data_sizes = (size_t *)malloc(sizeof(size_t) * num_rows);
|
col->data_sizes = (size_t *)malloc(sizeof(size_t) * num_rows);
|
||||||
if (col->data_sizes == NULL) {
|
if (col->data_sizes == NULL) {
|
||||||
@@ -176,7 +179,6 @@ struct column_data_t *columnFromResult(struct stored_conn_t *sconn, MYSQL_RES *r
|
|||||||
memset(col->data_sizes, 0, sizeof(size_t) * num_rows);
|
memset(col->data_sizes, 0, sizeof(size_t) * num_rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
col->nulls = 0;
|
|
||||||
if (col->isNullable) {
|
if (col->isNullable) {
|
||||||
col->nulls = malloc(num_rows / 8 + 1);
|
col->nulls = malloc(num_rows / 8 + 1);
|
||||||
if (col->nulls == NULL) {
|
if (col->nulls == NULL) {
|
||||||
|
|||||||
160
src/db_query.c
160
src/db_query.c
@@ -20,83 +20,6 @@ uint64_t simpleQuery(struct stored_conn_t *sconn, const char *qry, size_t qry_le
|
|||||||
return mysql_insert_id(SQCONN(sconn));
|
return mysql_insert_id(SQCONN(sconn));
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t scalarQuery(struct stored_conn_t *sconn, const char *qry, size_t qry_len,
|
|
||||||
char **res, size_t *res_len)
|
|
||||||
{
|
|
||||||
my_ulonglong insertId;
|
|
||||||
my_ulonglong n_row, n_col;
|
|
||||||
MYSQL_RES *result;
|
|
||||||
MYSQL_ROW row;
|
|
||||||
unsigned long *lens;
|
|
||||||
|
|
||||||
insertId = simpleQuery(sconn, qry, qry_len);
|
|
||||||
if (insertId == (uint64_t)-1) {
|
|
||||||
return insertId;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mysql_field_count(SQCONN(sconn)) == 0) {
|
|
||||||
// insert/update query
|
|
||||||
// TODO: res = makeInt64() // lastInsertId
|
|
||||||
return insertId;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
result = mysql_store_result(SQCONN(sconn));
|
|
||||||
if (result == NULL) {
|
|
||||||
fprintf(
|
|
||||||
stderr, "[%d]mysql_store_result: (%d) %s\n",
|
|
||||||
__LINE__, mysql_errno(SQCONN(sconn)), mysql_error(SQCONN(sconn))
|
|
||||||
);
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
n_row = mysql_num_rows(result);
|
|
||||||
if (n_row == 0) {
|
|
||||||
fprintf(stderr, "[%d]scalarQuery: Not enough rows in result\n", __LINE__);
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
if (n_row > 1) {
|
|
||||||
fprintf(
|
|
||||||
stderr, "[%d]scalarQuery: WARN: Too many rows in result, only returning first value\n",
|
|
||||||
__LINE__
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
n_col = mysql_num_fields(result);
|
|
||||||
if (n_col > 1) {
|
|
||||||
fprintf(
|
|
||||||
stderr, "[%d]scalarQuery: WARN: Too many columns in result, only returning first value\n",
|
|
||||||
__LINE__
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
row = mysql_fetch_row(result);
|
|
||||||
lens = mysql_fetch_lengths(result);
|
|
||||||
if (row == NULL) {
|
|
||||||
fprintf(stderr, "[%d]scalarQuery: Not enough rows in result\n", __LINE__);
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*row == NULL) {
|
|
||||||
(*res_len) = 0;
|
|
||||||
(*res) = 0;
|
|
||||||
} else {
|
|
||||||
(*res_len) = *(lens + 0);
|
|
||||||
(*res) = malloc(*(lens + 0) * sizeof(char) + 1);
|
|
||||||
if ((*res) == 0) {
|
|
||||||
fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno));
|
|
||||||
return (uint64_t)-1;
|
|
||||||
}
|
|
||||||
memcpy((*res), *(row + 0), *(lens + 0));
|
|
||||||
*((*res) + *(lens + 0)) = '\0';
|
|
||||||
}
|
|
||||||
|
|
||||||
mysql_free_result(result);
|
|
||||||
|
|
||||||
return insertId;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t tableQuery(struct stored_conn_t *sconn, const char *qry, size_t qry_len, int scalar_result,
|
uint64_t tableQuery(struct stored_conn_t *sconn, const char *qry, size_t qry_len, int scalar_result,
|
||||||
struct column_data_t ***col_data_ptr, size_t *n_cols)
|
struct column_data_t ***col_data_ptr, size_t *n_cols)
|
||||||
{
|
{
|
||||||
@@ -115,7 +38,11 @@ uint64_t tableQuery(struct stored_conn_t *sconn, const char *qry, size_t qry_len
|
|||||||
|
|
||||||
*n_cols = mysql_field_count(SQCONN(sconn));
|
*n_cols = mysql_field_count(SQCONN(sconn));
|
||||||
if (scalar_result && (*n_cols) > 1) {
|
if (scalar_result && (*n_cols) > 1) {
|
||||||
// TODO: throw warning due to column sizing issue
|
fprintf(
|
||||||
|
stderr,
|
||||||
|
"[%d]tableQuery: Scalar result expected, got %ul columns. Using first column value\n",
|
||||||
|
__LINE__, (unsigned int)*n_cols
|
||||||
|
);
|
||||||
(*n_cols) = 1;
|
(*n_cols) = 1;
|
||||||
}
|
}
|
||||||
if (*n_cols == 0) {
|
if (*n_cols == 0) {
|
||||||
@@ -135,11 +62,12 @@ uint64_t tableQuery(struct stored_conn_t *sconn, const char *qry, size_t qry_len
|
|||||||
|
|
||||||
|
|
||||||
col_data = (struct column_data_t **)malloc(sizeof(struct column_data_t *) * *n_cols);
|
col_data = (struct column_data_t **)malloc(sizeof(struct column_data_t *) * *n_cols);
|
||||||
if (result == NULL) {
|
if (col_data == NULL) {
|
||||||
fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno));
|
fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno));
|
||||||
mysql_free_result(result);
|
mysql_free_result(result);
|
||||||
return insertId;
|
return insertId;
|
||||||
}
|
}
|
||||||
|
memset(col_data, 0, sizeof(struct column_data_t *) * *n_cols);
|
||||||
|
|
||||||
n_rows = mysql_num_rows(result);
|
n_rows = mysql_num_rows(result);
|
||||||
if (scalar_result && n_rows > 1) {
|
if (scalar_result && n_rows > 1) {
|
||||||
@@ -215,15 +143,21 @@ int scalarInt(struct stored_conn_t *sconn, const char *qry, size_t qry_len, int
|
|||||||
{
|
{
|
||||||
struct column_data_t **col_data;
|
struct column_data_t **col_data;
|
||||||
size_t n_cols;
|
size_t n_cols;
|
||||||
|
uint64_t n_rows = tableQuery(sconn, qry, qry_len, 1, &col_data, &n_cols);
|
||||||
|
|
||||||
if (tableQuery(sconn, qry, qry_len, 1, &col_data, &n_cols) != (uint64_t)-1) {
|
if (n_rows == (uint64_t)-1) {
|
||||||
|
return default_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n_rows > 0) {
|
||||||
if (!((*col_data)->isNullable && columnRowIsNull(*col_data, 0))) {
|
if (!((*col_data)->isNullable && columnRowIsNull(*col_data, 0))) {
|
||||||
default_value = *((*col_data)->data.ptr_int32);
|
default_value = *((*col_data)->data.ptr_int32);
|
||||||
}
|
}
|
||||||
freeColumn(*col_data);
|
|
||||||
free(col_data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
freeColumn(*col_data);
|
||||||
|
free(col_data);
|
||||||
|
|
||||||
return default_value;
|
return default_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,15 +166,21 @@ unsigned int scalarUInt(struct stored_conn_t *sconn, const char *qry, size_t qry
|
|||||||
{
|
{
|
||||||
struct column_data_t **col_data;
|
struct column_data_t **col_data;
|
||||||
size_t n_cols;
|
size_t n_cols;
|
||||||
|
uint64_t n_rows = tableQuery(sconn, qry, qry_len, 1, &col_data, &n_cols);
|
||||||
|
|
||||||
if (tableQuery(sconn, qry, qry_len, 1, &col_data, &n_cols) != (uint64_t)-1) {
|
if (n_rows == (uint64_t)-1) {
|
||||||
|
return default_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n_rows > 0) {
|
||||||
if (!((*col_data)->isNullable && columnRowIsNull(*col_data, 0))) {
|
if (!((*col_data)->isNullable && columnRowIsNull(*col_data, 0))) {
|
||||||
default_value = *((*col_data)->data.ptr_uint32);
|
default_value = *((*col_data)->data.ptr_uint32);
|
||||||
}
|
}
|
||||||
freeColumn(*col_data);
|
|
||||||
free(col_data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
freeColumn(*col_data);
|
||||||
|
free(col_data);
|
||||||
|
|
||||||
return default_value;
|
return default_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,15 +189,21 @@ double scalarReal(struct stored_conn_t *sconn, const char *qry, size_t qry_len,
|
|||||||
{
|
{
|
||||||
struct column_data_t **col_data;
|
struct column_data_t **col_data;
|
||||||
size_t n_cols;
|
size_t n_cols;
|
||||||
|
uint64_t n_rows = tableQuery(sconn, qry, qry_len, 1, &col_data, &n_cols);
|
||||||
|
|
||||||
if (tableQuery(sconn, qry, qry_len, 1, &col_data, &n_cols) != (uint64_t)-1) {
|
if (n_rows == (uint64_t)-1) {
|
||||||
|
return default_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n_rows > 0) {
|
||||||
if (!((*col_data)->isNullable && columnRowIsNull(*col_data, 0))) {
|
if (!((*col_data)->isNullable && columnRowIsNull(*col_data, 0))) {
|
||||||
default_value = *((*col_data)->data.ptr_double);
|
default_value = *((*col_data)->data.ptr_double);
|
||||||
}
|
}
|
||||||
freeColumn(*col_data);
|
|
||||||
free(col_data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
freeColumn(*col_data);
|
||||||
|
free(col_data);
|
||||||
|
|
||||||
return default_value;
|
return default_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -265,15 +211,21 @@ char scalarChar(struct stored_conn_t *sconn, const char *qry, size_t qry_len, ch
|
|||||||
{
|
{
|
||||||
struct column_data_t **col_data;
|
struct column_data_t **col_data;
|
||||||
size_t n_cols;
|
size_t n_cols;
|
||||||
|
uint64_t n_rows = tableQuery(sconn, qry, qry_len, 1, &col_data, &n_cols);
|
||||||
|
|
||||||
if (tableQuery(sconn, qry, qry_len, 1, &col_data, &n_cols) != (uint64_t)-1) {
|
if (n_rows == (uint64_t)-1) {
|
||||||
|
return default_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n_rows > 0) {
|
||||||
if (!((*col_data)->isNullable && columnRowIsNull(*col_data, 0))) {
|
if (!((*col_data)->isNullable && columnRowIsNull(*col_data, 0))) {
|
||||||
default_value = *((*col_data)->data.ptr_str)[0];
|
default_value = *((*col_data)->data.ptr_str)[0];
|
||||||
}
|
}
|
||||||
freeColumn(*col_data);
|
|
||||||
free(col_data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
freeColumn(*col_data);
|
||||||
|
free(col_data);
|
||||||
|
|
||||||
return default_value;
|
return default_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -282,23 +234,27 @@ char *scalarString(struct stored_conn_t *sconn, const char *qry, size_t qry_len,
|
|||||||
{
|
{
|
||||||
struct column_data_t **col_data;
|
struct column_data_t **col_data;
|
||||||
size_t n_cols;
|
size_t n_cols;
|
||||||
char *retval;
|
char *retval = NULL;
|
||||||
|
uint64_t n_rows = tableQuery(sconn, qry, qry_len, 1, &col_data, &n_cols);
|
||||||
|
|
||||||
if (tableQuery(sconn, qry, qry_len, 1, &col_data, &n_cols) == (uint64_t)-1) {
|
if (n_rows == (uint64_t)-1) {
|
||||||
return default_value;
|
return default_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*col_data)->isNullable && columnRowIsNull(*col_data, 0)) {
|
if (n_rows > 0) {
|
||||||
retval = NULL;
|
if (!((*col_data)->isNullable && columnRowIsNull(*col_data, 0))) {
|
||||||
} else {
|
retval = (char *)malloc((*col_data)->data_sizes[0] + 1);
|
||||||
retval = (char *)malloc((*col_data)->data_sizes[0] + 1);
|
if (retval == 0) {
|
||||||
if (retval == 0) {
|
fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno));
|
||||||
fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno));
|
freeColumn(*col_data);
|
||||||
return default_value;
|
free(col_data);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
memcpy(retval, *((*col_data)->data.ptr_str), (*col_data)->data_sizes[0]);
|
||||||
|
retval[(*col_data)->data_sizes[0]] = '\0';
|
||||||
}
|
}
|
||||||
memcpy(retval, *((*col_data)->data.ptr_str), (*col_data)->data_sizes[0]);
|
|
||||||
retval[(*col_data)->data_sizes[0]] = '\0';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
freeColumn(*col_data);
|
freeColumn(*col_data);
|
||||||
free(col_data);
|
free(col_data);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user