2017-07-27 15:27:10 +00:00
|
|
|
package gime
|
2017-07-28 11:44:08 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
|
|
|
|
"github.com/br0xen/boltease"
|
|
|
|
)
|
|
|
|
|
|
|
|
type GimeDB struct {
|
|
|
|
db *boltease.DB
|
|
|
|
archDb *boltease.DB
|
|
|
|
dbOpened int
|
|
|
|
dbArchOpened int
|
|
|
|
path string
|
|
|
|
filename, arch string
|
|
|
|
}
|
|
|
|
|
|
|
|
const (
|
|
|
|
TypeCurrent = "current"
|
|
|
|
TypeRecent = "recent"
|
|
|
|
TypeArchive = "archive"
|
2017-07-31 12:00:16 +00:00
|
|
|
TypeUnknown = "unknown" // Not really a type, used for searches and stuff
|
2017-07-28 11:44:08 +00:00
|
|
|
)
|
|
|
|
|
2017-07-31 12:00:16 +00:00
|
|
|
const AllTypes = []string{TypeCurrent, TypeRecent, TypeArchive}
|
|
|
|
|
2017-07-28 11:44:08 +00:00
|
|
|
// Load Database returns a database loaded off the files given
|
|
|
|
// name and archName located in path
|
|
|
|
func LoadDatabase(path, name, archName string) (*GimeDB, error) {
|
|
|
|
if path[len(path)-1] != '/' {
|
|
|
|
path = path + "/"
|
|
|
|
}
|
|
|
|
gdb := GimeDB{
|
|
|
|
path: path,
|
|
|
|
filename: name,
|
|
|
|
arch: archName,
|
|
|
|
}
|
|
|
|
gdb.initDatabase()
|
|
|
|
return &gdb, nil
|
|
|
|
}
|
|
|
|
|
2017-07-31 12:00:16 +00:00
|
|
|
// Load a TimeEntry collection from a database
|
|
|
|
func (gdb *GimeDB) LoadTimeEntryCollection(tp string) *TimeEntryCollection {
|
|
|
|
ret := new(TimeEntryCollection)
|
|
|
|
entries := gdb.dbGetAllTimeEntries(tp)
|
|
|
|
for i := range entries {
|
|
|
|
ret.Push(&entries[i])
|
|
|
|
}
|
|
|
|
return ret
|
|
|
|
}
|
|
|
|
|
2017-07-28 11:44:08 +00:00
|
|
|
func (gdb *GimeDB) openDatabase() error {
|
|
|
|
gdb.dbOpened += 1
|
|
|
|
if gdb.dbOpened == 1 {
|
|
|
|
var err error
|
|
|
|
gdb.db, err = boltease.Create(gdb.path+gdb.filename, 0600, nil)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (gdb *GimeDB) closeDatabase() error {
|
|
|
|
gdb.dbOpened -= 1
|
|
|
|
if gdb.dbOpened == 0 {
|
|
|
|
return gdb.db.CloseDB()
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (gdb *GimeDB) openArchiveDatabase() error {
|
|
|
|
gdb.dbArchOpened += 1
|
|
|
|
if gdb.dbArchOpened == 1 {
|
|
|
|
var err error
|
|
|
|
gdb.archDb, err = boltease.Create(gdb.path+gdb.arch, 0600, nil)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (gdb *GimeDB) closeArchiveDatabase() error {
|
|
|
|
gdb.dbArchOpened -= 1
|
|
|
|
if gdb.dbArchOpened == 0 {
|
|
|
|
return gdb.archDb.CloseDB()
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (gdb *GimeDB) initDatabase() error {
|
|
|
|
// Initialize the current/recent/settings database
|
|
|
|
var err error
|
|
|
|
if err = gdb.openDatabase(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer gdb.closeDatabase()
|
|
|
|
// Create the path to the bucket to store application settings
|
|
|
|
if err := gdb.db.MkBucketPath([]string{"settings"}); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
// Create the path to the bucket to store the current time entry
|
|
|
|
if err := gdb.db.MkBucketPath([]string{TypeCurrent}); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
// Create the path to the bucket to store recent time entries
|
|
|
|
if err := gdb.db.MkBucketPath([]string{TypeRecent}); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Now initialize the Archive Database
|
|
|
|
if err = gdb.openArchiveDatabase(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer gdb.closeArchiveDatabase()
|
|
|
|
// Create the path to the bucket to store archived time entries
|
|
|
|
return gdb.archDb.MkBucketPath([]string{TypeArchive})
|
|
|
|
}
|
|
|
|
|
|
|
|
func (gdb *GimeDB) openDBType(tp string) (*boltease.DB, error) {
|
|
|
|
var err error
|
|
|
|
if tp == TypeCurrent || tp == TypeRecent {
|
|
|
|
if err = gdb.openDatabase(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return gdb.db, err
|
|
|
|
} else if tp == TypeArchive {
|
|
|
|
if err = gdb.openArchiveDatabase(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return gdb.archDb, err
|
|
|
|
}
|
|
|
|
return nil, errors.New("Invalid database type: " + tp)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (gdb *GimeDB) closeDBType(tp string) error {
|
|
|
|
if tp == TypeCurrent || tp == TypeRecent {
|
|
|
|
return gdb.closeDatabase()
|
|
|
|
} else if tp == TypeArchive {
|
|
|
|
return gdb.closeArchiveDatabase()
|
|
|
|
}
|
|
|
|
return errors.New("Invalid database type: " + tp)
|
|
|
|
}
|