Merge pull request #93 from utam0k/improvement/get_or_null

improve  the `row.try_get()`
pull/94/head
Takayuki Maeda 3 years ago committed by GitHub
commit 61c9298dc6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -49,3 +49,10 @@ pub trait TableRow: std::marker::Send {
fn fields(&self) -> Vec<String>;
fn columns(&self) -> Vec<String>;
}
#[macro_export]
macro_rules! get_or_null {
($value:expr) => {
$value.map_or("NULL".to_string(), |v| v.to_string())
};
}

@ -1,3 +1,5 @@
use crate::get_or_null;
use super::{Pool, TableRow, RECORDS_LIMIT_PER_PAGE};
use async_trait::async_trait;
use chrono::{NaiveDate, NaiveDateTime, NaiveTime};
@ -353,85 +355,69 @@ impl Pool for MySqlPool {
fn convert_column_value_to_string(row: &MySqlRow, column: &MySqlColumn) -> anyhow::Result<String> {
let column_name = column.name();
if let Ok(value) = row.try_get(column_name) {
let value: Option<String> = value;
return Ok(value.unwrap_or_else(|| "NULL".to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(value.unwrap_or_else(|| "NULL".to_string()))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<&str> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<i8> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<i16> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<i32> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<i64> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<f32> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<f64> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<u8> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<u16> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<u32> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<u64> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<rust_decimal::Decimal> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<NaiveDate> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<NaiveTime> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<NaiveDateTime> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<chrono::DateTime<chrono::Utc>> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<serde_json::Value> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<bool> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
Ok(get_or_null!(value))
} else {
anyhow::bail!(
"column type not implemented: `{}` {}",
column_name,
column.type_info().clone().name()
)
}
Err(anyhow::anyhow!(
"column type not implemented: `{}` {}",
column_name,
column.type_info().clone().name()
))
}

@ -1,3 +1,5 @@
use crate::get_or_null;
use super::{Pool, TableRow, RECORDS_LIMIT_PER_PAGE};
use async_trait::async_trait;
use chrono::{NaiveDate, NaiveDateTime, NaiveTime};
@ -467,23 +469,19 @@ fn convert_column_value_to_string(row: &PgRow, column: &PgColumn) -> anyhow::Res
let column_name = column.name();
if let Ok(value) = row.try_get(column_name) {
let value: Option<i16> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<i32> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<i64> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<rust_decimal::Decimal> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<&[u8]> = value;
return Ok(value.map_or("NULL".to_string(), |values| {
Ok(value.map_or("NULL".to_string(), |values| {
format!(
"\\x{}",
values
@ -491,51 +489,42 @@ fn convert_column_value_to_string(row: &PgRow, column: &PgColumn) -> anyhow::Res
.map(|v| format!("{:02x}", v))
.collect::<String>()
)
}));
}
if let Ok(value) = row.try_get(column_name) {
}))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<NaiveDate> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: String = value;
return Ok(value);
}
if let Ok(value) = row.try_get(column_name) {
Ok(value)
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<chrono::DateTime<chrono::Utc>> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<chrono::DateTime<chrono::Local>> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<NaiveDateTime> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<NaiveDate> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<NaiveTime> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<serde_json::Value> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get::<Option<bool>, _>(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get::<Option<bool>, _>(column_name) {
let value: Option<bool> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<Vec<String>> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.join(",")));
Ok(value.map_or("NULL".to_string(), |v| v.join(",")))
} else {
anyhow::bail!(
"column type not implemented: `{}` {}",
column_name,
column.type_info().clone().name()
)
}
Err(anyhow::anyhow!(
"column type not implemented: `{}` {}",
column_name,
column.type_info().clone().name()
))
}

@ -1,3 +1,5 @@
use crate::get_or_null;
use super::{Pool, TableRow, RECORDS_LIMIT_PER_PAGE};
use async_trait::async_trait;
use chrono::NaiveDateTime;
@ -347,51 +349,42 @@ fn convert_column_value_to_string(
let column_name = column.name();
if let Ok(value) = row.try_get(column_name) {
let value: Option<String> = value;
return Ok(value.unwrap_or_else(|| "NULL".to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(value.unwrap_or_else(|| "NULL".to_string()))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<&str> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<i16> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<i32> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<i64> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<f32> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<f64> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<chrono::DateTime<chrono::Utc>> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<chrono::DateTime<chrono::Local>> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<NaiveDateTime> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
}
if let Ok(value) = row.try_get(column_name) {
Ok(get_or_null!(value))
} else if let Ok(value) = row.try_get(column_name) {
let value: Option<bool> = value;
return Ok(value.map_or("NULL".to_string(), |v| v.to_string()));
Ok(get_or_null!(value))
} else {
anyhow::bail!(
"column type not implemented: `{}` {}",
column_name,
column.type_info().clone().name()
)
}
Err(anyhow::anyhow!(
"column type not implemented: `{}` {}",
column_name,
column.type_info().clone().name()
))
}

Loading…
Cancel
Save