use remote libsql

This commit is contained in:
xuu
2024-04-06 18:40:10 -06:00
parent ccc56508a6
commit 3b04dbe330
3 changed files with 38 additions and 55 deletions

View File

@@ -6,16 +6,15 @@ import (
"fmt"
"log"
"os"
"path/filepath"
"time"
"github.com/foxcpp/maddy/framework/config"
"github.com/foxcpp/maddy/framework/module"
"github.com/tursodatabase/go-libsql"
_ "github.com/tursodatabase/libsql-client-go/libsql"
)
type Table struct {
type table struct {
modName string
instName string
@@ -31,31 +30,28 @@ type Table struct {
}
func NewTable(modName, instName string, _, _ []string) (module.Module, error) {
return &Table{
return &table{
modName: modName,
instName: instName,
}, nil
}
func (s *Table) Name() string {
func (s *table) Name() string {
return s.modName
}
func (s *Table) InstanceName() string {
func (s *table) InstanceName() string {
return s.instName
}
func (s *Table) Init(cfg *config.Map) error {
func (s *table) Init(cfg *config.Map) error {
var (
initQueries []string
primaryUrl string
authToken string
dbName = "local.db"
)
cfg.StringList("init", false, false, nil, &initQueries)
cfg.String("url", false, true, "", &primaryUrl)
cfg.String("token", false, true, "", &authToken)
cfg.String("lookup", false, true, "", &s.lookup)
cfg.String("add", false, false, "", &s.add)
@@ -68,38 +64,9 @@ func (s *Table) Init(cfg *config.Map) error {
}
var err error
s.dir, err = os.MkdirTemp("", "libsql-*")
if err != nil {
return fmt.Errorf("error creating temporary directory: %w", err)
}
dbPath := filepath.Join(s.dir, dbName)
syncInterval := time.Minute
s.connector, err = libsql.NewEmbeddedReplicaConnector(dbPath, primaryUrl,
libsql.WithAuthToken(authToken),
libsql.WithSyncInterval(syncInterval),
)
if err != nil {
return fmt.Errorf("Error creating connector: %w", err)
}
s.sql = sql.OpenDB(s.connector)
s.sql, err = sql.Open("libsql", primaryUrl)
if len(initQueries) > 0 {
// bldr := ws4.NewRequestBuilder()
// for _, init := range initQueries {
// bldr.AddStatement(init)
// }
// req, err := bldr.Build()
// if err != nil {
// return config.NodeErr(cfg.Block, "failed to init db: %v", err)
// }
// _, _, err = db.Send(req)
// if err != nil {
// return config.NodeErr(cfg.Block, "failed to init db: %v", err)
// }
tx, err := s.sql.Begin()
if err != nil {
return err
@@ -118,17 +85,17 @@ func (s *Table) Init(cfg *config.Map) error {
}
}
return nil
return err
}
func (s *Table) Close() error {
func (s *table) Close() error {
defer os.RemoveAll(s.dir)
defer s.connector.Close()
return s.sql.Close()
}
func (s *Table) Lookup(ctx context.Context, val string) (value string, ok bool, err error) {
func (s *table) Lookup(ctx context.Context, val string) (value string, ok bool, err error) {
defer func() {
if err != nil {
err = fmt.Errorf("%s: lookup: %w", s.modName, err)
@@ -141,7 +108,7 @@ func (s *Table) Lookup(ctx context.Context, val string) (value string, ok bool,
return value, err == nil, err
}
func (s *Table) LookupMulti(ctx context.Context, val string) (lis []string, err error) {
func (s *table) LookupMulti(ctx context.Context, val string) (lis []string, err error) {
defer func() {
if err != nil {
err = fmt.Errorf("%s: lookupMulti: %w", s.modName, err)
@@ -168,7 +135,7 @@ func (s *Table) LookupMulti(ctx context.Context, val string) (lis []string, err
return
}
func (s *Table) Keys() (lis []string, err error) {
func (s *table) Keys() (lis []string, err error) {
if s.list == "" {
return nil, fmt.Errorf("%s: table is not mutable (no 'list' query)", s.modName)
}
@@ -198,7 +165,7 @@ func (s *Table) Keys() (lis []string, err error) {
return
}
func (s *Table) RemoveKey(k string) (err error) {
func (s *table) RemoveKey(k string) (err error) {
if s.del == "" {
return fmt.Errorf("%s: table is not mutable (no 'del' query)", s.modName)
}
@@ -210,7 +177,7 @@ func (s *Table) RemoveKey(k string) (err error) {
return nil
}
func (s *Table) SetKey(k, v string) (err error) {
func (s *table) SetKey(k, v string) (err error) {
if s.set == "" {
return fmt.Errorf("%s: table is not mutable (no 'set' query)", s.modName)
}
@@ -222,13 +189,13 @@ func (s *Table) SetKey(k, v string) (err error) {
if err != nil {
return fmt.Errorf("%s: set %s: %w", s.modName, k, err)
}
var n int64
if n, err = res.RowsAffected(); err != nil && n == 0 {
_, err = s.sql.ExecContext(context.TODO(), s.add, k, v)
if err != nil {
return fmt.Errorf("%s: add %s: %w", s.modName, k, err)
}
var n int64
if n, err = res.RowsAffected(); err != nil && n == 0 {
_, err = s.sql.ExecContext(context.TODO(), s.add, k, v)
if err != nil {
return fmt.Errorf("%s: add %s: %w", s.modName, k, err)
}
}
return
}