Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update open procs to support adding the default column family. #39

Merged
merged 1 commit into from Mar 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
37 changes: 19 additions & 18 deletions rocksdb/rocksdb.nim
Expand Up @@ -68,30 +68,30 @@ proc openRocksDb*(
dbOpts = defaultDbOptions(),
readOpts = defaultReadOptions(),
writeOpts = defaultWriteOptions(),
columnFamilies = @[defaultColFamilyDescriptor()]): RocksDBResult[RocksDbReadWriteRef] =
columnFamilies: openArray[ColFamilyDescriptor] = []): RocksDBResult[RocksDbReadWriteRef] =
## Open a RocksDB instance in read-write mode. If `columnFamilies` is empty
## then it will open the default column family. If `dbOpts`, `readOpts`, or
## `writeOpts` are not supplied then the default options will be used.
## By default, column families will be created if they don't yet exist.
## All existing column families must be specified if the database has
## previously created any column families. This means that the list of column
## families must always at least contain the default column family.
## previously created any column families.

if columnFamilies.len == 0:
return err("rocksdb: no column families")
var cfs = columnFamilies.toSeq()
if DEFAULT_COLUMN_FAMILY_NAME notin columnFamilies.mapIt(it.name()):
cfs.add(defaultColFamilyDescriptor())

var
cfNames = columnFamilies.mapIt(it.name().cstring)
cfOpts = columnFamilies.mapIt(it.options.cPtr)
columnFamilyHandles = newSeq[ColFamilyHandlePtr](columnFamilies.len)
cfNames = cfs.mapIt(it.name().cstring)
cfOpts = cfs.mapIt(it.options.cPtr)
cfHandles = newSeq[ColFamilyHandlePtr](cfs.len)
errors: cstring
let rocksDbPtr = rocksdb_open_column_families(
dbOpts.cPtr,
path.cstring,
cfNames.len().cint,
cast[cstringArray](cfNames[0].addr),
cfOpts[0].addr,
columnFamilyHandles[0].addr,
cfHandles[0].addr,
cast[cstringArray](errors.addr))
bailOnErrors(errors)

Expand All @@ -104,14 +104,14 @@ proc openRocksDb*(
writeOpts: writeOpts,
ingestOptsPtr: rocksdb_ingestexternalfileoptions_create(),
defaultCfName: DEFAULT_COLUMN_FAMILY_NAME,
cfTable: newColFamilyTable(cfNames.mapIt($it), columnFamilyHandles))
cfTable: newColFamilyTable(cfNames.mapIt($it), cfHandles))
ok(db)

proc openRocksDbReadOnly*(
path: string,
dbOpts = defaultDbOptions(),
readOpts = defaultReadOptions(),
columnFamilies = @[defaultColFamilyDescriptor()],
columnFamilies: openArray[ColFamilyDescriptor] = [],
errorIfWalFileExists = false): RocksDBResult[RocksDbReadOnlyRef] =
## Open a RocksDB instance in read-only mode. If `columnFamilies` is empty
## then it will open the default column family. If `dbOpts` or `readOpts` are
Expand All @@ -120,21 +120,22 @@ proc openRocksDbReadOnly*(
## contains any column families, then all or a subset of the existing column
## families can be opened for reading.

if columnFamilies.len == 0:
return err("rocksdb: no column families")
var cfs = columnFamilies.toSeq()
if DEFAULT_COLUMN_FAMILY_NAME notin columnFamilies.mapIt(it.name()):
cfs.add(defaultColFamilyDescriptor())

var
cfNames = columnFamilies.mapIt(it.name().cstring)
cfOpts = columnFamilies.mapIt(it.options.cPtr)
columnFamilyHandles = newSeq[ColFamilyHandlePtr](columnFamilies.len)
cfNames = cfs.mapIt(it.name().cstring)
cfOpts = cfs.mapIt(it.options.cPtr)
cfHandles = newSeq[ColFamilyHandlePtr](cfs.len)
errors: cstring
let rocksDbPtr = rocksdb_open_for_read_only_column_families(
dbOpts.cPtr,
path.cstring,
cfNames.len().cint,
cast[cstringArray](cfNames[0].addr),
cfOpts[0].addr,
columnFamilyHandles[0].addr,
cfHandles[0].addr,
errorIfWalFileExists.uint8,
cast[cstringArray](errors.addr))
bailOnErrors(errors)
Expand All @@ -146,7 +147,7 @@ proc openRocksDbReadOnly*(
dbOpts: dbOpts,
readOpts: readOpts,
defaultCfName: DEFAULT_COLUMN_FAMILY_NAME,
cfTable: newColFamilyTable(cfNames.mapIt($it), columnFamilyHandles))
cfTable: newColFamilyTable(cfNames.mapIt($it), cfHandles))
ok(db)

