Skip to content

Commit

Permalink
Update open procs to support adding the default column family if it i…
Browse files Browse the repository at this point in the history
…s missing from the columnFamilies list. (#39)
  • Loading branch information
web3-developer committed Mar 7, 2024
1 parent 5f6282e commit fc2ba4a
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 51 deletions.
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

0 comments on commit fc2ba4a

Please sign in to comment.