use super::{
cachedb::CacheDB,
sql::{create_db, Database, DatabaseOpts},
};
use serde::{Deserialize, Serialize};
use sqlx::{Column, Row};
use std::collections::BTreeMap;
#[allow(dead_code)]
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct DefaultReturn<T> {
pub success: bool,
pub message: String,
pub payload: T,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct DatabaseReturn(pub BTreeMap<String, String>);
#[derive(Clone)]
#[cfg(feature = "postgres")]
pub struct StarterDatabase {
pub db: Database<sqlx::PgPool>,
pub options: DatabaseOpts,
pub cachedb: CacheDB,
}
#[derive(Clone)]
#[cfg(feature = "mysql")]
pub struct StarterDatabase {
pub db: Database<sqlx::MySqlPool>,
pub options: DatabaseOpts,
pub cachedb: CacheDB,
}
#[derive(Clone)]
#[cfg(feature = "sqlite")]
pub struct StarterDatabase {
pub db: Database<sqlx::SqlitePool>,
pub options: DatabaseOpts,
pub cachedb: CacheDB,
}
impl StarterDatabase {
pub async fn new(options: DatabaseOpts) -> StarterDatabase {
StarterDatabase {
db: create_db(options.clone()).await,
options,
cachedb: CacheDB::new().await,
}
}
#[cfg(feature = "sqlite")]
pub fn textify_row(&self, row: sqlx::sqlite::SqliteRow) -> DatabaseReturn {
let columns = row.columns();
let mut out: BTreeMap<String, String> = BTreeMap::new();
for column in columns {
let name = column.name().to_string();
let value = row.get(&name.as_str());
out.insert(name, value);
}
DatabaseReturn(out)
}
#[cfg(feature = "postgres")]
pub fn textify_row(&self, row: sqlx::postgres::PgRow) -> DatabaseReturn {
let columns = row.columns();
let mut out: BTreeMap<String, String> = BTreeMap::new();
for column in columns {
let name = column.name().to_string();
let value = row.get(&name.as_str());
out.insert(name, value);
}
DatabaseReturn(out)
}
#[cfg(feature = "mysql")]
pub fn textify_row(&self, row: sqlx::mysql::MySqlRow) -> DatabaseReturn {
let columns = row.columns();
let mut out: BTreeMap<String, String> = BTreeMap::new();
for column in columns {
let name = column.name().to_string();
match row.try_get::<Vec<u8>, _>(&name.as_str()) {
Ok(value) => {
out.insert(
column.name().to_string(),
std::str::from_utf8(value.as_slice()).unwrap().to_string(),
);
}
Err(_) => {
let value = row.get(&name.as_str());
out.insert(name, value);
}
};
}
DatabaseReturn(out)
}
}