diff --git a/src/database/mod.rs b/src/database/mod.rs index 46a771a..fe4ad25 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -23,6 +23,15 @@ pub trait Pool: Send + Sync { page: u16, filter: Option, ) -> anyhow::Result<(Vec, Vec>)>; + + /// Get the total number of records in a table + async fn get_total_records_count( + &self, + database: &Database, + table: &Table, + filter: Option, + ) -> anyhow::Result; + async fn get_columns( &self, database: &Database, diff --git a/src/database/mysql.rs b/src/database/mysql.rs index 160306f..6fb7d73 100644 --- a/src/database/mysql.rs +++ b/src/database/mysql.rs @@ -265,6 +265,27 @@ impl Pool for MySqlPool { Ok((headers, records)) } + async fn get_total_records_count( + &self, + _database: &Database, + table: &Table, + filter: Option, + ) -> anyhow::Result { + let query = if let Some(filter) = filter { + format!( + "SELECT count(*) FROM `{table}` WHERE {filter}", + table = table.name, + filter = filter + ) + } else { + format!("SELECT count(*) FROM `{}`", table.name) + }; + + let res = sqlx::query(query.as_str()).fetch_one(&self.pool).await?; + + Ok(res.get::(0) as usize) + } + async fn get_columns( &self, database: &Database, diff --git a/src/database/postgres.rs b/src/database/postgres.rs index ab954b0..bc83a05 100644 --- a/src/database/postgres.rs +++ b/src/database/postgres.rs @@ -318,6 +318,27 @@ impl Pool for PostgresPool { Ok((headers, records)) } + async fn get_total_records_count( + &self, + _database: &Database, + table: &Table, + filter: Option, + ) -> anyhow::Result { + let query = if let Some(filter) = filter { + format!( + "SELECT count(*) FROM `{table}` WHERE {filter}", + table = table.name, + filter = filter + ) + } else { + format!("SELECT count(*) FROM `{}`", table.name) + }; + + let res = sqlx::query(query.as_str()).fetch_one(&self.pool).await?; + + Ok(res.get::(0) as usize) + } + async fn get_columns( &self, database: &Database, diff --git a/src/database/sqlite.rs b/src/database/sqlite.rs index 83063c7..b4d625e 100644 --- a/src/database/sqlite.rs +++ b/src/database/sqlite.rs @@ -265,6 +265,27 @@ impl Pool for SqlitePool { Ok((headers, records)) } + async fn get_total_records_count( + &self, + _database: &Database, + table: &Table, + filter: Option, + ) -> anyhow::Result { + let query = if let Some(filter) = filter { + format!( + "SELECT count(*) FROM `{table}` WHERE {filter}", + table = table.name, + filter = filter + ) + } else { + format!("SELECT count(*) FROM `{}`", table.name) + }; + + let res = sqlx::query(query.as_str()).fetch_one(&self.pool).await?; + + Ok(res.get::(0) as usize) + } + async fn get_columns( &self, _database: &Database,