rusqlite/
load_extension_guard.rs

1use crate::{Connection, Result};
2
3/// RAII guard temporarily enabling SQLite extensions to be loaded.
4///
5/// ## Example
6///
7/// ```rust,no_run
8/// # use rusqlite::{Connection, Result, LoadExtensionGuard};
9/// # use std::path::{Path};
10/// fn load_my_extension(conn: &Connection) -> Result<()> {
11///     unsafe {
12///         let _guard = LoadExtensionGuard::new(conn)?;
13///         conn.load_extension("trusted/sqlite/extension", None)
14///     }
15/// }
16/// ```
17#[cfg_attr(docsrs, doc(cfg(feature = "load_extension")))]
18pub struct LoadExtensionGuard<'conn> {
19    conn: &'conn Connection,
20}
21
22impl LoadExtensionGuard<'_> {
23    /// Attempt to enable loading extensions. Loading extensions will be
24    /// disabled when this guard goes out of scope. Cannot be meaningfully
25    /// nested.
26    ///
27    /// # Safety
28    ///
29    /// You must not run untrusted queries while extension loading is enabled.
30    ///
31    /// See the safety comment on [`Connection::load_extension_enable`] for more
32    /// details.
33    #[inline]
34    pub unsafe fn new(conn: &Connection) -> Result<LoadExtensionGuard<'_>> {
35        conn.load_extension_enable()
36            .map(|_| LoadExtensionGuard { conn })
37    }
38}
39
40#[allow(unused_must_use)]
41impl Drop for LoadExtensionGuard<'_> {
42    #[inline]
43    fn drop(&mut self) {
44        self.conn.load_extension_disable();
45    }
46}