use tracing::info;
use crate::error::StorageError;
use crate::types::DatabaseConfig;
use super::client::create_database_client;
pub async fn init_database(config: &DatabaseConfig) -> Result<(), StorageError> {
let pool = create_database_client(config).await?;
sqlx::query(
r#"
CREATE TABLE IF NOT EXISTS otherone_session (
session_id VARCHAR(36) PRIMARY KEY,
status SMALLINT NOT NULL DEFAULT 0,
create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
)
"#,
)
.execute(&pool)
.await?;
sqlx::query("CREATE INDEX IF NOT EXISTS idx_session_status ON otherone_session(status)")
.execute(&pool)
.await?;
sqlx::query("CREATE INDEX IF NOT EXISTS idx_session_create_at ON otherone_session(create_at)")
.execute(&pool)
.await?;
sqlx::query(
r#"
CREATE TABLE IF NOT EXISTS otherone_entries (
entry_id VARCHAR(36) PRIMARY KEY,
session_id VARCHAR(36) NOT NULL,
content TEXT NOT NULL,
role VARCHAR(50) NOT NULL,
token_consumption INT DEFAULT 0,
status SMALLINT NOT NULL DEFAULT 0,
tools TEXT,
create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
is_compaction SMALLINT NOT NULL DEFAULT 1
)
"#,
)
.execute(&pool)
.await?;
sqlx::query(
"CREATE INDEX IF NOT EXISTS idx_entries_session_id ON otherone_entries(session_id)",
)
.execute(&pool)
.await?;
sqlx::query("CREATE INDEX IF NOT EXISTS idx_entries_status ON otherone_entries(status)")
.execute(&pool)
.await?;
sqlx::query("CREATE INDEX IF NOT EXISTS idx_entries_create_at ON otherone_entries(create_at)")
.execute(&pool)
.await?;
sqlx::query(
"CREATE INDEX IF NOT EXISTS idx_entries_is_compaction ON otherone_entries(is_compaction)",
)
.execute(&pool)
.await?;
sqlx::query(
r#"
CREATE TABLE IF NOT EXISTS otherone_compacted_entries (
entry_id VARCHAR(36) PRIMARY KEY,
session_id VARCHAR(36) NOT NULL,
trigger_entry_id VARCHAR(36) NOT NULL,
summary TEXT NOT NULL,
create_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
status SMALLINT NOT NULL DEFAULT 0
)
"#,
)
.execute(&pool)
.await?;
sqlx::query(
"CREATE INDEX IF NOT EXISTS idx_compacted_session_id ON otherone_compacted_entries(session_id)",
)
.execute(&pool)
.await?;
sqlx::query(
"CREATE INDEX IF NOT EXISTS idx_compacted_trigger_entry_id ON otherone_compacted_entries(trigger_entry_id)",
)
.execute(&pool)
.await?;
sqlx::query(
"CREATE INDEX IF NOT EXISTS idx_compacted_status ON otherone_compacted_entries(status)",
)
.execute(&pool)
.await?;
sqlx::query(
"CREATE INDEX IF NOT EXISTS idx_compacted_create_at ON otherone_compacted_entries(create_at)",
)
.execute(&pool)
.await?;
pool.close().await;
info!("Database initialized successfully");
Ok(())
}