Skip to main content

harn_sqlite/
schema.rs

1//! Schema-owning initialization for a database whose tables are one SQL batch.
2
3use std::time::Duration;
4
5use crate::{InitializationError, SchemaVersion};
6use rusqlite::Connection;
7
8pub const DEFAULT_BUSY_TIMEOUT: Duration = Duration::from_secs(5);
9
10pub type RuntimeSqliteError = InitializationError<rusqlite::Error>;
11
12pub struct RuntimeSqliteSchema {
13    name: &'static str,
14    version: i64,
15    sql: &'static str,
16}
17
18impl RuntimeSqliteSchema {
19    pub const fn new(name: &'static str, version: i64, sql: &'static str) -> Self {
20        Self { name, version, sql }
21    }
22
23    const fn marker(&self) -> SchemaVersion {
24        SchemaVersion::new(self.name, self.version)
25    }
26}
27
28pub fn initialize_runtime_sqlite(
29    connection: &Connection,
30    busy_timeout: Duration,
31    schema: &RuntimeSqliteSchema,
32) -> Result<(), RuntimeSqliteError> {
33    initialize_runtime_sqlite_migrating(connection, busy_timeout, schema, |_| Ok(()))
34}
35
36pub fn initialize_runtime_sqlite_migrating(
37    connection: &Connection,
38    busy_timeout: Duration,
39    schema: &RuntimeSqliteSchema,
40    migrate: impl FnOnce(&rusqlite::Transaction<'_>) -> rusqlite::Result<()>,
41) -> Result<(), RuntimeSqliteError> {
42    crate::initialize_file(connection, busy_timeout, schema.marker(), |transaction| {
43        transaction.execute_batch(schema.sql)?;
44        migrate(transaction)
45    })
46}
47
48pub fn require_runtime_sqlite_initialized(
49    connection: &Connection,
50    busy_timeout: Duration,
51    schema: &RuntimeSqliteSchema,
52) -> Result<(), RuntimeSqliteError> {
53    crate::require_file_initialized::<rusqlite::Error>(connection, busy_timeout, schema.marker())
54}
55
56pub fn initialize_transient_runtime_sqlite(
57    connection: &Connection,
58    busy_timeout: Duration,
59    schema: &RuntimeSqliteSchema,
60) -> Result<(), RuntimeSqliteError> {
61    crate::initialize_transient(
62        connection,
63        busy_timeout,
64        SchemaVersion::new(schema.name, schema.version),
65        |transaction| transaction.execute_batch(schema.sql),
66    )
67}