use mongodb::bson::Document;
use super::TableInfo;
use crate::error::Result;
use crate::source::mongo::MongoSession;
pub(super) fn connect(url: &str) -> Result<MongoSession> {
MongoSession::connect(url, None, false)
}
pub(super) fn list_tables(session: &MongoSession) -> Result<Vec<String>> {
let names = session.block_on(async {
session
.client()
.database(session.db())
.list_collection_names()
.await
})?;
Ok(names
.into_iter()
.filter(|n| !n.starts_with("system."))
.collect())
}
pub(super) fn introspect(session: &MongoSession, collection: &str) -> Result<TableInfo> {
let count = session
.block_on(async {
session
.client()
.database(session.db())
.collection::<Document>(collection)
.estimated_document_count()
.await
})
.unwrap_or(0);
Ok(TableInfo {
schema: session.db().to_string(),
table: collection.to_string(),
row_estimate: i64::try_from(count).unwrap_or(0),
total_bytes: None,
columns: Vec::new(),
})
}