You've already forked OpenIntegrations
mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2025-08-10 22:41:43 +02:00
PG: Исключение unwind
This commit is contained in:
@@ -4,8 +4,6 @@ use base64::{engine::general_purpose, Engine as _};
|
||||
use crate::component::AddIn;
|
||||
use std::collections::HashMap;
|
||||
use std::net::IpAddr;
|
||||
use std::panic;
|
||||
use std::panic::AssertUnwindSafe;
|
||||
use chrono::{NaiveDate, NaiveTime, FixedOffset, NaiveDateTime, DateTime};
|
||||
use uuid::Uuid;
|
||||
use dateparser::parse;
|
||||
@@ -16,58 +14,43 @@ pub fn execute_query(
|
||||
params_json: String,
|
||||
force_result: bool,
|
||||
) -> String {
|
||||
let result = panic::catch_unwind(AssertUnwindSafe(|| {
|
||||
|
||||
let client_arc = match add_in.get_connection() {
|
||||
Some(c) => c,
|
||||
None => return format_json_error("No connection initialized"),
|
||||
};
|
||||
let client_arc = match add_in.get_connection() {
|
||||
Some(c) => c,
|
||||
None => return format_json_error("No connection initialized"),
|
||||
};
|
||||
|
||||
let mut client = match client_arc.lock() {
|
||||
Ok(c) => c,
|
||||
Err(_) => return format_json_error("Cannot acquire client lock"),
|
||||
};
|
||||
let mut client = match client_arc.lock(){
|
||||
Ok(c) => c,
|
||||
Err(_) => return format_json_error("Cannot acquire client lock"),
|
||||
};
|
||||
|
||||
let params: Vec<Value> = match serde_json::from_str(¶ms_json) {
|
||||
Ok(params) => params,
|
||||
Err(e) => return format_json_error(&e.to_string()),
|
||||
};
|
||||
// Парсинг JSON параметров
|
||||
let params: Vec<Value> = match serde_json::from_str(¶ms_json) {
|
||||
Ok(params) => params,
|
||||
Err(e) => return format_json_error(&e.to_string()),
|
||||
};
|
||||
|
||||
let params_ref = match process_params(¶ms) {
|
||||
Ok(params) => params,
|
||||
Err(e) => return format_json_error(&e.to_string()),
|
||||
};
|
||||
let params_ref = match process_params(¶ms){
|
||||
Ok(params) => params,
|
||||
Err(e) => return format_json_error(&e.to_string()),
|
||||
};
|
||||
|
||||
let params_unboxed: Vec<_> = params_ref.iter().map(AsRef::as_ref).collect();
|
||||
let params_unboxed: Vec<_> = params_ref.iter().map(AsRef::as_ref).collect();
|
||||
|
||||
if query.trim_start().to_uppercase().starts_with("SELECT") || force_result {
|
||||
match client.query(&query, ¶ms_unboxed) {
|
||||
Ok(rows) => rows_to_json(rows),
|
||||
Err(e) => format_json_error(&e.to_string()),
|
||||
}
|
||||
} else {
|
||||
match client.execute(&query, ¶ms_unboxed.as_slice()) {
|
||||
Ok(_) => json!({"result": true}).to_string(),
|
||||
Err(e) => format_json_error(&e.to_string()),
|
||||
if query.trim_start().to_uppercase().starts_with("SELECT") || force_result {
|
||||
match client.query(&query, ¶ms_unboxed) {
|
||||
Ok(rows) => {
|
||||
rows_to_json(rows)
|
||||
}
|
||||
Err(e) => format_json_error(&e.to_string()),
|
||||
}
|
||||
}));
|
||||
|
||||
result.unwrap_or_else(|payload| {
|
||||
let message = match payload.downcast_ref::<&str>() {
|
||||
Some(s) => *s,
|
||||
None => match payload.downcast_ref::<String>() {
|
||||
Some(s) => &s[..],
|
||||
None => "Unknown panic (non-string payload)",
|
||||
},
|
||||
};
|
||||
|
||||
let backtrace = std::backtrace::Backtrace::capture();
|
||||
|
||||
let panic_info = format!("Panic: {}\nBacktrace:\n{}", message, backtrace);
|
||||
|
||||
format_json_error(&panic_info)
|
||||
})
|
||||
} else {
|
||||
match client.execute(&query, ¶ms_unboxed.as_slice()) {
|
||||
Ok(_) => json!({"result": true}).to_string(),
|
||||
Err(e) => format_json_error(&e.to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Конвертирует JSON-параметры в Postgres-совместимые типы
|
||||
@@ -364,4 +347,4 @@ fn parse_date_tz(input: &str) -> Result<DateTime<FixedOffset>, String> {
|
||||
.map(|dt| dt.fixed_offset())
|
||||
.map_err(|e| format!("Failed to parse date: {}", e))
|
||||
})
|
||||
}
|
||||
}
|
@@ -16,13 +16,12 @@ pub const METHODS: &[&[u16]] = &[
|
||||
name!("Connect"),
|
||||
name!("Close"),
|
||||
name!("Execute"),
|
||||
name!("SetTLS"),
|
||||
name!("SetTLS")
|
||||
|
||||
];
|
||||
|
||||
// Число параметров функций компоненты
|
||||
pub fn get_params_amount(num: usize) -> usize {
|
||||
|
||||
match num {
|
||||
0 => 0,
|
||||
1 => 0,
|
||||
|
Reference in New Issue
Block a user