package datastore import ( "io" portainer "github.com/portainer/portainer/api" "github.com/portainer/portainer/api/dataservices/errors" ) func (store *Store) version() (int, error) { version, err := store.VersionService.DBVersion() if store.IsErrObjectNotFound(err) { version = 0 } return version, err } func (store *Store) edition() portainer.SoftwareEdition { edition, err := store.VersionService.Edition() if store.IsErrObjectNotFound(err) { edition = portainer.PortainerCE } return edition } // NewStore initializes a new Store and the associated services func NewStore(storePath string, fileService portainer.FileService, connection portainer.Connection) *Store { return &Store{ fileService: fileService, connection: connection, } } // Open opens and initializes the BoltDB database. func (store *Store) Open() (newStore bool, err error) { newStore = true err = store.connection.Open() if err != nil { return newStore, err } err = store.initServices() if err != nil { return newStore, err } // if we have DBVersion in the database then ensure we flag this as NOT a new store if _, err := store.VersionService.DBVersion(); err == nil { newStore = false } return newStore, nil } func (store *Store) Close() error { return store.connection.Close() } // BackupTo backs up db to a provided writer. // It does hot backup and doesn't block other database reads and writes func (store *Store) BackupTo(w io.Writer) error { return store.connection.BackupTo(w) } // CheckCurrentEdition checks if current edition is community edition func (store *Store) CheckCurrentEdition() error { if store.edition() != portainer.PortainerCE { return errors.ErrWrongDBEdition } return nil } // TODO: move the use of this to dataservices.IsErrObjectNotFound()? func (store *Store) IsErrObjectNotFound(e error) bool { return e == errors.ErrObjectNotFound } func (store *Store) Rollback(force bool) error { return store.connectionRollback(force) }