From e726a411b6c4a14bc6ffd4e977ed18f84bb7d096 Mon Sep 17 00:00:00 2001 From: Anton Titovets Date: Sun, 9 Feb 2025 21:54:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D1=8B=20Postgres?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/addins/postgre/src/component/methods.rs | 81 +++++++++++++++++++-- 1 file changed, 74 insertions(+), 7 deletions(-) diff --git a/src/addins/postgre/src/component/methods.rs b/src/addins/postgre/src/component/methods.rs index 9cecb54780..841e7809b9 100644 --- a/src/addins/postgre/src/component/methods.rs +++ b/src/addins/postgre/src/component/methods.rs @@ -5,6 +5,7 @@ use crate::component::AddIn; use std::collections::HashMap; use std::net::IpAddr; use std::time::{SystemTime, UNIX_EPOCH}; +use serde_json::Serializer; pub fn execute_query( add_in: &mut AddIn, @@ -159,22 +160,88 @@ fn process_params(params: &Vec) -> Result>, Str Ok(result) } -fn rows_to_json(rows: Vec) -> String{ +fn rows_to_json(rows: Vec) -> String { + let mut result = Vec::new(); for row in rows { - for coloumn in row.columns() { + let mut row_map = Map::new(); - let ctype = coloumn.type_().name().to_string(); - let cname = coloumn.name(); + for column in row.columns() { + let column_name = column.name(); // Получаем &str вместо String + let column_type = column.type_().name(); - let val = match ctype.as_str() { - _ => Value::String("".to_string()) + let value = match column_type { + "bool" | "BOOL" => { + let val: bool = row.get(column_name); + Value::Bool(val) + } + "\"char\"" => { + let val: i8 = row.get(column_name); + Value::Number(val.into()) + } + "int2" | "SMALLINT" | "SMALLSERIAL" => { + let val: i16 = row.get(column_name); + Value::Number(val.into()) + } + "int4" | "INT" | "SERIAL" => { + let val: i32 = row.get(column_name); + Value::Number(val.into()) + } + "oid" | "OID" => { + let val: u32 = row.get(column_name); + Value::Number(val.into()) + } + "int8" | "BIGINT" | "BIGSERIAL" => { + let val: i64 = row.get(column_name); + Value::Number(val.into()) + } + "float4" | "REAL" => { + let val: f32 = row.get(column_name); + Value::Number(serde_json::Number::from_f64(val as f64).unwrap_or_else(|| serde_json::Number::from(0))) + } + "float8" | "DOUBLE PRECISION" => { + let val: f64 = row.get(column_name); + Value::Number(serde_json::Number::from_f64(val).unwrap_or_else(|| serde_json::Number::from(0))) + } + "varchar" | "text" | "char" | "citext" | "name" | "unknown" | "VARCHAR" | "CHAR(n)" | "TEXT" | "CITEXT" | "NAME" | "UNKNOWN" => { + let val: String = row.get(column_name); + Value::String(val) + } + "ltree" | "lquery" | "ltxtquery" | "LTREE" | "LQUERY" | "LTXTQUERY" => { + let val: String = row.get(column_name); + Value::String(val) + } + "bytea" | "BYTEA" => { + let val: Vec = row.get(column_name); + Value::String(general_purpose::STANDARD.encode(val)) + } + "hstore" | "HSTORE" => { + let val: HashMap> = row.get(column_name); + let mut map = Map::new(); + for (k, v) in val { + map.insert(k, v.map(Value::String).unwrap_or(Value::Null)); + } + Value::Object(map) + } + "timestamp" | "timestamptz" | "TIMESTAMP" | "TIMESTAMP WITH TIME ZONE" => { + let val: SystemTime = row.get(column_name); + let duration = val.duration_since(SystemTime::UNIX_EPOCH).unwrap(); + Value::Number(duration.as_secs().into()) + } + "inet" | "INET" => { + let val: IpAddr = row.get(column_name); + Value::String(val.to_string()) + } + _ => Value::Null, // Неизвестный тип }; + row_map.insert(column_name.to_string(), value); // Вставляем в Map с ключом String } + + result.push(Value::Object(row_map)); } - "".to_string() + json!(result).to_string() } fn format_json_error(error: &str) -> String {