harn-vm 0.10.28

Async bytecode virtual machine for the Harn programming language
Documentation
use std::time::Duration;

use harn_sqlite::{InitializationError, SchemaVersion};
use rusqlite::Connection;

pub(crate) const DEFAULT_BUSY_TIMEOUT: Duration = Duration::from_secs(5);

pub(crate) type RuntimeSqliteError = InitializationError<rusqlite::Error>;

pub(crate) struct RuntimeSqliteSchema {
    name: &'static str,
    version: i64,
    sql: &'static str,
}

impl RuntimeSqliteSchema {
    pub(crate) const fn new(name: &'static str, version: i64, sql: &'static str) -> Self {
        Self { name, version, sql }
    }

    const fn marker(&self) -> SchemaVersion {
        SchemaVersion::new(self.name, self.version)
    }
}

pub(crate) fn initialize_runtime_sqlite(
    connection: &Connection,
    busy_timeout: Duration,
    schema: &RuntimeSqliteSchema,
) -> Result<(), RuntimeSqliteError> {
    harn_sqlite::initialize_file(connection, busy_timeout, schema.marker(), |transaction| {
        transaction.execute_batch(schema.sql)
    })
}

pub(crate) fn require_runtime_sqlite_initialized(
    connection: &Connection,
    busy_timeout: Duration,
    schema: &RuntimeSqliteSchema,
) -> Result<(), RuntimeSqliteError> {
    harn_sqlite::require_file_initialized::<rusqlite::Error>(
        connection,
        busy_timeout,
        schema.marker(),
    )
}

pub(crate) fn initialize_transient_runtime_sqlite(
    connection: &Connection,
    busy_timeout: Duration,
    schema: &RuntimeSqliteSchema,
) -> Result<(), RuntimeSqliteError> {
    harn_sqlite::initialize_transient(
        connection,
        busy_timeout,
        SchemaVersion::new(schema.name, schema.version),
        |transaction| transaction.execute_batch(schema.sql),
    )
}