You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
1.7 KiB
76 lines
1.7 KiB
package bolt
|
|
|
|
import (
|
|
"errors"
|
|
"github.com/gisle/stufflog/config"
|
|
"github.com/gisle/stufflog/database/repositories"
|
|
"go.etcd.io/bbolt"
|
|
"time"
|
|
"unsafe"
|
|
)
|
|
|
|
// A Database is a database.Database implementation using a bolt backend.
|
|
type Database struct {
|
|
users repositories.UserRepository
|
|
userSessions repositories.UserSessionRepository
|
|
activities repositories.ActivityRepository
|
|
periods repositories.PeriodRepository
|
|
}
|
|
|
|
func (database *Database) Users() repositories.UserRepository {
|
|
return database.users
|
|
}
|
|
|
|
func (database *Database) UserSessions() repositories.UserSessionRepository {
|
|
return database.userSessions
|
|
}
|
|
|
|
func (database *Database) Activities() repositories.ActivityRepository {
|
|
return database.activities
|
|
}
|
|
|
|
func (database *Database) Periods() repositories.PeriodRepository {
|
|
return database.periods
|
|
}
|
|
|
|
func Init(cfg config.Database) (*Database, error) {
|
|
opts := *bbolt.DefaultOptions
|
|
opts.Timeout = time.Second * 5
|
|
db, err := bbolt.Open(cfg.Path, 0700, &opts)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
users, err := newUserRepository(db)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
userSessions, err := newUserSessionRepository(db)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
periods, err := newPeriodRepository(db)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
activities, err := newActivityRepository(db)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
database := &Database{
|
|
users: users,
|
|
userSessions: userSessions,
|
|
periods: periods,
|
|
activities: activities,
|
|
}
|
|
|
|
return database, nil
|
|
}
|
|
|
|
// unsafeStringToBytes makes a byte array, mutation is punishable by segfault.
|
|
func unsafeStringToBytes(s string) []byte {
|
|
return *(*[]byte)(unsafe.Pointer(&s))
|
|
}
|
|
|
|
var errUnchanged = errors.New("database/bolt: unchanged")
|