diff --git a/src/engine/config.rs b/src/engine/config.rs index f319a422..7675c31c 100644 --- a/src/engine/config.rs +++ b/src/engine/config.rs @@ -110,7 +110,7 @@ fn from_chars_to_cstring(p: *mut ::libc::c_char) -> CString { } fn from_chars_to_string(p: *mut ::libc::c_char) -> String { - from_chars_to_cstring(p).into_string().unwrap() + from_chars_to_cstring(p).into_string().unwrap() } diff --git a/src/engine/util.rs b/src/engine/util.rs index 0c93de00..83cd22de 100644 --- a/src/engine/util.rs +++ b/src/engine/util.rs @@ -1,14 +1,19 @@ +use std::path::Path; +use std::mem; +use libc::c_void; use super::UnQlite; -use ffi::{unqlite_util_random_num, unqlite_util_random_string}; +use ffi::{unqlite_util_load_mmaped_file, unqlite_util_random_num, unqlite_util_random_string, + unqlite_util_release_mmaped_file}; -impl <'util> UnQlite { +impl<'util> UnQlite { /// Generate random string using the UnQLite PRNG. /// /// It will generate a english alphabet based string of length buf_size (last argument). - fn random_string(&self, buf_size: u32) -> Vec { + pub fn random_string(&self, buf_size: u32) -> Vec { unsafe { let mut vec: Vec = Vec::with_capacity(buf_size as usize); - error_or!(unqlite_util_random_string(self.db, vec.as_mut_ptr() as *mut i8, buf_size)).unwrap(); + error_or!(unqlite_util_random_string(self.db, vec.as_mut_ptr() as *mut i8, buf_size)) + .unwrap(); vec } } @@ -16,9 +21,41 @@ impl <'util> UnQlite { /// Generate random number using the UnQLite PRNG. /// /// It will return a 32-bit unsigned integer between 0 and 0xFFFFFFFF. - fn random_num(&self) -> u32 { + pub fn random_num(&self) -> u32 { + unsafe { unqlite_util_random_num(self.db) } + } + + /// Memory-mapped file + pub fn load_mmaped_file>(path: P) -> ::Result { + unsafe { + let path = path.as_ref(); + let mut ptr: *mut c_void = mem::uninitialized(); + let mut size: i64 = mem::uninitialized(); + error_or!(unqlite_util_load_mmaped_file(path.as_os_str() + .to_cstring() + .unwrap() + .as_ptr(), + &mut ptr, + &mut size)) + .map(|_| { + Mmap { + ptr: ptr, + size: size, + } + }) + } + } +} + +pub struct Mmap { + pub ptr: *mut c_void, + pub size: i64, +} + +impl Drop for Mmap { + fn drop(&mut self) { unsafe { - unqlite_util_random_num(self.db) + error_or!(unqlite_util_release_mmaped_file(self.ptr, self.size)).unwrap(); } } } diff --git a/src/lib.rs b/src/lib.rs index 9e220548..a81f4e1f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,5 @@ +#![feature(convert)] + extern crate unqlite_sys as ffi; extern crate libc;