107 lines
2.2 KiB
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)
|
|
}
|