tbotd/vendor/src/github.com/asdine/storm/storm.go

107 lines
2.2 KiB
Go

package storm
import (
"os"
"time"
"github.com/asdine/storm/codec"
"github.com/boltdb/bolt"
)
// Open opens a database at the given path with optional Storm options.
func Open(path string, stormOptions ...func(*DB) error) (*DB, error) {
var err error
s := &DB{
Path: path,
Codec: defaultCodec,
}
for _, option := range stormOptions {
option(s)
}
if s.boltMode == 0 {
s.boltMode = 0600
}
if s.boltOptions == nil {
s.boltOptions = &bolt.Options{Timeout: 1 * time.Second}
}
s.Bolt, err = bolt.Open(path, s.boltMode, s.boltOptions)
if err != nil {
return nil, err
}
s.root = &Node{s: s, rootBucket: s.rootBucket}
return s, nil
}
// OpenWithOptions opens a database with the given boltDB options and optional Storm options.
// Deprecated: Use storm.Open with storm.BoltOptions instead.
func OpenWithOptions(path string, mode os.FileMode, boltOptions *bolt.Options, stormOptions ...func(*DB)) (*DB, error) {
db, err := bolt.Open(path, mode, boltOptions)
if err != nil {
return nil, err
}
s := &DB{
Path: path,
Bolt: db,
Codec: defaultCodec,
}
for _, option := range stormOptions {
option(s)
}
s.root = &Node{s: s, rootBucket: s.rootBucket}
return s, nil
}
// DB is the wrapper around BoltDB. It contains an instance of BoltDB and uses it to perform all the
// needed operations
type DB struct {
// Path of the database file
Path string
// Handles encoding and decoding of objects
Codec codec.EncodeDecoder
// Bolt is still easily accessible
Bolt *bolt.DB
// Bolt file mode
boltMode os.FileMode
// Bolt options
boltOptions *bolt.Options
// Enable auto increment on empty integer fields
autoIncrement bool
// The root node that points to the root bucket.
root *Node
// The root bucket name
rootBucket []string
}
// From returns a new Storm node with a new bucket root.
// All DB operations on the new node will be executed relative to the given
// bucket.
func (s *DB) From(root ...string) *Node {
newNode := *s.root
newNode.rootBucket = root
return &newNode
}
// WithTransaction returns a New Storm node that will use the given transaction.
func (s *DB) WithTransaction(tx *bolt.Tx) *Node {
return s.root.WithTransaction(tx)
}