diff --git a/src/database/mod.rs b/src/database/mod.rs index 18014a1..91c074a 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -49,3 +49,10 @@ pub trait TableRow: std::marker::Send { fn fields(&self) -> Vec; fn columns(&self) -> Vec; } + +#[macro_export] +macro_rules! get_or_null { + ($value:expr) => { + $value.map_or("NULL".to_string(), |v| v.to_string()) + }; +} diff --git a/src/database/mysql.rs b/src/database/mysql.rs index 16d7b6c..2da6988 100644 --- a/src/database/mysql.rs +++ b/src/database/mysql.rs @@ -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 { let column_name = column.name(); + if let Ok(value) = row.try_get(column_name) { let value: Option = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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> = 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 = 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 = 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() - )) } diff --git a/src/database/postgres.rs b/src/database/postgres.rs index f8219a8..65cf574 100644 --- a/src/database/postgres.rs +++ b/src/database/postgres.rs @@ -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 = 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 = 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 = 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 = 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::() ) - })); - } - if let Ok(value) = row.try_get(column_name) { + })) + } else if let Ok(value) = row.try_get(column_name) { let value: Option = 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> = 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> = 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 = 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 = 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 = 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 = 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 = 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> = 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() - )) } diff --git a/src/database/sqlite.rs b/src/database/sqlite.rs index 6ca8e98..2e4af68 100644 --- a/src/database/sqlite.rs +++ b/src/database/sqlite.rs @@ -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 = 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 = 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 = 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 = 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 = 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 = 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> = 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> = 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 = 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 = 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() - )) }