Skip to content

Commit 499c743

Browse files
committed
Improved dbutils_table_settings_get_value
1 parent c119ffa commit 499c743

3 files changed

Lines changed: 28 additions & 40 deletions

File tree

src/dbutils.c

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -226,12 +226,11 @@ int dbutils_settings_check_version (cloudsync_context *data, const char *version
226226
return res;
227227
}
228228

229-
char *dbutils_table_settings_get_value (cloudsync_context *data, const char *table, const char *column_name, const char *key, char *buffer, size_t blen) {
229+
int dbutils_table_settings_get_value (cloudsync_context *data, const char *table, const char *column_name, const char *key, char *buffer, size_t blen) {
230230
DEBUG_SETTINGS("dbutils_table_settings_get_value table: %s column: %s key: %s", table, column_name, key);
231-
232-
// check if heap allocation must be forced
233-
if (!buffer || blen == 0) blen = 0;
234-
size_t size = 0;
231+
232+
if (!buffer || blen == 0) return DBRES_MISUSE;
233+
buffer[0] = 0;
235234

236235
dbvm_t *vm = NULL;
237236
int rc = databasevm_prepare(data, SQL_TABLE_SETTINGS_GET_VALUE, (void **)&vm, 0);
@@ -251,40 +250,30 @@ char *dbutils_table_settings_get_value (cloudsync_context *data, const char *tab
251250
else if (rc != DBRES_ROW) goto finalize_get_value;
252251

253252
// SQLITE_ROW case
254-
if (database_column_type(vm, 0) == DBTYPE_NULL) {
255-
buffer = NULL;
253+
if (rc == DBRES_ROW) {
256254
rc = DBRES_OK;
257-
goto finalize_get_value;
258-
}
255+
256+
// NULL case
257+
if (database_column_type(vm, 0) == DBTYPE_NULL) {
258+
goto finalize_get_value;
259+
}
259260

260-
const char *value = database_column_text(vm, 0);
261-
#if CLOUDSYNC_UNITTEST
262-
size = (buffer == OUT_OF_MEMORY_BUFFER) ? (SQLITE_MAX_ALLOCATION_SIZE + 1) :(size_t)database_column_bytes(vm, 0);
263-
#else
264-
size = (size_t)database_column_bytes(vm, 0);
265-
#endif
266-
if (size + 1 > blen) {
267-
buffer = cloudsync_memory_alloc((uint64_t)(size + 1));
268-
if (!buffer) {
261+
const char *value = database_column_text(vm, 0);
262+
size_t size = (size_t)database_column_bytes(vm, 0);
263+
if (size + 1 > blen) {
269264
rc = DBRES_NOMEM;
270-
goto finalize_get_value;
265+
} else {
266+
memcpy(buffer, value, size);
267+
buffer[size] = '\0';
271268
}
272269
}
273270

274-
memcpy(buffer, value, size+1);
275-
rc = DBRES_OK;
276-
277-
finalize_get_value:
278-
#if CLOUDSYNC_UNITTEST
279-
if ((rc == DBRES_NOMEM) && (size == SQLITE_MAX_ALLOCATION_SIZE + 1)) rc = DBRES_OK;
280-
#endif
271+
finalize_get_value:
281272
if (rc != DBRES_OK) {
282-
buffer = NULL;
283273
DEBUG_ALWAYS("cloudsync_table_settings error %s", database_errmsg(data));
284274
}
285-
if (vm) databasevm_finalize(vm);
286-
287-
return buffer;
275+
if (vm) databasevm_finalize(vm);
276+
return rc;
288277
}
289278

290279
int dbutils_table_settings_set_key_value (cloudsync_context *data, const char *table_name, const char *column_name, const char *key, const char *value) {
@@ -341,8 +330,8 @@ table_algo dbutils_table_settings_get_algo (cloudsync_context *data, const char
341330
DEBUG_SETTINGS("dbutils_table_settings_get_algo %s", table_name);
342331

343332
char buffer[512];
344-
char *value = dbutils_table_settings_get_value(data, table_name, "*", "algo", buffer, sizeof(buffer));
345-
return (value) ? cloudsync_algo_from_name(value) : table_algo_none;
333+
int rc = dbutils_table_settings_get_value(data, table_name, "*", "algo", buffer, sizeof(buffer));
334+
return (rc == DBRES_OK) ? cloudsync_algo_from_name(buffer) : table_algo_none;
346335
}
347336

348337
int dbutils_settings_load_callback (void *xdata, int ncols, char **values, char **names) {

src/dbutils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ int64_t dbutils_settings_get_int64_value (cloudsync_context *data, const char *k
3636
// table settings
3737
int dbutils_table_settings_set_key_value (cloudsync_context *data, const char *table_name, const char *column_name, const char *key, const char *value);
3838
int64_t dbutils_table_settings_count_tables (cloudsync_context *data);
39-
char *dbutils_table_settings_get_value (cloudsync_context *data, const char *table_name, const char *column_name, const char *key, char *buffer, size_t blen);
39+
int dbutils_table_settings_get_value (cloudsync_context *data, const char *table_name, const char *column_name, const char *key, char *buffer, size_t blen);
4040
table_algo dbutils_table_settings_get_algo (cloudsync_context *data, const char *table_name);
4141

4242
// others

test/unit.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2072,11 +2072,10 @@ bool do_test_dbutils (void) {
20722072

20732073
rc = SQLITE_ERROR;
20742074

2075-
char *value1 = dbutils_table_settings_get_value(data, "foo", NULL, "key1", NULL, 0);
2076-
char *value2 = dbutils_table_settings_get_value(data, "foo", NULL, "key2", NULL, 0);
2077-
if (value1 == NULL) goto finalize;
2078-
if (value2 != NULL) goto finalize;
2079-
cloudsync_memory_free(value1);
2075+
rc = dbutils_table_settings_get_value(data, "foo", NULL, "key1", buffer, sizeof(buffer));
2076+
if (rc != DBRES_OK || strcmp(buffer, "value1") != 0) goto finalize;
2077+
rc = dbutils_table_settings_get_value(data, "foo", NULL, "key2", buffer, sizeof(buffer));
2078+
if (rc != DBRES_OK || strlen(buffer) > 0) goto finalize;
20802079

20812080
int64_t db_version = 0;
20822081
database_select_int(data, "SELECT cloudsync_db_version();", &db_version);
@@ -2092,8 +2091,8 @@ bool do_test_dbutils (void) {
20922091
rc = dbutils_settings_get_value(data, "key1", NULL, 0, NULL);
20932092
if (rc != SQLITE_MISUSE) goto finalize;
20942093

2095-
value1 = dbutils_table_settings_get_value(data, "foo", NULL, "key1", OUT_OF_MEMORY_BUFFER, 0);
2096-
if (value1 != NULL) goto finalize;
2094+
rc = dbutils_table_settings_get_value(data, "foo", NULL, "key1", NULL, 0);
2095+
if (rc != DBRES_MISUSE) goto finalize;
20972096

20982097
//char *p = NULL;
20992098
//dbutils_select(data, "SELECT zeroblob(16);", NULL, NULL, NULL, 0, SQLITE_BLOB);

0 commit comments

Comments
 (0)