proc isClosed*(db: RocksDbRef): bool {.inline.} =
Expand Down
17 changes: 9 additions & 8 deletions rocksdb/transactiondb.nim
Expand Up @@ -49,18 +49,19 @@ proc openTransactionDb*(
path: string,
dbOpts = defaultDbOptions(),
txDbOpts = defaultTransactionDbOptions(),
columnFamilies = @[defaultColFamilyDescriptor()]): RocksDBResult[TransactionDbRef] =
columnFamilies: openArray[ColFamilyDescriptor] = []): RocksDBResult[TransactionDbRef] =
## Open a `TransactionDbRef` with the given options and column families.
## If no column families are provided the default column family will be used.
## If no options are provided the default options will be used.

if columnFamilies.len == 0:
return err("rocksdb: no column families")
var cfs = columnFamilies.toSeq()
if DEFAULT_COLUMN_FAMILY_NAME notin columnFamilies.mapIt(it.name()):
cfs.add(defaultColFamilyDescriptor())

var
cfNames = columnFamilies.mapIt(it.name().cstring)
cfOpts = columnFamilies.mapIt(it.options.cPtr)
columnFamilyHandles = newSeq[ColFamilyHandlePtr](columnFamilies.len)
cfNames = cfs.mapIt(it.name().cstring)
cfOpts = cfs.mapIt(it.options.cPtr)
cfHandles = newSeq[ColFamilyHandlePtr](cfs.len)
errors: cstring

let txDbPtr = rocksdb_transactiondb_open_column_families(
Expand All @@ -70,7 +71,7 @@ proc openTransactionDb*(
cfNames.len().cint,
cast[cstringArray](cfNames[0].addr),
cfOpts[0].addr,
columnFamilyHandles[0].addr,
cfHandles[0].addr,
cast[cstringArray](errors.addr))
bailOnErrors(errors)

Expand All @@ -80,7 +81,7 @@ proc openTransactionDb*(
path: path,
dbOpts: dbOpts,
txDbOpts: txDbOpts,
cfTable: newColFamilyTable(cfNames.mapIt($it), columnFamilyHandles))
cfTable: newColFamilyTable(cfNames.mapIt($it), cfHandles))
ok(db)

proc isClosed*(db: TransactionDbRef): bool {.inline.} =
Expand Down
8 changes: 4 additions & 4 deletions tests/test_helper.nim
Expand Up @@ -18,7 +18,7 @@ import

proc initReadWriteDb*(
path: string,
columnFamilyNames = @["default"]): RocksDbReadWriteRef =
columnFamilyNames: openArray[string] = @[]): RocksDbReadWriteRef =

let res = openRocksDb(
path,
Expand All @@ -30,7 +30,7 @@ proc initReadWriteDb*(

proc initReadOnlyDb*(
path: string,
columnFamilyNames = @["default"]): RocksDbReadOnlyRef =
columnFamilyNames: openArray[string] = @[]): RocksDbReadOnlyRef =

let res = openRocksDbReadOnly(
path,
Expand All @@ -48,12 +48,12 @@ proc initBackupEngine*(path: string): BackupEngineRef =

proc initTransactionDb*(
path: string,
columnFamilyNames = @["default"]): TransactionDbRef =
columnFamilyNames: openArray[string] = @[]): TransactionDbRef =

let res = openTransactionDb(
path,
columnFamilies = columnFamilyNames.mapIt(initColFamilyDescriptor(it)))
if res.isErr():
echo res.error()
doAssert res.isOk()
res.value()
res.value()
22 changes: 1 addition & 21 deletions tests/test_transactiondb.nim
Expand Up @@ -32,7 +32,7 @@ suite "TransactionDbRef Tests":

setup:
let dbPath = mkdtemp() / "data"
var db = initTransactionDb(dbPath, columnFamilyNames = @[CF_DEFAULT, CF_OTHER])
var db = initTransactionDb(dbPath, columnFamilyNames = @[CF_OTHER])

teardown:
db.close()
Expand Down Expand Up @@ -111,26 +111,6 @@ suite "TransactionDbRef Tests":
tx.get(key2, CF_OTHER).error() == ""
tx.get(key3, CF_OTHER).get() == val3

test "Test setting column family using withDefaultColFamily":
var tx = db.beginTransaction().withDefaultColFamily(CF_OTHER)
defer: tx.close()
check not tx.isClosed()

check:
tx.put(key1, val1).isOk()
tx.put(key2, val2).isOk()
tx.put(key3, val3).isOk()

tx.delete(key2).isOk()
not tx.isClosed()

check:
tx.get(key1, CF_DEFAULT).error() == ""
tx.get(key2, CF_DEFAULT).error() == ""
tx.get(key3, CF_DEFAULT).error() == ""
tx.get(key1, CF_OTHER).get() == val1
tx.get(key2, CF_OTHER).error() == ""
tx.get(key3, CF_OTHER).get() == val3

test "Test rollback and commit with multiple transactions":
var tx1 = db.beginTransaction(columnFamily = CF_DEFAULT)
Expand Down