use crate::{apis::coredb_types::CoreDB, Context};
use chrono::{DateTime, Utc};
use kube::runtime::controller::Action;
use std::sync::Arc;
const WAL_ARCHIVE_STATUS_QUERY: &str = r#"
SELECT
to_char((last_archived_time::timestamp), 'YYYY-MM-DD"T"HH24:MI:SS.US"Z"')
FROM pg_stat_archiver;
"#;
#[derive(Debug, Clone)]
pub struct WalArchiveStatus {
pub last_archived_time: Option<DateTime<Utc>>,
}
pub async fn get_wal_archive_status(
cdb: &CoreDB,
ctx: Arc<Context>,
) -> Result<WalArchiveStatus, Action> {
let query = cdb
.psql(
WAL_ARCHIVE_STATUS_QUERY.to_string(),
"postgres".to_string(),
ctx.clone(),
)
.await?;
let last_archived_time = query.get_field(0).and_then(|s| parse_date_time(&s));
let wal_archive_status = WalArchiveStatus { last_archived_time };
Ok(wal_archive_status)
}
fn parse_date_time(date_str: &str) -> Option<DateTime<Utc>> {
DateTime::parse_from_rfc3339(date_str)
.map(|dt| dt.with_timezone(&Utc))
.ok()
}
pub async fn reconcile_last_archive_status(
cdb: &CoreDB,
ctx: Arc<Context>,
) -> Result<Option<DateTime<Utc>>, Action> {
let wal_archive_status = get_wal_archive_status(cdb, ctx.clone()).await?;
if wal_archive_status.last_archived_time.is_none() {
return Ok(None);
}
Ok(wal_archive_status.last_archived_time)
}