mirror of https://github.com/portainer/portainer
73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
package bolt
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/boltdb/bolt"
|
|
)
|
|
|
|
// Store defines the implementation of portainer.DataStore using
|
|
// BoltDB as the storage system.
|
|
type Store struct {
|
|
// Path where is stored the BoltDB database.
|
|
Path string
|
|
|
|
// Services
|
|
UserService *UserService
|
|
EndpointService *EndpointService
|
|
|
|
db *bolt.DB
|
|
}
|
|
|
|
const (
|
|
databaseFileName = "portainer.db"
|
|
userBucketName = "users"
|
|
endpointBucketName = "endpoints"
|
|
activeEndpointBucketName = "activeEndpoint"
|
|
)
|
|
|
|
// NewStore initializes a new Store and the associated services
|
|
func NewStore(storePath string) *Store {
|
|
store := &Store{
|
|
Path: storePath,
|
|
UserService: &UserService{},
|
|
EndpointService: &EndpointService{},
|
|
}
|
|
store.UserService.store = store
|
|
store.EndpointService.store = store
|
|
return store
|
|
}
|
|
|
|
// Open opens and initializes the BoltDB database.
|
|
func (store *Store) Open() error {
|
|
path := store.Path + "/" + databaseFileName
|
|
db, err := bolt.Open(path, 0600, &bolt.Options{Timeout: 1 * time.Second})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
store.db = db
|
|
return db.Update(func(tx *bolt.Tx) error {
|
|
_, err := tx.CreateBucketIfNotExists([]byte(userBucketName))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = tx.CreateBucketIfNotExists([]byte(endpointBucketName))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = tx.CreateBucketIfNotExists([]byte(activeEndpointBucketName))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
})
|
|
}
|
|
|
|
// Close closes the BoltDB database.
|
|
func (store *Store) Close() error {
|
|
if store.db != nil {
|
|
return store.db.Close()
|
|
}
|
|
return nil
|
|
}
|