Involved Source Filesbolt_amd64.gobolt_linux.gobolt_unix.gobucket.gocompact.gocursor.godb.go package bbolt implements a low-level key/value store in pure Go. It supports
fully serializable transactions, ACID semantics, and lock-free MVCC with
multiple readers and a single writer. Bolt can be used for projects that
want a simple data store without the need to add large dependencies such as
Postgres or MySQL.
Bolt is a single-level, zero-copy, B+tree data store. This means that Bolt is
optimized for fast read access and does not require recovery in the event of a
system crash. Transactions which have not finished committing will simply be
rolled back in the event of a crash.
The design of Bolt is based on Howard Chu's LMDB database project.
Bolt currently works on Windows, Mac OS X, and Linux.
Basics
There are only a few types in Bolt: DB, Bucket, Tx, and Cursor. The DB is
a collection of buckets and is represented by a single file on disk. A bucket is
a collection of unique keys that are associated with values.
Transactions provide either read-only or read-write access to the database.
Read-only transactions can retrieve key/value pairs and can use Cursors to
iterate over the dataset sequentially. Read-write transactions can create and
delete buckets and can insert and remove keys. Only one read-write transaction
is allowed at a time.
Caveats
The database uses a read-only, memory-mapped data file to ensure that
applications cannot corrupt the database, however, this means that keys and
values returned from Bolt cannot be changed. Writing to a read-only byte slice
will cause Go to panic.
Keys and values retrieved from the database are only valid for the life of
the transaction. When used outside the transaction, these byte slices can
point to different data or can point to invalid memory which will cause a panic.errors.gofreelist.gofreelist_hmap.gomlock_unix.gonode.gopage.gotx.gounsafe.go
Package-Level Type Names (total 11)
/* sort by: | */
Bucket represents a collection of key/value pairs inside the database. Sets the threshold for filling nodes when they split. By default,
the bucket will fill to 50% but it can be useful to increase this
amount if you know that your write workloads are mostly append-only.
This is non-persisted across transactions so it must be set in every Tx. Bucket retrieves a nested bucket by name.
Returns nil if the bucket does not exist.
The bucket instance is only valid for the lifetime of the transaction. CreateBucket creates a new bucket at the given key and returns the new bucket.
Returns an error if the key already exists, if the bucket name is blank, or if the bucket name is too long.
The bucket instance is only valid for the lifetime of the transaction. CreateBucketIfNotExists creates a new bucket if it doesn't already exist and returns a reference to it.
Returns an error if the bucket name is blank, or if the bucket name is too long.
The bucket instance is only valid for the lifetime of the transaction. Cursor creates a cursor associated with the bucket.
The cursor is only valid as long as the transaction is open.
Do not use a cursor after the transaction is closed. Delete removes a key from the bucket.
If the key does not exist then nothing is done and a nil error is returned.
Returns an error if the bucket was created from a read-only transaction. DeleteBucket deletes a bucket at the given key.
Returns an error if the bucket does not exist, or if the key represents a non-bucket value. ForEach executes a function for each key/value pair in a bucket.
If the provided function returns an error then the iteration is stopped and
the error is returned to the caller. The provided function must not modify
the bucket; this will result in undefined behavior. Get retrieves the value for a key in the bucket.
Returns a nil value if the key does not exist or if the key is a nested bucket.
The returned value is only valid for the life of the transaction. NextSequence returns an autoincrementing integer for the bucket. Put sets the value for a key in the bucket.
If the key exist then its previous value will be overwritten.
Supplied value must remain valid for the life of the transaction.
Returns an error if the bucket was created from a read-only transaction, if the key is blank, if the key is too large, or if the value is too large. Root returns the root of the bucket. Sequence returns the current integer for the bucket without incrementing it. SetSequence updates the sequence number for the bucket. Stat returns stats on a bucket. Tx returns the tx of the bucket. Writable returns whether the bucket is writable.
func (*Bucket).Bucket(name []byte) *Bucket
func (*Bucket).CreateBucket(key []byte) (*Bucket, error)
func (*Bucket).CreateBucketIfNotExists(key []byte) (*Bucket, error)
func (*Cursor).Bucket() *Bucket
func (*Tx).Bucket(name []byte) *Bucket
func (*Tx).CreateBucket(name []byte) (*Bucket, error)
func (*Tx).CreateBucketIfNotExists(name []byte) (*Bucket, error)
BucketStats records statistics about resources used by a bucket. Page size utilization. // bytes allocated for physical branch pages // bytes actually used for branch data // number of physical branch overflow pages Page count statistics. // number of logical branch pages Bucket statistics // total number of buckets including the top bucket // number of levels in B+tree // bytes used for inlined buckets (also accounted for in LeafInuse) // total number on inlined buckets Tree statistics. // number of keys/value pairs // bytes allocated for physical leaf pages // bytes actually used for leaf data // number of physical leaf overflow pages // number of logical leaf pages(*BucketStats) Add(other BucketStats)
func (*Bucket).Stats() BucketStats
func (*BucketStats).Add(other BucketStats)
Cursor represents an iterator that can traverse over all key/value pairs in a bucket in sorted order.
Cursors see nested buckets with value == nil.
Cursors can be obtained from a transaction and are valid as long as the transaction is open.
Keys and values returned from the cursor are only valid for the life of the transaction.
Changing data while traversing with a cursor may cause it to be invalidated
and return unexpected keys and/or values. You must reposition your cursor
after mutating data. Bucket returns the bucket that this cursor was created from. Delete removes the current key/value under the cursor from the bucket.
Delete fails if current key/value is a bucket or if the transaction is not writable. First moves the cursor to the first item in the bucket and returns its key and value.
If the bucket is empty then a nil key and value are returned.
The returned key and value are only valid for the life of the transaction. Last moves the cursor to the last item in the bucket and returns its key and value.
If the bucket is empty then a nil key and value are returned.
The returned key and value are only valid for the life of the transaction. Next moves the cursor to the next item in the bucket and returns its key and value.
If the cursor is at the end of the bucket then a nil key and value are returned.
The returned key and value are only valid for the life of the transaction. Prev moves the cursor to the previous item in the bucket and returns its key and value.
If the cursor is at the beginning of the bucket then a nil key and value are returned.
The returned key and value are only valid for the life of the transaction. Seek moves the cursor to a given key and returns it.
If the key does not exist then the next key is used. If no keys
follow, a nil key is returned.
The returned key and value are only valid for the life of the transaction.
func (*Bucket).Cursor() *Cursor
func (*Tx).Cursor() *Cursor
DB represents a collection of buckets persisted to a file on disk.
All data access is performed through transactions which can be obtained through the DB.
All the functions on DB will return a ErrDatabaseNotOpen if accessed before Open() is called. AllocSize is the amount of space allocated when the database
needs to create new pages. This is done to amortize the cost
of truncate() and fsync() when growing the data file. FreelistType sets the backend freelist type. There are two options. Array which is simple but endures
dramatic performance degradation if database is large and framentation in freelist is common.
The alternative one is using hashmap, it is faster in almost all circumstances
but it doesn't guarantee that it offers the smallest page id available. In normal case it is safe.
The default type is array MaxBatchDelay is the maximum delay before a batch starts.
Default value is copied from DefaultMaxBatchDelay in Open.
If <=0, effectively disables batching.
Do not change concurrently with calls to Batch. MaxBatchSize is the maximum size of a batch. Default value is
copied from DefaultMaxBatchSize in Open.
If <=0, disables batching.
Do not change concurrently with calls to Batch. Mlock locks database file in memory when set to true.
It prevents major page faults, however used memory can't be reclaimed.
Supported only on Unix via mlock/munlock syscalls. If you want to read the entire database fast, you can set MmapFlag to
syscall.MAP_POPULATE on Linux 2.6.23+ for sequential read-ahead. When true, skips syncing freelist to disk. This improves the database
write performance under normal operation, but requires a full database
re-sync during recovery. When true, skips the truncate call when growing the database.
Setting this to true is only safe on non-ext3/ext4 systems.
Skipping truncation avoids preallocation of hard drive space and
bypasses a truncate() and fsync() syscall on remapping.
https://github.com/boltdb/bolt/issues/284 Setting the NoSync flag will cause the database to skip fsync()
calls after each commit. This can be useful when bulk loading data
into a database and you can restart the bulk load in the event of
a system failure or database corruption. Do not set this flag for
normal use.
If the package global IgnoreNoSync constant is true, this value is
ignored. See the comment on that constant for more details.
THIS IS UNSAFE. PLEASE USE WITH CAUTION. When enabled, the database will perform a Check() after every commit.
A panic is issued if the database is in an inconsistent state. This
flag has a large performance impact so it should only be used for
debugging purposes. Batch calls fn as part of a batch. It behaves similar to Update,
except:
1. concurrent Batch calls can be combined into a single Bolt
transaction.
2. the function passed to Batch may be called multiple times,
regardless of whether it returns error or not.
This means that Batch function side effects must be idempotent and
take permanent effect only after a successful return is seen in
caller.
The maximum batch size and delay can be adjusted with DB.MaxBatchSize
and DB.MaxBatchDelay, respectively.
Batch is only useful when there are multiple goroutines calling it. Begin starts a new transaction.
Multiple read-only transactions can be used concurrently but only one
write transaction can be used at a time. Starting multiple write transactions
will cause the calls to block and be serialized until the current write
transaction finishes.
Transactions should not be dependent on one another. Opening a read
transaction and a write transaction in the same goroutine can cause the
writer to deadlock because the database periodically needs to re-mmap itself
as it grows and it cannot do that while a read transaction is open.
If a long running read transaction (for example, a snapshot transaction) is
needed, you might want to set DB.InitialMmapSize to a large enough value
to avoid potential blocking of write transaction.
IMPORTANT: You must close read-only transactions after you are finished or
else the database will not reclaim old pages. Close releases all database resources.
It will block waiting for any open transactions to finish
before closing the database and returning. GoString returns the Go string representation of the database. This is for internal access to the raw data bytes from the C cursor, use
carefully, or not at all.(*DB) IsReadOnly() bool Path returns the path to currently open database file. Stats retrieves ongoing performance stats for the database.
This is only updated when a transaction closes. String returns the string representation of the database. Sync executes fdatasync() against the database file handle.
This is not necessary under normal operation, however, if you use NoSync
then it allows you to force the database file to sync against the disk. Update executes a function within the context of a read-write managed transaction.
If no error is returned from the function then the transaction is committed.
If an error is returned then the entire transaction is rolled back.
Any error that is returned from the function or returned from the commit is
returned from the Update() method.
Attempting to manually commit or rollback within the function will cause a panic. View executes a function within the context of a managed read-only transaction.
Any error that is returned from the function is returned from the View() method.
Attempting to manually rollback within the function will cause a panic.
*DB : expvar.Var
*DB : fmt.GoStringer
*DB : fmt.Stringer
*DB : github.com/polarsignals/frostdb.Sync
*DB : github.com/prometheus/common/expfmt.Closer
*DB : io.Closer
func Open(path string, mode os.FileMode, options *Options) (*DB, error)
func (*Tx).DB() *DB
func github.com/pancsta/asyncmachine-go/pkg/history/bbolt.NewDb(name string) (*DB, error)
func Compact(dst, src *DB, txMaxSize int64) error
func github.com/pancsta/asyncmachine-go/pkg/history/bbolt.GetMachine(db *DB, id string) (*amhist.MachineRecord, error)
func github.com/pancsta/asyncmachine-go/pkg/history/bbolt.ListMachines(db *DB) ([]*amhist.MachineRecord, error)
func github.com/pancsta/asyncmachine-go/pkg/history/bbolt.NewMemory(ctx context.Context, db *DB, mach am.Api, cfg bbolt.Config, onErr func(err error)) (*bbolt.Memory, error)
Options represents the options that can be set when opening a database. FreelistType sets the backend freelist type. There are two options. Array which is simple but endures
dramatic performance degradation if database is large and framentation in freelist is common.
The alternative one is using hashmap, it is faster in almost all circumstances
but it doesn't guarantee that it offers the smallest page id available. In normal case it is safe.
The default type is array InitialMmapSize is the initial mmap size of the database
in bytes. Read transactions won't block write transaction
if the InitialMmapSize is large enough to hold database mmap
size. (See DB.Begin for more information)
If <=0, the initial map size is 0.
If initialMmapSize is smaller than the previous database size,
it takes no effect. Mlock locks database file in memory when set to true.
It prevents potential page faults, however
used memory can't be reclaimed. (UNIX only) Sets the DB.MmapFlags flag before memory mapping the file. Do not sync freelist to disk. This improves the database write performance
under normal operation, but requires a full database re-sync during recovery. Sets the DB.NoGrowSync flag before memory mapping the file. NoSync sets the initial value of DB.NoSync. Normally this can just be
set directly on the DB itself when returned from Open(), but this option
is useful in APIs which expose Options but not the underlying DB. OpenFile is used to open files. It defaults to os.OpenFile. This option
is useful for writing hermetic tests. PageSize overrides the default OS page size. Open database in read-only mode. Uses flock(..., LOCK_SH |LOCK_NB) to
grab a shared lock (UNIX). Timeout is the amount of time to wait to obtain a file lock.
When set to zero it will wait indefinitely. This option is only
available on Darwin and Linux.
func Open(path string, mode os.FileMode, options *Options) (*DB, error)
var DefaultOptions *Options
Stats represents statistics about the database. // total bytes allocated in free pages Freelist stats // total number of free pages on the freelist // total bytes used by the freelist // number of currently open read transactions // total number of pending pages on the freelist Transaction stats // total number of started read transactions // global, ongoing stats. Sub calculates and returns the difference between two sets of database stats.
This is useful when obtaining stats at two different points and time and
you need the performance counters that occurred within that time span.
func (*DB).Stats() Stats
func (*Stats).Sub(other *Stats) Stats
func (*Stats).Sub(other *Stats) Stats
Tx represents a read-only or read/write transaction on the database.
Read-only transactions can be used for retrieving values for keys and creating cursors.
Read/write transactions can create and remove buckets and create and remove keys.
IMPORTANT: You must commit or rollback transactions when you are done with
them. Pages can not be reclaimed by the writer until no more transactions
are using them. A long running read transaction can cause the database to
quickly grow. WriteFlag specifies the flag for write-related methods like WriteTo().
Tx opens the database file with the specified flag to copy the data.
By default, the flag is unset, which works well for mostly in-memory
workloads. For databases that are much larger than available RAM,
set the flag to syscall.O_DIRECT to avoid trashing the page cache. Bucket retrieves a bucket by name.
Returns nil if the bucket does not exist.
The bucket instance is only valid for the lifetime of the transaction. Check performs several consistency checks on the database for this transaction.
An error is returned if any inconsistency is found.
It can be safely run concurrently on a writable transaction. However, this
incurs a high cost for large databases and databases with a lot of subbuckets
because of caching. This overhead can be removed if running on a read-only
transaction, however, it is not safe to execute other writer transactions at
the same time. Commit writes all changes to disk and updates the meta page.
Returns an error if a disk write error occurs, or if Commit is
called on a read-only transaction. Copy writes the entire database to a writer.
This function exists for backwards compatibility.
Deprecated; Use WriteTo() instead. CopyFile copies the entire database to file at the given path.
A reader transaction is maintained during the copy so it is safe to continue
using the database while a copy is in progress. CreateBucket creates a new bucket.
Returns an error if the bucket already exists, if the bucket name is blank, or if the bucket name is too long.
The bucket instance is only valid for the lifetime of the transaction. CreateBucketIfNotExists creates a new bucket if it doesn't already exist.
Returns an error if the bucket name is blank, or if the bucket name is too long.
The bucket instance is only valid for the lifetime of the transaction. Cursor creates a cursor associated with the root bucket.
All items in the cursor will return a nil value because all root bucket keys point to buckets.
The cursor is only valid as long as the transaction is open.
Do not use a cursor after the transaction is closed. DB returns a reference to the database that created the transaction. DeleteBucket deletes a bucket.
Returns an error if the bucket cannot be found or if the key represents a non-bucket value. ForEach executes a function for each bucket in the root.
If the provided function returns an error then the iteration is stopped and
the error is returned to the caller. ID returns the transaction id. OnCommit adds a handler function to be executed after the transaction successfully commits. Page returns page information for a given page number.
This is only safe for concurrent use when used by a writable transaction. Rollback closes the transaction and ignores all previous updates. Read-only
transactions must be rolled back and not committed. Size returns current database size in bytes as seen by this transaction. Stats retrieves a copy of the current transaction statistics. Writable returns whether the transaction can perform write operations. WriteTo writes the entire database to a writer.
If err == nil then exactly tx.Size() bytes will be written into the writer.
*Tx : database/sql/driver.Tx
*Tx : github.com/gobwas/ws.HandshakeHeader
*Tx : gorm.io/gorm.TxCommitter
*Tx : io.WriterTo
func (*Bucket).Tx() *Tx
func (*DB).Begin(writable bool) (*Tx, error)
TxStats represents statistics about the actions performed by the transaction. Cursor statistics. // number of cursors created Node statistics // number of node allocations // number of node dereferences // total bytes allocated Page statistics. // number of page allocations Rebalance statistics. // number of node rebalances // total time spent rebalancing // number of nodes spilled // total time spent spilling Split/Spill statistics. // number of nodes split Write statistics. // number of writes performed // total time spent writing to disk Sub calculates and returns the difference between two sets of transaction stats.
This is useful when obtaining stats at two different points and time and
you need the performance counters that occurred within that time span.
func (*Tx).Stats() TxStats
func (*TxStats).Sub(other *TxStats) TxStats
func (*TxStats).Sub(other *TxStats) TxStats
Open creates and opens a database at the given path.
If the file does not exist then it will be created automatically.
Passing in nil options will cause Bolt to open the database with the default options.
Package-Level Variables (total 17)
DefaultOptions represent the options used if nil options are passed into Open().
No timeout is used which will cause Bolt to wait indefinitely for a lock.
ErrBucketExists is returned when creating a bucket that already exists.
ErrBucketNameRequired is returned when creating a bucket with a blank name.
ErrBucketNotFound is returned when trying to access a bucket that has
not been created yet.
ErrChecksum is returned when either meta page checksum does not match.
ErrDatabaseNotOpen is returned when a DB instance is accessed before it
is opened or after it is closed.
ErrDatabaseOpen is returned when opening a database that is
already open.
ErrDatabaseReadOnly is returned when a mutating transaction is started on a
read-only database.
ErrIncompatibleValue is returned when trying create or delete a bucket
on an existing non-bucket key or when trying to create or delete a
non-bucket key on an existing bucket key.
ErrInvalid is returned when both meta pages on a database are invalid.
This typically occurs when a file is not a bolt database.
ErrKeyRequired is returned when inserting a zero-length key.
ErrKeyTooLarge is returned when inserting a key that is larger than MaxKeySize.
ErrTimeout is returned when a database cannot obtain an exclusive lock
on the data file after the timeout passed to Open().
ErrTxClosed is returned when committing or rolling back a transaction
that has already been committed or rolled back.
ErrTxNotWritable is returned when performing a write operation on a
read-only transaction.
ErrValueTooLarge is returned when inserting a value that is larger than MaxValueSize.
ErrVersionMismatch is returned when the data file was created with a
different version of Bolt.
Package-Level Constants (total 9)
Default values if not set in a DB instance.
DefaultFillPercent is the percentage that split pages are filled.
This value can be changed by setting Bucket.FillPercent.
Default values if not set in a DB instance.
Default values if not set in a DB instance.
FreelistArrayType indicates backend freelist type is array
FreelistMapType indicates backend freelist type is hashmap
IgnoreNoSync specifies whether the NoSync field of a DB is ignored when
syncing changes to a file. This is required as some operating systems,
such as OpenBSD, do not have a unified buffer cache (UBC) and writes
must be synchronized using the msync(2) syscall.
MaxKeySize is the maximum length of a key, in bytes.
MaxValueSize is the maximum length of a value, in bytes.
The pages are generated with Goldsv0.8.2. (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu.
PR and bug reports are welcome and can be submitted to the issue list.
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds.