mod models;
mod operations;
mod schema;
use std::sync::{Arc, RwLock};
use diesel::r2d2::{ConnectionManager, Pool};
use crate::store::pool::ConnectionPool;
use super::error::NodeIdStoreError;
use super::NodeIdStore;
use models::NodeID;
use operations::{
get_node_id::NodeIdGetOperation, set_node_id::NodeIdSetOperation, NodeIdOperations,
};
pub struct DieselNodeIdStore<Conn: diesel::Connection + 'static> {
pool: ConnectionPool<Conn>,
}
impl<C: diesel::Connection> DieselNodeIdStore<C> {
pub fn new(pool: Pool<ConnectionManager<C>>) -> Self {
Self { pool: pool.into() }
}
pub fn new_with_write_exclusivity(
connection_pool: Arc<RwLock<Pool<ConnectionManager<C>>>>,
) -> Self {
Self {
pool: connection_pool.into(),
}
}
}
#[cfg(feature = "postgres")]
impl NodeIdStore for DieselNodeIdStore<diesel::pg::PgConnection> {
fn get_node_id(&self) -> Result<Option<String>, NodeIdStoreError> {
self.pool
.execute_read(|conn| NodeIdOperations::new(conn).get_node_id())
}
fn set_node_id(&self, new_id: String) -> Result<(), NodeIdStoreError> {
self.pool
.execute_write(|conn| NodeIdOperations::new(conn).set_node_id(new_id))
}
}
#[cfg(feature = "sqlite")]
impl NodeIdStore for DieselNodeIdStore<diesel::sqlite::SqliteConnection> {
fn get_node_id(&self) -> Result<Option<String>, NodeIdStoreError> {
self.pool
.execute_read(|conn| NodeIdOperations::new(conn).get_node_id())
}
fn set_node_id(&self, new_id: String) -> Result<(), NodeIdStoreError> {
self.pool
.execute_write(|conn| NodeIdOperations::new(conn).set_node_id(new_id))
}
}