Skip to content

Commit 9f2ff85

Browse files
committed
fix schema versions table
1 parent 5806499 commit 9f2ff85

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

src/cloudsync.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2729,9 +2729,13 @@ void cloudsync_cleanup (sqlite3_context *context, int argc, sqlite3_value **argv
27292729
DEBUG_FUNCTION("cloudsync_cleanup");
27302730

27312731
const char *table = (const char *)sqlite3_value_text(argv[0]);
2732+
cloudsync_context *data = (cloudsync_context *)sqlite3_user_data(context);
2733+
sqlite3 *db = sqlite3_context_db_handle(context);
27322734

27332735
if (dbutils_is_star_table(table)) cloudsync_cleanup_all(context);
27342736
else cloudsync_cleanup_internal(context, table);
2737+
2738+
if (dbutils_table_exists(db, CLOUDSYNC_TABLE_SETTINGS_NAME) == true) dbutils_update_schema_hash(db, &data->schema_hash);
27352739
}
27362740

27372741
void cloudsync_enable_disable (sqlite3_context *context, const char *table_name, bool value) {
@@ -2968,7 +2972,6 @@ void cloudsync_init (sqlite3_context *context, int argc, sqlite3_value **argv) {
29682972

29692973
const char *table = (const char *)sqlite3_value_text(argv[0]);
29702974

2971-
29722975
cloudsync_context *data = (cloudsync_context *)sqlite3_user_data(context);
29732976
sqlite3 *db = sqlite3_context_db_handle(context);
29742977
int rc = sqlite3_exec(db, "SAVEPOINT cloudsync_init;", NULL, NULL, NULL);

src/dbutils.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -988,11 +988,10 @@ int dbutils_settings_init (sqlite3 *db, void *cloudsync_data, sqlite3_context *c
988988
if (schema_versions_exists == false) {
989989
DEBUG_SETTINGS("cloudsync_schema_versions does not exist (creating a new one)");
990990

991-
char sql[1024];
992991
int rc = SQLITE_OK;
993992

994993
// create table
995-
snprintf(sql, sizeof(sql), "CREATE TABLE IF NOT EXISTS %s (hash INTEGER PRIMARY KEY NOT NULL, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP); CREATE INDEX idx_timestamp ON %s (timestamp);", CLOUDSYNC_SCHEMA_VERSIONS_NAME, CLOUDSYNC_SCHEMA_VERSIONS_NAME);
994+
char *sql = "CREATE TABLE IF NOT EXISTS cloudsync_schema_versions (hash INTEGER PRIMARY KEY, seq INTEGER NOT NULL)";
996995
rc = sqlite3_exec(db, sql, NULL, NULL, NULL);
997996
if (rc != SQLITE_OK) {if (context) sqlite3_result_error(context, sqlite3_errmsg(db), -1); return rc;}
998997
}
@@ -1013,7 +1012,7 @@ int dbutils_settings_init (sqlite3 *db, void *cloudsync_data, sqlite3_context *c
10131012

10141013
int dbutils_update_schema_hash(sqlite3 *db, uint64_t *hash) {
10151014
char *schemasql = "SELECT group_concat(LOWER(sql)) FROM sqlite_master "
1016-
"WHERE type = 'table' AND name IN (SELECT tbl_name FROM cloudsync_table_settings) "
1015+
"WHERE type = 'table' AND name IN (SELECT tbl_name FROM cloudsync_table_settings ORDER BY tbl_name) "
10171016
"ORDER BY name;";
10181017
char *schema = dbutils_text_select(db, schemasql);
10191018
if (!schema) return SQLITE_ERROR;
@@ -1022,17 +1021,19 @@ int dbutils_update_schema_hash(sqlite3 *db, uint64_t *hash) {
10221021
if (hash && *hash == h) return SQLITE_CONSTRAINT;
10231022

10241023
char sql[1024];
1025-
snprintf(sql, sizeof(sql), "INSERT INTO %s (hash) VALUES (%lld);", CLOUDSYNC_SCHEMA_VERSIONS_NAME, (sqlite3_int64)h);
1024+
snprintf(sql, sizeof(sql), "INSERT INTO cloudsync_schema_versions (hash, seq) "
1025+
"VALUES (%lld, COALESCE((SELECT MAX(seq) FROM cloudsync_schema_versions), 0) + 1) "
1026+
"ON CONFLICT(hash) DO UPDATE SET "
1027+
" seq = (SELECT COALESCE(MAX(seq), 0) + 1 FROM cloudsync_schema_versions);", (sqlite3_int64)h);
10261028
int rc = sqlite3_exec(db, sql, NULL, NULL, NULL);
1027-
1028-
if (hash) *hash = h;
1029+
if (rc == SQLITE_OK && hash) *hash = h;
10291030
return rc;
10301031
}
10311032

10321033
sqlite3_uint64 dbutils_schema_hash (sqlite3 *db) {
10331034
DEBUG_DBFUNCTION("dbutils_schema_version");
10341035

1035-
return (sqlite3_uint64)dbutils_int_select(db, "SELECT hash FROM cloudsync_schema_versions ORDER BY timestamp DESC limit 1;");
1036+
return (sqlite3_uint64)dbutils_int_select(db, "SELECT hash FROM cloudsync_schema_versions ORDER BY seq DESC limit 1;");
10361037
}
10371038

10381039
bool dbutils_check_schema_hash (sqlite3 *db, sqlite3_uint64 hash) {
@@ -1052,6 +1053,6 @@ bool dbutils_check_schema_hash (sqlite3 *db, sqlite3_uint64 hash) {
10521053

10531054

10541055
int dbutils_settings_cleanup (sqlite3 *db) {
1055-
const char *sql = "DROP TABLE IF EXISTS cloudsync_settings; DROP TABLE IF EXISTS cloudsync_site_id; DROP TABLE IF EXISTS cloudsync_table_settings";
1056+
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; ";
10561057
return sqlite3_exec(db, sql, NULL, NULL, NULL);
10571058
}

0 commit comments

Comments
 (0)