diff --git a/tcp_client/config.toml b/tcp_client/config.toml index 021f5eb..e7fad58 100644 --- a/tcp_client/config.toml +++ b/tcp_client/config.toml @@ -22,3 +22,15 @@ name = "hy_instrument" query = "SELECT * FROM \"hy_instrument\"" incremental = false key_field = "UpdateTime" + +[[tables]] +name = "hy_information" +query = "SELECT * FROM \"hy_information\"" +incremental = false +key_field = "UpdateTime" + +[[tables]] +name = "hy_record" +query = "SELECT * FROM \"hy_record\"" +incremental = false # 是否增量同步 +key_field = "UpdateTime" # 增量同步的时间字段 \ No newline at end of file diff --git a/tcp_server/Cargo.lock b/tcp_server/Cargo.lock index 94d6949..8ea83b5 100644 --- a/tcp_server/Cargo.lock +++ b/tcp_server/Cargo.lock @@ -28,6 +28,21 @@ dependencies = [ "version_check", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "async-trait" version = "0.1.88" @@ -111,12 +126,36 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +[[package]] +name = "cc" +version = "1.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" +dependencies = [ + "shlex", +] + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "chrono" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "config" version = "0.13.4" @@ -136,6 +175,12 @@ dependencies = [ "yaml-rust", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -289,6 +334,30 @@ dependencies = [ "digest", ] +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "itoa" version = "1.0.15" @@ -402,6 +471,15 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + [[package]] name = "object" version = "0.36.7" @@ -562,6 +640,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613283563cd90e1dfc3518d548caee47e0e725455ed619881f5cf21f36de4b48" dependencies = [ "bytes", + "chrono", "fallible-iterator", "postgres-protocol", "serde", @@ -666,6 +745,12 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + [[package]] name = "ryu" version = "1.0.20" @@ -721,6 +806,12 @@ dependencies = [ "digest", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -793,6 +884,7 @@ dependencies = [ name = "tcp_server" version = "0.1.0" dependencies = [ + "chrono", "config", "serde", "serde_json", @@ -986,6 +1078,7 @@ checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", "once_cell", + "rustversion", "wasm-bindgen-macro", ] @@ -1056,6 +1149,65 @@ dependencies = [ "web-sys", ] +[[package]] +name = "windows-core" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.52.0" diff --git a/tcp_server/Cargo.toml b/tcp_server/Cargo.toml index 4f2b7fd..0a6a6ac 100644 --- a/tcp_server/Cargo.toml +++ b/tcp_server/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] tokio = { version = "1.28", features = ["full"] } config = "0.13" -tokio-postgres = { version = "0.7", features = ["with-serde_json-1"] } +tokio-postgres = { version = "0.7", features = ["with-serde_json-1", "with-chrono-0_4"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" +chrono = { version = "0.4", features = ["serde"] } diff --git a/tcp_server/src/main.rs b/tcp_server/src/main.rs index c2ae044..4f737f4 100644 --- a/tcp_server/src/main.rs +++ b/tcp_server/src/main.rs @@ -1,53 +1,11 @@ -use std::error::Error; use tokio::net::{TcpListener, TcpStream}; use tokio::io::{AsyncReadExt, AsyncWriteExt}; use config::Config; use tokio_postgres::{NoTls, Error as PgError}; use serde::{Deserialize, Serialize}; use std::sync::Arc; -use std::net::SocketAddr; - -#[derive(Debug)] -enum AppError { - Database(PgError), - Json(serde_json::Error), -} - -impl From for AppError { - fn from(err: PgError) -> Self { - AppError::Database(err) - } -} - -impl From for AppError { - fn from(err: serde_json::Error) -> Self { - AppError::Json(err) - } -} - -impl std::fmt::Display for AppError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - AppError::Database(e) => write!(f, "数据库错误: {}", e), - AppError::Json(e) => write!(f, "JSON错误: {}", e), - } - } -} - -impl std::error::Error for AppError { - fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { - match self { - AppError::Database(e) => Some(e), - AppError::Json(e) => Some(e), - } - } -} - -#[derive(Debug, Serialize, Deserialize)] -struct TableType { - table_name: String, - data: serde_json::Value, -} +use chrono::{DateTime, Utc}; +use std::error::Error; #[derive(Debug, Serialize, Deserialize)] struct InstrumentInfo { @@ -60,118 +18,60 @@ struct InstrumentInfo { specification: String, } -async fn insert_data(client: &tokio_postgres::Client, table_type: &TableType) -> Result<(), AppError> { - // 先检查表是否存在 - let exists = client - .query_one( - "SELECT EXISTS( - SELECT 1 FROM information_schema.tables - WHERE table_schema = 'public' - AND table_name = $1 - )", - &[&table_type.table_name], - ) - .await? - .get::<_, bool>(0); - - if !exists { - println!("表 {} 不存在", table_type.table_name); - return Ok(()); - } - - // 获取表的列信息 - let columns = client - .query( - "SELECT column_name, data_type - FROM information_schema.columns - WHERE table_schema = 'public' - AND table_name = $1 - ORDER BY ordinal_position", - &[&table_type.table_name], - ) - .await?; - - if columns.is_empty() { - println!("表 {} 没有列信息", table_type.table_name); - return Ok(()); - } - - // 检查 ID 是否存在 - if let Some(id) = table_type.data.get("id") { - let id_value = id.as_i64().unwrap_or(0); - let exists = client - .query_one( - &format!("SELECT EXISTS(SELECT 1 FROM public.{} WHERE id = $1)", table_type.table_name), - &[&id_value], - ) - .await? - .get::<_, bool>(0); - - if exists { - println!("表 {} 中 ID {} 已存在,跳过插入", table_type.table_name, id); - return Ok(()); - } - } - - // 构建插入语句 - let mut column_names = Vec::new(); - let mut placeholders = Vec::new(); - let mut param_count = 1; - let mut query_values: Vec> = Vec::new(); - - for row in &columns { - let column_name: String = row.get("column_name"); - let data_type: String = row.get("data_type"); - - if let Some(value) = table_type.data.get(&column_name) { - column_names.push(column_name); - placeholders.push(format!("${}", param_count)); - param_count += 1; - - // 根据数据类型转换值 - match data_type.as_str() { - "integer" | "bigint" => { - if let Some(n) = value.as_i64() { - query_values.push(Box::new(n)); - } - } - "character varying" | "text" => { - if let Some(s) = value.as_str() { - query_values.push(Box::new(s.to_string())); - } - } - "boolean" => { - if let Some(b) = value.as_bool() { - query_values.push(Box::new(b)); - } - } - "double precision" | "numeric" => { - if let Some(n) = value.as_f64() { - query_values.push(Box::new(n)); - } - } - // 可以根据需要添加更多数据类型的处理 - _ => println!("不支持的数据类型: {}", data_type), - } - } - } - - let query = format!( - "INSERT INTO public.{} ({}) OVERRIDING SYSTEM VALUE VALUES ({})", - table_type.table_name, - column_names.join(", "), - placeholders.join(", ") - ); - - let values: Vec<&(dyn tokio_postgres::types::ToSql + Sync)> = query_values - .iter() - .map(|v| v.as_ref()) - .collect(); - - client.execute(&query, &values[..]).await?; +#[derive(Debug, Deserialize)] +struct InformationInfo { + id: i32, + hy_name: Option, + flag: Option, + laboratory_id: Option, + analysistypeid: Option, +} - println!("成功插入数据到表 {}", table_type.table_name); - Ok(()) +#[derive(Debug, Deserialize)] +struct RecordInfo { + id: i32, + hy_code: Option, + r#type: Option, + hy_check: Option, + hy_approve: Option, + check_time: Option>, + approve_time: Option>, + approve_user: Option, + check_user: Option, + hy_time: Option>, + hy_values: Option, + accept_time: Option>, + accept_user: Option, + mt: Option, + mad: Option, + aad: Option, + ad: Option, + vad: Option, + vd: Option, + var: Option, + vdaf: Option, + fcad: Option, + st_ar: Option, + st_ad: Option, + st_d: Option, + had: Option, + hd: Option, + qb_ad: Option, + qgr_ad: Option, + qgr_d: Option, + qnet_ar_mj_kg: Option, + qnet_ar_j_cal: Option, + v: Option, + aar: Option, + qnet_ar: Option, + qnet_ar1: Option, + crc: Option, + st_daf: Option, + cad: Option, + cd: Option, + isauto: Option, + hy_type: Option, + isnormal: Option, } async fn connect_db(config: &Config) -> Result { @@ -189,7 +89,7 @@ async fn connect_db(config: &Config) -> Result let (client, connection) = tokio_postgres::connect(&connection_string, NoTls).await?; // 在后台运行连接 - tokio::task::spawn(async move { + tokio::spawn(async move { if let Err(e) = connection.await { eprintln!("数据库连接错误: {}", e); } @@ -198,17 +98,180 @@ async fn connect_db(config: &Config) -> Result Ok(client) } -async fn insert_instrument(client: &tokio_postgres::Client, info: &InstrumentInfo) -> Result<(), AppError> { - let json_data = serde_json::to_value(info)?; - let table_type = TableType { - table_name: "hy_instrument".to_string(), - data: json_data, - }; - insert_data(client, &table_type).await +async fn insert_instrument(client: &tokio_postgres::Client, info: &InstrumentInfo) -> Result<(), PgError> { + // 先检查 ID 是否存在 + let exists = client + .query_one( + "SELECT EXISTS(SELECT 1 FROM public.hy_instrument WHERE id = $1)", + &[&info.id], + ) + .await? + .get::<_, bool>(0); + + if exists { + println!("ID {} 已存在,跳过插入", info.id); + return Ok(()); + } + + // ID 不存在,执行插入 + client.execute( + "INSERT INTO public.hy_instrument (id, informationid, instrumentcode, laboratoryid, name, remark, specification) + OVERRIDING SYSTEM VALUE + VALUES ($1, $2, $3, $4, $5, $6, $7)", + &[ + &info.id, + &info.informationid, + &info.instrumentcode, + &info.laboratoryid, + &info.name, + &info.remark, + &info.specification, + ], + ) + .await?; + + println!("成功插入仪器信息: {} (ID: {})", info.instrumentcode, info.id); + Ok(()) +} + +async fn insert_information(client: &tokio_postgres::Client, info: &InformationInfo) -> Result<(), PgError> { + // 先检查 ID 是否存在 + let exists = client + .query_one( + "SELECT EXISTS(SELECT 1 FROM public.hy_information WHERE id = $1)", + &[&info.id], + ) + .await? + .get::<_, bool>(0); + + if exists { + println!("ID {} 已存在,跳过插入", info.id); + return Ok(()); + } + + // ID 不存在,执行插入 + client.execute( + "INSERT INTO public.hy_information (id, hy_name, flag, laboratory_id, analysistypeid) + OVERRIDING SYSTEM VALUE + VALUES ($1, $2, $3, $4, $5)", + &[ + &info.id, + &info.hy_name, + &info.flag, + &info.laboratory_id, + &info.analysistypeid, + ], + ) + .await?; + + println!("成功插入信息记录: ID {}", info.id); + Ok(()) +} + +async fn insert_record(client: &tokio_postgres::Client, info: &RecordInfo) -> Result<(), PgError> { + // 先检查 ID 是否存在 + let exists = client + .query_one( + "SELECT EXISTS(SELECT 1 FROM public.hy_record WHERE id = $1)", + &[&info.id], + ) + .await? + .get::<_, bool>(0); + + if exists { + println!("ID {} 已存在,跳过插入", info.id); + return Ok(()); + } + + // ID 不存在,执行插入 + client.execute( + "INSERT INTO public.hy_record ( + id, hy_code, type, hy_check, hy_approve, check_time, approve_time, + approve_user, check_user, hy_time, hy_values, accept_time, accept_user, + mt, mad, aad, ad, vad, vd, var, vdaf, fcad, st_ar, st_ad, st_d, + had, hd, qb_ad, qgr_ad, qgr_d, qnet_ar_mj_kg, qnet_ar_j_cal, v, + aar, qnet_ar, qnet_ar1, crc, st_daf, cad, cd, isauto, hy_type, isnormal + ) + OVERRIDING SYSTEM VALUE + VALUES ( + $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, + $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, + $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, + $39, $40, $41, $42, $43 + )", + &[ + &info.id, &info.hy_code, &info.r#type, &info.hy_check, &info.hy_approve, + &info.check_time, &info.approve_time, &info.approve_user, &info.check_user, + &info.hy_time, &info.hy_values, &info.accept_time, &info.accept_user, + &info.mt, &info.mad, &info.aad, &info.ad, &info.vad, &info.vd, &info.var, + &info.vdaf, &info.fcad, &info.st_ar, &info.st_ad, &info.st_d, &info.had, + &info.hd, &info.qb_ad, &info.qgr_ad, &info.qgr_d, &info.qnet_ar_mj_kg, + &info.qnet_ar_j_cal, &info.v, &info.aar, &info.qnet_ar, &info.qnet_ar1, + &info.crc, &info.st_daf, &info.cad, &info.cd, &info.isauto, &info.hy_type, + &info.isnormal + ], + ) + .await?; + + println!("成功插入记录: ID {}", info.id); + Ok(()) } -fn check_ok_message(_message: &[u8]) -> u8 { - 0xFF +async fn handle_client(socket: &mut TcpStream, client: &tokio_postgres::Client) -> Result<(), Box> { + let mut buf = [0; 1024 * 64]; // 增加缓冲区大小到64KB + + loop { + let n = socket.read(&mut buf).await?; + if n == 0 { + break; + } + + let data = String::from_utf8_lossy(&buf[..n]); + println!("接收到的数据: {}", data); + + // 尝试解析为不同的数据类型并处理 + let result = if let Ok(info) = serde_json::from_str::(&data) { + println!("接收到仪器信息: {:?}", info); + match insert_instrument(client, &info).await { + Ok(_) => true, + Err(e) => { + eprintln!("插入仪器信息失败: {}", e); + false + } + } + } else if let Ok(info) = serde_json::from_str::(&data) { + println!("接收到分析信息: {:?}", info); + match insert_information(client, &info).await { + Ok(_) => true, + Err(e) => { + eprintln!("插入分析信息失败: {}", e); + false + } + } + } else if let Ok(info) = serde_json::from_str::(&data) { + println!("接收到记录信息: {:?}", info); + match insert_record(client, &info).await { + Ok(_) => true, + Err(e) => { + eprintln!("插入记录信息失败: {}", e); + false + } + } + } else { + println!("无法解析JSON数据为任何已知类型"); + false + }; + + // 发送响应 + let response = if result { 0xFF } else { 0x00 }; + if let Err(e) = socket.write_all(&[response]).await { + eprintln!("发送响应失败: {}", e); + break; + } + } + + println!("客户端断开连接: {}", socket.peer_addr()?); + Ok(()) } #[tokio::main] @@ -231,66 +294,14 @@ async fn main() -> Result<(), Box> { println!("服务器监听地址: {}", bind_address); loop { - let (socket, addr) = listener.accept().await?; + let (mut socket, addr) = listener.accept().await?; println!("新客户端连接: {}", addr); let client = Arc::clone(&client); - // 使用 spawn_blocking 来处理连接 - tokio::task::spawn(async move { - if let Err(e) = process_connection(socket, addr, client).await { - eprintln!("处理连接错误: {}", e); + tokio::spawn(async move { + if let Err(e) = handle_client(&mut socket, &client).await { + eprintln!("处理客户端错误: {}", e); } }); } } - -async fn process_connection(mut socket: TcpStream, addr: SocketAddr, client: Arc) -> Result<(), Box> { - let mut buf = [0; 1024 * 64]; // 增加缓冲区大小到64KB - - loop { - match socket.read(&mut buf).await { - Ok(0) => { - println!("客户端断开连接: {}", addr); - break; - } - Ok(n) => { - let data = &buf[..n]; - // 尝试解析为 TableType - match serde_json::from_slice::(data) { - Ok(table_type) => { - println!("接收到表 {} 的数据", table_type.table_name); - if let Err(e) = insert_data(&client, &table_type).await { - eprintln!("错误: {}", e); - } - } - Err(_) => { - // 如果不是 TableType 格式,尝试解析为 InstrumentInfo(保持向后兼容) - match serde_json::from_slice::(data) { - Ok(info) => { - println!("接收到仪器信息: {:?}", info); - if let Err(e) = insert_instrument(&client, &info).await { - eprintln!("错误: {}", e); - } - } - Err(e) => { - eprintln!("解析JSON失败: {}", e); - eprintln!("接收到的数据: {}", String::from_utf8_lossy(data)); - } - } - } - } - - let response = check_ok_message(data); - if let Err(e) = socket.write_all(&[response]).await { - eprintln!("发送响应失败: {}", e); - break; - } - } - Err(e) => { - eprintln!("读取数据失败: {}", e); - break; - } - } - } - Ok(()) -} diff --git a/tcp_server/target/debug/.fingerprint/tcp_server-d434eb7e44cc404e/bin-tcp_server b/tcp_server/target/debug/.fingerprint/tcp_server-d434eb7e44cc404e/bin-tcp_server index e69de29..bb6723b 100644 --- a/tcp_server/target/debug/.fingerprint/tcp_server-d434eb7e44cc404e/bin-tcp_server +++ b/tcp_server/target/debug/.fingerprint/tcp_server-d434eb7e44cc404e/bin-tcp_server @@ -0,0 +1 @@ +0c18376461b43be3 \ No newline at end of file diff --git a/tcp_server/target/debug/.fingerprint/tcp_server-d434eb7e44cc404e/bin-tcp_server.json b/tcp_server/target/debug/.fingerprint/tcp_server-d434eb7e44cc404e/bin-tcp_server.json index 3d375ee..adc04d9 100644 --- a/tcp_server/target/debug/.fingerprint/tcp_server-d434eb7e44cc404e/bin-tcp_server.json +++ b/tcp_server/target/debug/.fingerprint/tcp_server-d434eb7e44cc404e/bin-tcp_server.json @@ -1 +1 @@ -{"rustc":13800692020808712694,"features":"[]","declared_features":"[]","target":8765685456636761285,"profile":8731458305071235362,"path":4942398508502643691,"deps":[[4679662532519462650,"tokio_postgres",false,5063794336024998218],[5138218615291878843,"tokio",false,15265975105261538754],[9689903380558560274,"serde",false,9113250839399411242],[15367738274754116744,"serde_json",false,13898242479202773795],[18150860780478849731,"config",false,16692050494851569320]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\tcp_server-d434eb7e44cc404e\\dep-bin-tcp_server","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0} \ No newline at end of file +{"rustc":13800692020808712694,"features":"[]","declared_features":"[]","target":8765685456636761285,"profile":8731458305071235362,"path":4942398508502643691,"deps":[[4679662532519462650,"tokio_postgres",false,10165692077103750655],[5138218615291878843,"tokio",false,15265975105261538754],[6547980334806251551,"chrono",false,15080356830784337688],[9689903380558560274,"serde",false,9113250839399411242],[15367738274754116744,"serde_json",false,13898242479202773795],[18150860780478849731,"config",false,16692050494851569320]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\tcp_server-d434eb7e44cc404e\\dep-bin-tcp_server","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0} \ No newline at end of file diff --git a/tcp_server/target/debug/tcp_server.exe b/tcp_server/target/debug/tcp_server.exe index 790dbd4..e2bc7b5 100644 Binary files a/tcp_server/target/debug/tcp_server.exe and b/tcp_server/target/debug/tcp_server.exe differ diff --git a/tcp_server/target/debug/tcp_server.pdb b/tcp_server/target/debug/tcp_server.pdb index 728fd12..84d2546 100644 Binary files a/tcp_server/target/debug/tcp_server.pdb and b/tcp_server/target/debug/tcp_server.pdb differ