Add View and Update methods

This commit is contained in:
Asdine El Hrychy
2019-02-24 15:35:17 +01:00
parent db9d617f80
commit f0109cee2f
2 changed files with 70 additions and 38 deletions

30
db.go
View File

@@ -25,6 +25,36 @@ func (db DB) Begin(writable bool) (*Tx, error) {
}, nil }, nil
} }
func (db DB) View(fn func(tx *Tx) error) error {
tx, err := db.Begin(false)
if err != nil {
return err
}
defer tx.Rollback()
err = fn(tx)
if err != nil {
return err
}
return tx.Rollback()
}
func (db DB) Update(fn func(tx *Tx) error) error {
tx, err := db.Begin(true)
if err != nil {
return err
}
defer tx.Rollback()
err = fn(tx)
if err != nil {
return err
}
return tx.Commit()
}
type Tx struct { type Tx struct {
engine.Transaction engine.Transaction
} }

View File

@@ -11,56 +11,58 @@ import (
) )
func TestTable(t *testing.T) { func TestTable(t *testing.T) {
db := genji.New(memory.NewEngine())
t.Run("Table/Insert/NoIndex", func(t *testing.T) { t.Run("Table/Insert/NoIndex", func(t *testing.T) {
tx, err := db.Begin(true) db := genji.New(memory.NewEngine())
require.NoError(t, err)
defer tx.Rollback()
tb, err := tx.CreateTable("test") err := db.Update(func(tx *genji.Tx) error {
require.NoError(t, err) tb, err := tx.CreateTable("test")
require.NoError(t, err)
rowid, err := tb.Insert(record.FieldBuffer([]field.Field{ rowid, err := tb.Insert(record.FieldBuffer([]field.Field{
field.NewString("name", "John"), field.NewString("name", "John"),
field.NewInt64("age", 10), field.NewInt64("age", 10),
})) }))
require.NoError(t, err) require.NoError(t, err)
require.NotNil(t, rowid) require.NotNil(t, rowid)
m, err := tx.Indexes("test") m, err := tx.Indexes("test")
require.NoError(t, err)
require.Empty(t, m)
return nil
})
require.NoError(t, err) require.NoError(t, err)
require.Empty(t, m)
}) })
t.Run("Table/Insert/WithIndex", func(t *testing.T) { t.Run("Table/Insert/WithIndex", func(t *testing.T) {
tx, err := db.Begin(true) db := genji.New(memory.NewEngine())
require.NoError(t, err) defer db.Close()
defer tx.Rollback()
tb, err := tx.CreateTable("test") err := db.Update(func(tx *genji.Tx) error {
require.NoError(t, err) tb, err := tx.CreateTable("test")
require.NoError(t, err)
_, err = tx.CreateIndex("test", "name") _, err = tx.CreateIndex("test", "name")
require.NoError(t, err) require.NoError(t, err)
rowid, err := tb.Insert(record.FieldBuffer([]field.Field{ rowid, err := tb.Insert(record.FieldBuffer([]field.Field{
field.NewString("name", "John"), field.NewString("name", "John"),
field.NewInt64("age", 10), field.NewInt64("age", 10),
})) }))
require.NoError(t, err) require.NoError(t, err)
require.NotNil(t, rowid) require.NotNil(t, rowid)
m, err := tx.Indexes("test") m, err := tx.Indexes("test")
require.NoError(t, err) require.NoError(t, err)
require.NotEmpty(t, m) require.NotEmpty(t, m)
c := m["name"].Cursor() c := m["name"].Cursor()
v, rid := c.Seek([]byte("John")) v, rid := c.Seek([]byte("John"))
require.Equal(t, []byte("John"), v) require.Equal(t, []byte("John"), v)
require.Equal(t, rowid, rid) require.Equal(t, rowid, rid)
return nil
})
require.NoError(t, err)
}) })
err := db.Close()
require.NoError(t, err)
} }