diff --git a/src/db_column.c b/src/db_column.c index 82e6bb3..cef46bc 100644 --- a/src/db_column.c +++ b/src/db_column.c @@ -259,15 +259,24 @@ void freeColumn(struct column_data_t *col) col->nulls = 0; } - free(col->name); - col->name = 0; + if (col->table) { + free(col->table); + col->table = 0; + } + + if (col->name) { + free(col->name); + col->name = 0; + } free(col); } void freeColumns(struct column_data_t **col_data, size_t n_cols) { for (size_t c = 0; c < n_cols; c++) { - freeColumn(*(col_data + c)); + if (*(col_data + c) != 0) { + freeColumn(*(col_data + c)); + } } free(col_data); } diff --git a/src/db_query.c b/src/db_query.c index 3719605..4907505 100644 --- a/src/db_query.c +++ b/src/db_query.c @@ -145,12 +145,7 @@ uint64_t tableQuery(struct stored_conn_t *sconn, const char *qry, size_t qry_len } if (failed > 0) { - for (size_t c = 0; c < *n_cols; c++) { - if (*(col_data + c) != 0) { - freeColumn(*(col_data + c)); - } - } - free(col_data); + freeColumns(col_data, *n_cols); mysql_free_result(result); return insertId; } @@ -170,6 +165,7 @@ int scalarInt(struct stored_conn_t *sconn, const char *qry, size_t qry_len, int uint64_t n_rows = tableQuery(sconn, qry, qry_len, 1, &col_data, &n_cols); if (n_rows == (uint64_t)-1) { + freeColumns(col_data, n_cols); return default_value; } @@ -179,8 +175,7 @@ int scalarInt(struct stored_conn_t *sconn, const char *qry, size_t qry_len, int } } - freeColumn(*col_data); - free(col_data); + freeColumns(col_data, n_cols); return default_value; } @@ -202,8 +197,7 @@ unsigned int scalarUInt(struct stored_conn_t *sconn, const char *qry, size_t qry } } - freeColumn(*col_data); - free(col_data); + freeColumns(col_data, n_cols); return default_value; } @@ -225,8 +219,7 @@ double scalarReal(struct stored_conn_t *sconn, const char *qry, size_t qry_len, } } - freeColumn(*col_data); - free(col_data); + freeColumns(col_data, n_cols); return default_value; } @@ -247,8 +240,7 @@ char scalarChar(struct stored_conn_t *sconn, const char *qry, size_t qry_len, ch } } - freeColumn(*col_data); - free(col_data); + freeColumns(col_data, n_cols); return default_value; } @@ -268,15 +260,12 @@ char *scalarString(struct stored_conn_t *sconn, const char *qry, size_t qry_len, if (n_rows > 0) { if (!((*col_data)->isNullable && columnRowIsNull(*col_data, 0))) { if (strmemcpy(*((*col_data)->data.ptr_str), (*col_data)->data_lens[0], &retval, &len) != 0) { - freeColumn(*col_data); - free(col_data); - return NULL; + retval = NULL; } } } - freeColumn(*col_data); - free(col_data); + freeColumns(col_data, n_cols); return retval; } @@ -297,10 +286,10 @@ int64_t countQuery(struct stored_conn_t *sconn, const char *table, where_builder strbld_str(sb, "` WHERE ", 0); compileWhereBuilder_sb(wb, sb); if (strbld_finalize_or_destroy(&sb, &qry, &qry_len) != 0) { - free(wb); + destroyWhereBuilder(&wb); return -1; } - free(wb); + destroyWhereBuilder(&wb); qry_ret = scalarInt(sconn, qry, qry_len, 0); free(qry); @@ -351,7 +340,7 @@ int syncIdMap(struct stored_conn_t *sconn, const char *table, wb = where(table, primary_col, EQ, TYPE_ID, 1, primary_id); qry_ret = deleteQuery(sconn, table, wb); - free(wb); + destroyWhereBuilder(&wb); if (qry_ret != 0) { return qry_ret; @@ -422,7 +411,7 @@ int hasIdMap(struct stored_conn_t *sconn, const char *table, where(table, map_col, EQ, TYPE_ID, 1, map_id) ); qry_ret = countQuery(sconn, table, wb); - free(wb); + destroyWhereBuilder(&wb); return qry_ret > 0; } @@ -479,7 +468,7 @@ int removeIdMap(struct stored_conn_t *sconn, const char *table, where(table, map_col, EQ, TYPE_ID, 1, map_id) ); qry_ret = deleteQuery(sconn, table, wb); - free(wb); + destroyWhereBuilder(&wb); return qry_ret; } diff --git a/src/db_where-builder_p.c b/src/db_where-builder_p.c index fd6a1da..e5888c9 100644 --- a/src/db_where-builder_p.c +++ b/src/db_where-builder_p.c @@ -255,7 +255,7 @@ void freeWhere(where_clause **where_ptr) clause->col = 0; } - if (clause->table) { + if (clause->table != 0) { free(clause->table); clause->table = 0; }