Учитывая явный размер и сложность структуры БД, кажется, нет «чистого» способа разоблачить все это до ржавчины. Инструмент, похожий на C2HS для создания FFI из заголовков C, будет приятным, но, увы, у нас его нет.
Обратите внимание, что Rust FFI в настоящее время не может звонить в библиотеки C++, поэтому вам придется использовать API C.
Я вообще не знаком с API БД, но для создания небольшой библиотеки поддержки в C фактически создается экземпляр структуры БД, а затем выставляются публичные элементы struct __db
через getter и setter функции.
Ваша реализация может выглядеть примерно так:
[#link_args = "-lrust_dbhelper"]
extern {
fn create_DB() -> *c_void;
fn free_DB(db: *c_void);
}
struct DB {
priv db: *c_void
}
impl Drop for DB {
fn drop(&self) {
free_DB(self.db);
}
}
priv struct DBAppMembers {
pgsize: u32,
priority: DBCachePriority
// Additional members omitted for brevity
}
impl DB {
pub fn new() -> DB {
DB {
db: create_DB()
}
}
pub fn set_pgsize(&mut self, u32 pgsize) {
unsafe {
let x: *mut DBAppMembers = ::std::ptr::transmute(self.db);
x.pgsize = pgsize;
}
}
// Additional methods omitted for brevity
}
Вы можете спасти себя от некоторой дополнительной работы по специально вызова функций C с DB.db
элемента в качестве параметра, но это требует работы в небезопасных условиях, которые следует, по возможности, избегать. В противном случае каждая функция, экспортированная libdb
, должна иметь свою собственную оболочку в вашем родном struct DB
.
Обратите внимание, что существует [rust-bindgen] (https://github.com/crabtw/rust-bindgen), который удаляет много (но не все) ножки в привязке к C libs. – huon