sylvia_iot_broker/models/mongodb/
conn.rs

1use std::{error::Error as StdError, sync::Arc};
2
3use log::{error, info};
4use mongodb::{
5    event::{cmap::CmapEvent, EventHandler},
6    options::ClientOptions,
7    Client, Database,
8};
9
10/// MongoDB connection options.
11pub struct Options {
12    /// MongoDB URL. Use `mongodb://username:password@host:port` format.
13    pub url: String,
14    /// The database.
15    pub db: String,
16    /// Connection pool size.
17    pub pool_size: Option<u32>,
18}
19
20/// Connect to MongoDB.
21pub async fn connect(options: &Options) -> Result<Database, Box<dyn StdError>> {
22    let mut opts = ClientOptions::parse(&options.url).await?;
23    if let Some(pool_size) = options.pool_size {
24        opts.max_pool_size = Some(pool_size);
25    }
26    opts.cmap_event_handler = Some(EventHandler::Callback(Arc::new(event_handler)));
27    let client = Client::with_options(opts)?;
28    client.list_database_names().await?;
29    Ok(client.database(&options.db))
30}
31
32fn event_handler(ev: CmapEvent) {
33    match ev {
34        CmapEvent::PoolCreated(_ev) => {
35            info!("[CmapEvent::PoolCreated]");
36        }
37        CmapEvent::PoolReady(_ev) => {
38            info!("[CmapEvent::PoolReady]");
39        }
40        CmapEvent::PoolCleared(_ev) => {
41            error!("[CmapEvent::PoolCleared]");
42        }
43        CmapEvent::PoolClosed(_ev) => {
44            error!("[CmapEvent::PoolClosed]");
45        }
46        CmapEvent::ConnectionCreated(_ev) => {
47            info!("[CmapEvent::ConnectionCreated]");
48        }
49        CmapEvent::ConnectionReady(_ev) => {
50            info!("[CmapEvent::ConnectionReady]");
51        }
52        CmapEvent::ConnectionClosed(_ev) => {
53            error!("[CmapEvent::ConnectionClosed]");
54        }
55        CmapEvent::ConnectionCheckoutStarted(_ev) => {
56            info!("[CmapEvent::ConnectionCheckoutStarted]");
57        }
58        CmapEvent::ConnectionCheckoutFailed(_ev) => {
59            error!("[CmapEvent::ConnectionCheckoutFailed]");
60        }
61        CmapEvent::ConnectionCheckedOut(_ev) => {
62            info!("[CmapEvent::ConnectionCheckedOut]");
63        }
64        CmapEvent::ConnectionCheckedIn(_ev) => {
65            info!("[CmapEvent::ConnectionCheckedIn]");
66        }
67        _ => {
68            error!("[CmapEvent::Unknown]");
69        }
70    }
71}