package util import ( "fmt" "os" "path/filepath" "go.etcd.io/bbolt" ) var bucket *bbolt.DB func InitBBolt() error { // 初始化bbolt数据库的逻辑 // ensure directory exists before opening DB dbPath := "runtime/data.db" if err := os.MkdirAll(filepath.Dir(dbPath), 0o755); err != nil { return err } db, err := bbolt.Open(dbPath, 0600, nil) if err != nil { return err } // keep the DB open for the package lifecycle bucket = db // ensure the "kv" bucket exists err = bucket.Update(func(tx *bbolt.Tx) error { _, err := tx.CreateBucketIfNotExists([]byte("kv")) return err }) if err != nil { // cleanup on failure to initialize buckets _ = bucket.Close() bucket = nil return err } return nil } func saveBBolt(key string, value interface{}) error { newValue := String(value) err := bucket.Update(func(tx *bbolt.Tx) error { b := tx.Bucket([]byte("kv")) return b.Put([]byte(key), []byte(newValue)) }) return err } func getBBolt(key string) (string, error) { var value string err := bucket.View(func(tx *bbolt.Tx) error { b := tx.Bucket([]byte("kv")) v := b.Get([]byte(key)) value = string(v) return nil }) return value, err } func SaveLanguageLastUpdate(timestamp interface{}) error { return saveBBolt("language_last_update", timestamp) } func GetLanguageLastUpdate() (int, error) { v, e := getBBolt("language_last_update") return Int(v), e } func SaveLanguageExportLastUpdate(timestamp interface{}) error { return saveBBolt("language_export_last_update", timestamp) } func GetLanguageExportLastUpdate() (int, error) { v, e := getBBolt("language_export_last_update") return Int(v), e } func GetGitHead(key string) (string, error) { return getBBolt(fmt.Sprintf("git_head_%s", key)) } func SaveGitHead(key string, head interface{}) error { return saveBBolt(fmt.Sprintf("git_head_%s", key), head) } func GetUserConnectNode(Uid string) (int, error) { v, e := getBBolt(fmt.Sprintf("user_connect_node_%s", Uid)) return Int(v), e } func SaveUserConnectNode(Uid string, node interface{}) error { return saveBBolt(fmt.Sprintf("user_connect_node_%s", Uid), node) }