fork of https://github.com/rust-rocksdb/rust-rocksdb for nextgraph
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.8 KiB
101 lines
2.8 KiB
8 years ago
|
// Copyright 2016 Alex Regueiro
|
||
|
//
|
||
|
// Licensed 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.
|
||
|
//
|
||
|
|
||
|
use std::ffi::CString;
|
||
|
use std::path::{Path};
|
||
|
|
||
|
use libc::{uint32_t};
|
||
|
|
||
|
use {DB, Error};
|
||
|
use ffi;
|
||
|
|
||
|
pub struct BackupEngine {
|
||
|
inner: *mut ffi::rocksdb_backup_engine_t,
|
||
|
}
|
||
|
|
||
|
pub struct BackupEngineOptions {
|
||
|
inner: *mut ffi::rocksdb_options_t,
|
||
|
}
|
||
|
|
||
|
impl BackupEngine {
|
||
|
/// Open a backup engine with the specified options.
|
||
|
pub fn open<P: AsRef<Path>>(opts: &BackupEngineOptions, path: P) -> Result<BackupEngine, Error> {
|
||
|
let path = path.as_ref();
|
||
|
let cpath = match CString::new(path.to_string_lossy().as_bytes()) {
|
||
|
Ok(c) => c,
|
||
|
Err(_) => {
|
||
|
return Err(Error::new("Failed to convert path to CString \
|
||
|
when opening backup engine"
|
||
|
.to_owned()))
|
||
|
}
|
||
|
};
|
||
|
|
||
|
let be: *mut ffi::rocksdb_backup_engine_t;
|
||
|
unsafe {
|
||
|
be = ffi_try!(ffi::rocksdb_backup_engine_open(opts.inner, cpath.as_ptr()))
|
||
|
}
|
||
|
|
||
|
if be.is_null() {
|
||
|
return Err(Error::new("Could not initialize backup engine.".to_owned()));
|
||
|
}
|
||
|
|
||
|
Ok(BackupEngine {
|
||
|
inner: be,
|
||
|
})
|
||
|
}
|
||
|
|
||
|
fn create_new_backup(&mut self, db: &DB) -> Result<(), Error> {
|
||
|
unsafe {
|
||
|
ffi_try!(ffi::rocksdb_backup_engine_create_new_backup(self.inner, db.inner));
|
||
|
Ok(())
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn purge_old_backups(&mut self, num_backups_to_keep: usize) -> Result<(), Error> {
|
||
|
unsafe {
|
||
|
ffi_try!(ffi::rocksdb_backup_engine_purge_old_backups(self.inner, num_backups_to_keep as uint32_t));
|
||
|
Ok(())
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl Default for BackupEngineOptions {
|
||
|
fn default() -> BackupEngineOptions {
|
||
|
unsafe {
|
||
|
let opts = ffi::rocksdb_options_create();
|
||
|
if opts.is_null() {
|
||
|
panic!("Could not create backup options".to_owned());
|
||
|
}
|
||
|
BackupEngineOptions { inner: opts }
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl Drop for BackupEngine {
|
||
|
fn drop(&mut self) {
|
||
|
unsafe {
|
||
|
ffi::rocksdb_backup_engine_close(self.inner);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl Drop for BackupEngineOptions {
|
||
|
fn drop(&mut self) {
|
||
|
unsafe {
|
||
|
ffi::rocksdb_options_destroy(self.inner);
|
||
|
}
|
||
|
}
|
||
|
}
|