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}