use crate::error::{Result, SyncError};
use crate::DbSyncConf;
use crate::{ADMIN_DB_NAME, LOG_STORAGE_COLL, LOG_STORAGE_DB};
use bson::Document;
use mongodb::sync::{Client, Collection, Database};
#[derive(Clone)]
pub struct Connection<'a> {
inner: ConnectionInner<'a>,
}
impl<'a> Connection<'a> {
pub fn new(config: &DbSyncConf) -> Result<Connection> {
let source_conn = Client::with_uri_str(config.get_src_uri())?;
let target_conn = Client::with_uri_str(config.get_dst_uri())?;
let oplog_storage_conn = Client::with_uri_str(config.get_oplog_storage_uri())?;
Ok(Connection {
inner: ConnectionInner {
source_conn,
target_conn,
oplog_storage_conn,
config,
},
})
}
pub fn check_permissions(&self) -> Result<()> {
self.inner.check_permissions()
}
pub fn get_src_db(&self) -> Database {
self.inner.source_conn.database(self.inner.config.get_db())
}
pub fn get_target_db(&self) -> Database {
self.inner.target_conn.database(self.inner.config.get_db())
}
pub fn time_record_coll(&self) -> Collection<Document> {
self.get_target_db()
.collection(self.inner.config.get_record_collection())
}
pub fn get_target_client(&self) -> Client {
self.inner.target_conn.clone()
}
pub fn oplog_coll(&self) -> Collection<Document> {
self.inner
.oplog_storage_conn
.database(LOG_STORAGE_DB)
.collection(LOG_STORAGE_COLL)
}
pub fn get_target_admin_db(&self) -> Database {
self.inner.target_conn.database(ADMIN_DB_NAME)
}
pub fn get_conf(&self) -> &DbSyncConf {
self.inner.config
}
}
#[derive(Clone)]
struct ConnectionInner<'a> {
source_conn: Client,
target_conn: Client,
oplog_storage_conn: Client,
config: &'a DbSyncConf,
}
impl<'a> ConnectionInner<'a> {
pub fn check_permissions(&self) -> Result<()> {
let db_name = self.config.get_db();
let source_db = self.source_conn.database(db_name);
if let Err(e) = source_db.list_collection_names(None) {
return Err(SyncError::PermissionError {
uri: self.config.get_src_uri().to_string(),
db: db_name.to_string(),
detail: e,
});
}
let target_db = self.target_conn.database(db_name);
if let Err(e) = target_db.list_collection_names(None) {
return Err(SyncError::PermissionError {
uri: self.config.get_dst_uri().to_string(),
db: db_name.to_string(),
detail: e,
});
}
Ok(())
}
}