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.

86 lines
1.9 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. package bolt
  2. import (
  3. "errors"
  4. "github.com/gisle/stufflog/config"
  5. "github.com/gisle/stufflog/database/repositories"
  6. "go.etcd.io/bbolt"
  7. "time"
  8. "unsafe"
  9. )
  10. // A Database is a database.Database implementation using a bolt backend.
  11. type Database struct {
  12. users repositories.UserRepository
  13. userSessions repositories.UserSessionRepository
  14. activities repositories.ActivityRepository
  15. periods repositories.PeriodRepository
  16. items repositories.ItemRepository
  17. }
  18. func (database *Database) Users() repositories.UserRepository {
  19. return database.users
  20. }
  21. func (database *Database) UserSessions() repositories.UserSessionRepository {
  22. return database.userSessions
  23. }
  24. func (database *Database) Activities() repositories.ActivityRepository {
  25. return database.activities
  26. }
  27. func (database *Database) Periods() repositories.PeriodRepository {
  28. return database.periods
  29. }
  30. func (database *Database) Items() repositories.ItemRepository {
  31. return database.items
  32. }
  33. func Init(cfg config.Database) (*Database, error) {
  34. opts := *bbolt.DefaultOptions
  35. opts.Timeout = time.Second * 5
  36. db, err := bbolt.Open(cfg.Path, 0700, &opts)
  37. if err != nil {
  38. return nil, err
  39. }
  40. users, err := newUserRepository(db)
  41. if err != nil {
  42. return nil, err
  43. }
  44. userSessions, err := newUserSessionRepository(db)
  45. if err != nil {
  46. return nil, err
  47. }
  48. periods, err := newPeriodRepository(db)
  49. if err != nil {
  50. return nil, err
  51. }
  52. activities, err := newActivityRepository(db)
  53. if err != nil {
  54. return nil, err
  55. }
  56. items, err := newItemRepository(db)
  57. if err != nil {
  58. return nil, err
  59. }
  60. database := &Database{
  61. users: users,
  62. userSessions: userSessions,
  63. periods: periods,
  64. activities: activities,
  65. items: items,
  66. }
  67. return database, nil
  68. }
  69. // unsafeStringToBytes makes a byte array, mutation is punishable by segfault.
  70. func unsafeStringToBytes(s string) []byte {
  71. return *(*[]byte)(unsafe.Pointer(&s))
  72. }
  73. var errUnchanged = errors.New("database/bolt: unchanged")