Skip to content

Commit 228bdb0

Browse files
committed
New architecture WP 7
1 parent ba5b2c8 commit 228bdb0

File tree

9 files changed

+558
-352
lines changed

9 files changed

+558
-352
lines changed

src/cloudsync.c

Lines changed: 54 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,10 @@ char *cloudsync_dbversion_build_query (db_t *db) {
315315
"SELECT GROUP_CONCAT(part, ' UNION ALL ') || ' UNION SELECT value as version FROM cloudsync_settings WHERE key = ''pre_alter_dbversion''' as full_query FROM query_parts"
316316
") "
317317
"SELECT 'SELECT max(version) as version FROM (' || full_query || ');' FROM combined_query;";
318-
return dbutils_text_select(db, sql);
318+
319+
char *value = NULL;
320+
int rc = database_select_text(db, sql, &value);
321+
return (rc == DBRES_OK) ? value : NULL;
319322
}
320323

321324
int cloudsync_dbversion_rebuild (db_t *db, cloudsync_context *data) {
@@ -419,10 +422,14 @@ int cloudsync_load_siteid (db_t *db, cloudsync_context *data) {
419422
if (data->site_id[0] != 0) return DBRES_OK;
420423

421424
// load site_id
422-
int size, rc;
423-
char *buffer = dbutils_blob_select(db, "SELECT site_id FROM cloudsync_site_id WHERE rowid=0;", &size, NULL, &rc);
424-
if (!buffer) return rc;
425-
if (size != UUID_LEN) return DBRES_MISUSE;
425+
char *buffer = NULL;
426+
db_int64 size = 0;
427+
int rc = database_select_blob(db, "SELECT site_id FROM cloudsync_site_id WHERE rowid=0;", &buffer, &size);
428+
if (rc != DBRES_OK) return rc;
429+
if (!buffer || size != UUID_LEN) {
430+
if (buffer) cloudsync_memory_free(buffer);
431+
return DBRES_MISUSE;
432+
}
426433

427434
memcpy(data->site_id, buffer, UUID_LEN);
428435
cloudsync_memory_free(buffer);
@@ -441,7 +448,7 @@ int cloudsync_bumpseq (cloudsync_context *data) {
441448
}
442449

443450
void cloudsync_update_schema_hash (cloudsync_context *data) {
444-
dbutils_update_schema_hash(data->db, &data->schema_hash);
451+
database_update_schema_hash(data->db, &data->schema_hash);
445452
}
446453

447454
void *cloudsync_db (cloudsync_context *data) {
@@ -575,10 +582,12 @@ char *table_build_values_sql (db_t *db, cloudsync_table_context *table) {
575582
#endif
576583
cloudsync_memory_free(singlequote_escaped_table_name);
577584
if (!sql) return NULL;
578-
char *query = dbutils_text_select(db, sql);
585+
586+
char *query = NULL;
587+
int rc = database_select_text(db, sql, &query);
579588
cloudsync_memory_free(sql);
580589

581-
return query;
590+
return (rc == DBRES_OK) ? query : NULL;
582591
}
583592

584593
char *table_build_mergedelete_sql (db_t *db, cloudsync_table_context *table) {
@@ -594,10 +603,11 @@ char *table_build_mergedelete_sql (db_t *db, cloudsync_table_context *table) {
594603
cloudsync_memory_free(singlequote_escaped_table_name);
595604
if (!sql) return NULL;
596605

597-
char *query = dbutils_text_select(db, sql);
606+
char *query = NULL;
607+
int rc = database_select_text(db, sql, &query);
598608
cloudsync_memory_free(sql);
599609

600-
return query;
610+
return (rc == DBRES_OK) ? query : NULL;
601611
}
602612

603613
char *table_build_mergeinsert_sql (db_t *db, cloudsync_table_context *table, const char *colname) {
@@ -630,10 +640,11 @@ char *table_build_mergeinsert_sql (db_t *db, cloudsync_table_context *table, con
630640
cloudsync_memory_free(singlequote_escaped_table_name);
631641
if (!sql) return NULL;
632642

633-
char *query = dbutils_text_select(db, sql);
643+
char *query = NULL;
644+
int rc = database_select_text(db, sql, &query);
634645
cloudsync_memory_free(sql);
635646

636-
return query;
647+
return (rc == DBRES_OK) ? query : NULL;
637648
}
638649

639650
char *table_build_value_sql (db_t *db, cloudsync_table_context *table, const char *colname) {
@@ -654,10 +665,11 @@ char *table_build_value_sql (db_t *db, cloudsync_table_context *table, const cha
654665
cloudsync_memory_free(singlequote_escaped_table_name);
655666
if (!sql) return NULL;
656667

657-
char *query = dbutils_text_select(db, sql);
668+
char *query = NULL;
669+
int rc = database_select_text(db, sql, &query);
658670
cloudsync_memory_free(sql);
659671

660-
return query;
672+
return (rc == DBRES_OK) ? query : NULL;
661673
}
662674

663675
cloudsync_table_context *table_create (cloudsync_context *data, const char *name, table_algo algo) {
@@ -993,9 +1005,11 @@ bool table_add_to_context (db_t *db, cloudsync_context *data, table_algo algo, c
9931005
// fill remaining metadata in the table
9941006
char *sql = cloudsync_memory_mprintf("SELECT count(*) FROM pragma_table_info('%q') WHERE pk>0;", table_name);
9951007
if (!sql) goto abort_add_table;
996-
table->npks = (int)dbutils_int_select(db, sql);
1008+
db_int64 value = 0;
1009+
int rc = database_select_int(db, sql, &value);
1010+
table->npks = (int)value;
9971011
cloudsync_memory_free(sql);
998-
if (table->npks == -1) {
1012+
if (rc != DBRES_OK) {
9991013
cloudsync_set_dberror(data);
10001014
goto abort_add_table;
10011015
}
@@ -1011,14 +1025,16 @@ bool table_add_to_context (db_t *db, cloudsync_context *data, table_algo algo, c
10111025

10121026
sql = cloudsync_memory_mprintf("SELECT count(*) FROM pragma_table_info('%q') WHERE pk=0;", table_name);
10131027
if (!sql) goto abort_add_table;
1014-
int64_t ncols = (int64_t)dbutils_int_select(db, sql);
1028+
1029+
db_int64 ncols = 0;
1030+
rc = database_select_int(db, sql, &ncols);
10151031
cloudsync_memory_free(sql);
1016-
if (ncols == -1) {
1032+
if (rc != DBRES_OK) {
10171033
cloudsync_set_dberror(data);
10181034
goto abort_add_table;
10191035
}
10201036

1021-
int rc = table_add_stmts(db, table, (int)ncols);
1037+
rc = table_add_stmts(db, table, (int)ncols);
10221038
if (rc != DBRES_OK) goto abort_add_table;
10231039

10241040
// a table with only pk(s) is totally legal
@@ -1553,7 +1569,7 @@ const char *cloudsync_context_init (cloudsync_context *data, void *db) {
15531569
if (cloudsync_load_siteid(db, data) != DBRES_OK) return NULL;
15541570

15551571
data->db = db;
1556-
data->schema_hash = dbutils_schema_hash(db);
1572+
data->schema_hash = database_schema_hash(db);
15571573
}
15581574

15591575
return (const char *)data->site_id;
@@ -1719,9 +1735,11 @@ int cloudsync_finalize_alter (cloudsync_context *data, cloudsync_table_context *
17191735
rc = DBRES_NOMEM;
17201736
goto finalize;
17211737
}
1722-
char *pkclause = dbutils_text_select(db, sql);
1723-
char *pkvalues = (pkclause) ? pkclause : "rowid";
1738+
char *pkclause = NULL;
1739+
int rc = database_select_text(db, sql, &pkclause);
17241740
cloudsync_memory_free(sql);
1741+
if (rc != DBRES_OK) goto finalize;
1742+
char *pkvalues = (pkclause) ? pkclause : "rowid";
17251743

17261744
// delete entries related to rows that no longer exist in the original table, but preserve tombstone
17271745
sql = cloudsync_memory_mprintf("DELETE FROM \"%w_cloudsync\" WHERE (\"col_name\" != '%s' OR (\"col_name\" = '%s' AND col_version %% 2 != 0)) AND NOT EXISTS (SELECT 1 FROM \"%w\" WHERE \"%w_cloudsync\".pk = cloudsync_pk_encode(%s) LIMIT 1);", table->name, CLOUDSYNC_TOMBSTONE_VALUE, CLOUDSYNC_TOMBSTONE_VALUE, table->name, table->name, pkvalues);
@@ -1802,19 +1820,23 @@ int cloudsync_refill_metatable (cloudsync_context *data, const char *table_name)
18021820
db_t *db= data->db;
18031821
dbvm_t *vm = NULL;
18041822
db_int64 db_version = cloudsync_dbversion_next(data, CLOUDSYNC_VALUE_NOTSET);
1823+
char *pkdecode = NULL;
18051824

18061825
char *sql = cloudsync_memory_mprintf("SELECT group_concat('\"' || format('%%w', name) || '\"', ',') FROM pragma_table_info('%q') WHERE pk>0 ORDER BY pk;", table_name);
1807-
char *pkclause_identifiers = dbutils_text_select(db, sql);
1808-
char *pkvalues_identifiers = (pkclause_identifiers) ? pkclause_identifiers : "rowid";
1826+
char *pkclause_identifiers = NULL;
1827+
int rc = database_select_text(db, sql, &pkclause_identifiers);
18091828
cloudsync_memory_free(sql);
1829+
if (rc != DBRES_OK) goto finalize;
1830+
char *pkvalues_identifiers = (pkclause_identifiers) ? pkclause_identifiers : "rowid";
18101831

18111832
sql = cloudsync_memory_mprintf("SELECT group_concat('cloudsync_pk_decode(pk, ' || pk || ') AS ' || '\"' || format('%%w', name) || '\"', ',') FROM pragma_table_info('%q') WHERE pk>0 ORDER BY pk;", table_name);
1812-
char *pkdecode = dbutils_text_select(db, sql);
1813-
char *pkdecodeval = (pkdecode) ? pkdecode : "cloudsync_pk_decode(pk, 1) AS rowid";
1833+
rc = database_select_text(db, sql, &pkdecode);
18141834
cloudsync_memory_free(sql);
1835+
if (rc != DBRES_OK) goto finalize;
1836+
char *pkdecodeval = (pkdecode) ? pkdecode : "cloudsync_pk_decode(pk, 1) AS rowid";
18151837

18161838
sql = cloudsync_memory_mprintf("SELECT cloudsync_insert('%q', %s) FROM (SELECT %s FROM \"%w\" EXCEPT SELECT %s FROM \"%w_cloudsync\");", table_name, pkvalues_identifiers, pkvalues_identifiers, table_name, pkdecodeval, table_name);
1817-
int rc = database_exec(db, sql);
1839+
rc = database_exec(db, sql);
18181840
cloudsync_memory_free(sql);
18191841
if (rc != DBRES_OK) goto finalize;
18201842

@@ -1853,7 +1875,7 @@ int cloudsync_refill_metatable (cloudsync_context *data, const char *table_name)
18531875
}
18541876

18551877
finalize:
1856-
if (rc != DBRES_OK) DEBUG_ALWAYS("cloudsync_refill_metatable error: %s", database_errmsg(db));
1878+
if (rc != DBRES_OK) {DEBUG_ALWAYS("cloudsync_refill_metatable error: %s", database_errmsg(db));}
18571879
if (pkclause_identifiers) cloudsync_memory_free(pkclause_identifiers);
18581880
if (pkdecode) cloudsync_memory_free(pkdecode);
18591881
if (vm) databasevm_finalize(vm);
@@ -2210,7 +2232,7 @@ int cloudsync_payload_apply (cloudsync_context *data, const char *payload, int b
22102232

22112233
db_t *db = data->db;
22122234
if (!data || header.schema_hash != data->schema_hash) {
2213-
if (!dbutils_check_schema_hash(db, header.schema_hash)) {
2235+
if (!database_check_schema_hash(db, header.schema_hash)) {
22142236
char buffer[1024];
22152237
snprintf(buffer, sizeof(buffer), "Cannot apply the received payload because the schema hash is unknown %llu.", header.schema_hash);
22162238
return cloudsync_set_error(data, buffer, DBRES_MISUSE);
@@ -2378,7 +2400,9 @@ int cloudsync_payload_get (cloudsync_context *data, char **blob, int *blob_size,
23782400
snprintf(sql, sizeof(sql), "WITH max_db_version AS (SELECT MAX(db_version) AS max_db_version FROM cloudsync_changes) "
23792401
"SELECT cloudsync_payload_encode(tbl, pk, col_name, col_value, col_version, db_version, site_id, cl, seq), max_db_version AS max_db_version, MAX(IIF(db_version = max_db_version, seq, NULL)) FROM cloudsync_changes, max_db_version WHERE site_id=cloudsync_siteid() AND (db_version>%d OR (db_version=%d AND seq>%d))", *db_version, *db_version, *seq);
23802402

2381-
int rc = dbutils_blob_int_int_select(db, sql, blob, blob_size, new_db_version, new_seq);
2403+
db_int64 len = 0;
2404+
int rc = database_select_blob_2int(db, sql, blob, &len, new_db_version, new_seq);
2405+
*blob_size = (int)len;
23822406
if (rc != DBRES_OK) return rc;
23832407

23842408
// exit if there is no data to send

src/database.h

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,43 @@ typedef void dbvm_t;
1818
typedef void dbvalue_t;
1919
typedef void dbcontext_t;
2020

21-
#define DBRES_OK 0
22-
#define DBRES_ERROR 1
23-
#define DBRES_ABORT 4
24-
#define DBRES_NOMEM 7
25-
#define DBRES_IOERR 10
26-
#define DBRES_CONSTRAINT 19
27-
#define DBRES_MISUSE 21
28-
#define DBRES_ROW 100
29-
#define DBRES_DONE 101
30-
31-
#define DBTYPE_INTEGER 1
32-
#define DBTYPE_FLOAT 2
33-
#define DBTYPE_TEXT 3
34-
#define DBTYPE_BLOB 4
35-
#define DBTYPE_NULL 5
36-
37-
#define DBFLAG_PERSISTENT 0x01
38-
21+
typedef enum {
22+
DBRES_OK = 0,
23+
DBRES_ERROR = 1,
24+
DBRES_ABORT = 4,
25+
DBRES_NOMEM = 7,
26+
DBRES_IOERR = 10,
27+
DBRES_CONSTRAINT = 19,
28+
DBRES_MISUSE = 21,
29+
DBRES_ROW = 100,
30+
DBRES_DONE = 101
31+
} DBRES;
32+
33+
typedef enum {
34+
DBTYPE_INTEGER = 1,
35+
DBTYPE_FLOAT = 2,
36+
DBTYPE_TEXT = 3,
37+
DBTYPE_BLOB = 4,
38+
DBTYPE_NULL = 5
39+
} DBTYPE;
40+
41+
typedef enum {
42+
DBFLAG_PERSISTENT = 0x01
43+
} DBFLAG;
44+
45+
/*
46+
typedef struct {
47+
DBTYPE type;
48+
db_int64 len;
49+
DBRES rc;
50+
union {
51+
db_int64 int_value;
52+
double double_value;
53+
char *ptr_value;
54+
} value;
55+
} DATABASE_RESULT;
56+
*/
57+
3958
#ifndef UNUSED_PARAMETER
4059
#define UNUSED_PARAMETER(X) (void)(X)
4160
#endif
@@ -45,6 +64,17 @@ typedef int (*database_exec_cb) (void *xdata, int argc, char **values, char **na
4564

4665
int database_exec (db_t *db, const char *sql);
4766
int database_exec_callback (db_t *db, const char *sql, database_exec_cb, void *xdata);
67+
int database_select_int (db_t *db, const char *sql, db_int64 *value);
68+
int database_select_text (db_t *db, const char *sql, char **value);
69+
int database_select_blob (db_t *db, const char *sql, char **value, db_int64 *value_len);
70+
int database_select_blob_2int (db_t *db, const char *sql, char **value, db_int64 *value_len, db_int64 *value2, db_int64 *value3);
71+
int database_write (db_t *db, const char *sql, const char **values, DBTYPE types[], int lens[], int count);
72+
73+
db_int64 database_schema_version (db_t *db);
74+
uint64_t database_schema_hash (db_t *db);
75+
bool database_check_schema_hash (db_t *db, uint64_t hash);
76+
int database_update_schema_hash (db_t *db, uint64_t *hash);
77+
4878
int database_begin_savepoint (db_t *db, const char *savepoint_name);
4979
int database_commit_savepoint (db_t *db, const char *savepoint_name);
5080
int database_rollback_savepoint (db_t *db, const char *savepoint_name);

0 commit comments

Comments
 (0)