|
|
|
@ -1,6 +1,6 @@
|
|
|
|
|
use crate::get_or_null;
|
|
|
|
|
|
|
|
|
|
use super::{ExecuteResult, Pool, TableRow, RECORDS_LIMIT_PER_PAGE};
|
|
|
|
|
use super::{concat_headers, ExecuteResult, Pool, TableRow, RECORDS_LIMIT_PER_PAGE};
|
|
|
|
|
use async_trait::async_trait;
|
|
|
|
|
use chrono::{NaiveDate, NaiveDateTime, NaiveTime};
|
|
|
|
|
use database_tree::{Child, Database, Schema, Table};
|
|
|
|
@ -245,8 +245,21 @@ impl Pool for PostgresPool {
|
|
|
|
|
table: &Table,
|
|
|
|
|
page: u16,
|
|
|
|
|
filter: Option<String>,
|
|
|
|
|
orders: Option<String>,
|
|
|
|
|
header_icons: Option<Vec<String>>,
|
|
|
|
|
) -> anyhow::Result<(Vec<String>, Vec<Vec<String>>)> {
|
|
|
|
|
let query = if let Some(filter) = filter.as_ref() {
|
|
|
|
|
let query = if let (Some(filter), Some(orders)) = (&filter, &orders) {
|
|
|
|
|
format!(
|
|
|
|
|
r#"SELECT * FROM "{database}"."{table_schema}"."{table}" WHERE {filter} {orders} LIMIT {limit} OFFSET {page}"#,
|
|
|
|
|
database = database.name,
|
|
|
|
|
table = table.name,
|
|
|
|
|
filter = filter,
|
|
|
|
|
orders = orders,
|
|
|
|
|
table_schema = table.schema.clone().unwrap_or_else(|| "public".to_string()),
|
|
|
|
|
page = page,
|
|
|
|
|
limit = RECORDS_LIMIT_PER_PAGE
|
|
|
|
|
)
|
|
|
|
|
} else if let Some(filter) = &filter {
|
|
|
|
|
format!(
|
|
|
|
|
r#"SELECT * FROM "{database}"."{table_schema}"."{table}" WHERE {filter} LIMIT {limit} OFFSET {page}"#,
|
|
|
|
|
database = database.name,
|
|
|
|
@ -256,6 +269,16 @@ impl Pool for PostgresPool {
|
|
|
|
|
page = page,
|
|
|
|
|
limit = RECORDS_LIMIT_PER_PAGE
|
|
|
|
|
)
|
|
|
|
|
} else if let Some(orders) = &orders {
|
|
|
|
|
format!(
|
|
|
|
|
r#"SELECT * FROM "{database}"."{table_schema}"."{table}" {orders} LIMIT {limit} OFFSET {page}"#,
|
|
|
|
|
database = database.name,
|
|
|
|
|
table = table.name,
|
|
|
|
|
orders = orders,
|
|
|
|
|
table_schema = table.schema.clone().unwrap_or_else(|| "public".to_string()),
|
|
|
|
|
page = page,
|
|
|
|
|
limit = RECORDS_LIMIT_PER_PAGE
|
|
|
|
|
)
|
|
|
|
|
} else {
|
|
|
|
|
format!(
|
|
|
|
|
r#"SELECT * FROM "{database}"."{table_schema}"."{table}" LIMIT {limit} OFFSET {page}"#,
|
|
|
|
@ -283,8 +306,14 @@ impl Pool for PostgresPool {
|
|
|
|
|
Err(_) => {
|
|
|
|
|
if json_records.is_none() {
|
|
|
|
|
json_records = Some(
|
|
|
|
|
self.get_json_records(database, table, page, filter.clone())
|
|
|
|
|
.await?,
|
|
|
|
|
self.get_json_records(
|
|
|
|
|
database,
|
|
|
|
|
table,
|
|
|
|
|
page,
|
|
|
|
|
filter.clone(),
|
|
|
|
|
orders.clone(),
|
|
|
|
|
)
|
|
|
|
|
.await?,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
if let Some(json_records) = &json_records {
|
|
|
|
@ -315,7 +344,7 @@ impl Pool for PostgresPool {
|
|
|
|
|
}
|
|
|
|
|
records.push(new_row)
|
|
|
|
|
}
|
|
|
|
|
Ok((headers, records))
|
|
|
|
|
Ok((concat_headers(headers, header_icons), records))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async fn get_columns(
|
|
|
|
@ -479,8 +508,20 @@ impl PostgresPool {
|
|
|
|
|
table: &Table,
|
|
|
|
|
page: u16,
|
|
|
|
|
filter: Option<String>,
|
|
|
|
|
orders: Option<String>,
|
|
|
|
|
) -> anyhow::Result<Vec<serde_json::Value>> {
|
|
|
|
|
let query = if let Some(filter) = filter {
|
|
|
|
|
let query = if let (Some(filter), Some(orders)) = (&filter, &orders) {
|
|
|
|
|
format!(
|
|
|
|
|
r#"SELECT to_json("{table}".*) FROM "{database}"."{table_schema}"."{table}" WHERE {filter} {orders} LIMIT {limit} OFFSET {page}"#,
|
|
|
|
|
database = database.name,
|
|
|
|
|
table = table.name,
|
|
|
|
|
filter = filter,
|
|
|
|
|
orders = orders,
|
|
|
|
|
table_schema = table.schema.clone().unwrap_or_else(|| "public".to_string()),
|
|
|
|
|
page = page,
|
|
|
|
|
limit = RECORDS_LIMIT_PER_PAGE
|
|
|
|
|
)
|
|
|
|
|
} else if let Some(filter) = filter {
|
|
|
|
|
format!(
|
|
|
|
|
r#"SELECT to_json("{table}".*) FROM "{database}"."{table_schema}"."{table}" WHERE {filter} LIMIT {limit} OFFSET {page}"#,
|
|
|
|
|
database = database.name,
|
|
|
|
@ -490,6 +531,16 @@ impl PostgresPool {
|
|
|
|
|
page = page,
|
|
|
|
|
limit = RECORDS_LIMIT_PER_PAGE
|
|
|
|
|
)
|
|
|
|
|
} else if let Some(orders) = orders {
|
|
|
|
|
format!(
|
|
|
|
|
r#"SELECT to_json("{table}".*) FROM "{database}"."{table_schema}"."{table}" {orders} LIMIT {limit} OFFSET {page}"#,
|
|
|
|
|
database = database.name,
|
|
|
|
|
table = table.name,
|
|
|
|
|
orders = orders,
|
|
|
|
|
table_schema = table.schema.clone().unwrap_or_else(|| "public".to_string()),
|
|
|
|
|
page = page,
|
|
|
|
|
limit = RECORDS_LIMIT_PER_PAGE
|
|
|
|
|
)
|
|
|
|
|
} else {
|
|
|
|
|
format!(
|
|
|
|
|
r#"SELECT to_json("{table}".*) FROM "{database}"."{table_schema}"."{table}" LIMIT {limit} OFFSET {page}"#,
|
|
|
|
|