TidesDB GO Reference
You must make sure you have the TidesDB shared C library installed on your system. Be sure to also compile with
TIDESDB_WITH_SANITIZER
andTIDESDB_BUILD_TESTS
OFF.
Installing
go get github.com/tidesdb/tidesdb-go
Usage
Opening and closing
db, err := tidesdb_go.Open("/path/to/db") // will reopen the database if it already existsif err != nil {...}defer db.Close() // Closes TidesDB gracefully
Creating and dropping a column family
Column families are used to store data in TidesDB. You can create a column family using the CreateColumnFamily
method.
err := db.CreateColumnFamily("example_cf", 1024*1024*64, 12, 0.24, true, int(tidesdb_go.TDB_COMPRESS_SNAPPY), true)if err != nil {...}
// You can also drop a column family using the `DropColumnFamily` method.err = db.DropColumnFamily("example_cf")if err != nil {...}
CRUD operations
Writing data
err := db.Put("example_cf", []byte("key"), []byte("value"), -1)if err != nil {...}
With TTL
err := db.Put("example_cf", []byte("key"), []byte("value"), time.Now().Add(10*time.Second).Unix())if err != nil {...}
Reading data
value, err := db.Get("example_cf", []byte("key"))if err != nil {...}fmt.Println(string(value))
Deleting data
err := db.Delete("example_cf", []byte("key"))if err != nil {...}
Deleting by range
// Delete all key-value pairs between "start_key" and "end_key" atomicallyerr := db.DeleteByRange("example_cf", []byte("start_key"), []byte("end_key"))if err != nil {...}
Iterating over data
cursor, err := db.CursorInit("example_cf")if err != nil {...}defer cursor.Free()
for {key, value, err := cursor.Get()if err != nil { break}fmt.Printf("Key: %s, Value: %s\n", key, value)
cursor.Next() // or cursor.Prev()}
Transactions
txn, err := db.BeginTxn("example_cf")if err != nil {...}defer txn.Free()
err = txn.Put([]byte("key"), []byte("value"), 0)if err != nil {...}
// You can also use txn.Delete(), txn.Get()
err = txn.Commit()if err != nil {...}
Range queries
// Get all key-value pairs between "start_key" and "end_key"pairs, err := db.Range("example_cf", []byte("start_key"), []byte("end_key"))if err != nil {...}
for _, pair := range pairs { key := pair[0] value := pair[1] fmt.Printf("Key: %s, Value: %s\n", key, value)}
Column Family Statistics
You can retrieve detailed statistics about a column family using the GetColumnFamilyStat
method.
stat, err := db.GetColumnFamilyStat("example_cf")if err != nil { ...}
// Access various statistics about the column familyfmt.Printf("Column Family: %s\n", stat.Name)fmt.Printf("Memtable Size: %d bytes\n", stat.MemtableSize)fmt.Printf("Memtable Entries: %d\n", stat.MemtableEntryCount)fmt.Printf("Number of SSTables: %d\n", stat.NumSSTables)fmt.Printf("Incremental Merging: %t\n", stat.IncrementalMerging)
// Access configuration detailsfmt.Printf("Flush Threshold: %d\n", stat.Config.FlushThreshold)fmt.Printf("Max Level: %d\n", stat.Config.MaxLevel)fmt.Printf("Probability: %f\n", stat.Config.Probability)fmt.Printf("Compressed: %t\n", stat.Config.Compressed)fmt.Printf("Bloom Filter: %t\n", stat.Config.BloomFilter)
// Access SSTable statisticsfor i, sstStat := range stat.SSTableStats { fmt.Printf("SSTable %d - Path: %s, Size: %d bytes, Blocks: %d\n", i, sstStat.Path, sstStat.Size, sstStat.NumBlocks)}
Listing Column Families
You can retrieve a list of all column families.
cfList, err := db.ListColumnFamilies()if err != nil {...}
fmt.Println("Available column families:", cfList)
Compaction
Compaction is done manually or in background incrementally.
Merging operations, pair and merge sstables, removing expired keys if TTL set and tombstoned data.
Manual
err := db.CompactSSTables("example_cf", 4) // 4 is the number of threads to use for compaction. Each thread will compact a pair of sstables.if err != nil { ...}
Background
err := db.StartIncrementalMerge("example_cf", 60, 1000) // merge a pair of sstables starting at oldest pair every 60 seconds only when we have a minimum of 1000 sstablesif err != nil {...}