Skip to content

Commit 7d38398

Browse files
Implement Rust FFI function raw_execute_sql to execute SQLite
1 parent 67cba6d commit 7d38398

1 file changed

Lines changed: 45 additions & 11 deletions

File tree

src/back_end/src/core/sqlite.rs

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
use sqlite::Connection;
22
use std::ffi::{CStr, c_char};
33

4+
#[derive(PartialEq, Eq, Debug)]
45
#[repr(C)]
5-
pub enum InitDatabaseStatus {
6-
Ok,
7-
CreateDatabaseFailed,
8-
CStrConvertFailed,
9-
ExecuteSqlFailed,
6+
#[allow(non_camel_case_types)]
7+
pub enum QueryResult {
8+
OK,
9+
OPEN_DATABASE_ERR,
10+
C_STR_CONVERT_ERR,
11+
EXECUTE_SQL_ERR,
1012
}
1113

1214
const INIT_QUERY: &str = r"--sql
@@ -25,24 +27,56 @@ const INIT_QUERY: &str = r"--sql
2527
/// Careful with unsafe context & raw pointers.
2628
pub unsafe extern "C" fn raw_init_clipboard_cache(
2729
file_path: *const c_char,
28-
) -> InitDatabaseStatus {
30+
) -> QueryResult {
2931
unsafe {
30-
use InitDatabaseStatus as Status;
32+
use QueryResult as R;
3133

3234
let Ok(file_path_cstr) = CStr::from_ptr(file_path).to_str() else {
33-
return Status::CStrConvertFailed;
35+
return R::C_STR_CONVERT_ERR;
3436
};
3537

3638
let Ok(sql) = Connection::open(file_path_cstr) else {
37-
return Status::CreateDatabaseFailed;
39+
return R::OPEN_DATABASE_ERR;
3840
};
3941

4042
let is_err = sql.execute(INIT_QUERY).is_err();
4143

4244
if is_err {
43-
return Status::ExecuteSqlFailed;
45+
return R::EXECUTE_SQL_ERR;
4446
}
4547

46-
Status::Ok
48+
R::OK
49+
}
50+
}
51+
52+
/// # Safety
53+
/// Careful with raw pointers & memory leaks.
54+
#[must_use]
55+
#[unsafe(no_mangle)]
56+
pub unsafe extern "C" fn raw_execute_sql(
57+
db_path: *const c_char,
58+
query: *const c_char,
59+
) -> QueryResult {
60+
use QueryResult as R;
61+
unsafe {
62+
let Ok(file_path_cstr) = CStr::from_ptr(db_path).to_str() else {
63+
return R::C_STR_CONVERT_ERR;
64+
};
65+
66+
let Ok(sql) = Connection::open(file_path_cstr) else {
67+
return R::OPEN_DATABASE_ERR;
68+
};
69+
70+
let Ok(query_str) = CStr::from_ptr(query).to_str() else {
71+
return R::C_STR_CONVERT_ERR;
72+
};
73+
74+
let is_err = sql.execute(query_str).is_err();
75+
76+
if is_err {
77+
return R::EXECUTE_SQL_ERR;
78+
}
79+
80+
R::OK
4781
}
4882
}

0 commit comments

Comments
 (0)