First pass at batched database interface

Signed-off-by: Zach Musgrave <zach@liquidata.co>
This commit is contained in:
Zach Musgrave
2019-12-04 11:29:46 -08:00
parent ac85b3806d
commit f28ef1611f

View File

@@ -37,19 +37,33 @@ const (
// Database implements sql.Database for a dolt DB.
type Database struct {
sql.Database
name string
root *doltdb.RootValue
dEnv *env.DoltEnv
batchMode batchMode
name string
root *doltdb.RootValue
dEnv *env.DoltEnv
batchMode batchMode
outstandingTables map[string]*DoltTable
}
// NewDatabase returns a new dolt database to use in queries.
func NewDatabase(name string, root *doltdb.RootValue, dEnv *env.DoltEnv) *Database {
return &Database{
name: name,
root: root,
dEnv: dEnv,
name: name,
root: root,
dEnv: dEnv,
batchMode: single,
outstandingTables: make(map[string]*DoltTable),
}
}
// NewBatchedDatabase returns a new dolt database executing in batch insert mode. Integrators must call Flush() to
// commit any outstanding edits.
func NewBatchedDatabase(name string, root *doltdb.RootValue, dEnv *env.DoltEnv) *Database {
return &Database{
name: name,
root: root,
dEnv: dEnv,
batchMode: batched,
outstandingTables: make(map[string]*DoltTable),
}
}
@@ -101,7 +115,12 @@ func (db *Database) GetTableInsensitive(ctx context.Context, tblName string) (sq
return nil, false, err
}
return &DoltTable{name: tblName, table: tbl, sch: sch, db: db}, true, nil
table := &DoltTable{name: tblName, table: tbl, sch: sch, db: db}
if db.batchMode == batched {
db.outstandingTables[tblName] = table
}
return table, true, nil
}
func (db *Database) GetTableNames(ctx context.Context) ([]string, error) {
@@ -183,3 +202,13 @@ func (db *Database) CreateTable(ctx *sql.Context, tableName string, schema sql.S
return nil
}
// Flushes the current batch of outstanding changes and returns any errors.
func (db *Database) Flush(ctx context.Context) error {
for _, table := range db.outstandingTables {
if err := table.flushBatchedEdits(ctx); err != nil {
return err
}
}
return nil
}