diff --git a/db/migrations/000017_remotevars.down.sql b/db/migrations/000017_remotevars.down.sql new file mode 100644 index 00000000..442c1b8b --- /dev/null +++ b/db/migrations/000017_remotevars.down.sql @@ -0,0 +1,2 @@ +ALTER TABLE remote DROP COLUMN statevars; + diff --git a/db/migrations/000017_remotevars.up.sql b/db/migrations/000017_remotevars.up.sql new file mode 100644 index 00000000..f9136053 --- /dev/null +++ b/db/migrations/000017_remotevars.up.sql @@ -0,0 +1,2 @@ +ALTER TABLE remote ADD COLUMN statevars json NOT NULL DEFAULT '{}'; + diff --git a/db/schema.sql b/db/schema.sql index 0b9ba237..018e8442 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -58,7 +58,7 @@ CREATE TABLE remote ( local boolean NOT NULL, archived boolean NOT NULL, remoteidx int NOT NULL -); +, statevars json NOT NULL DEFAULT '{}'); CREATE TABLE history ( historyid varchar(36) PRIMARY KEY, ts bigint NOT NULL, @@ -192,10 +192,17 @@ CREATE TABLE IF NOT EXISTS "cmd" ( rtndiffhasharr json NOT NULL, PRIMARY KEY (screenid, cmdid) ); -CREATE TABLE screenupdates ( +CREATE TABLE screenupdate ( updateid integer PRIMARY KEY, screenid varchar(36) NOT NULL, lineid varchar(36) NOT NULL, updatetype varchar(50) NOT NULL, updatets bigint NOT NULL ); +CREATE TABLE webptypos ( + screenid varchar(36) NOT NULL, + lineid varchar(36) NOT NULL, + ptypos bigint NOT NULL, + PRIMARY KEY (screenid, lineid) +); +CREATE INDEX idx_screenupdate_ids ON screenupdate (screenid, lineid); diff --git a/pkg/dbutil/dbutil.go b/pkg/dbutil/dbutil.go index e3dfbbf4..36387327 100644 --- a/pkg/dbutil/dbutil.go +++ b/pkg/dbutil/dbutil.go @@ -4,6 +4,7 @@ import ( "database/sql/driver" "encoding/json" "fmt" + "reflect" "strconv" ) @@ -130,8 +131,22 @@ func QuickSetJsonArr(ptr interface{}, m map[string]interface{}, name string) { json.Unmarshal(barr, ptr) } +func CheckNil(v interface{}) bool { + rv := reflect.ValueOf(v) + if !rv.IsValid() { + return true + } + switch rv.Kind() { + case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Pointer, reflect.Slice: + return rv.IsNil() + + default: + return false + } +} + func QuickNullableJson(v interface{}) string { - if v == nil { + if CheckNil(v) { return "null" } barr, _ := json.Marshal(v) @@ -139,7 +154,7 @@ func QuickNullableJson(v interface{}) string { } func QuickJson(v interface{}) string { - if v == nil { + if CheckNil(v) { return "{}" } barr, _ := json.Marshal(v) @@ -147,7 +162,7 @@ func QuickJson(v interface{}) string { } func QuickJsonBytes(v interface{}) []byte { - if v == nil { + if CheckNil(v) { return []byte("{}") } barr, _ := json.Marshal(v) @@ -155,7 +170,7 @@ func QuickJsonBytes(v interface{}) []byte { } func QuickJsonArr(v interface{}) string { - if v == nil { + if CheckNil(v) { return "[]" } barr, _ := json.Marshal(v) @@ -163,7 +178,7 @@ func QuickJsonArr(v interface{}) string { } func QuickJsonArrBytes(v interface{}) []byte { - if v == nil { + if CheckNil(v) { return []byte("[]") } barr, _ := json.Marshal(v) @@ -186,7 +201,7 @@ func QuickScanJson(ptr interface{}, val interface{}) error { } func QuickValueJson(v interface{}) (driver.Value, error) { - if v == nil { + if CheckNil(v) { return "{}", nil } barr, err := json.Marshal(v) diff --git a/pkg/dbutil/map.go b/pkg/dbutil/map.go index 25ca99d7..491f7037 100644 --- a/pkg/dbutil/map.go +++ b/pkg/dbutil/map.go @@ -123,7 +123,7 @@ func isStringMapType(t reflect.Type) bool { } func ToDBMap(v DBMappable, useBytes bool) map[string]interface{} { - if v == nil { + if CheckNil(v) { return nil } rv := reflect.ValueOf(v) @@ -168,7 +168,7 @@ func ToDBMap(v DBMappable, useBytes bool) map[string]interface{} { } func FromDBMap(v DBMappable, m map[string]interface{}) { - if v == nil { + if CheckNil(v) { panic("StructFromDBMap, v cannot be nil") } rv := reflect.ValueOf(v)