Compare commits

...

5 Commits

Author SHA1 Message Date
lash
03d19283f6 Apply dbconn explicit to all conns by default 2025-01-24 10:09:46 +00:00
lash
15ce29a1a4 Fmt 2025-01-22 18:37:54 +00:00
lash
6749c632b0 Correct handling of db modes 2025-01-22 12:34:24 +00:00
lash
8530c45074 Enable db text/binary mode set in override, config 2025-01-22 09:37:11 +00:00
lash
d5e636fbd6 Gofmt 2025-01-21 15:30:53 +00:00
15 changed files with 178 additions and 103 deletions

View File

@@ -15,17 +15,32 @@ var (
DefaultLanguage string DefaultLanguage string
dbConn string dbConn string
dbConnMissing bool dbConnMissing bool
dbConnMode storage.DbMode
stateDbConn string stateDbConn string
stateDbConnMode storage.DbMode
resourceDbConn string resourceDbConn string
resourceDbConnMode storage.DbMode
userDbConn string userDbConn string
userDbConnMode storage.DbMode
Languages []string Languages []string
) )
type Override struct {
DbConn string
DbConnMode storage.DbMode
StateConn string
StateConnMode storage.DbMode
ResourceConn string
ResourceConnMode storage.DbMode
UserConn string
UserConnMode storage.DbMode
}
func setLanguage() error { func setLanguage() error {
defaultLanguage = env.GetEnv("DEFAULT_LANGUAGE", defaultLanguage) defaultLanguage = env.GetEnv("DEFAULT_LANGUAGE", defaultLanguage)
languages = strings.Split(env.GetEnv("LANGUAGES", defaultLanguage), ",") languages = strings.Split(env.GetEnv("LANGUAGES", defaultLanguage), ",")
haveDefaultLanguage := false haveDefaultLanguage := false
for i, v := range(languages) { for i, v := range languages {
languages[i] = strings.ReplaceAll(v, " ", "") languages[i] = strings.ReplaceAll(v, " ", "")
if languages[i] == defaultLanguage { if languages[i] == defaultLanguage {
haveDefaultLanguage = true haveDefaultLanguage = true
@@ -47,18 +62,22 @@ func setConn() error {
return nil return nil
} }
func ApplyConn(connStr *string, stateConnStr *string, resourceConnStr *string, userConnStr *string) { func ApplyConn(override *Override) {
if connStr != nil { if override.DbConn != "?" {
dbConn = *connStr dbConn = override.DbConn
stateDbConn = override.StateConn
resourceDbConn = override.ResourceConn
userDbConn = override.UserConn
} }
if stateConnStr != nil { dbConnMode = override.DbConnMode
stateDbConn = *stateConnStr if override.StateConn != "?" {
stateDbConn = override.StateConn
} }
if resourceConnStr != nil { if override.ResourceConn != "?" {
resourceDbConn = *resourceConnStr resourceDbConn = override.ResourceConn
} }
if userConnStr != nil { if override.UserConn != "?" {
userDbConn = *userConnStr userDbConn = override.UserConn
} }
if dbConn == "?" { if dbConn == "?" {
@@ -67,28 +86,45 @@ func ApplyConn(connStr *string, stateConnStr *string, resourceConnStr *string, u
if stateDbConn == "?" { if stateDbConn == "?" {
stateDbConn = dbConn stateDbConn = dbConn
stateDbConnMode = dbConnMode
} }
if resourceDbConn == "?" { if resourceDbConn == "?" {
resourceDbConn = dbConn resourceDbConn = dbConn
resourceDbConnMode = dbConnMode
} }
if userDbConn == "?" { if userDbConn == "?" {
userDbConn = dbConn userDbConn = dbConn
userDbConnMode = dbConnMode
}
logg.Debugf("conns", "conn", dbConn, "user", userDbConn)
if override.DbConnMode != storage.DBMODE_ANY {
dbConnMode = override.DbConnMode
}
if override.StateConnMode != storage.DBMODE_ANY {
stateDbConnMode = override.StateConnMode
}
if override.ResourceConnMode != storage.DBMODE_ANY {
resourceDbConnMode = override.ResourceConnMode
}
if override.UserConnMode != storage.DBMODE_ANY {
userDbConnMode = override.UserConnMode
} }
} }
func GetConns() (storage.Conns, error) { func GetConns() (storage.Conns, error) {
o := storage.NewConns() o := storage.NewConns()
c, err := storage.ToConnData(stateDbConn) c, err := storage.ToConnDataMode(stateDbConn, stateDbConnMode)
if err != nil { if err != nil {
return o, err return o, err
} }
o.Set(c, storage.STORETYPE_STATE) o.Set(c, storage.STORETYPE_STATE)
c, err = storage.ToConnData(resourceDbConn) c, err = storage.ToConnDataMode(resourceDbConn, resourceDbConnMode)
if err != nil { if err != nil {
return o, err return o, err
} }
o.Set(c, storage.STORETYPE_RESOURCE) o.Set(c, storage.STORETYPE_RESOURCE)
c, err = storage.ToConnData(userDbConn) c, err = storage.ToConnDataMode(userDbConn, userDbConnMode)
if err != nil { if err != nil {
return o, err return o, err
} }

View File

@@ -2,8 +2,9 @@ package entry
import ( import (
"context" "context"
"git.defalsify.org/vise.git/resource"
"git.defalsify.org/vise.git/persist" "git.defalsify.org/vise.git/persist"
"git.defalsify.org/vise.git/resource"
) )
type EntryHandler interface { type EntryHandler interface {

View File

@@ -7,9 +7,9 @@ import (
"git.defalsify.org/vise.git/engine" "git.defalsify.org/vise.git/engine"
"git.defalsify.org/vise.git/persist" "git.defalsify.org/vise.git/persist"
"git.defalsify.org/vise.git/resource" "git.defalsify.org/vise.git/resource"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
"git.grassecon.net/grassrootseconomics/visedriver/errors"
"git.grassecon.net/grassrootseconomics/visedriver/entry" "git.grassecon.net/grassrootseconomics/visedriver/entry"
"git.grassecon.net/grassrootseconomics/visedriver/errors"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
) )
type BaseRequestHandler struct { type BaseRequestHandler struct {

View File

@@ -5,8 +5,8 @@ import (
"strconv" "strconv"
"git.defalsify.org/vise.git/logging" "git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/visedriver/request"
"git.grassecon.net/grassrootseconomics/visedriver/errors" "git.grassecon.net/grassrootseconomics/visedriver/errors"
"git.grassecon.net/grassrootseconomics/visedriver/request"
) )
var ( var (

View File

@@ -10,8 +10,8 @@ import (
"git.defalsify.org/vise.git/engine" "git.defalsify.org/vise.git/engine"
viseerrors "git.grassecon.net/grassrootseconomics/visedriver/errors" viseerrors "git.grassecon.net/grassrootseconomics/visedriver/errors"
"git.grassecon.net/grassrootseconomics/visedriver/testutil/mocks/httpmocks"
"git.grassecon.net/grassrootseconomics/visedriver/request" "git.grassecon.net/grassrootseconomics/visedriver/request"
"git.grassecon.net/grassrootseconomics/visedriver/testutil/mocks/httpmocks"
) )
// invalidRequestType is a custom type to test invalid request scenarios // invalidRequestType is a custom type to test invalid request scenarios

View File

@@ -4,10 +4,10 @@ import (
"context" "context"
"io" "io"
"git.defalsify.org/vise.git/resource"
"git.defalsify.org/vise.git/persist"
"git.defalsify.org/vise.git/engine" "git.defalsify.org/vise.git/engine"
"git.defalsify.org/vise.git/logging" "git.defalsify.org/vise.git/logging"
"git.defalsify.org/vise.git/persist"
"git.defalsify.org/vise.git/resource"
"git.grassecon.net/grassrootseconomics/visedriver/storage" "git.grassecon.net/grassrootseconomics/visedriver/storage"
) )

View File

@@ -5,6 +5,8 @@ import (
"net/url" "net/url"
) )
type DbMode uint8
const ( const (
DBTYPE_NONE = iota DBTYPE_NONE = iota
DBTYPE_MEM DBTYPE_MEM
@@ -13,6 +15,12 @@ const (
DBTYPE_POSTGRES DBTYPE_POSTGRES
) )
const (
DBMODE_ANY DbMode = iota
DBMODE_BINARY
DBMODE_TEXT
)
const ( const (
STORETYPE_STATE = iota STORETYPE_STATE = iota
STORETYPE_RESOURCE STORETYPE_RESOURCE
@@ -20,6 +28,12 @@ const (
_STORETYPE_MAX _STORETYPE_MAX
) )
var (
DbModeDebug = []string{"ANY", "BIN", "TXT"}
DbTypeDebug = []string{"NONE", "MEM", "FS", "GDBM", "POSTGRES"}
DbStoreDebug = []string{"STATE", "RESOURCE", "USER"}
)
type Conns map[int8]ConnData type Conns map[int8]ConnData
func NewConns() Conns { func NewConns() Conns {
@@ -35,16 +49,18 @@ func (c Conns) Set(conn ConnData, typ int8) {
} }
func (c Conns) Have(conn *ConnData) int8 { func (c Conns) Have(conn *ConnData) int8 {
for i := range(_STORETYPE_MAX) { for i := range _STORETYPE_MAX {
ii := int8(i) ii := int8(i)
v, ok := c[ii] v, ok := c[ii]
if !ok { if !ok {
continue continue
} }
if v.String() == conn.String() { if v.Raw() == conn.Raw() {
if v.Mode() == DBMODE_ANY || v.Mode() == conn.Mode() {
return ii return ii
} }
} }
}
return -1 return -1
} }
@@ -52,22 +68,31 @@ type ConnData struct {
typ int typ int
str string str string
domain string domain string
mode DbMode
} }
func (cd *ConnData) DbType() int { func (cd *ConnData) DbType() int {
return cd.typ return cd.typ
} }
func (cd *ConnData) String() string { func (cd ConnData) String() string {
return cd.str return fmt.Sprintf("conn: %s, mod %s, typ %s", cd.str, DbModeDebug[uint8(cd.mode)], DbTypeDebug[uint8(cd.typ)])
} }
func (cd *ConnData) Domain() string { func (cd *ConnData) Domain() string {
return cd.domain return cd.domain
} }
func (cd *ConnData) Mode() DbMode {
return cd.mode
}
func (cd *ConnData) Path() string { func (cd *ConnData) Path() string {
v, _ := url.Parse(cd.str) v, _ := url.Parse(cd.str)
v.RawQuery = "" v.RawQuery = ""
return v.String() return v.String()
} }
func (cd *ConnData) Raw() string {
return cd.str
}

View File

@@ -61,6 +61,15 @@ func probeMem(s string) (string, string, bool) {
return "", "", true return "", "", true
} }
func ToConnDataMode(connStr string, mode DbMode) (ConnData, error) {
o, err := ToConnData(connStr)
if err != nil {
return o, err
}
o.mode = mode
return o, nil
}
func ToConnData(connStr string) (ConnData, error) { func ToConnData(connStr string) (ConnData, error) {
var o ConnData var o ConnData

View File

@@ -7,7 +7,6 @@ import (
"os" "os"
"path" "path"
"github.com/jackc/pgx/v5/pgxpool"
"git.defalsify.org/vise.git/db" "git.defalsify.org/vise.git/db"
fsdb "git.defalsify.org/vise.git/db/fs" fsdb "git.defalsify.org/vise.git/db/fs"
memdb "git.defalsify.org/vise.git/db/mem" memdb "git.defalsify.org/vise.git/db/mem"
@@ -17,6 +16,7 @@ import (
"git.defalsify.org/vise.git/persist" "git.defalsify.org/vise.git/persist"
"git.defalsify.org/vise.git/resource" "git.defalsify.org/vise.git/resource"
gdbmstorage "git.grassecon.net/grassrootseconomics/visedriver/storage/db/gdbm" gdbmstorage "git.grassecon.net/grassrootseconomics/visedriver/storage/db/gdbm"
"github.com/jackc/pgx/v5/pgxpool"
) )
var ( var (
@@ -61,6 +61,7 @@ func (ms *MenuStorageService) checkDb(ctx context.Context,typ int8) db.Db {
return store return store
} }
connData := ms.conns[typ] connData := ms.conns[typ]
logg.DebugCtxf(ctx, "db check", "conn", connData, "store", DbStoreDebug[typ])
v := ms.conns.Have(&connData) v := ms.conns.Have(&connData)
if v == -1 { if v == -1 {
return nil return nil
@@ -70,7 +71,7 @@ func (ms *MenuStorageService) checkDb(ctx context.Context,typ int8) db.Db {
return nil return nil
} }
ms.store[typ] = ms.store[v] ms.store[typ] = ms.store[v]
logg.DebugCtxf(ctx, "found existing db", "typ", typ, "srctyp", v, "store", ms.store[typ], "srcstore", ms.store[v]) logg.DebugCtxf(ctx, "found existing db", "typ", typ, "srctyp", v, "store", ms.store[typ], "srcstore", ms.store[v], "conn", connData)
return ms.store[typ] return ms.store[typ]
} }
@@ -84,7 +85,7 @@ func (ms *MenuStorageService) getOrCreateDb(ctx context.Context, section string,
} }
connData := ms.conns[typ] connData := ms.conns[typ]
connStr := connData.String() connStr := connData.Raw()
dbTyp := connData.DbType() dbTyp := connData.DbType()
if dbTyp == DBTYPE_POSTGRES { if dbTyp == DBTYPE_POSTGRES {
// TODO: move to vise // TODO: move to vise
@@ -105,12 +106,16 @@ func (ms *MenuStorageService) getOrCreateDb(ctx context.Context, section string,
if err != nil { if err != nil {
return nil, err return nil, err
} }
newDb = fsdb.NewFsDb().WithBinary() fsdbInstance := fsdb.NewFsDb()
if connData.Mode() == DBMODE_BINARY {
fsdbInstance = fsdbInstance.WithBinary()
}
newDb = fsdbInstance
} else if dbTyp == DBTYPE_MEM { } else if dbTyp == DBTYPE_MEM {
logg.WarnCtxf(ctx, "using volatile storage (memdb)") logg.WarnCtxf(ctx, "using volatile storage (memdb)")
newDb = memdb.NewMemDb() newDb = memdb.NewMemDb()
} else { } else {
return nil, fmt.Errorf("unsupported connection string: '%s'\n", connData.String()) return nil, fmt.Errorf("unsupported connection string: '%s'\n", connData.Raw())
} }
logg.InfoCtxf(ctx, "connecting to db", "conn", connData, "typ", typ) logg.InfoCtxf(ctx, "connecting to db", "conn", connData, "typ", typ)
err = newDb.Connect(ctx, connStr) err = newDb.Connect(ctx, connStr)
@@ -135,7 +140,7 @@ func (ms *MenuStorageService) WithGettext(path string, lns []lang.Language) *Men
} }
rs := resource.NewPoResource(lns[0], path) rs := resource.NewPoResource(lns[0], path)
for _, ln := range(lns) { for _, ln := range lns {
rs = rs.WithLanguage(ln) rs = rs.WithLanguage(ln)
} }
@@ -164,7 +169,9 @@ func ensureSchemaExists(ctx context.Context, conn ConnData) error {
func applySession(ctx context.Context, store db.Db) error { func applySession(ctx context.Context, store db.Db) error {
sessionId, ok := ctx.Value("SessionId").(string) sessionId, ok := ctx.Value("SessionId").(string)
if !ok { if !ok {
return fmt.Errorf("missing session to apply to store: %v", store) logg.DebugCtxf(ctx, "missing session to apply", "store", store)
return nil
//return fmt.Errorf("missing session to apply to store: %v", store)
} }
store.SetSession(sessionId) store.SetSession(sessionId)
return nil return nil
@@ -179,7 +186,6 @@ func (ms *MenuStorageService) GetPersister(ctx context.Context) (*persist.Persis
if err != nil { if err != nil {
return nil, err return nil, err
} }
pr := persist.NewPersister(stateStore) pr := persist.NewPersister(stateStore)
logg.TraceCtxf(ctx, "menu storage service", "persist", pr, "store", stateStore) logg.TraceCtxf(ctx, "menu storage service", "persist", pr, "store", stateStore)
return pr, nil return pr, nil
@@ -190,7 +196,6 @@ func (ms *MenuStorageService) GetUserdataDb(ctx context.Context) (db.Db, error)
if err != nil { if err != nil {
return nil, err return nil, err
} }
err = applySession(ctx, userStore) err = applySession(ctx, userStore)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -228,7 +233,7 @@ func (ms *MenuStorageService) ensureDbDir(path string) error {
func (ms *MenuStorageService) Close(ctx context.Context) error { func (ms *MenuStorageService) Close(ctx context.Context) error {
var errs []error var errs []error
var haveErr bool var haveErr bool
for i := range(_STORETYPE_MAX) { for i := range _STORETYPE_MAX {
err := ms.store[int8(i)].Close(ctx) err := ms.store[int8(i)].Close(ctx)
if err != nil { if err != nil {
haveErr = true haveErr = true
@@ -237,7 +242,7 @@ func (ms *MenuStorageService) Close(ctx context.Context) error {
} }
if haveErr { if haveErr {
errStr := "" errStr := ""
for i, err := range(errs) { for i, err := range errs {
errStr += fmt.Sprintf("(%d: %v)", i, err) errStr += fmt.Sprintf("(%d: %v)", i, err)
} }
return errors.New(errStr) return errors.New(errStr)

View File

@@ -5,8 +5,8 @@ import (
"git.defalsify.org/vise.git/db" "git.defalsify.org/vise.git/db"
memdb "git.defalsify.org/vise.git/db/mem" memdb "git.defalsify.org/vise.git/db/mem"
"git.defalsify.org/vise.git/resource"
"git.defalsify.org/vise.git/persist" "git.defalsify.org/vise.git/persist"
"git.defalsify.org/vise.git/resource"
) )
type MemStorageService struct { type MemStorageService struct {
@@ -39,4 +39,3 @@ func (mss *MemStorageService) GetUserdataDb(ctx context.Context) (db.Db, error)
func (mss *MemStorageService) GetResource(ctx context.Context) (resource.Resource, error) { func (mss *MemStorageService) GetResource(ctx context.Context) (resource.Resource, error) {
return mss.rs, nil return mss.rs, nil
} }