1use 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}