commit 21449e347e37d58f5d42b7eea218e468512b552d
parent cdc33f4cf7963038da5a3a2b6f2e4783fbf8f98a
Author: lash <dev@holbrook.no>
Date: Sun, 6 Apr 2025 23:29:19 +0100
Add dblog wrapper
Diffstat:
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