fix: bug
This commit is contained in:
131
v2/db/db.go
131
v2/db/db.go
@@ -1,131 +0,0 @@
|
|||||||
package db
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"reflect"
|
|
||||||
|
|
||||||
tinydb "github.com/Yiwen-Chan/tinydb"
|
|
||||||
)
|
|
||||||
|
|
||||||
type DB struct {
|
|
||||||
tdb *tinydb.Database
|
|
||||||
}
|
|
||||||
|
|
||||||
var instance map[string]*DB = make(map[string]*DB)
|
|
||||||
|
|
||||||
func Instance(name string) *DB {
|
|
||||||
if db, ok := instance[name]; ok {
|
|
||||||
return db
|
|
||||||
}
|
|
||||||
os.MkdirAll("data", 0o700)
|
|
||||||
db, err := NewDB("data/hiddify-db-" + name + ".json")
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("Default DB instance failed", err)
|
|
||||||
}
|
|
||||||
instance[name] = db
|
|
||||||
return db
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewDB(path string) (*DB, error) {
|
|
||||||
storage, err := tinydb.JSONStorage(path)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
tdb, err := tinydb.TinyDB(storage)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &DB{
|
|
||||||
tdb: tdb,
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *DB) Close() error {
|
|
||||||
return d.tdb.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetTableDB[T any](db *DB) *Table[T] {
|
|
||||||
tt := tinydb.GetTable[T](db.tdb)
|
|
||||||
if tt == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &Table[T]{
|
|
||||||
Table: tt,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetTable[T any]() *Table[T] {
|
|
||||||
var t T
|
|
||||||
name := reflect.TypeOf(t).Name()
|
|
||||||
|
|
||||||
tt := tinydb.GetTable[T](Instance(name).tdb)
|
|
||||||
if tt == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return &Table[T]{
|
|
||||||
Table: tt,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type Table[T any] struct {
|
|
||||||
*tinydb.Table[T]
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tbl *Table[T]) Select(selector func(T) bool) ([]T, error) {
|
|
||||||
return tbl.Table.Select(selector)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tbl *Table[T]) All() ([]T, error) {
|
|
||||||
return tbl.Table.Select(func(T) bool {
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tbl *Table[T]) Insert(items ...T) error {
|
|
||||||
return tbl.Table.Insert(items...)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tbl *Table[T]) Delete(selector func(T) bool) ([]T, error) {
|
|
||||||
return tbl.Table.Delete(selector)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tbl *Table[T]) Update(update func(T) T, selector func(T) bool) error {
|
|
||||||
return tbl.Table.Update(update, selector)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tbl *Table[T]) First(selector func(T) bool) (*T, error) {
|
|
||||||
data, err := tbl.Select(selector)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if len(data) == 0 {
|
|
||||||
return nil, fmt.Errorf("not found")
|
|
||||||
}
|
|
||||||
return &data[0], nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (table *Table[T]) FirstOrInsert(selector func(d T) bool, generator func() T) (*T, error) {
|
|
||||||
data, err := table.First(selector)
|
|
||||||
if err == nil {
|
|
||||||
return data, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := table.Insert(generator()); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return table.First(selector)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (table *Table[T]) ReplaceOrInsert(selector func(d T) bool, generator T) error {
|
|
||||||
data, err := table.First(selector)
|
|
||||||
if err == nil && data != nil {
|
|
||||||
if _, err := table.Delete(selector); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if err := table.Insert(generator); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user