Documentation ¶
Index ¶
- Constants
- Variables
- func Batch() func(*Options) error
- func BoltOptions(mode os.FileMode, options *bolt.Options) func(*Options) error
- func Codec(c codec.MarshalUnmarshaler) func(*Options) error
- func Limit(limit int) func(*index.Options)
- func Reverse() func(*index.Options)
- func Root(root ...string) func(*Options) error
- func Skip(offset int) func(*index.Options)
- func UseDB(b *bolt.DB) func(*Options) error
- type BucketScanner
- type DB
- type Finder
- type KeyValueStore
- type Node
- type Options
- type Query
- type Tx
- type TypeStore
Examples ¶
Constants ¶
const Version = "2.0.0"
Version of Storm
Variables ¶
var ( // ErrNoID is returned when no ID field or id tag is found in the struct. ErrNoID = errors.New("missing struct tag id or ID field") // ErrZeroID is returned when the ID field is a zero value. ErrZeroID = errors.New("id field must not be a zero value") // ErrBadType is returned when a method receives an unexpected value type. ErrBadType = errors.New("provided data must be a struct or a pointer to struct") // ErrAlreadyExists is returned uses when trying to set an existing value on a field that has a unique index. ErrAlreadyExists = errors.New("already exists") // ErrNilParam is returned when the specified param is expected to be not nil. ErrNilParam = errors.New("param must not be nil") // ErrUnknownTag is returned when an unexpected tag is specified. ErrUnknownTag = errors.New("unknown tag") // ErrIdxNotFound is returned when the specified index is not found. ErrIdxNotFound = errors.New("index not found") // ErrSlicePtrNeeded is returned when an unexpected value is given, instead of a pointer to slice. ErrSlicePtrNeeded = errors.New("provided target must be a pointer to slice") // ErrSlicePtrNeeded is returned when an unexpected value is given, instead of a pointer to struct. ErrStructPtrNeeded = errors.New("provided target must be a pointer to struct") // ErrSlicePtrNeeded is returned when an unexpected value is given, instead of a pointer. ErrPtrNeeded = errors.New("provided target must be a pointer to a valid variable") // ErrNoName is returned when the specified struct has no name. ErrNoName = errors.New("provided target must have a name") // ErrNotFound is returned when the specified record is not saved in the bucket. ErrNotFound = errors.New("not found") // ErrNotInTransaction is returned when trying to rollback or commit when not in transaction. ErrNotInTransaction = errors.New("not in transaction") // ErrIncompatibleValue is returned when trying to set a value with a different type than the chosen field ErrIncompatibleValue = errors.New("incompatible value") // ErrDifferentCodec is returned when using a codec different than the first codec used with the bucket. ErrDifferentCodec = errors.New("the selected codec is incompatible with this bucket") )
Errors
Functions ¶
func Batch ¶ added in v0.5.0
Batch enables the use of batch instead of update for read-write transactions.
func BoltOptions ¶
BoltOptions used to pass options to BoltDB.
func Codec ¶
func Codec(c codec.MarshalUnmarshaler) func(*Options) error
Codec used to set a custom encoder and decoder. The default is JSON.
func Limit ¶
Limit sets the maximum number of records to return
Example ¶
package main import ( "fmt" "io/ioutil" "log" "os" "path/filepath" "strings" "time" "github.com/asdine/storm" ) func main() { dir, db := prepareDB() defer os.RemoveAll(dir) defer db.Close() var users []User err := db.All(&users, storm.Limit(2)) if err != nil { log.Fatal(err) } fmt.Println("Found", len(users)) } type User struct { ID int `storm:"id,increment"` Group string `storm:"index"` Email string `storm:"unique"` Name string Age int `storm:"index"` CreatedAt time.Time `storm:"index"` } type Account struct { ID int `storm:"id,increment"` Amount int64 } func prepareDB() (string, *storm.DB) { dir, _ := ioutil.TempDir(os.TempDir(), "storm") db, _ := storm.Open(filepath.Join(dir, "storm.db")) for i, name := range []string{"John", "Eric", "Dilbert"} { email := strings.ToLower(name + "@provider.com") user := User{ Group: "staff", Email: email, Name: name, Age: 21 + i, CreatedAt: time.Now(), } err := db.Save(&user) if err != nil { log.Fatal(err) } } for i := int64(0); i < 10; i++ { account := Account{Amount: 10000} err := db.Save(&account) if err != nil { log.Fatal(err) } } return dir, db }
Output: Found 2
func Skip ¶
Skip sets the number of records to skip
Example ¶
package main import ( "fmt" "io/ioutil" "log" "os" "path/filepath" "strings" "time" "github.com/asdine/storm" ) func main() { dir, db := prepareDB() defer os.RemoveAll(dir) defer db.Close() var users []User err := db.All(&users, storm.Skip(1)) if err != nil { log.Fatal(err) } fmt.Println("Found", len(users)) } type User struct { ID int `storm:"id,increment"` Group string `storm:"index"` Email string `storm:"unique"` Name string Age int `storm:"index"` CreatedAt time.Time `storm:"index"` } type Account struct { ID int `storm:"id,increment"` Amount int64 } func prepareDB() (string, *storm.DB) { dir, _ := ioutil.TempDir(os.TempDir(), "storm") db, _ := storm.Open(filepath.Join(dir, "storm.db")) for i, name := range []string{"John", "Eric", "Dilbert"} { email := strings.ToLower(name + "@provider.com") user := User{ Group: "staff", Email: email, Name: name, Age: 21 + i, CreatedAt: time.Now(), } err := db.Save(&user) if err != nil { log.Fatal(err) } } for i := int64(0); i < 10; i++ { account := Account{Amount: 10000} err := db.Save(&account) if err != nil { log.Fatal(err) } } return dir, db }
Output: Found 2
func UseDB ¶
UseDB allows Storm to use an existing open Bolt.DB. Warning: storm.DB.Close() will close the bolt.DB instance.
Example ¶
package main import ( "fmt" "io/ioutil" "log" "os" "path/filepath" "time" "github.com/asdine/storm" bolt "go.etcd.io/bbolt" ) func main() { dir, _ := ioutil.TempDir(os.TempDir(), "storm") defer os.RemoveAll(dir) bDB, err := bolt.Open(filepath.Join(dir, "bolt.db"), 0600, &bolt.Options{Timeout: 10 * time.Second}) if err != nil { log.Fatal(err) } db, _ := storm.Open("", storm.UseDB(bDB)) defer db.Close() err = db.Save(&User{ID: 10}) if err != nil { log.Fatal(err) } var user User err = db.One("ID", 10, &user) fmt.Println(err) } type User struct { ID int `storm:"id,increment"` Group string `storm:"index"` Email string `storm:"unique"` Name string Age int `storm:"index"` CreatedAt time.Time `storm:"index"` }
Output: <nil>
Types ¶
type BucketScanner ¶
type BucketScanner interface { // PrefixScan scans the root buckets for keys matching the given prefix. PrefixScan(prefix string) []Node // PrefixScan scans the buckets in this node for keys matching the given prefix. RangeScan(min, max string) []Node }
A BucketScanner scans a Node for a list of buckets
type DB ¶
type DB struct { // The root node that points to the root bucket. Node // Bolt is still easily accessible Bolt *bolt.DB }
DB is the wrapper around BoltDB. It contains an instance of BoltDB and uses it to perform all the needed operations
type Finder ¶
type Finder interface { // One returns one record by the specified index One(fieldName string, value interface{}, to interface{}) error // Find returns one or more records by the specified index Find(fieldName string, value interface{}, to interface{}, options ...func(q *index.Options)) error // AllByIndex gets all the records of a bucket that are indexed in the specified index AllByIndex(fieldName string, to interface{}, options ...func(*index.Options)) error // All gets all the records of a bucket. // If there are no records it returns no error and the 'to' parameter is set to an empty slice. All(to interface{}, options ...func(*index.Options)) error // Select a list of records that match a list of matchers. Doesn't use indexes. Select(matchers ...q.Matcher) Query // Range returns one or more records by the specified index within the specified range Range(fieldName string, min, max, to interface{}, options ...func(*index.Options)) error // Prefix returns one or more records whose given field starts with the specified prefix. Prefix(fieldName string, prefix string, to interface{}, options ...func(*index.Options)) error // Count counts all the records of a bucket Count(data interface{}) (int, error) }
A Finder can fetch types from BoltDB.
type KeyValueStore ¶
type KeyValueStore interface { // Get a value from a bucket Get(bucketName string, key interface{}, to interface{}) error // Set a key/value pair into a bucket Set(bucketName string, key interface{}, value interface{}) error // Delete deletes a key from a bucket Delete(bucketName string, key interface{}) error // GetBytes gets a raw value from a bucket. GetBytes(bucketName string, key interface{}) ([]byte, error) // SetBytes sets a raw value into a bucket. SetBytes(bucketName string, key interface{}, value []byte) error // KeyExists reports the presence of a key in a bucket. KeyExists(bucketName string, key interface{}) (bool, error) }
KeyValueStore can store and fetch values by key
type Node ¶
type Node interface { Tx TypeStore KeyValueStore BucketScanner // From returns a new Storm node with a new bucket root below the current. // All DB operations on the new node will be executed relative to this bucket. From(addend ...string) Node // Bucket returns the bucket name as a slice from the root. // In the normal, simple case this will be empty. Bucket() []string // GetBucket returns the given bucket below the current node. GetBucket(tx *bolt.Tx, children ...string) *bolt.Bucket // CreateBucketIfNotExists creates the bucket below the current node if it doesn't // already exist. CreateBucketIfNotExists(tx *bolt.Tx, bucket string) (*bolt.Bucket, error) // WithTransaction returns a New Storm node that will use the given transaction. WithTransaction(tx *bolt.Tx) Node // Begin starts a new transaction. Begin(writable bool) (Node, error) // Codec used by this instance of Storm Codec() codec.MarshalUnmarshaler // WithCodec returns a New Storm Node that will use the given Codec. WithCodec(codec codec.MarshalUnmarshaler) Node // WithBatch returns a new Storm Node with the batch mode enabled. WithBatch(enabled bool) Node }
A Node in Storm represents the API to a BoltDB bucket.
type Options ¶
type Options struct {
// contains filtered or unexported fields
}
Options are used to customize the way Storm opens a database.
type Query ¶
type Query interface { // Skip matching records by the given number Skip(int) Query // Limit the results by the given number Limit(int) Query // Order by the given fields, in descending precedence, left-to-right. OrderBy(...string) Query // Reverse the order of the results Reverse() Query // Bucket specifies the bucket name Bucket(string) Query // Find a list of matching records Find(interface{}) error // First gets the first matching record First(interface{}) error // Delete all matching records Delete(interface{}) error // Count all the matching records Count(interface{}) (int, error) // Returns all the records without decoding them Raw() ([][]byte, error) // Execute the given function for each raw element RawEach(func([]byte, []byte) error) error // Execute the given function for each element Each(interface{}, func(interface{}) error) error }
Query is the low level query engine used by Storm. It allows to operate searches through an entire bucket.
type Tx ¶
type Tx interface { // Commit writes all changes to disk. Commit() error // Rollback closes the transaction and ignores all previous updates. Rollback() error }
Tx is a transaction.
type TypeStore ¶
type TypeStore interface { Finder // Init creates the indexes and buckets for a given structure Init(data interface{}) error // ReIndex rebuilds all the indexes of a bucket ReIndex(data interface{}) error // Save a structure Save(data interface{}) error // Update a structure Update(data interface{}) error // UpdateField updates a single field UpdateField(data interface{}, fieldName string, value interface{}) error // Drop a bucket Drop(data interface{}) error // DeleteStruct deletes a structure from the associated bucket DeleteStruct(data interface{}) error }
TypeStore stores user defined types in BoltDB.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Package codec contains sub-packages with different codecs that can be used to encode and decode entities in Storm.
|
Package codec contains sub-packages with different codecs that can be used to encode and decode entities in Storm. |
gob
Package gob contains a codec to encode and decode entities in Gob format
|
Package gob contains a codec to encode and decode entities in Gob format |
json
Package json contains a codec to encode and decode entities in JSON format
|
Package json contains a codec to encode and decode entities in JSON format |
msgpack
Package msgpack contains a codec to encode and decode entities in msgpack format
|
Package msgpack contains a codec to encode and decode entities in msgpack format |
protobuf
Package protobuf contains a codec to encode and decode entities in Protocol Buffer Package protobuf is a generated protocol buffer package.
|
Package protobuf contains a codec to encode and decode entities in Protocol Buffer Package protobuf is a generated protocol buffer package. |
sereal
Package sereal contains a codec to encode and decode entities using Sereal
|
Package sereal contains a codec to encode and decode entities using Sereal |
Package index contains Index engines used to store values and their corresponding IDs
|
Package index contains Index engines used to store values and their corresponding IDs |
Package q contains a list of Matchers used to compare struct fields with values
|
Package q contains a list of Matchers used to compare struct fields with values |