Skip to content

Commit 623be6b

Browse files
committed
Refactored SQL in dbutils (related to settings)
1 parent 780ddc3 commit 623be6b

File tree

4 files changed

+122
-34
lines changed

4 files changed

+122
-34
lines changed

src/dbutils.c

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77

88
#include <stdlib.h>
9+
#include "sql.h"
910
#include "utils.h"
1011
#include "dbutils.h"
1112
#include "cloudsync.h"
@@ -107,8 +108,7 @@ char *dbutils_settings_get_value (db_t *db, const char *key, char *buffer, size_
107108
size_t size = 0;
108109

109110
dbvm_t *vm = NULL;
110-
char *sql = "SELECT value FROM cloudsync_settings WHERE key=?1;";
111-
int rc = database_prepare(db, sql, (void **)&vm, 0);
111+
int rc = database_prepare(db, SQL_SETTINGS_GET_VALUE, (void **)&vm, 0);
112112
if (rc != DBRES_OK) goto finalize_get_value;
113113

114114
rc = databasevm_bind_text(vm, 1, key, -1);
@@ -158,19 +158,17 @@ int dbutils_settings_set_key_value (db_t *db, cloudsync_context *data, const cha
158158
if (db == NULL) db = cloudsync_db(data);
159159

160160
if (key && value) {
161-
char *sql = "REPLACE INTO cloudsync_settings (key, value) VALUES (?1, ?2);";
162161
const char *values[] = {key, value};
163162
DBTYPE types[] = {DBTYPE_TEXT, DBTYPE_TEXT};
164163
int lens[] = {-1, -1};
165-
rc = database_write(db, sql, values, types, lens, 2);
164+
rc = database_write(db, SQL_SETTINGS_SET_KEY_VALUE_REPLACE, values, types, lens, 2);
166165
}
167166

168167
if (value == NULL) {
169-
char *sql = "DELETE FROM cloudsync_settings WHERE key = ?1;";
170168
const char *values[] = {key};
171169
DBTYPE types[] = {DBTYPE_TEXT};
172170
int lens[] = {-1};
173-
rc = database_write(db, sql, values, types, lens, 1);
171+
rc = database_write(db, SQL_SETTINGS_SET_KEY_VALUE_DELETE, values, types, lens, 1);
174172
}
175173

176174
if (rc == DBRES_OK && data) cloudsync_sync_key(data, key, value);
@@ -216,8 +214,7 @@ char *dbutils_table_settings_get_value (db_t *db, const char *table, const char
216214
size_t size = 0;
217215

218216
dbvm_t *vm = NULL;
219-
char *sql = "SELECT value FROM cloudsync_table_settings WHERE (tbl_name=?1 AND col_name=?2 AND key=?3);";
220-
int rc = database_prepare(db, sql, (void **)&vm, 0);
217+
int rc = database_prepare(db, SQL_TABLE_SETTINGS_GET_VALUE, (void **)&vm, 0);
221218
if (rc != DBRES_OK) goto finalize_get_value;
222219

223220
rc = databasevm_bind_text(vm, 1, table, -1);
@@ -276,6 +273,7 @@ int dbutils_table_settings_set_key_value (db_t *db, cloudsync_context *data, con
276273

277274
// sanity check tbl_name
278275
if (table == NULL) {
276+
// TODO: fix me
279277
//if (context) sqlite3_result_error(context, "cloudsync_set_table/set_column requires a non-null table parameter", -1);
280278
return DBRES_ERROR;
281279
}
@@ -285,28 +283,25 @@ int dbutils_table_settings_set_key_value (db_t *db, cloudsync_context *data, con
285283

286284
// remove all table_name entries
287285
if (key == NULL) {
288-
char *sql = "DELETE FROM cloudsync_table_settings WHERE tbl_name=?1;";
289286
const char *values[] = {table};
290287
DBTYPE types[] = {DBTYPE_TEXT};
291288
int lens[] = {-1};
292-
rc = database_write(db, sql, values, types, lens, 1);
289+
rc = database_write(db, SQL_TABLE_SETTINGS_DELETE_ALL_FOR_TABLE, values, types, lens, 1);
293290
return rc;
294291
}
295292

296293
if (key && value) {
297-
char *sql = "REPLACE INTO cloudsync_table_settings (tbl_name, col_name, key, value) VALUES (?1, ?2, ?3, ?4);";
298294
const char *values[] = {table, column, key, value};
299295
DBTYPE types[] = {DBTYPE_TEXT, DBTYPE_TEXT, DBTYPE_TEXT, DBTYPE_TEXT};
300296
int lens[] = {-1, -1, -1, -1};
301-
rc = database_write(db, sql, values, types, lens, 4);
297+
rc = database_write(db, SQL_TABLE_SETTINGS_REPLACE, values, types, lens, 4);
302298
}
303299

304300
if (value == NULL) {
305-
char *sql = "DELETE FROM cloudsync_table_settings WHERE (tbl_name=?1 AND col_name=?2 AND key=?3);";
306301
const char *values[] = {table, column, key};
307302
DBTYPE types[] = {DBTYPE_TEXT, DBTYPE_TEXT, DBTYPE_TEXT};
308303
int lens[] = {-1, -1, -1};
309-
rc = database_write(db, sql, values, types, lens, 3);
304+
rc = database_write(db, SQL_TABLE_SETTINGS_DELETE_ONE, values, types, lens, 3);
310305
}
311306

312307
// unused in this version
@@ -318,7 +313,7 @@ int dbutils_table_settings_set_key_value (db_t *db, cloudsync_context *data, con
318313
db_int64 dbutils_table_settings_count_tables (db_t *db) {
319314
DEBUG_SETTINGS("dbutils_table_settings_count_tables");
320315
db_int64 count = 0;
321-
int rc = database_select_int(db, "SELECT count(*) FROM cloudsync_table_settings WHERE key='algo';", &count);
316+
int rc = database_select_int(db, SQL_TABLE_SETTINGS_COUNT_TABLES, &count);
322317
return (rc == DBRES_OK) ? count : 0;
323318
}
324319

@@ -374,12 +369,12 @@ int dbutils_settings_load (db_t *db, cloudsync_context *data) {
374369
DEBUG_SETTINGS("dbutils_settings_load %p", data);
375370

376371
// load global settings
377-
const char *sql = "SELECT key, value FROM cloudsync_settings;";
372+
const char *sql = SQL_SETTINGS_LOAD_GLOBAL;
378373
int rc = database_exec_callback(db, sql, dbutils_settings_load_callback, data);
379374
if (rc != DBRES_OK) DEBUG_ALWAYS("cloudsync_load_settings error: %s", database_errmsg(db));
380375

381376
// load table-specific settings
382-
sql = "SELECT lower(tbl_name), lower(col_name), key, value FROM cloudsync_table_settings ORDER BY tbl_name;";
377+
sql = SQL_SETTINGS_LOAD_TABLE;
383378
rc = database_exec_callback(db, sql, dbutils_settings_table_load_callback, data);
384379
if (rc != DBRES_OK) DEBUG_ALWAYS("cloudsync_load_settings error: %s", database_errmsg(db));
385380

@@ -397,20 +392,18 @@ int dbutils_settings_init (db_t *db, void *cloudsync_data) {
397392
if (settings_exists == false) {
398393
DEBUG_SETTINGS("cloudsync_settings does not exist (creating a new one)");
399394

400-
char sql[1024];
401-
402395
// create table and fill-in initial data
403-
snprintf(sql, sizeof(sql), "CREATE TABLE IF NOT EXISTS cloudsync_settings (key TEXT PRIMARY KEY NOT NULL COLLATE NOCASE, value TEXT);");
404-
rc = database_exec(db, sql);
396+
rc = database_exec(db, SQL_CREATE_SETTINGS_TABLE);
405397
if (rc != DBRES_OK) return rc;
406398

407399
// library version
408-
snprintf(sql, sizeof(sql), "INSERT INTO cloudsync_settings (key, value) VALUES ('%s', '%s');", CLOUDSYNC_KEY_LIBVERSION, CLOUDSYNC_VERSION);
400+
char sql[1024];
401+
snprintf(sql, sizeof(sql), SQL_INSERT_SETTINGS_STR_FORMAT, CLOUDSYNC_KEY_LIBVERSION, CLOUDSYNC_VERSION);
409402
rc = database_exec(db, sql);
410403
if (rc != DBRES_OK) return rc;
411404

412405
// schema version
413-
snprintf(sql, sizeof(sql), "INSERT INTO cloudsync_settings (key, value) VALUES ('%s', %lld);", CLOUDSYNC_KEY_SCHEMAVERSION, (long long)database_schema_version(db));
406+
snprintf(sql, sizeof(sql), SQL_INSERT_SETTINGS_INT_FORMAT, CLOUDSYNC_KEY_SCHEMAVERSION, (long long)database_schema_version(db));
414407
rc = database_exec(db, sql);
415408
if (rc != DBRES_OK) return rc;
416409
}
@@ -421,29 +414,26 @@ int dbutils_settings_init (db_t *db, void *cloudsync_data) {
421414
// create table and fill-in initial data
422415
// site_id is implicitly indexed
423416
// the rowid column is the primary key
424-
char *sql = "CREATE TABLE IF NOT EXISTS cloudsync_site_id (site_id BLOB UNIQUE NOT NULL);";
425-
rc = database_exec(db, sql);
417+
rc = database_exec(db, SQL_CREATE_SITE_ID_TABLE);
426418
if (rc != DBRES_OK) return rc;
427419

428420
// siteid (to uniquely identify this local copy of the database)
429421
uint8_t site_id[UUID_LEN];
430422
if (cloudsync_uuid_v7(site_id) == -1) return DBRES_ERROR;
431423

432424
// rowid 0 means local site_id
433-
sql = "INSERT INTO cloudsync_site_id (rowid, site_id) VALUES (?, ?);";
434425
const char *values[] = {"0", (const char *)&site_id};
435426
DBTYPE types[] = {DBTYPE_INTEGER, DBTYPE_BLOB};
436427
int lens[] = {-1, UUID_LEN};
437-
rc = database_write(db, sql, values, types, lens, 2);
428+
rc = database_write(db, SQL_INSERT_SITE_ID_ROWID, values, types, lens, 2);
438429
if (rc != DBRES_OK) return rc;
439430
}
440431

441432
// check if cloudsync_table_settings table exists
442433
if (database_table_exists(db, CLOUDSYNC_TABLE_SETTINGS_NAME) == false) {
443434
DEBUG_SETTINGS("cloudsync_table_settings does not exist (creating a new one)");
444435

445-
char *sql = "CREATE TABLE IF NOT EXISTS cloudsync_table_settings (tbl_name TEXT NOT NULL COLLATE NOCASE, col_name TEXT NOT NULL COLLATE NOCASE, key TEXT, value TEXT, PRIMARY KEY(tbl_name,key));";
446-
rc = database_exec(db, sql);
436+
rc = database_exec(db, SQL_CREATE_TABLE_SETTINGS_TABLE);
447437
if (rc != DBRES_OK) return rc;
448438
}
449439

@@ -453,8 +443,7 @@ int dbutils_settings_init (db_t *db, void *cloudsync_data) {
453443
DEBUG_SETTINGS("cloudsync_schema_versions does not exist (creating a new one)");
454444

455445
// create table
456-
char *sql = "CREATE TABLE IF NOT EXISTS cloudsync_schema_versions (hash INTEGER PRIMARY KEY, seq INTEGER NOT NULL)";
457-
rc = database_exec(db, sql);
446+
rc = database_exec(db, SQL_CREATE_SCHEMA_VERSIONS_TABLE);
458447
if (rc != DBRES_OK) return rc;
459448
}
460449

@@ -473,6 +462,5 @@ int dbutils_settings_init (db_t *db, void *cloudsync_data) {
473462
}
474463

475464
int dbutils_settings_cleanup (db_t *db) {
476-
const char *sql = "DROP TABLE IF EXISTS cloudsync_settings; DROP TABLE IF EXISTS cloudsync_site_id; DROP TABLE IF EXISTS cloudsync_table_settings; DROP TABLE IF EXISTS cloudsync_schema_versions; ";
477-
return database_exec(db, sql);
465+
return database_exec(db, SQL_SETTINGS_CLEANUP_DROP_ALL);
478466
}

src/sql.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//
2+
// sql.h
3+
// cloudsync
4+
//
5+
// Created by Marco Bambini on 17/12/25.
6+
//
7+
8+
#ifndef __CLOUDSYNC_SQL__
9+
#define __CLOUDSYNC_SQL__
10+
11+
// SETTINGS
12+
extern const char * const SQL_SETTINGS_GET_VALUE;
13+
extern const char * const SQL_SETTINGS_SET_KEY_VALUE_REPLACE;
14+
extern const char * const SQL_SETTINGS_SET_KEY_VALUE_DELETE;
15+
extern const char * const SQL_TABLE_SETTINGS_GET_VALUE;
16+
extern const char * const SQL_TABLE_SETTINGS_DELETE_ALL_FOR_TABLE;
17+
extern const char * const SQL_TABLE_SETTINGS_REPLACE;
18+
extern const char * const SQL_TABLE_SETTINGS_DELETE_ONE;
19+
extern const char * const SQL_TABLE_SETTINGS_COUNT_TABLES;
20+
extern const char * const SQL_SETTINGS_LOAD_GLOBAL;
21+
extern const char * const SQL_SETTINGS_LOAD_TABLE;
22+
extern const char * const SQL_CREATE_SETTINGS_TABLE;
23+
extern const char * const SQL_INSERT_SETTINGS_STR_FORMAT;
24+
extern const char * const SQL_INSERT_SETTINGS_INT_FORMAT;
25+
extern const char * const SQL_CREATE_SITE_ID_TABLE;
26+
extern const char * const SQL_INSERT_SITE_ID_ROWID;
27+
extern const char * const SQL_CREATE_TABLE_SETTINGS_TABLE;
28+
extern const char * const SQL_CREATE_SCHEMA_VERSIONS_TABLE;
29+
extern const char * const SQL_SETTINGS_CLEANUP_DROP_ALL;
30+
31+
#endif

src/sql_sqlite.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
//
2+
// sql_sqlite.c
3+
// cloudsync
4+
//
5+
// Created by Marco Bambini on 17/12/25.
6+
//
7+
8+
#include "sql.h"
9+
10+
// MARK: - Settings -
11+
12+
const char * const SQL_SETTINGS_GET_VALUE =
13+
"SELECT value FROM cloudsync_settings WHERE key=?1;";
14+
15+
const char * const SQL_SETTINGS_SET_KEY_VALUE_REPLACE =
16+
"REPLACE INTO cloudsync_settings (key, value) VALUES (?1, ?2);";
17+
18+
const char * const SQL_SETTINGS_SET_KEY_VALUE_DELETE =
19+
"DELETE FROM cloudsync_settings WHERE key = ?1;";
20+
21+
const char * const SQL_TABLE_SETTINGS_GET_VALUE =
22+
"SELECT value FROM cloudsync_table_settings WHERE (tbl_name=?1 AND col_name=?2 AND key=?3);";
23+
24+
const char * const SQL_TABLE_SETTINGS_DELETE_ALL_FOR_TABLE =
25+
"DELETE FROM cloudsync_table_settings WHERE tbl_name=?1;";
26+
27+
const char * const SQL_TABLE_SETTINGS_REPLACE =
28+
"REPLACE INTO cloudsync_table_settings (tbl_name, col_name, key, value) VALUES (?1, ?2, ?3, ?4);";
29+
30+
const char * const SQL_TABLE_SETTINGS_DELETE_ONE =
31+
"DELETE FROM cloudsync_table_settings WHERE (tbl_name=?1 AND col_name=?2 AND key=?3);";
32+
33+
const char * const SQL_TABLE_SETTINGS_COUNT_TABLES =
34+
"SELECT count(*) FROM cloudsync_table_settings WHERE key='algo';";
35+
36+
const char * const SQL_SETTINGS_LOAD_GLOBAL =
37+
"SELECT key, value FROM cloudsync_settings;";
38+
39+
const char * const SQL_SETTINGS_LOAD_TABLE =
40+
"SELECT lower(tbl_name), lower(col_name), key, value FROM cloudsync_table_settings ORDER BY tbl_name;";
41+
42+
const char * const SQL_CREATE_SETTINGS_TABLE =
43+
"CREATE TABLE IF NOT EXISTS cloudsync_settings (key TEXT PRIMARY KEY NOT NULL COLLATE NOCASE, value TEXT);";
44+
45+
// format strings (snprintf) are also static SQL templates
46+
const char * const SQL_INSERT_SETTINGS_STR_FORMAT =
47+
"INSERT INTO cloudsync_settings (key, value) VALUES ('%s', '%s');";
48+
49+
const char * const SQL_INSERT_SETTINGS_INT_FORMAT =
50+
"INSERT INTO cloudsync_settings (key, value) VALUES ('%s', %lld);";
51+
52+
const char * const SQL_CREATE_SITE_ID_TABLE =
53+
"CREATE TABLE IF NOT EXISTS cloudsync_site_id (site_id BLOB UNIQUE NOT NULL);";
54+
55+
const char * const SQL_INSERT_SITE_ID_ROWID =
56+
"INSERT INTO cloudsync_site_id (rowid, site_id) VALUES (?, ?);";
57+
58+
const char * const SQL_CREATE_TABLE_SETTINGS_TABLE =
59+
"CREATE TABLE IF NOT EXISTS cloudsync_table_settings (tbl_name TEXT NOT NULL COLLATE NOCASE, col_name TEXT NOT NULL COLLATE NOCASE, key TEXT, value TEXT, PRIMARY KEY(tbl_name,key));";
60+
61+
const char * const SQL_CREATE_SCHEMA_VERSIONS_TABLE =
62+
"CREATE TABLE IF NOT EXISTS cloudsync_schema_versions (hash INTEGER PRIMARY KEY, seq INTEGER NOT NULL)";
63+
64+
const char * const SQL_SETTINGS_CLEANUP_DROP_ALL =
65+
"DROP TABLE IF EXISTS cloudsync_settings; "
66+
"DROP TABLE IF EXISTS cloudsync_site_id; "
67+
"DROP TABLE IF EXISTS cloudsync_table_settings; "
68+
"DROP TABLE IF EXISTS cloudsync_schema_versions; ";
69+

test/unit.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6293,7 +6293,7 @@ int main (int argc, const char * argv[]) {
62936293
cloudsync_memory_finalize();
62946294

62956295
sqlite3_int64 memory_used = sqlite3_memory_used();
6296-
result += test_report("Memory leak check:", memory_used == 0);
6296+
result += test_report("Memory Leaks Check:", memory_used == 0);
62976297
if (memory_used > 0) {
62986298
printf("\tleaked: %lld B\n", memory_used);
62996299
result++;

0 commit comments

Comments
 (0)