Compare commits
No commits in common. "master" and "lash/dbtx" have entirely different histories.
@ -15,32 +15,17 @@ var (
|
||||
DefaultLanguage string
|
||||
dbConn string
|
||||
dbConnMissing bool
|
||||
dbConnMode storage.DbMode
|
||||
stateDbConn string
|
||||
stateDbConnMode storage.DbMode
|
||||
resourceDbConn string
|
||||
resourceDbConnMode storage.DbMode
|
||||
userDbConn string
|
||||
userDbConnMode storage.DbMode
|
||||
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 {
|
||||
defaultLanguage = env.GetEnv("DEFAULT_LANGUAGE", defaultLanguage)
|
||||
languages = strings.Split(env.GetEnv("LANGUAGES", defaultLanguage), ",")
|
||||
haveDefaultLanguage := false
|
||||
for i, v := range languages {
|
||||
for i, v := range(languages) {
|
||||
languages[i] = strings.ReplaceAll(v, " ", "")
|
||||
if languages[i] == defaultLanguage {
|
||||
haveDefaultLanguage = true
|
||||
@ -62,22 +47,18 @@ func setConn() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func ApplyConn(override *Override) {
|
||||
if override.DbConn != "?" {
|
||||
dbConn = override.DbConn
|
||||
stateDbConn = override.StateConn
|
||||
resourceDbConn = override.ResourceConn
|
||||
userDbConn = override.UserConn
|
||||
func ApplyConn(connStr *string, stateConnStr *string, resourceConnStr *string, userConnStr *string) {
|
||||
if connStr != nil {
|
||||
dbConn = *connStr
|
||||
}
|
||||
dbConnMode = override.DbConnMode
|
||||
if override.StateConn != "?" {
|
||||
stateDbConn = override.StateConn
|
||||
if stateConnStr != nil {
|
||||
stateDbConn = *stateConnStr
|
||||
}
|
||||
if override.ResourceConn != "?" {
|
||||
resourceDbConn = override.ResourceConn
|
||||
if resourceConnStr != nil {
|
||||
resourceDbConn = *resourceConnStr
|
||||
}
|
||||
if override.UserConn != "?" {
|
||||
userDbConn = override.UserConn
|
||||
if userConnStr != nil {
|
||||
userDbConn = *userConnStr
|
||||
}
|
||||
|
||||
if dbConn == "?" {
|
||||
@ -86,45 +67,28 @@ func ApplyConn(override *Override) {
|
||||
|
||||
if stateDbConn == "?" {
|
||||
stateDbConn = dbConn
|
||||
stateDbConnMode = dbConnMode
|
||||
}
|
||||
if resourceDbConn == "?" {
|
||||
resourceDbConn = dbConn
|
||||
resourceDbConnMode = dbConnMode
|
||||
}
|
||||
if userDbConn == "?" {
|
||||
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) {
|
||||
o := storage.NewConns()
|
||||
c, err := storage.ToConnDataMode(stateDbConn, stateDbConnMode)
|
||||
c, err := storage.ToConnData(stateDbConn)
|
||||
if err != nil {
|
||||
return o, err
|
||||
}
|
||||
o.Set(c, storage.STORETYPE_STATE)
|
||||
c, err = storage.ToConnDataMode(resourceDbConn, resourceDbConnMode)
|
||||
c, err = storage.ToConnData(resourceDbConn)
|
||||
if err != nil {
|
||||
return o, err
|
||||
}
|
||||
o.Set(c, storage.STORETYPE_RESOURCE)
|
||||
c, err = storage.ToConnDataMode(userDbConn, userDbConnMode)
|
||||
c, err = storage.ToConnData(userDbConn)
|
||||
if err != nil {
|
||||
return o, err
|
||||
}
|
||||
|
@ -2,9 +2,8 @@ package entry
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"git.defalsify.org/vise.git/persist"
|
||||
"git.defalsify.org/vise.git/resource"
|
||||
"git.defalsify.org/vise.git/persist"
|
||||
)
|
||||
|
||||
type EntryHandler interface {
|
||||
|
2
go.mod
2
go.mod
@ -3,7 +3,7 @@ module git.grassecon.net/grassrootseconomics/visedriver
|
||||
go 1.23.0
|
||||
|
||||
require (
|
||||
git.defalsify.org/vise.git v0.2.3-0.20250204132233-2bffe532f21e
|
||||
git.defalsify.org/vise.git v0.2.3-0.20250119111745-4f69d6fe5939
|
||||
github.com/jackc/pgx/v5 v5.7.1
|
||||
github.com/joho/godotenv v1.5.1
|
||||
)
|
||||
|
4
go.sum
4
go.sum
@ -1,5 +1,5 @@
|
||||
git.defalsify.org/vise.git v0.2.3-0.20250204132233-2bffe532f21e h1:gtB9OdX6x5gQRM3W824dEurXuuf/YPInqgtv2KAp5Zo=
|
||||
git.defalsify.org/vise.git v0.2.3-0.20250204132233-2bffe532f21e/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
|
||||
git.defalsify.org/vise.git v0.2.3-0.20250119111745-4f69d6fe5939 h1:DA0gus9TuKpLvZMDmmqCAwAr5Lly+U93jtO2OKtGAeo=
|
||||
git.defalsify.org/vise.git v0.2.3-0.20250119111745-4f69d6fe5939/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
|
||||
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c h1:H9Nm+I7Cg/YVPpEV1RzU3Wq2pjamPc/UtHDgItcb7lE=
|
||||
github.com/barbashov/iso639-3 v0.0.0-20211020172741-1f4ffb2d8d1c/go.mod h1:rGod7o6KPeJ+hyBpHfhi4v7blx9sf+QsHsA7KAsdN6U=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
|
@ -7,37 +7,28 @@ import (
|
||||
"git.defalsify.org/vise.git/engine"
|
||||
"git.defalsify.org/vise.git/persist"
|
||||
"git.defalsify.org/vise.git/resource"
|
||||
"git.grassecon.net/grassrootseconomics/visedriver/entry"
|
||||
"git.grassecon.net/grassrootseconomics/visedriver/errors"
|
||||
"git.grassecon.net/grassrootseconomics/visedriver/storage"
|
||||
"git.grassecon.net/grassrootseconomics/visedriver/errors"
|
||||
"git.grassecon.net/grassrootseconomics/visedriver/entry"
|
||||
)
|
||||
|
||||
type EngineFunc func(engine.Config, resource.Resource, *persist.Persister) engine.Engine
|
||||
|
||||
type BaseRequestHandler struct {
|
||||
cfgTemplate engine.Config
|
||||
rp RequestParser
|
||||
rs resource.Resource
|
||||
hn entry.EntryHandler
|
||||
provider storage.StorageProvider
|
||||
engineFunc EngineFunc
|
||||
}
|
||||
|
||||
//func NewBaseRequestHandler(cfg engine.Config, rs resource.Resource, stateDb db.Db, userdataDb db.Db, rp request.RequestParser, hn *handlers.Handlers) *BaseRequestHandler {
|
||||
func NewBaseRequestHandler(cfg engine.Config, rs resource.Resource, stateDb db.Db, userdataDb db.Db, rp RequestParser, hn entry.EntryHandler) *BaseRequestHandler {
|
||||
h := &BaseRequestHandler{
|
||||
return &BaseRequestHandler{
|
||||
cfgTemplate: cfg,
|
||||
rs: rs,
|
||||
hn: hn,
|
||||
rp: rp,
|
||||
provider: storage.NewSimpleStorageProvider(stateDb, userdataDb),
|
||||
}
|
||||
h.engineFunc = h.getDefaultEngine
|
||||
return h
|
||||
}
|
||||
|
||||
func (f *BaseRequestHandler) WithEngineFunc(fn EngineFunc) *BaseRequestHandler {
|
||||
f.engineFunc = fn
|
||||
return f
|
||||
}
|
||||
|
||||
func (f *BaseRequestHandler) Shutdown(ctx context.Context) {
|
||||
@ -48,22 +39,15 @@ func (f *BaseRequestHandler) Shutdown(ctx context.Context) {
|
||||
}
|
||||
|
||||
func (f *BaseRequestHandler) GetEngine(cfg engine.Config, rs resource.Resource, pr *persist.Persister) engine.Engine {
|
||||
return f.engineFunc(cfg, rs, pr)
|
||||
}
|
||||
|
||||
func (f *BaseRequestHandler) getDefaultEngine(cfg engine.Config, rs resource.Resource, pr *persist.Persister) engine.Engine {
|
||||
en := engine.NewEngine(cfg, rs)
|
||||
en = en.WithPersister(pr)
|
||||
en = en.WithFirst(f.hn.Init)
|
||||
if f.cfgTemplate.EngineDebug {
|
||||
en = en.WithDebug(nil)
|
||||
}
|
||||
return en
|
||||
}
|
||||
|
||||
func(f *BaseRequestHandler) Process(rqs RequestSession) (RequestSession, error) {
|
||||
var r bool
|
||||
var err error
|
||||
var ok bool
|
||||
|
||||
logg.InfoCtxf(rqs.Ctx, "new request", "data", rqs)
|
||||
|
||||
@ -73,12 +57,27 @@ func (f *BaseRequestHandler) Process(rqs RequestSession) (RequestSession, error)
|
||||
return rqs, errors.ErrStorage
|
||||
}
|
||||
|
||||
//f.hn = f.hn.WithPersister(rqs.Storage.Persister)
|
||||
f.hn.SetPersister(rqs.Storage.Persister)
|
||||
defer func() {
|
||||
f.hn.Exit()
|
||||
}()
|
||||
eni := f.GetEngine(rqs.Config, f.rs, rqs.Storage.Persister)
|
||||
en, ok := eni.(*engine.DefaultEngine)
|
||||
if !ok {
|
||||
perr := f.provider.Put(rqs.Ctx, rqs.Config.SessionId, rqs.Storage)
|
||||
rqs.Storage = nil
|
||||
if perr != nil {
|
||||
logg.ErrorCtxf(rqs.Ctx, "", "storage put error", perr)
|
||||
}
|
||||
return rqs, errors.ErrEngineType
|
||||
}
|
||||
en = en.WithFirst(f.hn.Init)
|
||||
if rqs.Config.EngineDebug {
|
||||
en = en.WithDebug(nil)
|
||||
}
|
||||
rqs.Engine = en
|
||||
|
||||
rqs.Engine = f.GetEngine(rqs.Config, f.rs, rqs.Storage.Persister)
|
||||
r, err = rqs.Engine.Exec(rqs.Ctx, rqs.Input)
|
||||
if err != nil {
|
||||
perr := f.provider.Put(rqs.Ctx, rqs.Config.SessionId, rqs.Storage)
|
||||
|
@ -5,8 +5,8 @@ import (
|
||||
"strconv"
|
||||
|
||||
"git.defalsify.org/vise.git/logging"
|
||||
"git.grassecon.net/grassrootseconomics/visedriver/errors"
|
||||
"git.grassecon.net/grassrootseconomics/visedriver/request"
|
||||
"git.grassecon.net/grassrootseconomics/visedriver/errors"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -10,8 +10,8 @@ import (
|
||||
|
||||
"git.defalsify.org/vise.git/engine"
|
||||
viseerrors "git.grassecon.net/grassrootseconomics/visedriver/errors"
|
||||
"git.grassecon.net/grassrootseconomics/visedriver/request"
|
||||
"git.grassecon.net/grassrootseconomics/visedriver/testutil/mocks/httpmocks"
|
||||
"git.grassecon.net/grassrootseconomics/visedriver/request"
|
||||
)
|
||||
|
||||
// invalidRequestType is a custom type to test invalid request scenarios
|
||||
|
@ -4,10 +4,10 @@ import (
|
||||
"context"
|
||||
"io"
|
||||
|
||||
"git.defalsify.org/vise.git/resource"
|
||||
"git.defalsify.org/vise.git/persist"
|
||||
"git.defalsify.org/vise.git/engine"
|
||||
"git.defalsify.org/vise.git/logging"
|
||||
"git.defalsify.org/vise.git/persist"
|
||||
"git.defalsify.org/vise.git/resource"
|
||||
"git.grassecon.net/grassrootseconomics/visedriver/storage"
|
||||
)
|
||||
|
||||
|
@ -5,8 +5,6 @@ import (
|
||||
"net/url"
|
||||
)
|
||||
|
||||
type DbMode uint8
|
||||
|
||||
const (
|
||||
DBTYPE_NONE = iota
|
||||
DBTYPE_MEM
|
||||
@ -15,12 +13,6 @@ const (
|
||||
DBTYPE_POSTGRES
|
||||
)
|
||||
|
||||
const (
|
||||
DBMODE_ANY DbMode = iota
|
||||
DBMODE_BINARY
|
||||
DBMODE_TEXT
|
||||
)
|
||||
|
||||
const (
|
||||
STORETYPE_STATE = iota
|
||||
STORETYPE_RESOURCE
|
||||
@ -28,12 +20,6 @@ const (
|
||||
_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
|
||||
|
||||
func NewConns() Conns {
|
||||
@ -49,18 +35,16 @@ func (c Conns) Set(conn ConnData, typ int8) {
|
||||
}
|
||||
|
||||
func (c Conns) Have(conn *ConnData) int8 {
|
||||
for i := range _STORETYPE_MAX {
|
||||
for i := range(_STORETYPE_MAX) {
|
||||
ii := int8(i)
|
||||
v, ok := c[ii]
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
if v.Raw() == conn.Raw() {
|
||||
if v.Mode() == DBMODE_ANY || v.Mode() == conn.Mode() {
|
||||
if v.String() == conn.String() {
|
||||
return ii
|
||||
}
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
@ -68,31 +52,22 @@ type ConnData struct {
|
||||
typ int
|
||||
str string
|
||||
domain string
|
||||
mode DbMode
|
||||
}
|
||||
|
||||
func (cd *ConnData) DbType() int {
|
||||
return cd.typ
|
||||
}
|
||||
|
||||
func (cd ConnData) String() string {
|
||||
return fmt.Sprintf("conn: %s, mod %s, typ %s", cd.str, DbModeDebug[uint8(cd.mode)], DbTypeDebug[uint8(cd.typ)])
|
||||
func (cd *ConnData) String() string {
|
||||
return cd.str
|
||||
}
|
||||
|
||||
func (cd *ConnData) Domain() string {
|
||||
return cd.domain
|
||||
}
|
||||
|
||||
func (cd *ConnData) Mode() DbMode {
|
||||
return cd.mode
|
||||
}
|
||||
|
||||
func (cd *ConnData) Path() string {
|
||||
v, _ := url.Parse(cd.str)
|
||||
v.RawQuery = ""
|
||||
return v.String()
|
||||
}
|
||||
|
||||
func (cd *ConnData) Raw() string {
|
||||
return cd.str
|
||||
}
|
||||
|
@ -61,15 +61,6 @@ func probeMem(s string) (string, string, bool) {
|
||||
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) {
|
||||
var o ConnData
|
||||
|
||||
|
@ -7,6 +7,7 @@ import (
|
||||
"os"
|
||||
"path"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
"git.defalsify.org/vise.git/db"
|
||||
fsdb "git.defalsify.org/vise.git/db/fs"
|
||||
memdb "git.defalsify.org/vise.git/db/mem"
|
||||
@ -16,7 +17,6 @@ import (
|
||||
"git.defalsify.org/vise.git/persist"
|
||||
"git.defalsify.org/vise.git/resource"
|
||||
gdbmstorage "git.grassecon.net/grassrootseconomics/visedriver/storage/db/gdbm"
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
)
|
||||
|
||||
var (
|
||||
@ -61,7 +61,6 @@ func (ms *MenuStorageService) checkDb(ctx context.Context, typ int8) db.Db {
|
||||
return store
|
||||
}
|
||||
connData := ms.conns[typ]
|
||||
logg.DebugCtxf(ctx, "db check", "conn", connData, "store", DbStoreDebug[typ])
|
||||
v := ms.conns.Have(&connData)
|
||||
if v == -1 {
|
||||
return nil
|
||||
@ -71,7 +70,7 @@ func (ms *MenuStorageService) checkDb(ctx context.Context, typ int8) db.Db {
|
||||
return nil
|
||||
}
|
||||
ms.store[typ] = ms.store[v]
|
||||
logg.DebugCtxf(ctx, "found existing db", "typ", typ, "srctyp", v, "store", ms.store[typ], "srcstore", ms.store[v], "conn", connData)
|
||||
logg.DebugCtxf(ctx, "found existing db", "typ", typ, "srctyp", v, "store", ms.store[typ], "srcstore", ms.store[v])
|
||||
return ms.store[typ]
|
||||
}
|
||||
|
||||
@ -85,7 +84,7 @@ func (ms *MenuStorageService) getOrCreateDb(ctx context.Context, section string,
|
||||
}
|
||||
|
||||
connData := ms.conns[typ]
|
||||
connStr := connData.Raw()
|
||||
connStr := connData.String()
|
||||
dbTyp := connData.DbType()
|
||||
if dbTyp == DBTYPE_POSTGRES {
|
||||
// TODO: move to vise
|
||||
@ -106,16 +105,12 @@ func (ms *MenuStorageService) getOrCreateDb(ctx context.Context, section string,
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
fsdbInstance := fsdb.NewFsDb()
|
||||
if connData.Mode() == DBMODE_BINARY {
|
||||
fsdbInstance = fsdbInstance.WithBinary()
|
||||
}
|
||||
newDb = fsdbInstance
|
||||
newDb = fsdb.NewFsDb().WithBinary()
|
||||
} else if dbTyp == DBTYPE_MEM {
|
||||
logg.WarnCtxf(ctx, "using volatile storage (memdb)")
|
||||
newDb = memdb.NewMemDb()
|
||||
} else {
|
||||
return nil, fmt.Errorf("unsupported connection string: '%s'\n", connData.Raw())
|
||||
return nil, fmt.Errorf("unsupported connection string: '%s'\n", connData.String())
|
||||
}
|
||||
logg.InfoCtxf(ctx, "connecting to db", "conn", connData, "typ", typ)
|
||||
err = newDb.Connect(ctx, connStr)
|
||||
@ -140,7 +135,7 @@ func (ms *MenuStorageService) WithGettext(path string, lns []lang.Language) *Men
|
||||
}
|
||||
rs := resource.NewPoResource(lns[0], path)
|
||||
|
||||
for _, ln := range lns {
|
||||
for _, ln := range(lns) {
|
||||
rs = rs.WithLanguage(ln)
|
||||
}
|
||||
|
||||
@ -169,9 +164,7 @@ func ensureSchemaExists(ctx context.Context, conn ConnData) error {
|
||||
func applySession(ctx context.Context, store db.Db) error {
|
||||
sessionId, ok := ctx.Value("SessionId").(string)
|
||||
if !ok {
|
||||
logg.DebugCtxf(ctx, "missing session to apply", "store", store)
|
||||
return nil
|
||||
//return fmt.Errorf("missing session to apply to store: %v", store)
|
||||
return fmt.Errorf("missing session to apply to store: %v", store)
|
||||
}
|
||||
store.SetSession(sessionId)
|
||||
return nil
|
||||
@ -186,6 +179,7 @@ func (ms *MenuStorageService) GetPersister(ctx context.Context) (*persist.Persis
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
pr := persist.NewPersister(stateStore)
|
||||
logg.TraceCtxf(ctx, "menu storage service", "persist", pr, "store", stateStore)
|
||||
return pr, nil
|
||||
@ -196,6 +190,7 @@ func (ms *MenuStorageService) GetUserdataDb(ctx context.Context) (db.Db, error)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = applySession(ctx, userStore)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -233,7 +228,7 @@ func (ms *MenuStorageService) ensureDbDir(path string) error {
|
||||
func (ms *MenuStorageService) Close(ctx context.Context) error {
|
||||
var errs []error
|
||||
var haveErr bool
|
||||
for i := range _STORETYPE_MAX {
|
||||
for i := range(_STORETYPE_MAX) {
|
||||
err := ms.store[int8(i)].Close(ctx)
|
||||
if err != nil {
|
||||
haveErr = true
|
||||
@ -242,7 +237,7 @@ func (ms *MenuStorageService) Close(ctx context.Context) error {
|
||||
}
|
||||
if haveErr {
|
||||
errStr := ""
|
||||
for i, err := range errs {
|
||||
for i, err := range(errs) {
|
||||
errStr += fmt.Sprintf("(%d: %v)", i, err)
|
||||
}
|
||||
return errors.New(errStr)
|
||||
|
@ -5,8 +5,8 @@ import (
|
||||
|
||||
"git.defalsify.org/vise.git/db"
|
||||
memdb "git.defalsify.org/vise.git/db/mem"
|
||||
"git.defalsify.org/vise.git/persist"
|
||||
"git.defalsify.org/vise.git/resource"
|
||||
"git.defalsify.org/vise.git/persist"
|
||||
)
|
||||
|
||||
type MemStorageService struct {
|
||||
@ -39,3 +39,4 @@ func (mss *MemStorageService) GetUserdataDb(ctx context.Context) (db.Db, error)
|
||||
func (mss *MemStorageService) GetResource(ctx context.Context) (resource.Resource, error) {
|
||||
return mss.rs, nil
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user