From d7b597037f4769bb8a984e35729641d5cf11249d Mon Sep 17 00:00:00 2001 From: Anton Titovets Date: Tue, 20 May 2025 16:02:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=81=D0=B1=D0=BE?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20SQLite=20=D0=B4=D0=BB=D1=8F=20=D0=BC=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=D0=BF=D0=BE=D1=82=D0=BE=D1=87=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/addins/sqlite/dependencies.log | 12 ++++---- src/addins/sqlite/src/component/methods.rs | 34 +++++++++++++--------- src/addins/sqlite/src/component/mod.rs | 29 +++++++++++++----- 3 files changed, 47 insertions(+), 28 deletions(-) diff --git a/src/addins/sqlite/dependencies.log b/src/addins/sqlite/dependencies.log index 0a883c4adfd..f0b73dbda4c 100644 --- a/src/addins/sqlite/dependencies.log +++ b/src/addins/sqlite/dependencies.log @@ -1,10 +1,10 @@ "MAIN ---" - linux-vdso.so.1 (0x00007ffcd9bf6000) - libm.so.6 => /lib64/libm.so.6 (0x00007f92c5ace000) - libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f92c58ae000) - libc.so.6 => /lib64/libc.so.6 (0x00007f92c54d7000) - libdl.so.2 => /lib64/libdl.so.2 (0x00007f92c52d3000) - /lib64/ld-linux-x86-64.so.2 (0x00007f92c5e50000) + linux-vdso.so.1 (0x00007fff2f736000) + libm.so.6 => /lib64/libm.so.6 (0x00007febb79bc000) + libpthread.so.0 => /lib64/libpthread.so.0 (0x00007febb779c000) + libc.so.6 => /lib64/libc.so.6 (0x00007febb73c5000) + libdl.so.2 => /lib64/libdl.so.2 (0x00007febb71c1000) + /lib64/ld-linux-x86-64.so.2 (0x00007febb7d3e000) GLIBC_2.2.5 GLIBC_2.3 GLIBC_2.3.4 diff --git a/src/addins/sqlite/src/component/methods.rs b/src/addins/sqlite/src/component/methods.rs index 1d80da15a1a..c8753be43d2 100644 --- a/src/addins/sqlite/src/component/methods.rs +++ b/src/addins/sqlite/src/component/methods.rs @@ -12,11 +12,16 @@ pub fn execute_query( force_result: bool ) -> String { - let conn = match client.get_connection() { + let conn_arc = match client.get_connection() { Some(c) => c, None => return format_json_error("No connection initialized"), }; + let conn = match conn_arc.lock() { + Ok(conn) => conn, + Err(_) => return format_json_error("Failed to acquire connection lock"), + }; + // Парсинг JSON параметров let mut parsed_params: Value = match serde_json::from_str(¶ms_json) { Ok(params) => params, @@ -62,31 +67,32 @@ pub fn execute_query( } pub fn load_extension(client: &mut component::AddIn, path: String, point: String) -> String { - - let conn = match client.get_connection() { + let conn_arc = match client.get_connection() { Some(c) => c, None => return format_json_error("No connection initialized"), }; + let conn = match conn_arc.lock() { + Ok(conn) => conn, + Err(_) => return format_json_error("Failed to acquire connection lock"), + }; + let entry_point = match point.is_empty() { true => None, false => Some(point.as_str()) }; unsafe { + // Здесь мы берем ссылку на Connection из MutexGuard + let _guard = match LoadExtensionGuard::new(&*conn) { + Ok(g) => g, + Err(e) => return format_json_error(e), + }; - let guard = LoadExtensionGuard::new(conn); - - match guard { - Err(e) => format_json_error(e), - Ok(_) => { - match conn.load_extension(path, entry_point){ - Ok(_) => r#"{"result": true}"#.to_string(), - Err(e) => format_json_error(e) - } - } + match conn.load_extension(path, entry_point) { + Ok(_) => r#"{"result": true}"#.to_string(), + Err(e) => format_json_error(e) } - } } diff --git a/src/addins/sqlite/src/component/mod.rs b/src/addins/sqlite/src/component/mod.rs index 2ce8251d6f5..bab2abdef88 100644 --- a/src/addins/sqlite/src/component/mod.rs +++ b/src/addins/sqlite/src/component/mod.rs @@ -1,6 +1,7 @@ mod methods; use addin1c::{name, Variant}; +use std::sync::{Mutex, Arc}; use crate::core::getset; use rusqlite::{Connection, OpenFlags}; use serde_json::json; @@ -66,7 +67,7 @@ pub const PROPS: &[&[u16]] = &[ pub struct AddIn { connection_string: String, - connection: Option, + connection: Option>>, } impl AddIn { @@ -91,7 +92,7 @@ impl AddIn { match conn_result { Ok(conn) => { - self.connection = Some(conn); + self.connection = Some(Arc::new(Mutex::new(conn))); r#"{"result": true}"#.to_string() } Err(e) => { @@ -116,17 +117,29 @@ impl AddIn { } } - pub fn get_connection(&self) -> Option<&Connection> { - self.connection.as_ref() + pub fn get_connection(&self) -> Option>> { + self.connection.clone() } pub fn close_connection(&mut self) -> String { if let Some(conn) = self.connection.take() { - match conn.close() { - Ok(_) => json!({"result": true}).to_string(), - Err((_conn, err)) => json!({ + match Arc::try_unwrap(conn) { + Ok(conn_mutex) => match conn_mutex.into_inner() { + Ok(conn) => match conn.close() { + Ok(_) => json!({"result": true}).to_string(), + Err((_conn, err)) => json!({ + "result": false, + "error": err.to_string() + }).to_string(), + }, + Err(_) => json!({ + "result": false, + "error": "Failed to acquire connection lock" + }).to_string(), + }, + Err(_) => json!({ "result": false, - "error": err.to_string() + "error": "Connection is still in use by other threads" }).to_string(), } } else {