mod logger;
mod events;
mod config;
mod query;
pub use logger::AuditLogger;
pub use events::{AuditEvent, OperationType, AuditMetadata};
pub use config::AuditConfig;
pub use query::{AuditQuery, AuditFilter};
use crate::Result;
pub fn initialize_audit_tables(storage: &crate::storage::StorageEngine) -> Result<()> {
let catalog = storage.catalog();
let table_exists = catalog.get_table_schema("__audit_log").is_ok();
if !table_exists {
use crate::{Schema, Column, DataType};
let schema = Schema::new(vec![
Column {
name: "id".to_string(),
data_type: DataType::Int8,
nullable: false,
primary_key: true,
source_table: None,
source_table_name: None,
default_expr: None,
unique: false,
storage_mode: crate::ColumnStorageMode::Default,
},
Column {
name: "timestamp".to_string(),
data_type: DataType::Timestamp,
nullable: false,
primary_key: false,
source_table: None,
source_table_name: None,
default_expr: None,
unique: false,
storage_mode: crate::ColumnStorageMode::Default,
},
Column {
name: "session_id".to_string(),
data_type: DataType::Text,
nullable: false,
primary_key: false,
source_table: None,
source_table_name: None,
default_expr: None,
unique: false,
storage_mode: crate::ColumnStorageMode::Default,
},
Column {
name: "user".to_string(),
data_type: DataType::Text,
nullable: false,
primary_key: false,
source_table: None,
source_table_name: None,
default_expr: None,
unique: false,
storage_mode: crate::ColumnStorageMode::Default,
},
Column {
name: "operation".to_string(),
data_type: DataType::Text,
nullable: false,
primary_key: false,
source_table: None,
source_table_name: None,
default_expr: None,
unique: false,
storage_mode: crate::ColumnStorageMode::Default,
},
Column {
name: "target".to_string(),
data_type: DataType::Text,
nullable: true,
primary_key: false,
source_table: None,
source_table_name: None,
default_expr: None,
unique: false,
storage_mode: crate::ColumnStorageMode::Default,
},
Column {
name: "query".to_string(),
data_type: DataType::Text,
nullable: false,
primary_key: false,
source_table: None,
source_table_name: None,
default_expr: None,
unique: false,
storage_mode: crate::ColumnStorageMode::Default,
},
Column {
name: "affected_rows".to_string(),
data_type: DataType::Int8,
nullable: false,
primary_key: false,
source_table: None,
source_table_name: None,
default_expr: None,
unique: false,
storage_mode: crate::ColumnStorageMode::Default,
},
Column {
name: "success".to_string(),
data_type: DataType::Boolean,
nullable: false,
primary_key: false,
source_table: None,
source_table_name: None,
default_expr: None,
unique: false,
storage_mode: crate::ColumnStorageMode::Default,
},
Column {
name: "error".to_string(),
data_type: DataType::Text,
nullable: true,
primary_key: false,
source_table: None,
source_table_name: None,
default_expr: None,
unique: false,
storage_mode: crate::ColumnStorageMode::Default,
},
Column {
name: "checksum".to_string(),
data_type: DataType::Text,
nullable: false,
primary_key: false,
source_table: None,
source_table_name: None,
default_expr: None,
unique: false,
storage_mode: crate::ColumnStorageMode::Default,
},
]);
catalog.create_table("__audit_log", schema)?;
}
use crate::storage::compression::CompressionConfig;
let mut compression_config = CompressionConfig::default();
compression_config.enabled = false;
catalog.set_compression_config("__audit_log", &compression_config)?;
Ok(())
}
#[cfg(test)]
#[allow(clippy::unwrap_used, clippy::expect_used)]
mod tests {
use super::*;
use crate::{Config, storage::StorageEngine};
#[test]
fn test_initialize_audit_tables() {
let config = Config::in_memory();
let storage = StorageEngine::open_in_memory(&config).unwrap();
let result = initialize_audit_tables(&storage);
assert!(result.is_ok());
let catalog = storage.catalog();
let schema = catalog.get_table_schema("__audit_log");
assert!(schema.is_ok());
}
}