1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-08-10 22:41:43 +02:00

PG: Исключение unwind

This commit is contained in:
Anton Titovets
2025-08-06 18:53:07 +03:00
parent 4991d4e83e
commit 57b42fecff
2 changed files with 31 additions and 49 deletions

View File

@@ -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,24 +14,24 @@ 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 mut client = match client_arc.lock() {
let mut client = match client_arc.lock(){
Ok(c) => c,
Err(_) => return format_json_error("Cannot acquire client lock"),
};
// Парсинг JSON параметров
let params: Vec<Value> = match serde_json::from_str(&params_json) {
Ok(params) => params,
Err(e) => return format_json_error(&e.to_string()),
};
let params_ref = match process_params(&params) {
let params_ref = match process_params(&params){
Ok(params) => params,
Err(e) => return format_json_error(&e.to_string()),
};
@@ -42,7 +40,9 @@ pub fn execute_query(
if query.trim_start().to_uppercase().starts_with("SELECT") || force_result {
match client.query(&query, &params_unboxed) {
Ok(rows) => rows_to_json(rows),
Ok(rows) => {
rows_to_json(rows)
}
Err(e) => format_json_error(&e.to_string()),
}
} else {
@@ -51,23 +51,6 @@ pub fn execute_query(
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)
})
}
/// Конвертирует JSON-параметры в Postgres-совместимые типы

View File

@@ -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,