func prepareDB() (string, *storm.DB) { dir, _ := ioutil.TempDir(os.TempDir(), "storm") db, _ := storm.Open(filepath.Join(dir, "storm.db"), storm.AutoIncrement()) 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 }
func Example() { // The examples below show how to set up all the codecs shipped with Storm. // Proper error handling left out to make it simple. var gobDb, _ = storm.Open("gob.db", storm.Codec(gob.Codec)) var jsonDb, _ = storm.Open("json.db", storm.Codec(json.Codec)) var serealDb, _ = storm.Open("sereal.db", storm.Codec(sereal.Codec)) var protobufDb, _ = storm.Open("protobuf.db", storm.Codec(protobuf.Codec)) fmt.Printf("%T\n", gobDb.Codec()) fmt.Printf("%T\n", jsonDb.Codec()) fmt.Printf("%T\n", serealDb.Codec()) fmt.Printf("%T\n", protobufDb.Codec()) // Output: // *gob.gobCodec // *json.jsonCodec // *sereal.serealCodec // *protobuf.protobufCodec }
// Initialize will open the store func Initialize(name string) { var err error // open the database Storm, err = storm.Open(fmt.Sprintf("%s.db", name), storm.AutoIncrement()) if err != nil { panic(err) } }
func TestGetSet(t *testing.T) { dir, _ := ioutil.TempDir(os.TempDir(), "storm") defer os.RemoveAll(dir) db, _ := storm.Open(filepath.Join(dir, "storm.db"), storm.Codec(Codec)) err := db.Set("bucket", "key", "value") assert.NoError(t, err) var s string err = db.Get("bucket", "key", &s) assert.NoError(t, err) assert.Equal(t, "value", s) }
func TestSave(t *testing.T) { dir, _ := ioutil.TempDir(os.TempDir(), "storm") defer os.RemoveAll(dir) db, _ := storm.Open(filepath.Join(dir, "storm.db"), storm.Codec(Codec)) u1 := SimpleUser{Id: 1, Name: "John"} err := db.Save(&u1) assert.NoError(t, err) u2 := SimpleUser{} err = db.One("Id", uint64(1), &u2) assert.NoError(t, err) assert.Equal(t, u2.Name, u1.Name) }
func ExampleDB_Save() { dir, _ := ioutil.TempDir(os.TempDir(), "storm") defer os.RemoveAll(dir) type User struct { ID int `storm:"id"` Group string `storm:"index"` Email string `storm:"unique"` Name string Age int `storm:"index"` CreatedAt time.Time `storm:"index"` } // Open takes an optional list of options as the last argument. // AutoIncrement will auto-increment integer IDs without existing values. db, _ := storm.Open(filepath.Join(dir, "storm.db"), storm.AutoIncrement()) defer db.Close() user := User{ Group: "staff", Email: "*****@*****.**", Name: "John", Age: 21, CreatedAt: time.Now(), } err := db.Save(&user) if err != nil { log.Fatal(err) } fmt.Println(user.ID) user2 := user user2.ID = 0 // Save will fail because of the unique constraint on Email err = db.Save(&user2) fmt.Println(err) // Output: // 1 // already exists }
func TestListIndexAddRemoveID(t *testing.T) { dir, _ := ioutil.TempDir(os.TempDir(), "storm") defer os.RemoveAll(dir) db, _ := storm.Open(filepath.Join(dir, "storm.db")) defer db.Close() db.Bolt.Update(func(tx *bolt.Tx) error { b, err := tx.CreateBucket([]byte("test")) assert.NoError(t, err) idx, err := index.NewListIndex(b, []byte("lindex1")) assert.NoError(t, err) err = idx.Add([]byte("hello"), []byte("id1")) assert.NoError(t, err) assert.Equal(t, 1, countItems(t, idx.IndexBucket)) err = idx.Add([]byte("hello"), []byte("id2")) assert.NoError(t, err) assert.Equal(t, 2, countItems(t, idx.IndexBucket)) err = idx.Add([]byte("goodbye"), []byte("id1")) assert.NoError(t, err) assert.Equal(t, 2, countItems(t, idx.IndexBucket)) err = idx.Add([]byte("hello"), []byte("id3")) assert.NoError(t, err) assert.Equal(t, 3, countItems(t, idx.IndexBucket)) err = idx.RemoveID([]byte("id1")) assert.NoError(t, err) assert.Equal(t, 2, countItems(t, idx.IndexBucket)) err = idx.RemoveID([]byte("id2")) assert.NoError(t, err) assert.Equal(t, 1, countItems(t, idx.IndexBucket)) err = idx.RemoveID([]byte("id3")) assert.NoError(t, err) assert.Equal(t, 0, countItems(t, idx.IndexBucket)) return nil }) }
func ExampleUseDB() { 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) // Output: // <nil> }
func TestListIndexRange(t *testing.T) { dir, _ := ioutil.TempDir(os.TempDir(), "storm") defer os.RemoveAll(dir) db, _ := storm.Open(filepath.Join(dir, "storm.db")) defer db.Close() db.Bolt.Update(func(tx *bolt.Tx) error { b, err := tx.CreateBucket([]byte("test")) assert.NoError(t, err) idx, err := index.NewListIndex(b, []byte("index1")) assert.NoError(t, err) for i := 0; i < 10; i++ { val, _ := gob.Codec.Marshal(i) err = idx.Add(val, val) assert.NoError(t, err) } min, _ := gob.Codec.Marshal(3) max, _ := gob.Codec.Marshal(5) list, err := idx.Range(min, max, nil) assert.Len(t, list, 3) assert.NoError(t, err) assertEncodedIntListEqual(t, []int{3, 4, 5}, list) min, _ = gob.Codec.Marshal(11) max, _ = gob.Codec.Marshal(20) list, err = idx.Range(min, max, nil) assert.Len(t, list, 0) assert.NoError(t, err) min, _ = gob.Codec.Marshal(7) max, _ = gob.Codec.Marshal(2) list, err = idx.Range(min, max, nil) assert.Len(t, list, 0) assert.NoError(t, err) min, _ = gob.Codec.Marshal(-5) max, _ = gob.Codec.Marshal(2) list, err = idx.Range(min, max, nil) assert.Len(t, list, 0) assert.NoError(t, err) min, _ = gob.Codec.Marshal(3) max, _ = gob.Codec.Marshal(7) opts := index.NewOptions() opts.Skip = 2 list, err = idx.Range(min, max, opts) assert.Len(t, list, 3) assert.NoError(t, err) assertEncodedIntListEqual(t, []int{5, 6, 7}, list) opts = index.NewOptions() opts.Limit = 2 list, err = idx.Range(min, max, opts) assert.Len(t, list, 2) assert.NoError(t, err) assertEncodedIntListEqual(t, []int{3, 4}, list) opts = index.NewOptions() opts.Reverse = true opts.Skip = 2 opts.Limit = 2 list, err = idx.Range(min, max, opts) assert.Len(t, list, 2) assert.NoError(t, err) assertEncodedIntListEqual(t, []int{5, 4}, list) return nil }) }
func TestListIndexAllRecords(t *testing.T) { dir, _ := ioutil.TempDir(os.TempDir(), "storm") defer os.RemoveAll(dir) db, _ := storm.Open(filepath.Join(dir, "storm.db")) defer db.Close() db.Bolt.Update(func(tx *bolt.Tx) error { b, err := tx.CreateBucket([]byte("test")) assert.NoError(t, err) idx, err := index.NewListIndex(b, []byte("lindex1")) assert.NoError(t, err) ids, err := idx.AllRecords(nil) assert.NoError(t, err) assert.Len(t, ids, 0) err = idx.Add([]byte("goodbye"), []byte("id2")) assert.NoError(t, err) assert.Equal(t, 1, countItems(t, idx.IndexBucket)) err = idx.Add([]byte("goodbye"), []byte("id1")) assert.NoError(t, err) assert.Equal(t, 2, countItems(t, idx.IndexBucket)) err = idx.Add([]byte("hello"), []byte("id4")) assert.NoError(t, err) assert.Equal(t, 3, countItems(t, idx.IndexBucket)) err = idx.Add([]byte("hello"), []byte("id3")) assert.NoError(t, err) assert.Equal(t, 4, countItems(t, idx.IndexBucket)) ids, err = idx.AllRecords(nil) assert.NoError(t, err) assert.Len(t, ids, 4) assert.Equal(t, []byte("id1"), ids[0]) assert.Equal(t, []byte("id2"), ids[1]) assert.Equal(t, []byte("id3"), ids[2]) assert.Equal(t, []byte("id4"), ids[3]) err = idx.RemoveID([]byte("id1")) assert.NoError(t, err) assert.Equal(t, 3, countItems(t, idx.IndexBucket)) ids, err = idx.AllRecords(nil) assert.NoError(t, err) assert.Len(t, ids, 3) assert.Equal(t, []byte("id2"), ids[0]) err = idx.Add([]byte("goodbye"), []byte("id1")) assert.NoError(t, err) assert.Equal(t, 4, countItems(t, idx.IndexBucket)) opts := index.NewOptions() opts.Limit = 1 ids, err = idx.AllRecords(opts) assert.Len(t, ids, 1) opts = index.NewOptions() opts.Skip = 2 ids, err = idx.AllRecords(opts) assert.Len(t, ids, 2) opts = index.NewOptions() opts.Skip = 2 opts.Limit = 3 opts.Reverse = true ids, err = idx.AllRecords(opts) assert.NoError(t, err) assert.Len(t, ids, 2) assert.Equal(t, []byte("id2"), ids[0]) return nil }) }
func TestListIndex(t *testing.T) { dir, _ := ioutil.TempDir(os.TempDir(), "storm") defer os.RemoveAll(dir) db, _ := storm.Open(filepath.Join(dir, "storm.db")) defer db.Close() err := db.Bolt.Update(func(tx *bolt.Tx) error { b, err := tx.CreateBucket([]byte("test")) assert.NoError(t, err) idx, err := index.NewListIndex(b, []byte("lindex1")) assert.NoError(t, err) err = idx.Add([]byte("hello"), []byte("id1")) assert.NoError(t, err) err = idx.Add([]byte("hello"), []byte("id1")) assert.NoError(t, err) err = idx.Add([]byte("hello"), []byte("id2")) assert.NoError(t, err) err = idx.Add([]byte("goodbye"), []byte("id2")) assert.NoError(t, err) err = idx.Add(nil, []byte("id2")) assert.Error(t, err) assert.Equal(t, index.ErrNilParam, err) err = idx.Add([]byte("hi"), nil) assert.Error(t, err) assert.Equal(t, index.ErrNilParam, err) ids, err := idx.All([]byte("hello"), nil) assert.NoError(t, err) assert.Len(t, ids, 1) assert.Equal(t, []byte("id1"), ids[0]) ids, err = idx.All([]byte("goodbye"), nil) assert.Len(t, ids, 1) assert.Equal(t, []byte("id2"), ids[0]) ids, err = idx.All([]byte("yo"), nil) assert.Nil(t, ids) err = idx.RemoveID([]byte("id2")) assert.NoError(t, err) ids, err = idx.All([]byte("goodbye"), nil) assert.Len(t, ids, 0) err = idx.RemoveID(nil) assert.NoError(t, err) err = idx.RemoveID([]byte("id1")) assert.NoError(t, err) err = idx.RemoveID([]byte("id2")) assert.NoError(t, err) err = idx.RemoveID([]byte("id3")) assert.NoError(t, err) ids, err = idx.All([]byte("hello"), nil) assert.NoError(t, err) assert.Nil(t, ids) err = idx.Add([]byte("hello"), []byte("id1")) assert.NoError(t, err) err = idx.Add([]byte("hi"), []byte("id2")) assert.NoError(t, err) err = idx.Add([]byte("yo"), []byte("id3")) assert.NoError(t, err) err = idx.RemoveID([]byte("id2")) assert.NoError(t, err) ids, err = idx.All([]byte("hello"), nil) assert.Len(t, ids, 1) assert.Equal(t, []byte("id1"), ids[0]) ids, err = idx.All([]byte("hi"), nil) assert.Len(t, ids, 0) ids, err = idx.All([]byte("yo"), nil) assert.Len(t, ids, 1) assert.Equal(t, []byte("id3"), ids[0]) err = idx.RemoveID([]byte("id2")) assert.NoError(t, err) err = idx.RemoveID([]byte("id4")) assert.NoError(t, err) err = idx.Add([]byte("hey"), []byte("id1")) err = idx.Add([]byte("hey"), []byte("id2")) err = idx.Add([]byte("hey"), []byte("id3")) err = idx.Add([]byte("hey"), []byte("id4")) ids, err = idx.All([]byte("hey"), nil) assert.Len(t, ids, 4) opts := index.NewOptions() opts.Limit = 1 ids, err = idx.All([]byte("hey"), opts) assert.Len(t, ids, 1) opts = index.NewOptions() opts.Skip = 2 ids, err = idx.All([]byte("hey"), opts) assert.Len(t, ids, 2) opts = index.NewOptions() opts.Skip = 2 opts.Limit = 3 opts.Reverse = true ids, err = idx.All([]byte("hey"), opts) assert.Len(t, ids, 2) assert.Equal(t, []byte("id2"), ids[0]) id := idx.Get([]byte("hey")) assert.Equal(t, []byte("id1"), id) err = idx.Remove([]byte("hey")) assert.NoError(t, err) ids, err = idx.All([]byte("hey"), nil) assert.NoError(t, err) assert.Len(t, ids, 0) ids, err = idx.All([]byte("hey"), nil) assert.NoError(t, err) assert.Len(t, ids, 0) return nil }) assert.NoError(t, err) }
func TestUniqueIndex(t *testing.T) { dir, _ := ioutil.TempDir(os.TempDir(), "storm") defer os.RemoveAll(dir) db, _ := storm.Open(filepath.Join(dir, "storm.db")) defer db.Close() err := db.Bolt.Update(func(tx *bolt.Tx) error { b, err := tx.CreateBucket([]byte("test")) assert.NoError(t, err) idx, err := index.NewUniqueIndex(b, []byte("uindex1")) assert.NoError(t, err) err = idx.Add([]byte("hello"), []byte("id1")) assert.NoError(t, err) err = idx.Add([]byte("hello"), []byte("id1")) assert.NoError(t, err) err = idx.Add([]byte("hello"), []byte("id2")) assert.Error(t, err) assert.Equal(t, index.ErrAlreadyExists, err) err = idx.Add(nil, []byte("id2")) assert.Error(t, err) assert.Equal(t, index.ErrNilParam, err) err = idx.Add([]byte("hi"), nil) assert.Error(t, err) assert.Equal(t, index.ErrNilParam, err) id := idx.Get([]byte("hello")) assert.Equal(t, []byte("id1"), id) id = idx.Get([]byte("goodbye")) assert.Nil(t, id) err = idx.Remove([]byte("hello")) assert.NoError(t, err) err = idx.Remove(nil) assert.NoError(t, err) id = idx.Get([]byte("hello")) assert.Nil(t, id) err = idx.Add([]byte("hello"), []byte("id1")) assert.NoError(t, err) err = idx.Add([]byte("hi"), []byte("id2")) assert.NoError(t, err) err = idx.Add([]byte("yo"), []byte("id3")) assert.NoError(t, err) list, err := idx.AllRecords(nil) assert.NoError(t, err) assert.Len(t, list, 3) opts := index.NewOptions() opts.Limit = 2 list, err = idx.AllRecords(opts) assert.NoError(t, err) assert.Len(t, list, 2) opts = index.NewOptions() opts.Skip = 2 list, err = idx.AllRecords(opts) assert.NoError(t, err) assert.Len(t, list, 1) assert.Equal(t, []byte("id3"), list[0]) opts = index.NewOptions() opts.Skip = 2 opts.Limit = 1 opts.Reverse = true list, err = idx.AllRecords(opts) assert.NoError(t, err) assert.Len(t, list, 1) assert.Equal(t, []byte("id1"), list[0]) err = idx.RemoveID([]byte("id2")) assert.NoError(t, err) id = idx.Get([]byte("hello")) assert.Equal(t, []byte("id1"), id) id = idx.Get([]byte("hi")) assert.Nil(t, id) id = idx.Get([]byte("yo")) assert.Equal(t, []byte("id3"), id) ids, err := idx.All([]byte("yo"), nil) assert.NoError(t, err) assert.Len(t, ids, 1) assert.Equal(t, []byte("id3"), ids[0]) err = idx.RemoveID([]byte("id2")) assert.NoError(t, err) err = idx.RemoveID([]byte("id4")) assert.NoError(t, err) return nil }) assert.NoError(t, err) }