OCEAN преди 2 месеца
родител
ревизия
11bad2d737
променени са 8 файла, в които са добавени 400 реда и са изтрити 223 реда
  1. +12
    -0
      tcp_client/config.toml
  2. +152
    -0
      tcp_server/Cargo.lock
  3. +2
    -1
      tcp_server/Cargo.toml
  4. +232
    -221
      tcp_server/src/main.rs
  5. +1
    -0
      tcp_server/target/debug/.fingerprint/tcp_server-d434eb7e44cc404e/bin-tcp_server
  6. +1
    -1
      tcp_server/target/debug/.fingerprint/tcp_server-d434eb7e44cc404e/bin-tcp_server.json
  7. Двоични данни
      tcp_server/target/debug/tcp_server.exe
  8. Двоични данни
      tcp_server/target/debug/tcp_server.pdb

+ 12
- 0
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" # 增量同步的时间字段

+ 152
- 0
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"


+ 2
- 1
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"] }

+ 232
- 221
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<PgError> for AppError {
fn from(err: PgError) -> Self {
AppError::Database(err)
}
}

impl From<serde_json::Error> 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<Box<dyn tokio_postgres::types::ToSql + Sync>> = 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<String>,
flag: Option<i16>,
laboratory_id: Option<i32>,
analysistypeid: Option<i32>,
}

println!("成功插入数据到表 {}", table_type.table_name);
Ok(())
#[derive(Debug, Deserialize)]
struct RecordInfo {
id: i32,
hy_code: Option<String>,
r#type: Option<String>,
hy_check: Option<i16>,
hy_approve: Option<i16>,
check_time: Option<DateTime<Utc>>,
approve_time: Option<DateTime<Utc>>,
approve_user: Option<String>,
check_user: Option<String>,
hy_time: Option<DateTime<Utc>>,
hy_values: Option<String>,
accept_time: Option<DateTime<Utc>>,
accept_user: Option<String>,
mt: Option<f64>,
mad: Option<f64>,
aad: Option<f64>,
ad: Option<f64>,
vad: Option<f64>,
vd: Option<f64>,
var: Option<f64>,
vdaf: Option<f64>,
fcad: Option<f64>,
st_ar: Option<f64>,
st_ad: Option<f64>,
st_d: Option<f64>,
had: Option<f64>,
hd: Option<f64>,
qb_ad: Option<f64>,
qgr_ad: Option<f64>,
qgr_d: Option<f64>,
qnet_ar_mj_kg: Option<f64>,
qnet_ar_j_cal: Option<f64>,
v: Option<f64>,
aar: Option<f64>,
qnet_ar: Option<f64>,
qnet_ar1: Option<f64>,
crc: Option<f64>,
st_daf: Option<f64>,
cad: Option<f64>,
cd: Option<f64>,
isauto: Option<i16>,
hy_type: Option<String>,
isnormal: Option<i32>,
}

async fn connect_db(config: &Config) -> Result<tokio_postgres::Client, PgError> {
@@ -189,7 +89,7 @@ async fn connect_db(config: &Config) -> Result<tokio_postgres::Client, PgError>
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<tokio_postgres::Client, PgError>
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<dyn Error>> {
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::<InstrumentInfo>(&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::<InformationInfo>(&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::<RecordInfo>(&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<dyn Error>> {
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<tokio_postgres::Client>) -> Result<(), Box<dyn Error + Send + Sync>> {
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::<TableType>(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::<InstrumentInfo>(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(())
}

+ 1
- 0
tcp_server/target/debug/.fingerprint/tcp_server-d434eb7e44cc404e/bin-tcp_server Целия файл

@@ -0,0 +1 @@
0c18376461b43be3

+ 1
- 1
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}
{"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}

Двоични данни
tcp_server/target/debug/tcp_server.exe Целия файл


Двоични данни
tcp_server/target/debug/tcp_server.pdb Целия файл


Loading…
Отказ
Запис