Documentation
¶
Overview ¶
Package database provides database primitives such as tables, transactions and indexes.
Index ¶
- Variables
- func CastConversion(v document.Value, path document.Path, targetType document.ValueType) (document.Value, error)
- func LosslessNumbersConversion(v document.Value, path document.Path, targetType document.ValueType) (document.Value, error)
- type Catalog
- func (c *Catalog) AddFieldConstraint(tx *Transaction, tableName string, fc FieldConstraint) error
- func (c *Catalog) Clone() *Catalog
- func (c *Catalog) CreateIndex(tx *Transaction, info *IndexInfo) error
- func (c *Catalog) CreateTable(tx *Transaction, tableName string, info *TableInfo) error
- func (c *Catalog) DropIndex(tx *Transaction, name string) error
- func (c *Catalog) DropTable(tx *Transaction, tableName string) error
- func (c *Catalog) GetIndex(tx *Transaction, indexName string) (*Index, error)
- func (c *Catalog) GetTable(tx *Transaction, tableName string) (*Table, error)
- func (c *Catalog) ListIndexes(tableName string) []string
- func (c *Catalog) Load(tables []TableInfo, indexes []IndexInfo)
- func (c *Catalog) ReIndex(tx *Transaction, indexName string) error
- func (c *Catalog) ReIndexAll(tx *Transaction) error
- func (c *Catalog) RenameTable(tx *Transaction, oldName, newName string) error
- type ConversionFunc
- type Database
- type FieldConstraint
- func (f *FieldConstraint) HasDefaultValue() bool
- func (f *FieldConstraint) IsEqual(other *FieldConstraint) (bool, error)
- func (f *FieldConstraint) MergeInferred(other *FieldConstraint)
- func (f *FieldConstraint) ScanDocument(d document.Document) error
- func (f *FieldConstraint) String() string
- func (f *FieldConstraint) ToDocument() document.Document
- type FieldConstraints
- func (f *FieldConstraints) Add(newFc *FieldConstraint) error
- func (f FieldConstraints) ConvertDocument(d document.Document) (*document.FieldBuffer, error)
- func (f FieldConstraints) ConvertValueAtPath(path document.Path, v document.Value, conversionFn ConversionFunc) (document.Value, error)
- func (f FieldConstraints) Get(path document.Path) *FieldConstraint
- func (f FieldConstraints) Infer() (FieldConstraints, error)
- func (f FieldConstraints) ValidateDocument(d document.Document) (*document.FieldBuffer, error)
- type Index
- func (idx *Index) Arity() int
- func (idx *Index) AscendGreaterOrEqual(pivot Pivot, fn func(val, key []byte) error) error
- func (idx *Index) Delete(vs []document.Value, k []byte) error
- func (idx *Index) DescendLessOrEqual(pivot Pivot, fn func(val, key []byte) error) error
- func (idx *Index) EncodeValueBuffer(vb *document.ValueBuffer) ([]byte, error)
- func (idx *Index) IsComposite() bool
- func (idx *Index) Papity() int
- func (idx *Index) Set(vs []document.Value, k []byte) error
- func (idx *Index) Truncate() error
- type IndexInfo
- type Indexes
- type Options
- type Pivot
- type Table
- func (t *Table) AscendGreaterOrEqual(pivot document.Value, fn func(d document.Document) error) error
- func (t *Table) Delete(key []byte) error
- func (t *Table) DescendLessOrEqual(pivot document.Value, fn func(d document.Document) error) error
- func (t *Table) EncodeValue(v document.Value) ([]byte, error)
- func (t *Table) GetDocument(key []byte) (document.Document, error)
- func (t *Table) Insert(d document.Document) (document.Document, error)
- func (t *Table) Iterate(fn func(d document.Document) error) error
- func (t *Table) Replace(key []byte, d document.Document) error
- func (t *Table) Truncate() error
- type TableInfo
- type Transaction
- type TxOptions
Constants ¶
This section is empty.
Variables ¶
var ( // ErrIndexDuplicateValue is returned when a value is already associated with a key ErrIndexDuplicateValue = errors.New("duplicate value") // ErrIndexWrongArity is returned when trying to index more values that what an // index supports. ErrIndexWrongArity = errors.New("wrong index arity") )
Functions ¶
Types ¶
type Catalog ¶
type Catalog struct {
// contains filtered or unexported fields
}
Catalog holds all table and index informations.
func NewCatalog ¶
func NewCatalog() *Catalog
func (*Catalog) AddFieldConstraint ¶
func (c *Catalog) AddFieldConstraint(tx *Transaction, tableName string, fc FieldConstraint) error
AddFieldConstraint adds a field constraint to a table.
func (*Catalog) CreateIndex ¶
func (c *Catalog) CreateIndex(tx *Transaction, info *IndexInfo) error
CreateIndex creates an index with the given name. If it already exists, returns errs.ErrIndexAlreadyExists.
func (*Catalog) CreateTable ¶
func (c *Catalog) CreateTable(tx *Transaction, tableName string, info *TableInfo) error
CreateTable creates a table with the given name. If it already exists, returns ErrTableAlreadyExists.
func (*Catalog) DropIndex ¶
func (c *Catalog) DropIndex(tx *Transaction, name string) error
DropIndex deletes an index from the database.
func (*Catalog) DropTable ¶
func (c *Catalog) DropTable(tx *Transaction, tableName string) error
DropTable deletes a table from the
func (*Catalog) GetIndex ¶
func (c *Catalog) GetIndex(tx *Transaction, indexName string) (*Index, error)
GetIndex returns an index by name.
func (*Catalog) GetTable ¶
func (c *Catalog) GetTable(tx *Transaction, tableName string) (*Table, error)
func (*Catalog) ListIndexes ¶
ListIndexes returns an index by name.
func (*Catalog) ReIndex ¶
func (c *Catalog) ReIndex(tx *Transaction, indexName string) error
ReIndex truncates and recreates selected index from scratch.
func (*Catalog) ReIndexAll ¶
func (c *Catalog) ReIndexAll(tx *Transaction) error
ReIndexAll truncates and recreates all indexes of the database from scratch.
func (*Catalog) RenameTable ¶
func (c *Catalog) RenameTable(tx *Transaction, oldName, newName string) error
RenameTable renames a table. If it doesn't exist, it returns errs.ErrTableNotFound.
type ConversionFunc ¶
type ConversionFunc func(v document.Value, path document.Path, targetType document.ValueType) (document.Value, error)
ConversionFunc is called when the type of a value is different than the expected type and the value needs to be converted.
type Database ¶
type Database struct {
// Codec used to encode documents. Defaults to MessagePack.
Codec encoding.Codec
Catalog *Catalog
// contains filtered or unexported fields
}
A Database manages a list of tables in an engine.
func (*Database) Begin ¶
func (db *Database) Begin(writable bool) (*Transaction, error)
Begin starts a new transaction with default options. The returned transaction must be closed either by calling Rollback or Commit.
func (*Database) BeginTx ¶
BeginTx starts a new transaction with the given options. If opts is empty, it will use the default options. The returned transaction must be closed either by calling Rollback or Commit. If the Attached option is passed, it opens a database level transaction, which gets attached to the database and prevents any other transaction to be opened afterwards until it gets rolled back or commited.
func (*Database) GetAttachedTx ¶
func (db *Database) GetAttachedTx() *Transaction
GetAttachedTx returns the transaction attached to the database. It returns nil if there is no such transaction. The returned transaction is not thread safe.
type FieldConstraint ¶
type FieldConstraint struct {
Path document.Path
Type document.ValueType
IsPrimaryKey bool
IsNotNull bool
IsUnique bool // not stored, only set during table creation
DefaultValue document.Value
IsInferred bool
InferredBy []document.Path
}
FieldConstraint describes constraints on a particular field.
func (*FieldConstraint) HasDefaultValue ¶
func (f *FieldConstraint) HasDefaultValue() bool
HasDefaultValue returns this field contains a default value constraint.
func (*FieldConstraint) IsEqual ¶
func (f *FieldConstraint) IsEqual(other *FieldConstraint) (bool, error)
IsEqual compares f with other member by member. Inference is not compared.
func (*FieldConstraint) MergeInferred ¶
func (f *FieldConstraint) MergeInferred(other *FieldConstraint)
MergeInferred adds the other.InferredBy to f.InferredBy and ensures there are no duplicates.
func (*FieldConstraint) ScanDocument ¶
func (f *FieldConstraint) ScanDocument(d document.Document) error
ScanDocument implements the document.Scanner interface.
func (*FieldConstraint) String ¶
func (f *FieldConstraint) String() string
func (*FieldConstraint) ToDocument ¶
func (f *FieldConstraint) ToDocument() document.Document
ToDocument returns a document from f.
type FieldConstraints ¶
type FieldConstraints []*FieldConstraint
FieldConstraints is a list of field constraints.
func NewFieldConstraints ¶
func NewFieldConstraints(userConstraints []*FieldConstraint) (FieldConstraints, error)
NewFieldConstraints takes user-defined field constraints, validates them, infers additional constraints if needed, and returns a valid FieldConstraints type that can be assigned to a table.
func (*FieldConstraints) Add ¶
func (f *FieldConstraints) Add(newFc *FieldConstraint) error
Add a field constraint to the list. If another constraint exists for the same path and they are equal, newFc will be ignored. Otherwise an error will be returned. If newFc has been inferred by another constraint and another constraint exists with the same path, their InferredBy member will be merged.
func (FieldConstraints) ConvertDocument ¶
func (f FieldConstraints) ConvertDocument(d document.Document) (*document.FieldBuffer, error)
ConvertDocument the document using the field constraints. It converts any path that has a field constraint on it into the specified type using CAST. If there is no constraint on an integer field or value, it converts it into a double. Default values on missing fields are not applied.
func (FieldConstraints) ConvertValueAtPath ¶
func (f FieldConstraints) ConvertValueAtPath(path document.Path, v document.Value, conversionFn ConversionFunc) (document.Value, error)
ConvertValueAtPath converts the value using the field constraints that are applicable at the given path.
func (FieldConstraints) Get ¶
func (f FieldConstraints) Get(path document.Path) *FieldConstraint
Get a field constraint by path. Returns nil if not found.
func (FieldConstraints) Infer ¶
func (f FieldConstraints) Infer() (FieldConstraints, error)
Infer additional constraints based on user defined ones. For example, given the following table:
CREATE TABLE foo (a.b[0] TEXT)
this function will return a TableInfo that behaves as if the table had been created like this:
CREATE TABLE foo( a DOCUMENT a.b ARRAY a.b[0] TEXT )
func (FieldConstraints) ValidateDocument ¶
func (f FieldConstraints) ValidateDocument(d document.Document) (*document.FieldBuffer, error)
ValidateDocument calls Convert then ensures the document validates against the field constraints.
type Index ¶
type Index struct {
Info *IndexInfo
// contains filtered or unexported fields
}
An Index associates encoded values with keys.
The association is performed by encoding the values in a binary format that preserve ordering when compared lexicographically. For the implementation, see the binarysort package and the document.ValueEncoder.
func NewIndex ¶
func NewIndex(tx engine.Transaction, idxName string, opts *IndexInfo) *Index
NewIndex creates an index that associates values with a list of keys.
func (*Index) Arity ¶
Arity returns how many values the index is operating on. For example, an index created with `CREATE INDEX idx_a_b ON foo (a, b)` has an arity of 2.
func (*Index) AscendGreaterOrEqual ¶
AscendGreaterOrEqual seeks for the pivot and then goes through all the subsequent key value pairs in increasing order and calls the given function for each pair. If the given function returns an error, the iteration stops and returns that error. If the pivot(s) is/are empty, starts from the beginning.
Valid pivots are: - zero value pivot
- iterate on everything
- n elements pivot (where n is the index arity) with each element having a value and a type
- iterate starting at the closest index value
- optionally, the last pivot element can have just a type and no value, which will scope the value of that element to that type
- less than n elements pivot, with each element having a value and a type
- iterate starting at the closest index value, using the first known value for missing elements
- optionally, the last pivot element can have just a type and no value, which will scope the value of that element to that type
- a single element with a type but nil value: will iterate on everything of that type
Any other variation of a pivot are invalid and will panic.
func (*Index) DescendLessOrEqual ¶
DescendLessOrEqual seeks for the pivot and then goes through all the subsequent key value pairs in descreasing order and calls the given function for each pair. If the given function returns an error, the iteration stops and returns that error. If the pivot(s) is/are empty, starts from the end.
Valid pivots are: - zero value pivot
- iterate on everything
- n elements pivot (where n is the index arity) with each element having a value and a type
- iterate starting at the closest index value
- optionally, the last pivot element can have just a type and no value, which will scope the value of that element to that type
- less than n elements pivot, with each element having a value and a type
- iterate starting at the closest index value, using the last known value for missing elements
- optionally, the last pivot element can have just a type and no value, which will scope the value of that element to that type
- a single element with a type but nil value: will iterate on everything of that type
Any other variation of a pivot are invalid and will panic.
func (*Index) EncodeValueBuffer ¶
func (idx *Index) EncodeValueBuffer(vb *document.ValueBuffer) ([]byte, error)
EncodeValueBuffer encodes the value buffer containing a single or multiple values being indexed into a byte array, keeping the order of the original values.
The values are marshalled and separated with a document.ArrayValueDelim, *without* a trailing document.ArrayEnd, which enables to handle cases where only some of the values are being provided and still perform lookups (like index_foo_a_b_c and providing only a and b).
See IndexValueEncoder for details about how the value themselves are encoded.
func (*Index) IsComposite ¶
IsComposite returns true if the index is defined to operate on at least more than one value.
type IndexInfo ¶
type IndexInfo struct {
TableName string
IndexName string
Paths []document.Path
// If set to true, values will be associated with at most one key. False by default.
Unique bool
// If set, the index is typed and only accepts values of those types.
Types []document.ValueType
}
IndexInfo holds the configuration of an index.
func (*IndexInfo) ToDocument ¶
ToDocument creates a document from an IndexConfig.
type Table ¶
type Table struct {
Tx *Transaction
Store engine.Store
Name string
// Table information.
// May not represent the most up to date data.
// Always get a fresh Table instance before relying on this field.
Info *TableInfo
// List of Indexes of this table.
// May not represent the most up to date data.
// Always get a fresh Table instance relying on this field.
Indexes Indexes
}
A Table represents a collection of documents.
func GetIndexStore ¶
func GetIndexStore(tx *Transaction) *Table
func GetTableStore ¶
func GetTableStore(tx *Transaction) *Table
func (*Table) AscendGreaterOrEqual ¶
func (t *Table) AscendGreaterOrEqual(pivot document.Value, fn func(d document.Document) error) error
AscendGreaterOrEqual iterates over the documents of the table whose key is greater than or equal to the pivot. The pivot is converted to the type of the primary key, if any, prior to iteration. If the pivot is empty, it iterates from the beginning of the table.
func (*Table) DescendLessOrEqual ¶
DescendLessOrEqual iterates over the documents of the table whose key is less than or equal to the pivot, in reverse order. The pivot is converted to the type of the primary key, if any, prior to iteration. If the pivot is empty, it iterates from the end of the table in reverse order.
func (*Table) EncodeValue ¶
EncodeValue encodes a value following primary key constraints. It returns a binary representation of the key as used in the store. It can be used to manually add a new entry to the store or to compare with other keys during table iteration.
func (*Table) GetDocument ¶
GetDocument returns one document by key.
func (*Table) Insert ¶
Insert the document into the table. If a primary key has been specified during the table creation, the field is expected to be present in the given document. If no primary key has been selected, a monotonic autoincremented integer key will be generated. It returns the inserted document alongside its key. They key can be accessed using the document.Keyer interface.
func (*Table) Iterate ¶
Iterate goes through all the documents of the table and calls the given function by passing each one of them. If the given function returns an error, the iteration stops.
type TableInfo ¶
type TableInfo struct {
// name of the table.
TableName string
// name of the store associated with the table.
StoreName []byte
ReadOnly bool
FieldConstraints FieldConstraints
}
TableInfo contains information about a table.
func (*TableInfo) GetPrimaryKey ¶
func (ti *TableInfo) GetPrimaryKey() *FieldConstraint
GetPrimaryKey returns the field constraint of the primary key. Returns nil if there is no primary key.
func (*TableInfo) ToDocument ¶
ToDocument turns ti into a document.
type Transaction ¶
type Transaction struct {
DB *Database
Tx engine.Transaction
Catalog *Catalog
Writable bool
// these functions are run after a successful rollback.
OnRollbackHooks []func()
// contains filtered or unexported fields
}
Transaction represents a database transaction. It provides methods for managing the collection of tables and the transaction itself. Transaction is either read-only or read/write. Read-only can be used to read tables and read/write can be used to read, create, delete and modify tables.
func (*Transaction) Commit ¶
func (tx *Transaction) Commit() error
Commit the transaction. Calling this method on read-only transactions will return an error.
func (*Transaction) Rollback ¶
func (tx *Transaction) Rollback() error
Rollback the transaction. Can be used safely after commit.
type TxOptions ¶
type TxOptions struct {
// Open a read-only transaction.
ReadOnly bool
// Set the transaction as global at the database level.
// Any queries run by the database will use that transaction until it is
// rolled back or commited.
Attached bool
}
TxOptions are passed to Begin to configure transactions.