Files
chaisql/internal/query/statement/statement.go
Asdine El Hrychy d5401cfe5d Decouple transaction from catalog
To avoid cyclic dependencies, we removed the Catalog from the
Transaction type and pass it around everywhere.
2021-07-02 15:55:58 +04:00

68 lines
1.2 KiB
Go

package statement
import (
"errors"
"github.com/genjidb/genji/document"
"github.com/genjidb/genji/internal/database"
"github.com/genjidb/genji/internal/expr"
)
// A Statement represents a unique action that can be executed against the database.
type Statement interface {
Run(*Context) (Result, error)
IsReadOnly() bool
}
type Context struct {
Tx *database.Transaction
Catalog database.Catalog
Params []expr.Param
}
type Preparer interface {
Prepare(tx *Context) error
}
// Result of a query.
type Result struct {
Iterator document.Iterator
Tx *database.Transaction
closed bool
err error
}
func (r *Result) Iterate(fn func(d document.Document) error) error {
if r.Iterator == nil {
return nil
}
r.err = r.Iterator.Iterate(fn)
return r.err
}
// Close the result stream.
// After closing the result, Stream is not supposed to be used.
// If the result stream was already closed, it returns an error.
func (r *Result) Close() (err error) {
if r == nil {
return nil
}
if r.closed {
return errors.New("result already closed")
}
r.closed = true
if r.Tx != nil {
if r.Tx.Writable && r.err == nil {
err = r.Tx.Commit()
} else {
err = r.Tx.Rollback()
}
}
return err
}