1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
use super::{CharacterSetFields, InformationSchema, SchemaQueryBuilder};
use crate::sqlx_types::{mysql::MySqlRow, Row};
use sea_query::{Expr, Iden, Order, Query, SeaRc, SelectStatement};
#[derive(Debug, sea_query::Iden)]
pub enum TablesFields {
TableCatalog,
TableSchema,
TableName,
TableType,
Engine,
Version,
RowFormat,
TableRows,
AvgRowLength,
DataLength,
MaxDataLength,
IndexLength,
DataFree,
AutoIncrement,
CreateTime,
UpdateTime,
CheckTime,
TableCollation,
Checksum,
CreateOptions,
TableComment,
}
#[derive(Debug, sea_query::Iden)]
pub enum TableType {
#[iden = "BASE TABLE"]
BaseTable,
View,
#[iden = "SYSTEM VIEW"]
SystemView,
}
#[derive(Debug, Default)]
pub struct TableQueryResult {
pub table_name: String,
pub engine: String,
pub auto_increment: Option<u64>,
pub table_char_set: String,
pub table_collation: String,
pub table_comment: String,
pub create_options: String,
}
impl SchemaQueryBuilder {
pub fn query_tables(&self, schema: SeaRc<dyn Iden>) -> SelectStatement {
type Schema = InformationSchema;
Query::select()
.columns(vec![
TablesFields::TableName,
TablesFields::Engine,
TablesFields::AutoIncrement,
TablesFields::TableCollation,
TablesFields::TableComment,
TablesFields::CreateOptions,
])
.column((
Schema::CollationCharacterSet,
CharacterSetFields::CharacterSetName,
))
.from((Schema::Schema, Schema::Tables))
.left_join(
(Schema::Schema, Schema::CollationCharacterSet),
Expr::tbl(
Schema::CollationCharacterSet,
CharacterSetFields::CollationName,
)
.equals(Schema::Tables, TablesFields::TableCollation),
)
.and_where(Expr::col(TablesFields::TableSchema).eq(schema.to_string()))
.and_where(Expr::col(TablesFields::TableType).eq(TableType::BaseTable.to_string()))
.order_by(TablesFields::TableName, Order::Asc)
.take()
}
}
#[cfg(feature = "sqlx-mysql")]
impl From<&MySqlRow> for TableQueryResult {
fn from(row: &MySqlRow) -> Self {
Self {
table_name: row.get(0),
engine: row.get(1),
auto_increment: row.get(2),
table_collation: row.get(3),
table_comment: row.get(4),
create_options: row.get(5),
table_char_set: row.get(6),
}
}
}
#[cfg(not(feature = "sqlx-mysql"))]
impl From<&MySqlRow> for TableQueryResult {
fn from(row: &MySqlRow) -> Self {
Self::default()
}
}