@@ -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
10141013int 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
10321033sqlite3_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
10381039bool 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
10541055int 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