Index: dbmod.scm ================================================================== --- dbmod.scm +++ dbmod.scm @@ -345,56 +345,61 @@ (define (dbmod:attach-sync tables dbh destdbfile direction #!key (mode 'full) (no-update '("keys")) ;; do ) (debug:print 0 *default-log-port* "Doing sync "direction" "destdbfile) - (let* ((table-names (map car tables)) - (dest-exists (file-exists? destdbfile))) - (assert dest-exists "FATAL: sync called with non-existant file, "destdbfile) - ;; attach the destdbfile - ;; for each table - ;; insert into dest. select * from src.
where last_update>last_update - ;; done - (debug:print 0 *default-log-port* "Attaching "destdbfile" as auxdb") - (sqlite3:execute dbh (conc "ATTACH '"destdbfile"' AS auxdb;")) - (for-each - (lambda (table) - (let* ((tbldat (alist-ref table tables equal?)) - (fields (map car tbldat)) - (fields-str (string-intersperse fields ",")) - (dir (eq? direction 'todest)) - (fromdb (if dir "" "auxdb.")) - (todb (if dir "auxdb." "")) - (stmt1 (conc "INSERT OR IGNORE INTO "todb table - " SELECT * FROM "fromdb table";")) - (stmt2 (conc "INSERT OR REPLACE INTO "todb table - " SELECT * FROM "fromdb table" WHERE " - fromdb table".last_update > " - todb table".last_update;")) - (stmt3 (conc "INSERT OR REPLACE INTO "todb"."table - " SELECT * FROM "fromdb table";")) - (stmt4 (conc "DELETE FROM "todb table" WHERE "fromdb - table ".last_update > "todb table".last_update;")) - (stmt5 (conc "DELETE FROM "todb table";")) - (stmt6 (conc "INSERT OR REPLACE INTO "todb table" ("fields-str") SELECT "fields-str" FROM "fromdb table";")) - (start-ms (current-milliseconds))) - ;; (if (not (has-last-update dbh table)) - ;; (sqlite3:execute dbh (conc "ALTER TABLE "table" ADD COLUMN last_update INTEGER;"))) - ;; (if (not (has-last-update dbh (conc "auxdb."table))) - ;; (sqlite3:execute dbh (conc "ALTER TABLE auxdb."table" ADD COLUMN last_update INTEGER;"))) - (sqlite3:with-transaction - dbh - (lambda () - (sqlite3:execute dbh stmt5) - ;; (sqlite3:execute dbh stmt4) ;; if it worked this would be better for incremental up - ;; (sqlite3:execute dbh stmt1) - (sqlite3:execute dbh stmt6) - )) - (debug:print 0 *default-log-port* "Synced table "table" in "(- (current-milliseconds) start-ms)"ms") - )) - table-names) - (sqlite3:execute dbh "DETACH auxdb;"))) + (if (not (sqlite3:auto-committing? dbh)) + (debug:print 0 *default-log-port* "Skipping sync due to transaction in flight.") + (let* ((table-names (map car tables)) + (dest-exists (file-exists? destdbfile))) + (assert dest-exists "FATAL: sync called with non-existant file, "destdbfile) + ;; attach the destdbfile + ;; for each table + ;; insert into dest.
select * from src.
where last_update>last_update + ;; done + (debug:print 0 *default-log-port* "Attaching "destdbfile" as auxdb") + (sqlite3:execute dbh (conc "ATTACH '"destdbfile"' AS auxdb;")) + (for-each + (lambda (table) + (let* ((tbldat (alist-ref table tables equal?)) + (fields (map car tbldat)) + (fields-str (string-intersperse fields ",")) + (dir (eq? direction 'todest)) + (fromdb (if dir "" "auxdb.")) + (todb (if dir "auxdb." "")) + (stmt1 (conc "INSERT OR IGNORE INTO "todb table + " SELECT * FROM "fromdb table";")) + (stmt2 (conc "INSERT OR REPLACE INTO "todb table + " SELECT * FROM "fromdb table" WHERE " + fromdb table".last_update > " + todb table".last_update;")) + (stmt3 (conc "INSERT OR REPLACE INTO "todb"."table + " SELECT * FROM "fromdb table";")) + (stmt4 (conc "DELETE FROM "todb table" WHERE "fromdb + table ".last_update > "todb table".last_update;")) + (stmt5 (conc "DELETE FROM "todb table";")) + (stmt6 (conc "INSERT OR REPLACE INTO "todb table" ("fields-str") SELECT "fields-str" FROM "fromdb table";")) + (start-ms (current-milliseconds))) + ;; (if (not (has-last-update dbh table)) + ;; (sqlite3:execute dbh (conc "ALTER TABLE "table" ADD COLUMN last_update INTEGER;"))) + ;; (if (not (has-last-update dbh (conc "auxdb."table))) + ;; (sqlite3:execute dbh (conc "ALTER TABLE auxdb."table" ADD COLUMN last_update INTEGER;"))) + (if (sqlite3:auto-committing? dbh) + (begin + (sqlite3:with-transaction + dbh + (lambda () + (sqlite3:execute dbh stmt5) + ;; (sqlite3:execute dbh stmt4) ;; if it worked this would be better for incremental up + ;; (sqlite3:execute dbh stmt1) + (sqlite3:execute dbh stmt6) + )) + (debug:print 0 *default-log-port* "Synced table "table + " in "(- (current-milliseconds) start-ms)"ms")) + (debug:print 0 *default-log-port* "Skipping sync of table "table" due to transaction in flight.")))) + table-names) + (sqlite3:execute dbh "DETACH auxdb;")))) ;; prefix is "" or "auxdb." ;; ;; (define (dbmod:last-update-patch dbh prefix) ;; (let ((