spatialite_rs/
lib.rs

1use sqlite::*;
2use std::path::Path;
3
4pub fn open<T: AsRef<Path>>(path: T) -> Result<Connection> {
5    let connection = sqlite::Connection::open(path)?;
6    load_spatialite_extension(&connection);
7    Ok(connection)
8}
9
10pub fn open_with_flags<T: AsRef<Path>>(path: T, flags: OpenFlags) -> Result<Connection> {
11    let connection = sqlite::Connection::open_with_flags(&path, flags)?;
12    load_spatialite_extension(&connection);
13    Ok(connection)
14}
15
16fn load_spatialite_extension(conn: &Connection) {
17    load_custom_extension(conn, "mod_spatialite.so");
18}
19
20pub fn load_custom_extension(conn: &Connection, module: &str) {
21    unsafe {
22        sqlite3_sys::sqlite3_enable_load_extension(conn.as_raw(), 1);
23    }
24    conn.execute(format!("SELECT load_extension('{}');", module))
25        .unwrap();
26    unsafe {
27        sqlite3_sys::sqlite3_enable_load_extension(conn.as_raw(), 0);
28    }
29}
30
31pub fn load_custom_extension_ep(conn: &Connection, module: &str, entry_point: &str ) {
32    unsafe {
33        sqlite3_sys::sqlite3_enable_load_extension(conn.as_raw(), 1);
34    }
35    conn.execute(format!("SELECT load_extension('{}', '{}');", module, entry_point))
36        .unwrap();
37    unsafe {
38        sqlite3_sys::sqlite3_enable_load_extension(conn.as_raw(), 0);
39    }
40}
41
42#[test]
43fn test_open() -> anyhow::Result<()> {
44    {
45        open("spatialite_rs_test.db")?;
46    }
47
48    open_with_flags("spatialite_rs_test.db", OpenFlags::new().set_read_only())?;
49    std::fs::remove_file("spatialite_rs_test.db")?;
50    Ok(())
51}