mod connection;
mod reader;
mod storage;
mod writer;
#[cfg(test)]
mod tests;
use std::{
collections::HashSet,
io,
marker::PhantomData,
path::PathBuf,
sync::{Arc, RwLock},
};
use gix_tempfile::{
Handle,
handle::{Writable, persist},
};
use r2d2::Pool;
use r2d2_sqlite::SqliteConnectionManager;
pub type Result<T> = core::result::Result<T, SqliteDatasetError>;
#[derive(thiserror::Error, Debug)]
pub enum SqliteDatasetError {
#[error("IO error: {0}")]
Io(#[from] io::Error),
#[error("Sql error: {0}")]
Sql(#[from] serde_rusqlite::rusqlite::Error),
#[error("Serde error: {0}")]
Serde(#[from] rmp_serde::encode::Error),
#[error("Overwrite flag is set to false and the database file already exists: {0}")]
FileExists(PathBuf),
#[error("Failed to create connection pool: {0}")]
ConnectionPool(#[from] r2d2::Error),
#[error("Could not persist the temporary database file: {0}")]
PersistDbFile(#[from] persist::Error<Writable>),
#[error("{0}")]
Other(&'static str),
}
impl From<&'static str> for SqliteDatasetError {
fn from(s: &'static str) -> Self {
SqliteDatasetError::Other(s)
}
}
#[derive(Debug)]
pub struct SqliteDataset<I> {
db_file: PathBuf,
split: String,
conn_pool: Pool<SqliteConnectionManager>,
columns: Vec<String>,
len: usize,
select_statement: String,
row_serialized: bool,
phantom: PhantomData<I>,
}
#[derive(Clone, Debug)]
pub struct SqliteDatasetStorage {
name: Option<String>,
db_file: Option<PathBuf>,
base_dir: Option<PathBuf>,
}
#[derive(Debug)]
pub struct SqliteDatasetWriter<I> {
db_file: PathBuf,
db_file_tmp: Option<Handle<Writable>>,
splits: Arc<RwLock<HashSet<String>>>,
overwrite: bool,
conn_pool: Option<Pool<SqliteConnectionManager>>,
is_completed: Arc<RwLock<bool>>,
phantom: PhantomData<I>,
}