summaryrefslogtreecommitdiffstats
path: root/third_party/rust/rusqlite/src/load_extension_guard.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/rusqlite/src/load_extension_guard.rs')
-rw-r--r--third_party/rust/rusqlite/src/load_extension_guard.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/third_party/rust/rusqlite/src/load_extension_guard.rs b/third_party/rust/rusqlite/src/load_extension_guard.rs
new file mode 100644
index 0000000000..deed3b4bdd
--- /dev/null
+++ b/third_party/rust/rusqlite/src/load_extension_guard.rs
@@ -0,0 +1,46 @@
+use crate::{Connection, Result};
+
+/// RAII guard temporarily enabling SQLite extensions to be loaded.
+///
+/// ## Example
+///
+/// ```rust,no_run
+/// # use rusqlite::{Connection, Result, LoadExtensionGuard};
+/// # use std::path::{Path};
+/// fn load_my_extension(conn: &Connection) -> Result<()> {
+/// unsafe {
+/// let _guard = LoadExtensionGuard::new(conn)?;
+/// conn.load_extension("trusted/sqlite/extension", None)
+/// }
+/// }
+/// ```
+#[cfg_attr(docsrs, doc(cfg(feature = "load_extension")))]
+pub struct LoadExtensionGuard<'conn> {
+ conn: &'conn Connection,
+}
+
+impl LoadExtensionGuard<'_> {
+ /// Attempt to enable loading extensions. Loading extensions will be
+ /// disabled when this guard goes out of scope. Cannot be meaningfully
+ /// nested.
+ ///
+ /// # Safety
+ ///
+ /// You must not run untrusted queries while extension loading is enabled.
+ ///
+ /// See the safety comment on [`Connection::load_extension_enable`] for more
+ /// details.
+ #[inline]
+ pub unsafe fn new(conn: &Connection) -> Result<LoadExtensionGuard<'_>> {
+ conn.load_extension_enable()
+ .map(|_| LoadExtensionGuard { conn })
+ }
+}
+
+#[allow(unused_must_use)]
+impl Drop for LoadExtensionGuard<'_> {
+ #[inline]
+ fn drop(&mut self) {
+ self.conn.load_extension_disable();
+ }
+}