This commit is contained in:
2026-04-29 17:18:35 +02:00
parent f8a2309173
commit 0b36caf77d
17 changed files with 1593 additions and 11 deletions

View File

@@ -294,6 +294,22 @@ pub(crate) async fn ensure_schema(database: &crate::KbDatabase) -> Result<(), cr
if let Err(error) = result {
return Err(error);
}
let result = create_kb_trade_events_table(pool).await;
if let Err(error) = result {
return Err(error);
}
let result = create_kb_idx_trade_events_pair_id(pool).await;
if let Err(error) = result {
return Err(error);
}
let result = create_kb_idx_trade_events_pool_id(pool).await;
if let Err(error) = result {
return Err(error);
}
let result = create_kb_pair_metrics_table(pool).await;
if let Err(error) = result {
return Err(error);
}
Ok(())
}
}
@@ -1608,3 +1624,92 @@ ON kb_wallet_participations(transaction_id)
)
.await
}
async fn create_kb_trade_events_table(pool: &sqlx::SqlitePool) -> Result<(), crate::KbError> {
execute_sqlite_schema_statement(
pool,
"create_kb_trade_events_table",
r#"
CREATE TABLE IF NOT EXISTS kb_trade_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
dex_id INTEGER NOT NULL,
pool_id INTEGER NOT NULL,
pair_id INTEGER NOT NULL,
transaction_id INTEGER NOT NULL,
decoded_event_id INTEGER NOT NULL UNIQUE,
signature TEXT NOT NULL,
slot INTEGER NULL,
trade_side TEXT NOT NULL,
base_token_id INTEGER NOT NULL,
quote_token_id INTEGER NOT NULL,
base_amount_raw TEXT NULL,
quote_amount_raw TEXT NULL,
price_quote_per_base REAL NULL,
source_kind INTEGER NOT NULL,
source_endpoint_name TEXT NULL,
payload_json TEXT NOT NULL,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
FOREIGN KEY(dex_id) REFERENCES kb_dexes(id) ON DELETE CASCADE,
FOREIGN KEY(pool_id) REFERENCES kb_pools(id) ON DELETE CASCADE,
FOREIGN KEY(pair_id) REFERENCES kb_pairs(id) ON DELETE CASCADE,
FOREIGN KEY(transaction_id) REFERENCES kb_chain_transactions(id) ON DELETE CASCADE,
FOREIGN KEY(decoded_event_id) REFERENCES kb_dex_decoded_events(id) ON DELETE CASCADE,
FOREIGN KEY(base_token_id) REFERENCES kb_tokens(id) ON DELETE CASCADE,
FOREIGN KEY(quote_token_id) REFERENCES kb_tokens(id) ON DELETE CASCADE
)
"#,
)
.await
}
async fn create_kb_idx_trade_events_pair_id(pool: &sqlx::SqlitePool) -> Result<(), crate::KbError> {
execute_sqlite_schema_statement(
pool,
"create_kb_idx_trade_events_pair_id",
r#"
CREATE INDEX IF NOT EXISTS kb_idx_trade_events_pair_id
ON kb_trade_events(pair_id)
"#,
)
.await
}
async fn create_kb_idx_trade_events_pool_id(pool: &sqlx::SqlitePool) -> Result<(), crate::KbError> {
execute_sqlite_schema_statement(
pool,
"create_kb_idx_trade_events_pool_id",
r#"
CREATE INDEX IF NOT EXISTS kb_idx_trade_events_pool_id
ON kb_trade_events(pool_id)
"#,
)
.await
}
async fn create_kb_pair_metrics_table(pool: &sqlx::SqlitePool) -> Result<(), crate::KbError> {
execute_sqlite_schema_statement(
pool,
"create_kb_pair_metrics_table",
r#"
CREATE TABLE IF NOT EXISTS kb_pair_metrics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
pair_id INTEGER NOT NULL UNIQUE,
first_slot INTEGER NULL,
last_slot INTEGER NULL,
first_signature TEXT NULL,
last_signature TEXT NULL,
trade_count INTEGER NOT NULL,
buy_count INTEGER NOT NULL,
sell_count INTEGER NOT NULL,
cumulative_base_amount_raw TEXT NULL,
cumulative_quote_amount_raw TEXT NULL,
last_price_quote_per_base REAL NULL,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
FOREIGN KEY(pair_id) REFERENCES kb_pairs(id) ON DELETE CASCADE
)
"#,
)
.await
}