From 02d11c75b24f25ab60cdb96dfe5d7559640ec003 Mon Sep 17 00:00:00 2001 From: avsdev-cw Date: Tue, 15 Sep 2020 17:31:51 +0100 Subject: [PATCH] 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 --- src/db_column.c | 6 +- src/db_query.c | 160 ++++++++++++++++++------------------------------ 2 files changed, 62 insertions(+), 104 deletions(-) diff --git a/src/db_column.c b/src/db_column.c index 7f6af02..5556797 100644 --- a/src/db_column.c +++ b/src/db_column.c @@ -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->isTimestamp = (field->flags & TIMESTAMP_FLAG) > 0; + if (num_rows == 0) { + return col; + } + col->data.vptr = malloc(col->type_bytes * num_rows); if (col->data.vptr == NULL) { 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); - col->data_sizes = 0; if (col->hasPointers) { col->data_sizes = (size_t *)malloc(sizeof(size_t) * num_rows); 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); } - col->nulls = 0; if (col->isNullable) { col->nulls = malloc(num_rows / 8 + 1); if (col->nulls == NULL) { diff --git a/src/db_query.c b/src/db_query.c index df58cff..3960aab 100644 --- a/src/db_query.c +++ b/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)); } -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, 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)); 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; } 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); - if (result == NULL) { + if (col_data == NULL) { fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno)); mysql_free_result(result); return insertId; } + memset(col_data, 0, sizeof(struct column_data_t *) * *n_cols); n_rows = mysql_num_rows(result); 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; 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))) { default_value = *((*col_data)->data.ptr_int32); } - freeColumn(*col_data); - free(col_data); } + freeColumn(*col_data); + free(col_data); + 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; 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))) { default_value = *((*col_data)->data.ptr_uint32); } - freeColumn(*col_data); - free(col_data); } + freeColumn(*col_data); + free(col_data); + 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; 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))) { default_value = *((*col_data)->data.ptr_double); } - freeColumn(*col_data); - free(col_data); } + freeColumn(*col_data); + free(col_data); + 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; 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))) { default_value = *((*col_data)->data.ptr_str)[0]; } - freeColumn(*col_data); - free(col_data); } + freeColumn(*col_data); + free(col_data); + 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; 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; } - if ((*col_data)->isNullable && columnRowIsNull(*col_data, 0)) { - retval = NULL; - } else { - retval = (char *)malloc((*col_data)->data_sizes[0] + 1); - if (retval == 0) { - fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno)); - return default_value; + if (n_rows > 0) { + if (!((*col_data)->isNullable && columnRowIsNull(*col_data, 0))) { + retval = (char *)malloc((*col_data)->data_sizes[0] + 1); + if (retval == 0) { + fprintf(stderr, "[%d]malloc: (%d) %s\n", __LINE__, errno, strerror(errno)); + freeColumn(*col_data); + 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); free(col_data);