2024-03-05 03:12:37 +00:00
|
|
|
# Nim-RocksDB
|
|
|
|
# Copyright 2024 Status Research & Development GmbH
|
|
|
|
# Licensed under either of
|
|
|
|
#
|
|
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
|
|
|
|
# * GPL license, version 2.0, ([LICENSE-GPLv2](LICENSE-GPLv2) or https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)
|
|
|
|
#
|
|
|
|
# at your option. This file may not be copied, modified, or distributed except according to those terms.
|
|
|
|
|
|
|
|
## A `BackupEngineRef` is used to create and manage backups against a RocksDB database.
|
|
|
|
|
|
|
|
{.push raises: [].}
|
|
|
|
|
|
|
|
import
|
2024-06-26 15:00:10 +00:00
|
|
|
./lib/librocksdb, ./internal/utils, ./options/backupopts, ./rocksdb, ./rocksresult
|
2024-03-05 03:12:37 +00:00
|
|
|
|
2024-06-26 15:00:10 +00:00
|
|
|
export backupopts, rocksdb, rocksresult
|
2024-03-05 03:12:37 +00:00
|
|
|
|
|
|
|
type
|
|
|
|
BackupEnginePtr* = ptr rocksdb_backup_engine_t
|
2024-07-03 15:46:42 +00:00
|
|
|
EnvPtr = ptr rocksdb_env_t
|
2024-03-05 03:12:37 +00:00
|
|
|
|
|
|
|
BackupEngineRef* = ref object
|
|
|
|
cPtr: BackupEnginePtr
|
2024-07-03 15:46:42 +00:00
|
|
|
env: EnvPtr
|
2024-03-05 03:12:37 +00:00
|
|
|
path: string
|
|
|
|
backupOpts: BackupEngineOptionsRef
|
|
|
|
|
|
|
|
proc openBackupEngine*(
|
2024-07-03 15:46:42 +00:00
|
|
|
path: string, backupOpts = defaultBackupEngineOptions(path, autoClose = true)
|
2024-06-26 15:00:10 +00:00
|
|
|
): RocksDBResult[BackupEngineRef] =
|
2024-03-05 03:12:37 +00:00
|
|
|
## Create a new backup engine. The `path` parameter is the path of the backup
|
|
|
|
## directory. Note that the same directory should not be used for both backups
|
|
|
|
## and the database itself.
|
2024-06-28 02:04:37 +00:00
|
|
|
##
|
|
|
|
## If no `backupOpts` are provided, the default options will be used. These
|
|
|
|
## default backup options will be closed when the backup engine is closed.
|
|
|
|
## If `backupOpts` are provided, they will need to be closed manually.
|
2024-03-05 03:12:37 +00:00
|
|
|
|
2024-07-03 15:46:42 +00:00
|
|
|
let env = rocksdb_create_default_env()
|
2024-03-05 03:12:37 +00:00
|
|
|
var errors: cstring
|
2024-07-03 15:46:42 +00:00
|
|
|
let backupEnginePtr = rocksdb_backup_engine_open_opts(
|
|
|
|
backupOpts.cPtr, env, cast[cstringArray](errors.addr)
|
2024-06-26 15:00:10 +00:00
|
|
|
)
|
2024-06-28 15:57:34 +00:00
|
|
|
bailOnErrorsWithCleanup(errors):
|
|
|
|
autoCloseNonNil(backupOpts)
|
2024-07-03 15:46:42 +00:00
|
|
|
rocksdb_env_destroy(env)
|
2024-03-05 03:12:37 +00:00
|
|
|
|
2024-06-26 15:00:10 +00:00
|
|
|
let engine =
|
|
|
|
BackupEngineRef(cPtr: backupEnginePtr, path: path, backupOpts: backupOpts)
|
2024-03-05 03:12:37 +00:00
|
|
|
ok(engine)
|
|
|
|
|
|
|
|
proc isClosed*(backupEngine: BackupEngineRef): bool {.inline.} =
|
|
|
|
## Returns `true` if the `BackupEngineRef` has been closed.
|
|
|
|
backupEngine.cPtr.isNil()
|
|
|
|
|
|
|
|
proc createNewBackup*(
|
2024-06-26 15:00:10 +00:00
|
|
|
backupEngine: BackupEngineRef, db: RocksDbRef
|
|
|
|
): RocksDBResult[void] =
|
2024-03-05 03:12:37 +00:00
|
|
|
## Create a new backup of the database.
|
|
|
|
doAssert not backupEngine.isClosed()
|
|
|
|
doAssert not db.isClosed()
|
|
|
|
|
|
|
|
var errors: cstring
|
|
|
|
rocksdb_backup_engine_create_new_backup(
|
2024-06-26 15:00:10 +00:00
|
|
|
backupEngine.cPtr, db.cPtr, cast[cstringArray](errors.addr)
|
|
|
|
)
|
2024-03-05 03:12:37 +00:00
|
|
|
bailOnErrors(errors)
|
|
|
|
|
|
|
|
ok()
|
|
|
|
|
|
|
|
proc restoreDbFromLatestBackup*(
|
2024-06-26 15:00:10 +00:00
|
|
|
backupEngine: BackupEngineRef, dbDir: string, walDir = dbDir, keepLogFiles = false
|
|
|
|
): RocksDBResult[void] =
|
2024-03-05 03:12:37 +00:00
|
|
|
## Restore the database from the latest backup.
|
|
|
|
doAssert not backupEngine.isClosed()
|
|
|
|
|
|
|
|
let restoreOptions = rocksdb_restore_options_create()
|
|
|
|
rocksdb_restore_options_set_keep_log_files(restoreOptions, keepLogFiles.cint)
|
|
|
|
|
|
|
|
var errors: cstring
|
|
|
|
rocksdb_backup_engine_restore_db_from_latest_backup(
|
|
|
|
backupEngine.cPtr,
|
|
|
|
dbDir.cstring,
|
|
|
|
walDir.cstring,
|
|
|
|
restoreOptions,
|
2024-06-26 15:00:10 +00:00
|
|
|
cast[cstringArray](errors.addr),
|
|
|
|
)
|
2024-03-05 03:12:37 +00:00
|
|
|
bailOnErrors(errors)
|
|
|
|
|
|
|
|
rocksdb_restore_options_destroy(restoreOptions)
|
|
|
|
|
|
|
|
ok()
|
|
|
|
|
|
|
|
proc close*(backupEngine: BackupEngineRef) =
|
|
|
|
## Close the `BackupEngineRef`.
|
|
|
|
if not backupEngine.isClosed():
|
|
|
|
rocksdb_backup_engine_close(backupEngine.cPtr)
|
|
|
|
backupEngine.cPtr = nil
|
2024-06-28 02:04:37 +00:00
|
|
|
|
2024-07-03 15:46:42 +00:00
|
|
|
if not backupEngine.env.isNil():
|
|
|
|
rocksdb_env_destroy(backupEngine.env)
|
|
|
|
backupEngine.env = nil
|
|
|
|
|
2024-06-28 15:57:34 +00:00
|
|
|
autoCloseNonNil(backupEngine.backupOpts)
|