Files
TorrServerJellyfin/server/settings/db.go
nikk gitanes b46f996a3d Squashed commit of the following:
commit 218d84b7905d23dce3c8f842ed78b8eac8ea9580
Author: nikk gitanes <tsynik@gmail.com>
Date:   Mon Feb 5 01:10:19 2024 +0300

    add read-only DB logging

commit 826fde8e8444a9169afeb7f777e1803fcf6bd435
Author: nikk gitanes <tsynik@gmail.com>
Date:   Sat Feb 3 22:50:19 2024 +0300

    update msx doc

commit 98b7d61bd98269b0e456cb71a5d50a8f98203aba
Merge: 490ee26 963c7da
Author: nikk gitanes <tsynik@gmail.com>
Date:   Sat Feb 3 11:21:45 2024 +0300

    Merge branch 'master' into jsondb

commit 490ee26d3f14316cb1ad3b872ebe408a5aa2a91b
Merge: 83c7ed1 efb17ee
Author: nikk gitanes <tsynik@gmail.com>
Date:   Sat Feb 3 10:50:41 2024 +0300

    Merge branch 'master' into jsondb
2024-02-06 12:44:49 +03:00

164 lines
2.7 KiB
Go

package settings
import (
"path/filepath"
"strings"
"time"
"server/log"
bolt "go.etcd.io/bbolt"
)
type TDB struct {
Path string
db *bolt.DB
}
func NewTDB() TorrServerDB {
db, err := bolt.Open(filepath.Join(Path, "config.db"), 0o666, &bolt.Options{Timeout: 5 * time.Second})
if err != nil {
log.TLogln(err)
return nil
}
tdb := new(TDB)
tdb.db = db
tdb.Path = Path
return tdb
}
func (v *TDB) CloseDB() {
if v.db != nil {
v.db.Close()
v.db = nil
}
}
func (v *TDB) Get(xpath, name string) []byte {
spath := strings.Split(xpath, "/")
if len(spath) == 0 {
return nil
}
var ret []byte
err := v.db.View(func(tx *bolt.Tx) error {
buckt := tx.Bucket([]byte(spath[0]))
if buckt == nil {
return nil
}
for i, p := range spath {
if i == 0 {
continue
}
buckt = buckt.Bucket([]byte(p))
if buckt == nil {
return nil
}
}
ret = buckt.Get([]byte(name))
return nil
})
if err != nil {
log.TLogln("Error get sets", xpath+"/"+name, ", error:", err)
}
return ret
}
func (v *TDB) Set(xpath, name string, value []byte) {
spath := strings.Split(xpath, "/")
if len(spath) == 0 {
return
}
err := v.db.Update(func(tx *bolt.Tx) error {
buckt, err := tx.CreateBucketIfNotExists([]byte(spath[0]))
if err != nil {
return err
}
for i, p := range spath {
if i == 0 {
continue
}
buckt, err = buckt.CreateBucketIfNotExists([]byte(p))
if err != nil {
return err
}
}
return buckt.Put([]byte(name), value)
})
if err != nil {
log.TLogln("Error put sets", xpath+"/"+name, ", error:", err)
log.TLogln("value:", value)
}
}
func (v *TDB) List(xpath string) []string {
spath := strings.Split(xpath, "/")
if len(spath) == 0 {
return nil
}
var ret []string
err := v.db.View(func(tx *bolt.Tx) error {
buckt := tx.Bucket([]byte(spath[0]))
if buckt == nil {
return nil
}
for i, p := range spath {
if i == 0 {
continue
}
buckt = buckt.Bucket([]byte(p))
if buckt == nil {
return nil
}
}
buckt.ForEach(func(k, _ []byte) error {
if len(k) > 0 {
ret = append(ret, string(k))
}
return nil
})
return nil
})
if err != nil {
log.TLogln("Error list sets", xpath, ", error:", err)
}
return ret
}
func (v *TDB) Rem(xpath, name string) {
spath := strings.Split(xpath, "/")
if len(spath) == 0 {
return
}
err := v.db.Update(func(tx *bolt.Tx) error {
buckt := tx.Bucket([]byte(spath[0]))
if buckt == nil {
return nil
}
for i, p := range spath {
if i == 0 {
continue
}
buckt = buckt.Bucket([]byte(p))
if buckt == nil {
return nil
}
}
return buckt.Delete([]byte(name))
})
if err != nil {
log.TLogln("Error rem sets", xpath+"/"+name, ", error:", err)
}
}