go-vise

Constrained Size Output Virtual Machine
Info | Log | Files | Refs | README | LICENSE

commit 21449e347e37d58f5d42b7eea218e468512b552d
parent cdc33f4cf7963038da5a3a2b6f2e4783fbf8f98a
Author: lash <dev@holbrook.no>
Date:   Sun,  6 Apr 2025 23:29:19 +0100

Add dblog wrapper

Diffstat:
Mdb/db.go | 4+++-
Mdb/fs/dump.go | 4++++
Mdb/fs/fs.go | 5+++++
Mdb/gdbm/gdbm.go | 5+++++
Adb/log/log.go | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Adb/log/log_test.go | 11+++++++++++
Mdb/mem/mem.go | 5+++++
Mdb/postgres/pg.go | 5+++++
8 files changed, 158 insertions(+), 1 deletion(-)

diff --git a/db/db.go b/db/db.go @@ -81,6 +81,7 @@ type Db interface { Stop(context.Context) error Abort(context.Context) Connection() string + Base() *DbBase } type LookupKey struct { @@ -126,6 +127,7 @@ type baseDb struct { lang *lang.Language seal bool connStr string + logDb Db } // DbBase is a base class that must be extended by all db.Db implementers. @@ -201,7 +203,7 @@ func (bd *DbBase) CheckPut() bool { func (bd *DbBase) ToSessionKey(pfx uint8, key []byte) []byte { var b []byte - if pfx > datatype_sessioned_threshold { + if pfx > datatype_sessioned_threshold || pfx == DATATYPE_UNKNOWN { b = append([]byte(bd.sid), key...) } else { b = key diff --git a/db/fs/dump.go b/db/fs/dump.go @@ -26,6 +26,8 @@ func (fdb *fsDb) Dump(ctx context.Context, key []byte) (*db.Dumper, error) { return nil, err } + logg.TraceCtxf(ctx, "have elements in dir", "n", len(fdb.elements)) + if len(fdb.elements) > 0 { if len(key) == 0 { k := fdb.nextElement() @@ -42,7 +44,9 @@ func (fdb *fsDb) Dump(ctx context.Context, key []byte) (*db.Dumper, error) { } for len(fdb.elements) > 0 { k := fdb.nextElement() + logg.DebugCtxf(ctx, "processing element", "e", string(k)) if len(key) > len(k) { + continue } kk, err := fdb.DecodeKey(ctx, k) diff --git a/db/fs/fs.go b/db/fs/fs.go @@ -36,6 +36,11 @@ func NewFsDb() *fsDb { return db } +// Base implements Db +func (fdb *fsDb) Base() *db.BaseDb { + return fdb.DbBase +} + func (fdb *fsDb) WithBinary() *fsDb { fdb.binary = true return fdb diff --git a/db/gdbm/gdbm.go b/db/gdbm/gdbm.go @@ -29,6 +29,11 @@ func NewGdbmDb() *gdbmDb { return db } +// Base implements Db +func (gdb *gdbmDb) Base() *db.BaseDb { + return gdb.DbBase +} + // WithReadOnly sets database as read only. // // There may exist more than one instance of read-only diff --git a/db/log/log.go b/db/log/log.go @@ -0,0 +1,120 @@ +package log + +import ( + "context" + "encoding/binary" + "time" + + "git.defalsify.org/vise.git/logging" + "git.defalsify.org/vise.git/lang" + "git.defalsify.org/vise.git/db" +) + +var ( + logg logging.Logger = logging.NewVanilla().WithDomain("logdb") +) + +type logDb struct { + db.Db + logDb db.Db +} + +func NewLogDb(mainDb db.Db, db db.Db) db.Db { + return &logDb{ + Db: mainDb, + logDb: db, + } +} + +func (ldb *logDb) Start(ctx context.Context) error { + err := ldb.Db.Start(ctx) + if err != nil { + return err + } + err = ldb.logDb.Start(ctx) + if err != nil { + logg.DebugCtxf(ctx, "logdb start fail", "ctx", ctx, "err", err) + } + return nil +} + +func (ldb *logDb) Stop(ctx context.Context) error { + err := ldb.logDb.Stop(ctx) + if err != nil { + logg.DebugCtxf(ctx, "logdb stop fail", "ctx", ctx, "err", err) + } + return ldb.Db.Stop(ctx) +} + +func (ldb *logDb) Connect(ctx context.Context, connStr string) error { + err := ldb.Db.Connect(ctx, connStr) + if err != nil { + return err + } + err = ldb.logDb.Connect(ctx, connStr) + if err != nil { + ldb.Db.Close(ctx) + } + return err +} + +func (ldb *logDb) SetPrefix(pfx uint8) { + ldb.Db.SetPrefix(pfx) + ldb.logDb.SetPrefix(pfx) +} + +func (ldb *logDb) SetLanguage(ln *lang.Language) { + ldb.Db.SetLanguage(ln) + ldb.logDb.SetLanguage(ln) +} + +func (ldb *logDb) SetSession(sessionId string) { + ldb.Db.SetSession(sessionId) + ldb.logDb.SetSession(sessionId) +} + +func (ldb *logDb) Base() *db.DbBase { + return ldb.Db.Base() +} + +func (ldb *logDb) toLogDbEntry(ctx context.Context, key []byte, val []byte) ([]byte, []byte) { + var innerKey []byte + var innerValKey []byte + var innerValVal []byte + var l []byte + + lk, err := ldb.Base().ToKey(ctx, key) + if err != nil { + return nil, nil + } + if lk.Translation == nil { + innerValKey = lk.Default + } else { + innerValKey = lk.Translation + } + binary.PutUvarint(l, uint64(len(innerValKey))) + innerValKey = append(l, innerValKey...) + innerValKey = append(l, val...) + + t := time.Now().UnixNano() + binary.BigEndian.PutUint64(innerKey, uint64(t)) + innerKey = ldb.Base().ToSessionKey(db.DATATYPE_UNKNOWN, innerKey) + return innerKey, append(innerValKey, innerValVal...) +} + +func (ldb *logDb) Put(ctx context.Context, key []byte, val []byte) error { + err := ldb.Db.Put(ctx, key, val) + if err != nil { + return err + } + key, val = ldb.toLogDbEntry(ctx, key, val) + if key == nil { + logg.DebugCtxf(ctx, "logdb kv fail", "key", key, "err", err) + return nil + } + err = ldb.logDb.Put(ctx, key, val) + if err != nil { + logg.DebugCtxf(ctx, "logdb put fail", "key", key, "err", err) + } + return nil +} diff --git a/db/log/log_test.go b/db/log/log_test.go @@ -0,0 +1,11 @@ +package log + +import ( + "context" + "testing" +) + +func TestLogDb(t *testing.T) { + ctx := context.Background() + _ = ctx +} diff --git a/db/mem/mem.go b/db/mem/mem.go @@ -28,6 +28,11 @@ func NewMemDb() *memDb { return db } +// Base implements Db +func (mdb *memDb) Base() *db.BaseDb { + return mdb.DbBase +} + // String implements the string interface. func (mdb *memDb) String() string { return "memdb" diff --git a/db/postgres/pg.go b/db/postgres/pg.go @@ -42,6 +42,11 @@ func NewPgDb() *pgDb { return db } +// Base implements Db +func (pdb *pgDb) Base() *db.BaseDb { + return pdb.DbBase +} + // WithSchema sets the Postgres schema to use for the storage table. func (pdb *pgDb) WithSchema(schema string) *pgDb { pdb.schema = schema