sylvia_iot_data/models/
mod.rs

1//! Traits and implementations for accessing databases and caches.
2//!
3//! Currently we only provide pure MongoDB/SQLite implementation. Mixing implementation is
4//! possible.
5
6use std::{error::Error as StdError, sync::Arc};
7
8use async_trait::async_trait;
9
10pub mod application_dldata;
11pub mod application_uldata;
12pub mod coremgr_opdata;
13pub mod network_dldata;
14pub mod network_uldata;
15
16mod model_mongodb;
17mod model_sqlite;
18mod mongodb;
19mod sqlite;
20
21pub use self::{
22    mongodb::conn::{self as mongodb_conn, Options as MongoDbOptions},
23    sqlite::conn::{self as sqlite_conn, Options as SqliteOptions},
24};
25pub use model_mongodb::Model as MongoDbModel;
26pub use model_sqlite::Model as SqliteModel;
27
28/// Database connection options for model implementation.
29pub enum ConnOptions {
30    // Pure MongoDB model implementation.
31    MongoDB(MongoDbOptions),
32    /// Pure SQLite model implementation.
33    Sqlite(SqliteOptions),
34}
35
36/// The top level trait to get all models (tables/collections).
37#[async_trait]
38pub trait Model: Send + Sync {
39    /// Close database connection.
40    async fn close(&self) -> Result<(), Box<dyn StdError>>;
41
42    /// To get the application downlink data model.
43    fn application_dldata(&self) -> &dyn application_dldata::ApplicationDlDataModel;
44
45    /// To get the application uplink data model.
46    fn application_uldata(&self) -> &dyn application_uldata::ApplicationUlDataModel;
47
48    /// To get the coremgr operation data model.
49    fn coremgr_opdata(&self) -> &dyn coremgr_opdata::CoremgrOpDataModel;
50
51    /// To get the network downlink data model.
52    fn network_dldata(&self) -> &dyn network_dldata::NetworkDlDataModel;
53
54    /// To get the network uplink data model.
55    fn network_uldata(&self) -> &dyn network_uldata::NetworkUlDataModel;
56}
57
58/// To create the database model with the specified database implementation.
59pub async fn new(opts: &ConnOptions) -> Result<Arc<dyn Model>, Box<dyn StdError>> {
60    let model: Arc<dyn Model> = match opts {
61        ConnOptions::MongoDB(opts) => Arc::new(MongoDbModel::new(opts).await?),
62        ConnOptions::Sqlite(opts) => Arc::new(SqliteModel::new(opts).await?),
63    };
64    model.application_dldata().init().await?;
65    model.application_uldata().init().await?;
66    model.coremgr_opdata().init().await?;
67    model.network_dldata().init().await?;
68    model.network_uldata().init().await?;
69    Ok(model)
70}