diff --git a/z/database.go b/z/database.go new file mode 100644 index 0000000..1e8fe4b --- /dev/null +++ b/z/database.go @@ -0,0 +1,69 @@ +package z + +import ( + "log" + "encoding/json" + "github.com/tidwall/buntdb" + "github.com/google/uuid" +) + +type Database struct { + DB *buntdb.DB +} + +func InitDatabase() (*Database, error) { + db, err := buntdb.Open(":memory:") // TODO: Replace with file + if err != nil { + return nil, err + } + + db.CreateIndex("task", "*", buntdb.IndexJSON("task")) + db.CreateIndex("project", "*", buntdb.IndexJSON("project")) + + database := Database{db} + return &database, nil +} + +func (database *Database) NewID() (string) { + id, err := uuid.NewRandom() + if err != nil { + log.Fatalln("Could not generate UUID: %+v", err) + } + return id.String() +} + +func (database *Database) AddEntry(entry Entry) (string, error) { + id := database.NewID() + + entryJson, jsonerr := json.Marshal(entry) + if jsonerr != nil { + return id, jsonerr + } + + dberr := database.DB.Update(func(tx *buntdb.Tx) error { + _, _, seterr := tx.Set(id, string(entryJson), nil) + return seterr + }) + + return id, dberr +} + +func (database *Database) ListEntries() ([]Entry, error) { + var entries []Entry + + dberr := database.DB.View(func(tx *buntdb.Tx) error { + tx.Ascend("task", func(key, value string) bool { + var entry Entry + json.Unmarshal([]byte(value), &entry) + + entry.ID = key + + entries = append(entries, entry) + return true + }) + + return nil + }) + + return entries, dberr +}