11use sqlite:: Connection ;
22use 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
1214const INIT_QUERY : & str = r"--sql
@@ -25,24 +27,56 @@ const INIT_QUERY: &str = r"--sql
2527/// Careful with unsafe context & raw pointers.
2628pub 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