Packages
rocksdb
0.23.1
3.1.2
3.1.1
3.1.0
3.0.0
2.6.2
2.6.1
retired
2.6.0
retired
2.5.0
2.4.1
2.4.0
2.3.0
2.2.0
2.1.0
2.0.0
1.9.0
1.8.0
1.7.0
1.6.0
1.5.1
1.5.0
1.4.0
1.3.2
1.3.1
1.3.0
1.2.0
1.1.1
1.1.0
1.0.0
0.26.2
0.26.1
0.26.0
0.25.0
0.24.0
0.23.3
0.23.2
0.23.1
0.23.0
0.22.0
0.21.0
0.20.1
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.1
0.13.0
0.12.0
0.11.0
0.10.0
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.1
0.7.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
RocksDB for Erlang
Current section
Files
Jump to
Current section
Files
c_src/backup.cc
// -------------------------------------------------------------------
// Copyright (c) 2017 Benoit Chesneau. All Rights Reserved.
//
// This file is provided to you under the Apache License,
// Version 2.0 (the "License"); you may not use this file
// except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
// -------------------------------------------------------------------
#include <vector>
#include "erl_nif.h"
#include "rocksdb/db.h"
#include "rocksdb/utilities/backupable_db.h"
#include "atoms.h"
#include "refobjects.h"
#include "util.h"
namespace erocksdb {
ERL_NIF_TERM
OpenBackupEngine(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
char path[4096];
BackupEngineObject * backup_engine_ptr;
rocksdb::BackupEngine* backup_engine;
rocksdb::Status s;
if(!enif_get_string(env, argv[0], path, sizeof(path), ERL_NIF_LATIN1) ||!enif_is_list(env, argv[0]))
{
return enif_make_badarg(env);
}
s = rocksdb::BackupEngine::Open(rocksdb::Env::Default(), rocksdb::BackupableDBOptions(path), &backup_engine);
if(!s.ok())
return error_tuple(env, ATOM_ERROR_BACKUP_ENGINE_OPEN, s);
backup_engine_ptr = BackupEngineObject::CreateBackupEngineObject(backup_engine);
ERL_NIF_TERM result = enif_make_resource(env, backup_engine_ptr);
enif_release_resource(backup_engine_ptr);
return enif_make_tuple2(env, ATOM_OK, result);
} // OpenBackupEngine
ERL_NIF_TERM
CreateNewBackup(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
ReferencePtr<BackupEngineObject> backup_engine_ptr;
ReferencePtr<DbObject> db_ptr;
rocksdb::Status s;
if(!enif_get_backup_engine(env, argv[0], &backup_engine_ptr))
return enif_make_badarg(env);
if(!enif_get_db(env, argv[1], &db_ptr))
return enif_make_badarg(env);
s = backup_engine_ptr->m_BackupEngine->CreateNewBackup(db_ptr->m_Db);
if (s.ok()) {
return ATOM_OK;
}
return error_tuple(env, ATOM_ERROR, s);
}
ERL_NIF_TERM
GetBackupInfo(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
ReferencePtr<BackupEngineObject> backup_engine_ptr;
std::vector<rocksdb::BackupInfo> backup_infos;
rocksdb::Status s;
if(!enif_get_backup_engine(env, argv[0], &backup_engine_ptr))
return enif_make_badarg(env);
backup_engine_ptr->m_BackupEngine->GetBackupInfo(&backup_infos);
ERL_NIF_TERM info_list = enif_make_list(env, 0);
for (auto & backup_info : backup_infos) {
ERL_NIF_TERM backup_id = enif_make_uint(env, backup_info.backup_id);
ERL_NIF_TERM timestamp = enif_make_uint64(env, backup_info.timestamp);
ERL_NIF_TERM size = enif_make_uint64(env, backup_info.size);
ERL_NIF_TERM number_files = enif_make_uint(env, backup_info.backup_id);;
ERL_NIF_TERM info = enif_make_new_map(env);
enif_make_map_put(env, info, ATOM_BACKUP_INFO_ID, backup_id, &info);
enif_make_map_put(env, info, ATOM_BACKUP_INFO_TIMESTAMP, timestamp, &info);
enif_make_map_put(env, info, ATOM_BACKUP_INFO_SIZE, size, &info);
enif_make_map_put(env, info, ATOM_BACKUP_INFO_NUMBER_FILES, number_files, &info);
info_list = enif_make_list_cell(env, info, info_list);
}
return enif_make_tuple2(env, ATOM_OK, info_list);
}
ERL_NIF_TERM
VerifyBackup(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
ReferencePtr<BackupEngineObject> backup_engine_ptr;
rocksdb::BackupID backup_id;
rocksdb::Status s;
if(!enif_get_backup_engine(env, argv[0], &backup_engine_ptr))
return enif_make_badarg(env);
if(!enif_get_uint(env, argv[1], &backup_id))
return enif_make_badarg(env);
s = backup_engine_ptr->m_BackupEngine->VerifyBackup(backup_id);
if (s.ok()) {
return ATOM_OK;
}
return error_tuple(env, ATOM_ERROR, s);
}
ERL_NIF_TERM
StopBackup(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
ReferencePtr<BackupEngineObject> backup_engine_ptr;
if(!enif_get_backup_engine(env, argv[0], &backup_engine_ptr))
return enif_make_badarg(env);
backup_engine_ptr->m_BackupEngine->StopBackup();
return ATOM_OK;
}
ERL_NIF_TERM
DeleteBackup(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
ReferencePtr<BackupEngineObject> backup_engine_ptr;
rocksdb::BackupID backup_id;
rocksdb::Status s;
if(!enif_get_backup_engine(env, argv[0], &backup_engine_ptr))
return enif_make_badarg(env);
if(!enif_get_uint(env, argv[1], &backup_id))
return enif_make_badarg(env);
s = backup_engine_ptr->m_BackupEngine->DeleteBackup(backup_id);
if (s.ok()) {
return ATOM_OK;
}
return error_tuple(env, ATOM_ERROR, s);
}
ERL_NIF_TERM
PurgeOldBackup(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
ReferencePtr<BackupEngineObject> backup_engine_ptr;
uint32_t num_backups_to_keep;
rocksdb::Status s;
if(!enif_get_backup_engine(env, argv[0], &backup_engine_ptr))
return enif_make_badarg(env);
if(!enif_get_uint(env, argv[1], &num_backups_to_keep))
return enif_make_badarg(env);
s = backup_engine_ptr->m_BackupEngine->PurgeOldBackups(num_backups_to_keep);
if (s.ok()) {
return ATOM_OK;
}
return error_tuple(env, ATOM_ERROR, s);
}
ERL_NIF_TERM
RestoreDBFromBackup(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
ReferencePtr<BackupEngineObject> backup_engine_ptr;
rocksdb::BackupID backup_id;
rocksdb::Status s;
char db_dir[4096];
char wal_dir[4096];
if(!enif_get_backup_engine(env, argv[0], &backup_engine_ptr))
return enif_make_badarg(env);
if(!enif_get_uint(env, argv[1], &backup_id))
return enif_make_badarg(env);
if(!enif_get_string(env, argv[2], db_dir, sizeof(db_dir), ERL_NIF_LATIN1) || !enif_is_list(env, argv[2])) {
return enif_make_badarg(env);
}
if(argc == 4) {
if(!enif_get_string(env, argv[3], wal_dir, sizeof(wal_dir), ERL_NIF_LATIN1) || !enif_is_list(env, argv[3])) {
return enif_make_badarg(env);
}
} else {
strncpy(wal_dir, db_dir, sizeof(db_dir));
}
s = backup_engine_ptr->m_BackupEngine->RestoreDBFromBackup(backup_id, db_dir, wal_dir);
if (s.ok()) {
return ATOM_OK;
}
return error_tuple(env, ATOM_ERROR, s);
}
ERL_NIF_TERM
RestoreDBFromLatestBackup(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
ReferencePtr<BackupEngineObject> backup_engine_ptr;
rocksdb::Status s;
char db_dir[4096];
char wal_dir[4096];
if(!enif_get_backup_engine(env, argv[0], &backup_engine_ptr))
return enif_make_badarg(env);
if(!enif_get_string(env, argv[1], db_dir, sizeof(db_dir), ERL_NIF_LATIN1) || !enif_is_list(env, argv[1])) {
return enif_make_badarg(env);
}
if(argc == 3) {
if(!enif_get_string(env, argv[2], wal_dir, sizeof(wal_dir), ERL_NIF_LATIN1) || !enif_is_list(env, argv[2])) {
return enif_make_badarg(env);
}
} else {
strncpy(wal_dir, db_dir, sizeof(db_dir));
}
s = backup_engine_ptr->m_BackupEngine->RestoreDBFromLatestBackup(db_dir, wal_dir);
if (s.ok()) {
return ATOM_OK;
}
return error_tuple(env, ATOM_ERROR, s);
}
ERL_NIF_TERM
GarbageCollect(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
ReferencePtr<BackupEngineObject> backup_engine_ptr;
rocksdb::Status s;
if(!enif_get_backup_engine(env, argv[0], &backup_engine_ptr))
return enif_make_badarg(env);
s = backup_engine_ptr->m_BackupEngine->GarbageCollect();
if (s.ok()) {
return ATOM_OK;
}
return error_tuple(env, ATOM_ERROR, s);
}
ERL_NIF_TERM
CloseBackup(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
BackupEngineObject * backup_engine_ptr;
backup_engine_ptr = BackupEngineObject::RetrieveBackupEngineObject(env, argv[0]);
if (NULL==backup_engine_ptr)
return enif_make_badarg(env);
// set closing flag
ErlRefObject::InitiateCloseRequest(backup_engine_ptr);
backup_engine_ptr=NULL;
return ATOM_OK;
}
}