package main import ( "encoding/binary" "encoding/json" "errors" "fmt" "github.com/xujiajun/nutsdb" ) func ReadUser(username string) (*UserData, error) { data, err := DbRead(bucketUsers, username) if err != nil { return nil, err } var user UserData err = json.Unmarshal(data, &user) return &user, err } func SaveUser(user *UserData) error { data, err := json.Marshal(user) if err != nil { return err } if user.Username == "" { return errors.New("user empty") } err = DbSave(bucketUsers, user.Username, data) return err } func ReadAnimes() ([]Anime, error) { var animes []Anime err := db.View( func(tx *nutsdb.Tx) error { entries, err := tx.GetAll(bucketAnime) if err != nil { return err } animes = make([]Anime, len(entries)) // iterate entries for _, entry := range entries { // decode anime list malId, c := binary.Varint(entry.Key) if c <= 0 { return fmt.Errorf("int64 decode error: %s %s", entry.Key, entry.Value) } // parse user list var users []WatchUser err = json.Unmarshal(entry.Value, &users) if err != nil { return err } anime := Anime{ Anime: malId, Users: users, } animes = append(animes, anime) } return nil }) return animes, err } func DbClean() error { return db.Update( func(tx *nutsdb.Tx) error { return db.Merge() }) } func DbSave(bucket, key string, val []byte) error { return db.Update( func(tx *nutsdb.Tx) error { keyBytes := []byte(key) return tx.Put(bucket, keyBytes, val, nutsdb.Persistent) }) } func DbRead(bucket, key string) ([]byte, error) { var val []byte err := db.View( func(tx *nutsdb.Tx) error { keyBytes := []byte(key) e, err := tx.Get(bucket, keyBytes) if err != nil { return err } val = make([]byte, len(e.Value)) copy(val, e.Value) return err }) return val, err } func DbDelete(bucket, key string, val []byte) error { return db.Update( func(tx *nutsdb.Tx) error { keyBytes := []byte(key) return tx.Delete(bucket, keyBytes) }) }