sqlite-functions 0.1.1

A small toolkit for authoring Rust functions for SQLite
Documentation
#![doc = include_str!("../README.md")]
#![cfg_attr(not(feature = "loadable-extension"), forbid(unsafe_code))]

//! The crate's public API is intentionally small: describe a function with
//! [`FunctionOptions`], register it, and reuse the same registration function
//! from Rust or a loadable extension.

mod options;
mod register;

#[cfg(feature = "loadable-extension")]
#[doc(hidden)]
pub mod __private;

pub use options::{Arity, FunctionOptions};
pub use register::{register_aggregate, register_scalar};

/// Re-exported so extension crates use the exact `rusqlite` version expected by
/// this crate.
pub use rusqlite;

/// Generate SQLite's conventional loadable-extension entry point.
///
/// The supplied function must have the signature
/// `fn(&sqlite_functions::rusqlite::Connection) -> sqlite_functions::rusqlite::Result<()>`.
///
/// This macro is available only when the `loadable-extension` feature is
/// enabled. Invoke it once in a `cdylib` crate.
#[cfg(feature = "loadable-extension")]
#[macro_export]
macro_rules! export_extension {
    ($register:path) => {
        #[doc = "SQLite loadable-extension entry point."]
        ///
        /// # Safety
        ///
        /// This function must only be called by SQLite with pointers supplied
        /// to an extension entry point.
        #[unsafe(no_mangle)]
        pub unsafe extern "C" fn sqlite3_extension_init(
            db: *mut $crate::rusqlite::ffi::sqlite3,
            error_message: *mut *mut ::std::os::raw::c_char,
            api: *mut $crate::rusqlite::ffi::sqlite3_api_routines,
        ) -> ::std::os::raw::c_int {
            fn register(
                connection: $crate::rusqlite::Connection,
            ) -> $crate::rusqlite::Result<bool> {
                $register(&connection)?;
                Ok(false)
            }

            // SAFETY: SQLite owns these pointers and invokes this exported
            // entry point according to its loadable-extension ABI.
            unsafe { $crate::__private::initialize(db, error_message, api, register) }
        }
    };
}