Plan stuff. Log stuff.
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

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")