@@ -5,7 +5,7 @@ use syn::{parse_macro_input, spanned::Spanned, Item};
55use proc_macro:: TokenStream ;
66use quote:: quote_spanned;
77
8- /// Wraps an entrypoint function to expose an unsafe extern "C" function of the same name.
8+ /// Wraps an entrypoint function to expose an unsafe extern "C" function of the same name.
99#[ proc_macro_attribute]
1010pub fn sqlite_entrypoint ( _attr : TokenStream , item : TokenStream ) -> TokenStream {
1111 let ast = parse_macro_input ! ( item as syn:: Item ) ;
@@ -26,7 +26,7 @@ pub fn sqlite_entrypoint(_attr: TokenStream, item: TokenStream) -> TokenStream {
2626
2727 /// # Safety
2828 ///
29- /// Should only be called by underlying SQLite C APIs,
29+ /// Should only be called by underlying SQLite C APIs,
3030 /// like sqlite3_auto_extension and sqlite3_cancel_auto_extension.
3131 #[ no_mangle]
3232 pub unsafe extern "C" fn #c_entrypoint(
@@ -44,3 +44,43 @@ pub fn sqlite_entrypoint(_attr: TokenStream, item: TokenStream) -> TokenStream {
4444 _ => panic ! ( "Only function items are allowed on sqlite_entrypoint" ) ,
4545 }
4646}
47+
48+ /// Wraps an entrypoint function to expose an unsafe extern "C" function of the same name.
49+ #[ proc_macro_attribute]
50+ pub fn sqlite_entrypoint_permanent ( _attr : TokenStream , item : TokenStream ) -> TokenStream {
51+ let ast = parse_macro_input ! ( item as syn:: Item ) ;
52+ match ast {
53+ Item :: Fn ( mut func) => {
54+ let c_entrypoint = func. sig . ident . clone ( ) ;
55+
56+ let original_funcname = func. sig . ident . to_string ( ) ;
57+ func. sig . ident = Ident :: new (
58+ format ! ( "_{}" , original_funcname) . as_str ( ) ,
59+ func. sig . ident . span ( ) ,
60+ ) ;
61+
62+ let prefixed_original_function = func. sig . ident . clone ( ) ;
63+
64+ quote_spanned ! { func. span( ) =>
65+ #func
66+
67+ /// # Safety
68+ ///
69+ /// Should only be called by underlying SQLite C APIs,
70+ /// like sqlite3_auto_extension and sqlite3_cancel_auto_extension.
71+ #[ no_mangle]
72+ pub unsafe extern "C" fn #c_entrypoint(
73+ db: * mut sqlite3,
74+ pz_err_msg: * mut * mut c_char,
75+ p_api: * mut sqlite3_api_routines,
76+ ) -> c_uint {
77+ register_entrypoint_load_permanently( db, pz_err_msg, p_api, #prefixed_original_function)
78+ }
79+
80+
81+ }
82+ . into ( )
83+ }
84+ _ => panic ! ( "Only function items are allowed on sqlite_entrypoint" ) ,
85+ }
86+ }
0 commit comments