From 6bad5dab784c5ccb9e55ed0ad0a8443ba1d9e96d Mon Sep 17 00:00:00 2001 From: dave griffiths Date: Tue, 19 Sep 2017 10:08:01 +0000 Subject: [PATCH] setting sent to zero when updating values, added sent to schema properly - but kept alter for tablets, now running unit tests all the time too --- eavdb/eavdb.ss | 49 +++++++++++++++++++++++++++++++++--------- eavdb/entity-update.ss | 5 +++-- eavdb/entity-values.ss | 6 ++++-- 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/eavdb/eavdb.ss b/eavdb/eavdb.ss index ab6db1f..765de22 100644 --- a/eavdb/eavdb.ss +++ b/eavdb/eavdb.ss @@ -33,42 +33,44 @@ (provide (all-defined-out)) -(msg "hello from eavdb.ss") - (define (upgrade-table db name) (db-exec db (string-append "alter table " name " add version integer")) - (db-exec db (string-append "alter table " name " add sent integer default 0")) - ) + (db-exec db (string-append "alter table " name " add sent integer default 0"))) ;; create eav tables (add types as required) ;; aggregating version updates - should clean all this up +;; +;; remember that this is run on both pi and android - on the tablets we don't really know +;; how old the initial versions of the databases are, they might go right back to the beginning +;; so need to be super conservative and alter tables to add new stuff (define (setup db table) (msg "db setup") - (db-exec db (string-append "create table " table "_entity ( entity_id integer primary key autoincrement, entity_type varchar(256), unique_id varchar(256), dirty integer, version integer)")) + (db-exec db (string-append "create table " table "_entity ( entity_id integer primary key autoincrement, entity_type varchar(256), unique_id varchar(256), dirty integer, version integer, sent integer default 0)")) + ;; throws benign errors if it exists - we catch and ignore em... (db-exec db (string-append "alter table " table "_entity add sent integer default 0")) (db-exec db (string-append "create index if not exists index_" table "_entity on " table "_entity (unique_id)")) - (db-exec db (string-append "create table " table "_attribute ( id integer primary key autoincrement, attribute_id varchar(256), entity_type varchar(256), attribute_type varchar(256))")) + (db-exec db (string-append "create table " table "_attribute ( id integer primary key autoincrement, attribute_id varchar(256), entity_type varchar(256), attribute_type varchar(256), sent integer default 0)")) (db-exec db (string-append "alter table " table "_attribute add sent integer default 0")) (db-exec db (string-append "create index if not exists index_" table "_attribute on " table "_attribute (entity_type)")) - (db-exec db (string-append "create table " table "_value_varchar ( id integer primary key autoincrement, entity_id integer, attribute_id varchar(255), value varchar(4096), dirty integer, version integer)")) + (db-exec db (string-append "create table " table "_value_varchar ( id integer primary key autoincrement, entity_id integer, attribute_id varchar(255), value varchar(4096), dirty integer, version integer, sent integer default 0)")) (upgrade-table db (string-append table "_value_varchar")) (db-exec db (string-append "create index if not exists index_" table "_value_varchar on " table "_value_varchar (entity_id,attribute_id)")) - (db-exec db (string-append "create table " table "_value_int ( id integer primary key autoincrement, entity_id integer, attribute_id varchar(255), value integer, dirty integer, version integer)")) + (db-exec db (string-append "create table " table "_value_int ( id integer primary key autoincrement, entity_id integer, attribute_id varchar(255), value integer, dirty integer, version integer, sent integer default 0)")) (upgrade-table db (string-append table "_value_int")) (db-exec db (string-append "create index if not exists index_" table "_value_int on " table "_value_int (entity_id,attribute_id)")) - (db-exec db (string-append "create table " table "_value_real ( id integer primary key autoincrement, entity_id integer, attribute_id varchar(255), value real, dirty integer, version integer)")) + (db-exec db (string-append "create table " table "_value_real ( id integer primary key autoincrement, entity_id integer, attribute_id varchar(255), value real, dirty integer, version integer, sent integer default 0)")) (upgrade-table db (string-append table "_value_real")) (db-exec db (string-append "create index if not exists index_" table "_value_real on " table "_value_real (entity_id,attribute_id)")) - (db-exec db (string-append "create table " table "_value_file ( id integer primary key autoincrement, entity_id integer, attribute_id varchar(255), value varchar(4096), dirty integer, version integer)")) + (db-exec db (string-append "create table " table "_value_file ( id integer primary key autoincrement, entity_id integer, attribute_id varchar(255), value varchar(4096), dirty integer, version integer, sent integer default 0)")) (upgrade-table db (string-append table "_value_file")) (db-exec db (string-append "create index if not exists index_" table "_value_file on " table "_value_file (entity_id,attribute_id)")) @@ -119,3 +121,30 @@ (lambda (i) (get-entity-only db table i kt-list)) (filter-entities-inc-deleted db table type filter))) + +(define (run-unit-tests) + (msg "running eavdb tests...") + (define last-test-db (open (string->path "unit-test.db"))) + ;; clear out last test + (db-exec last-test-db "drop table sync_entity;") + (db-exec last-test-db "drop table sync_attribute;") + (db-exec last-test-db "drop table sync_value_varchar;") + (db-exec last-test-db "drop table sync_value_int;") + (db-exec last-test-db "drop table sync_value_real;") + (db-exec last-test-db "drop table sync_value_file;") + + (db-exec last-test-db "drop table stream_entity;") + (db-exec last-test-db "drop table stream_attribute;") + (db-exec last-test-db "drop table stream_value_varchar;") + (db-exec last-test-db "drop table stream_value_int;") + (db-exec last-test-db "drop table stream_value_real;") + (db-exec last-test-db "drop table stream_value_file;") + ;; reopen to run setup + (define test-db (db-open "unit-test.db" setup)) + (ktv-test) + (entity-update-test test-db "sync") + (entity-sync-test test-db "sync") + (msg "finished running eavdb tests...")) + +(run-unit-tests) + diff --git a/eavdb/entity-update.ss b/eavdb/entity-update.ss index 79c52d3..d7e9bca 100644 --- a/eavdb/entity-update.ss +++ b/eavdb/entity-update.ss @@ -28,16 +28,17 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; updating data +;; setting sent=0 to update rabbitmq - probably not needed? (define (update-entity-changed db table entity-id) (db-exec db (string-append - "update " table "_entity set dirty=?, version=version+1 where entity_id = ?") + "update " table "_entity set dirty=?, sent=0, version=version+1 where entity_id = ?") 1 entity-id)) (define (update-entity-version db table entity-id version) (db-exec db (string-append - "update " table "_entity set dirty=0, version=? where entity_id = ?") + "update " table "_entity set dirty=0, sent=0, version=? where entity_id = ?") version entity-id)) ;; update an entire entity (version incl), via a (possibly partial) list of key/value pairs diff --git a/eavdb/entity-values.ss b/eavdb/entity-values.ss index 5d5a22b..9de9ffc 100644 --- a/eavdb/entity-values.ss +++ b/eavdb/entity-values.ss @@ -63,6 +63,7 @@ ;; update the value given an entity type, a attribute type and it's key (= attriute_id) ;; creates the value if it doesn't already exist, updates it otherwise if it's different +;; setting sent=0 to work with the rabbitmq updater here - probably not needed (define (update-value db table entity-id ktv) (let ((s (select-first db (string-append @@ -74,11 +75,12 @@ (if (not (ktv-eq? ktv (list (ktv-key ktv) (ktv-type ktv) s))) (db-exec db (string-append "update " table "_value_" (ktv-type ktv) - " set value=?, dirty=1 where entity_id = ? and attribute_id = ?") + " set value=?, dirty=1, sent=0 where entity_id = ? and attribute_id = ?") (ktv-value ktv) entity-id (ktv-key ktv)) '())))) ;;(msg "values for" (ktv-key ktv) "are the same (" (ktv-value ktv) "==" s ")"))))) ;; don't make dirty or update version here +;; setting sent=0 to work with the rabbitmq updater here (define (update-value-from-sync db table entity-id ktv) (let ((s (select-first db (string-append @@ -91,7 +93,7 @@ (insert-value db table entity-id ktv #t) ;; <- don't make dirty!? (db-exec db (string-append "update " table "_value_" (ktv-type ktv) - " set value=?, dirty=0 where entity_id = ? and attribute_id = ?") + " set value=?, dirty=0, sent=0 where entity_id = ? and attribute_id = ?") (ktv-value ktv) entity-id (ktv-key ktv))))) ;; get all the (current) attributes for an entity type