Skip to content

Commit 0f3ab4b

Browse files
committed
db_version must be int64_t in network.c
1 parent ddcb824 commit 0f3ab4b

File tree

5 files changed

+41
-23
lines changed

5 files changed

+41
-23
lines changed

src/cloudsync.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ struct cloudsync_context {
125125
// version the DB would have if the transaction committed now
126126
int64_t pending_db_version;
127127
// used to set an order inside each transaction
128-
int seq;
128+
int seq;
129129

130130
// augmented tables are stored in-memory so we do not need to retrieve information about
131131
// col_names and cid from the disk each time a write statement is performed

src/dbutils.c

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,12 @@ int dbutils_binary_comparison (int x, int y) {
102102
return (x == y) ? 0 : (x > y ? 1 : -1);
103103
}
104104

105-
char *dbutils_settings_get_value (db_t *db, const char *key, char *buffer, size_t blen) {
105+
char *dbutils_settings_get_value (db_t *db, const char *key, char *buffer, size_t blen, int64_t *intvalue) {
106106
DEBUG_SETTINGS("dbutils_settings_get_value key: %s", key);
107107

108108
// check if heap allocation must be forced
109109
if (!buffer || blen == 0) blen = 0;
110+
if (intvalue) *intvalue = 0;
110111
size_t size = 0;
111112

112113
dbvm_t *vm = NULL;
@@ -126,21 +127,27 @@ char *dbutils_settings_get_value (db_t *db, const char *key, char *buffer, size_
126127
goto finalize_get_value;
127128
}
128129

129-
const char *value = database_column_text(vm, 0);
130-
#if CLOUDSYNC_UNITTEST
131-
size = (buffer == OUT_OF_MEMORY_BUFFER) ? (SQLITE_MAX_ALLOCATION_SIZE + 1) :(size_t)database_column_bytes(vm, 0);
132-
#else
133-
size = (size_t)database_column_bytes(vm, 0);
134-
#endif
135-
if (size + 1 > blen) {
136-
buffer = cloudsync_memory_alloc((uint64_t)(size + 1));
137-
if (!buffer) {
138-
rc = DBRES_NOMEM;
139-
goto finalize_get_value;
130+
if (intvalue) {
131+
// check if we are only interested in the intvalue
132+
*intvalue = database_column_int(vm, 0);
133+
} else {
134+
// if intvalue is NULL then proceed with text case
135+
const char *value = database_column_text(vm, 0);
136+
#if CLOUDSYNC_UNITTEST
137+
size = (buffer == OUT_OF_MEMORY_BUFFER) ? (SQLITE_MAX_ALLOCATION_SIZE + 1) :(size_t)database_column_bytes(vm, 0);
138+
#else
139+
size = (size_t)database_column_bytes(vm, 0);
140+
#endif
141+
if (size + 1 > blen) {
142+
buffer = cloudsync_memory_alloc((uint64_t)(size + 1));
143+
if (!buffer) {
144+
rc = DBRES_NOMEM;
145+
goto finalize_get_value;
146+
}
140147
}
148+
memcpy(buffer, value, size+1);
141149
}
142150

143-
memcpy(buffer, value, size+1);
144151
rc = DBRES_OK;
145152

146153
finalize_get_value:
@@ -180,15 +187,25 @@ int dbutils_settings_set_key_value (db_t *db, cloudsync_context *data, const cha
180187
int dbutils_settings_get_int_value (db_t *db, const char *key) {
181188
DEBUG_SETTINGS("dbutils_settings_get_int_value key: %s", key);
182189
char buffer[256] = {0};
183-
if (dbutils_settings_get_value(db, key, buffer, sizeof(buffer)) == NULL) return -1;
190+
int64_t value = 0;
191+
if (dbutils_settings_get_value(db, key, buffer, sizeof(buffer), &value) == NULL) return -1;
192+
193+
return (int)value;
194+
}
195+
196+
int64_t dbutils_settings_get_int64_value (db_t *db, const char *key) {
197+
DEBUG_SETTINGS("dbutils_settings_get_int_value key: %s", key);
198+
char buffer[256] = {0};
199+
int64_t value = 0;
200+
if (dbutils_settings_get_value(db, key, buffer, sizeof(buffer), &value) == NULL) return -1;
184201

185-
return (int)strtol(buffer, NULL, 0);
202+
return value;
186203
}
187204

188205
int dbutils_settings_check_version (db_t *db, const char *version) {
189206
DEBUG_SETTINGS("dbutils_settings_check_version");
190207
char buffer[256];
191-
if (dbutils_settings_get_value(db, CLOUDSYNC_KEY_LIBVERSION, buffer, sizeof(buffer)) == NULL) return -666;
208+
if (dbutils_settings_get_value(db, CLOUDSYNC_KEY_LIBVERSION, buffer, sizeof(buffer), NULL) == NULL) return -666;
192209

193210
int major1, minor1, patch1;
194211
int major2, minor2, patch2;

src/dbutils.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,11 @@ int dbutils_settings_init (db_t *db, void *cloudsync_data);
3232
int dbutils_settings_cleanup (db_t *db);
3333
int dbutils_settings_set_key_value (db_t *db, cloudsync_context *data, const char *key, const char *value);
3434
int dbutils_settings_get_int_value (db_t *db, const char *key);
35+
int64_t dbutils_settings_get_int64_value (db_t *db, const char *key);
3536

3637
// table settings
3738
int dbutils_table_settings_set_key_value (db_t *db, cloudsync_context *data, const char *table, const char *column, const char *key, const char *value);
38-
int64_t dbutils_table_settings_count_tables (db_t *db);
39+
int64_t dbutils_table_settings_count_tables (db_t *db);
3940
char *dbutils_table_settings_get_value (db_t *db, const char *table_name, const char *column, const char *key, char *buffer, size_t blen);
4041
table_algo dbutils_table_settings_get_algo (db_t *db, const char *table_name);
4142

src/network.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,7 @@ int cloudsync_network_check_internal(sqlite3_context *context, int *pnrows) {
785785

786786
sqlite3 *db = sqlite3_context_db_handle(context);
787787

788-
int db_version = dbutils_settings_get_int_value(db, CLOUDSYNC_KEY_CHECK_DBVERSION);
788+
int64_t db_version = dbutils_settings_get_int64_value(db, CLOUDSYNC_KEY_CHECK_DBVERSION);
789789
if (db_version<0) {sqlite3_result_error(context, "Unable to retrieve db_version.", -1); return -1;}
790790

791791
int seq = dbutils_settings_get_int_value(db, CLOUDSYNC_KEY_CHECK_SEQ);

test/unit.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ void dbvm_reset (dbvm_t *stmt);
3636
int dbvm_count (dbvm_t *stmt, const char *value, size_t len, int type);
3737
int dbvm_execute (dbvm_t *stmt, void *data);
3838

39-
char *dbutils_settings_get_value (db_t *db, const char *key, char *buffer, size_t blen);;
39+
char *dbutils_settings_get_value (db_t *db, const char *key, char *buffer, size_t blen, int64_t *intvalue);
4040
int dbutils_settings_table_load_callback (void *xdata, int ncols, char **values, char **names);
4141
int dbutils_settings_check_version (db_t *db, const char *version);
4242
bool dbutils_settings_migrate (db_t *db);
@@ -2010,8 +2010,8 @@ bool do_test_dbutils (void) {
20102010
dbutils_settings_set_key_value(db, NULL, "key2", "test2");
20112011
dbutils_settings_set_key_value(db, NULL, "key2", NULL);
20122012

2013-
char *value1 = dbutils_settings_get_value(db, "key1", NULL, 0);
2014-
char *value2 = dbutils_settings_get_value(db, "key2", NULL, 0);
2013+
char *value1 = dbutils_settings_get_value(db, "key1", NULL, 0, NULL);
2014+
char *value2 = dbutils_settings_get_value(db, "key2", NULL, 0, NULL);
20152015
if (value1 == NULL) goto finalize;
20162016
if (value2 != NULL) goto finalize;
20172017
cloudsync_memory_free(value1);
@@ -2048,7 +2048,7 @@ bool do_test_dbutils (void) {
20482048
cloudsync_memory_free(site_id_blob);
20492049

20502050
// force out-of-memory test
2051-
value1 = dbutils_settings_get_value(db, "key1", OUT_OF_MEMORY_BUFFER, 0);
2051+
value1 = dbutils_settings_get_value(db, "key1", OUT_OF_MEMORY_BUFFER, 0, NULL);
20522052
if (value1 != NULL) goto finalize;
20532053

20542054
value1 = dbutils_table_settings_get_value(db, "foo", NULL, "key1", OUT_OF_MEMORY_BUFFER, 0);

0 commit comments

Comments
 (0)