A Go library that implements the common github.com/bborbe/kv interfaces for BoltDB (go.etcd.io/bbolt). This provides a standardized key-value store interface while maintaining access to BoltDB-specific functionality through extended methods.
- Standard KV Interface: Implements
github.com/bborbe/kvinterfaces for consistent usage across different key-value stores - BoltDB Extensions: Access underlying BoltDB types (
*bolt.DB,*bolt.Tx,*bolt.Bucket,*bolt.Cursor) through extended interfaces - Multiple Database Creation Options: Create databases from files, directories, or temporary locations
- Transaction State Management: Built-in transaction nesting prevention and state tracking
- Bucket Caching: Efficient bucket management with caching during transactions
- Forward and Reverse Iteration: Support for both iteration directions
- CLI Tools: Command-line utilities for database management
go get github.com/bborbe/boltkvpackage main
import (
"context"
"fmt"
"log"
"github.com/bborbe/boltkv"
"github.com/bborbe/kv"
)
func main() {
ctx := context.Background()
// Open database
db, err := boltkv.OpenFile(ctx, "my-database.db")
if err != nil {
log.Fatal(err)
}
defer db.Close(ctx)
// Start transaction
err = db.Update(ctx, func(ctx context.Context, tx kv.Tx) error {
// Create or open bucket
bucket, err := tx.CreateBucketIfNotExists(ctx, []byte("my-bucket"))
if err != nil {
return err
}
// Set key-value pair
return bucket.Put(ctx, []byte("key"), []byte("value"))
})
if err != nil {
log.Fatal(err)
}
// Read value
err = db.View(ctx, func(ctx context.Context, tx kv.Tx) error {
bucket, err := tx.Bucket(ctx, []byte("my-bucket"))
if err != nil {
return err
}
value, err := bucket.Get(ctx, []byte("key"))
if err != nil {
return err
}
fmt.Printf("Value: %s\n", value)
return nil
})
if err != nil {
log.Fatal(err)
}
}// Create from file path
db, err := boltkv.OpenFile(ctx, "/path/to/database.db")
// Create from directory (creates bolt.db inside)
db, err := boltkv.OpenDir(ctx, "/path/to/directory")
// Create temporary database
db, err := boltkv.OpenTemp(ctx)
// With custom options
db, err := boltkv.OpenFile(ctx, "database.db", func(opts *bolt.Options) {
opts.ReadOnly = true
opts.Timeout = time.Second * 10
})// Access underlying BoltDB types
err = db.Update(ctx, func(ctx context.Context, tx kv.Tx) error {
// Cast to extended interfaces for BoltDB access
boltTx := tx.(boltkv.Tx).Tx() // Get *bolt.Tx
boltDB := db.(boltkv.DB).DB() // Get *bolt.DB
bucket, err := tx.CreateBucketIfNotExists(ctx, []byte("bucket"))
if err != nil {
return err
}
boltBucket := bucket.(boltkv.Bucket).Bucket() // Get *bolt.Bucket
// Use BoltDB-specific functionality
return boltBucket.ForEach(func(k, v []byte) error {
fmt.Printf("Key: %s, Value: %s\n", k, v)
return nil
})
})err = db.View(ctx, func(ctx context.Context, tx kv.Tx) error {
bucket, err := tx.Bucket(ctx, []byte("my-bucket"))
if err != nil {
return err
}
// Forward iteration
return bucket.ForEach(ctx, func(key, value []byte) error {
fmt.Printf("Key: %s, Value: %s\n", key, value)
return nil
})
})
// Reverse iteration
err = db.View(ctx, func(ctx context.Context, tx kv.Tx) error {
bucket, err := tx.Bucket(ctx, []byte("my-bucket"))
if err != nil {
return err
}
return bucket.ForEachReverse(ctx, func(key, value []byte) error {
fmt.Printf("Key: %s, Value: %s\n", key, value)
return nil
})
})BoltKV includes several command-line utilities for database management:
# List all buckets
bolt-bucket-list -database=/path/to/db.bolt
# Delete a bucket
bolt-bucket-delete -database=/path/to/db.bolt -bucket=bucket-name# Set a value
bolt-value-set -database=/path/to/db.bolt -bucket=bucket-name -key=mykey -value=myvalue
# Get a value
bolt-value-get -database=/path/to/db.bolt -bucket=bucket-name -key=mykey
# List all keys in a bucket
bolt-value-list -database=/path/to/db.bolt -bucket=bucket-name
# Delete a key
bolt-value-delete -database=/path/to/db.bolt -bucket=bucket-name -key=mykeyboltkv_db.go- Database connection and lifecycle managementboltkv_tx.go- Transaction handling with bucket cachingboltkv_bucket.go- Key-value operations within bucketsboltkv_iterator.go- Forward iteration supportboltkv_iterator-reverse.go- Reverse iteration support
- Interface Extension: Implements
github.com/bborbe/kvinterfaces while adding BoltDB-specific access methods - Transaction State Management: Uses context keys to track transaction state and prevent nesting
- Bucket Caching: Transactions cache opened buckets with mutex protection for efficiency
- Factory Methods: Multiple database creation options for different use cases
- go.etcd.io/bbolt - BoltDB embedded key-value database
- github.com/bborbe/kv - Common key-value store interfaces
- github.com/bborbe/errors - Enhanced error handling
- github.com/bborbe/service - Service framework
The library includes comprehensive tests and passes the shared test suites from github.com/bborbe/kv to ensure proper interface implementation.
# Run all tests
make test
# Run tests with coverage
go test -race -cover ./...
# Run specific test package
go test ./path/to/packageThis project is licensed under the BSD-style license. See the LICENSE file for details.
Contributions are welcome! Please ensure all tests pass and follow the existing code style.
# Run the full development workflow
make precommit