81 lines
2.5 KiB
Rust
81 lines
2.5 KiB
Rust
use crate::AsyncBoxError;
|
|
|
|
use super::*;
|
|
|
|
impl Shard {
|
|
pub(super) async fn migrate(&self) -> Result<(), AsyncBoxError> {
|
|
let shard_id = self.id();
|
|
// create tables, indexes, etc
|
|
self.conn
|
|
.call(move |conn| {
|
|
ensure_schema_versions_table(conn)?;
|
|
let schema_rows = load_schema_rows(conn)?;
|
|
|
|
if let Some((version, date_time)) = schema_rows.first() {
|
|
debug!(
|
|
"shard {}: latest schema version: {} @ {}",
|
|
shard_id, version, date_time
|
|
);
|
|
|
|
if *version == 1 {
|
|
// no-op
|
|
} else {
|
|
return Err(tokio_rusqlite::Error::Other(Box::new(ShardError::new(
|
|
format!("shard {}: unsupported schema version {}", shard_id, version),
|
|
))));
|
|
}
|
|
} else {
|
|
debug!("shard {}: no schema version found, initializing", shard_id);
|
|
migrate_to_version_1(conn)?;
|
|
}
|
|
Ok(())
|
|
})
|
|
.await?;
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
fn ensure_schema_versions_table(conn: &rusqlite::Connection) -> Result<usize, rusqlite::Error> {
|
|
conn.execute(
|
|
"CREATE TABLE IF NOT EXISTS schema_version (
|
|
version INTEGER PRIMARY KEY,
|
|
created_at TEXT NOT NULL
|
|
)",
|
|
[],
|
|
)
|
|
}
|
|
|
|
fn load_schema_rows(conn: &rusqlite::Connection) -> Result<Vec<(i64, String)>, rusqlite::Error> {
|
|
let mut stmt = conn
|
|
.prepare("SELECT version, created_at FROM schema_version ORDER BY version DESC LIMIT 1")?;
|
|
let rows = stmt.query_map([], |row| {
|
|
let version = row.get(0)?;
|
|
let created_at = row.get(1)?;
|
|
Ok((version, created_at))
|
|
})?;
|
|
rows.collect()
|
|
}
|
|
|
|
fn migrate_to_version_1(conn: &rusqlite::Connection) -> Result<(), rusqlite::Error> {
|
|
debug!("migrating to version 1");
|
|
conn.execute(
|
|
"CREATE TABLE IF NOT EXISTS entries (
|
|
sha256 BLOB PRIMARY KEY,
|
|
content_type TEXT NOT NULL,
|
|
compression_id INTEGER NOT NULL,
|
|
uncompressed_size INTEGER NOT NULL,
|
|
compressed_size INTEGER NOT NULL,
|
|
data BLOB NOT NULL,
|
|
created_at TEXT NOT NULL
|
|
)",
|
|
[],
|
|
)?;
|
|
|
|
conn.execute(
|
|
"INSERT INTO schema_version (version, created_at) VALUES (1, ?)",
|
|
[chrono::Utc::now().to_rfc3339()],
|
|
)?;
|
|
|
|
Ok(())
|
|
}
|