sea_schema/sqlite/
discovery.rs

1use sea_query::{Alias, Expr, SelectStatement};
2
3use super::def::{IndexInfo, Schema, TableDef};
4pub use super::error::DiscoveryResult;
5use super::executor::{Executor, IntoExecutor};
6use super::query::SqliteMaster;
7use crate::sqlx_types::SqlitePool;
8
9/// Performs all the methods for schema discovery of a SQLite database
10pub struct SchemaDiscovery {
11    pub executor: Executor,
12}
13
14impl SchemaDiscovery {
15    /// Instantiate a new database connection to the database specified
16    pub fn new(sqlite_pool: SqlitePool) -> Self {
17        SchemaDiscovery {
18            executor: sqlite_pool.into_executor(),
19        }
20    }
21
22    /// Discover all the tables in a SQLite database
23    pub async fn discover(&self) -> DiscoveryResult<Schema> {
24        let get_tables = SelectStatement::new()
25            .column(Alias::new("name"))
26            .from(SqliteMaster)
27            .and_where(Expr::col(Alias::new("type")).eq("table"))
28            .and_where(Expr::col(Alias::new("name")).ne("sqlite_sequence"))
29            .to_owned();
30
31        let mut tables = Vec::new();
32        for row in self.executor.fetch_all(get_tables).await? {
33            let mut table: TableDef = (&row).into();
34            table.pk_is_autoincrement(&self.executor).await?;
35            table.get_foreign_keys(&self.executor).await?;
36            table.get_column_info(&self.executor).await?;
37            table.get_constraints(&self.executor).await?;
38            tables.push(table);
39        }
40
41        let indexes = self.discover_indexes().await?;
42
43        Ok(Schema { tables, indexes })
44    }
45
46    /// Discover table indexes
47    pub async fn discover_indexes(&self) -> DiscoveryResult<Vec<IndexInfo>> {
48        let get_tables = SelectStatement::new()
49            .column(Alias::new("name"))
50            .from(SqliteMaster)
51            .and_where(Expr::col(Alias::new("type")).eq("table"))
52            .and_where(Expr::col(Alias::new("name")).ne("sqlite_sequence"))
53            .to_owned();
54
55        let mut discovered_indexes = Vec::new();
56        let rows = self.executor.fetch_all(get_tables).await?;
57        for row in rows {
58            let mut table: TableDef = (&row).into();
59            table.get_indexes(&self.executor).await?;
60            discovered_indexes.append(&mut table.indexes);
61        }
62
63        Ok(discovered_indexes)
64    }
65}