Skip to content

Commit 1fed20d

Browse files
committed
Query char_set from information_schema
1 parent 547c73c commit 1fed20d

10 files changed

Lines changed: 36 additions & 22 deletions

File tree

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ path = "src/lib.rs"
2727
[dependencies]
2828
futures = { version = "0.3", optional = true }
2929
sea-schema-derive = { version = "0.1.0", path = "sea-schema-derive" }
30-
sea-query = { version = "0.9.1" }
30+
sea-query = { version = "0.9.3" }
3131
sqlx = { version = "0.5", optional = true }
3232

3333
[features]
34-
debug_print = []
34+
debug-print = []
3535
default = [ "discovery" ]
3636
def = [ ]
37-
discovery = [ "futures", "def", "parser", "query" ]
37+
discovery = [ "futures", "parser" ]
3838
parser = [ "def", "query" ]
3939
query = [ ]
4040
sqlx-dep = [ "sqlx" ]

src/mysql/def/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! To represent MySQL's schema definitions
22
3-
mod charset;
3+
mod char_set;
44
mod column;
55
mod foreign_key;
66
mod index;
@@ -10,7 +10,7 @@ mod system;
1010
mod table;
1111
mod types;
1212

13-
pub use charset::*;
13+
pub use char_set::*;
1414
pub use column::*;
1515
pub use foreign_key::*;
1616
pub use index::*;

src/mysql/def/types.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,14 @@ pub enum Type {
4747

4848
#[derive(Clone, Debug, Default, PartialEq)]
4949
pub struct NumericAttr {
50+
/// For integer types, M is the maximum display width (deprecated).
51+
/// For decimal types, M is the total number of digits.
5052
pub maximum: Option<u32>,
53+
/// Number of decimal digits.
5154
pub decimal: Option<u32>,
55+
/// Whether this number is unsigned
5256
pub unsigned: Option<bool>,
57+
/// Deprecated. Prefix 0 up to Z number of digits.
5358
pub zero_fill: Option<bool>,
5459
}
5560

src/mysql/parser/table.rs

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,12 @@ impl TableQueryResult {
99
}
1010

1111
pub fn parse_table_query_result(result: TableQueryResult) -> TableInfo {
12-
let collation = parse_table_collation(result.table_collation.as_str());
13-
1412
TableInfo {
1513
name: result.table_name,
16-
engine: parse_table_engine(result.engine.as_str()),
14+
engine: StorageEngine::from_str(result.engine.as_str()).unwrap(),
1715
auto_increment: result.auto_increment,
18-
char_set: collation.char_set(),
19-
collation,
16+
char_set: CharSet::from_str(result.table_char_set.as_str()).unwrap(),
17+
collation: Collation::from_str(result.table_collation.as_str()).unwrap(),
2018
comment: result.table_comment,
2119
}
2220
}
23-
24-
pub fn parse_table_engine(string: &str) -> StorageEngine {
25-
StorageEngine::from_str(string).unwrap()
26-
}
27-
28-
pub fn parse_table_collation(string: &str) -> Collation {
29-
Collation::from_str(string).unwrap()
30-
}

src/mysql/query/char_set.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#[derive(Debug, sea_query::Iden)]
2+
/// Ref: https://dev.mysql.com/doc/refman/8.0/en/information-schema-collation-character-set-applicability-table.html
3+
pub enum CharacterSetFields {
4+
CharacterSetName,
5+
CollationName,
6+
}

src/mysql/query/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
//! To query MySQL's INFORMATION_SCHEMA
22
3+
mod char_set;
34
mod column;
45
mod constraint;
56
mod index;
67
mod schema;
78
mod table;
89
mod version;
910

11+
pub use char_set::*;
1012
pub use column::*;
1113
pub use constraint::*;
1214
pub use index::*;

src/mysql/query/schema.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,6 @@ pub enum InformationSchema {
2323
Statistics,
2424
KeyColumnUsage,
2525
ReferentialConstraints,
26+
#[iden = "collation_character_set_applicability"]
27+
CollationCharacterSet,
2628
}

src/mysql/query/table.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::rc::Rc;
22
use sea_query::{Expr, Iden, Order, Query, SelectStatement};
33
use crate::sqlx_types::{Row, mysql::MySqlRow};
4-
use super::{InformationSchema, SchemaQueryBuilder};
4+
use super::{InformationSchema, SchemaQueryBuilder, CharacterSetFields};
55

66
#[derive(Debug, sea_query::Iden)]
77
/// Ref: https://dev.mysql.com/doc/refman/8.0/en/information-schema-tables-table.html
@@ -43,13 +43,15 @@ pub struct TableQueryResult {
4343
pub table_name: String,
4444
pub engine: String,
4545
pub auto_increment: Option<u64>,
46+
pub table_char_set: String,
4647
pub table_collation: String,
4748
pub table_comment: String,
4849
pub create_options: String,
4950
}
5051

5152
impl SchemaQueryBuilder {
5253
pub fn query_tables(&self, schema: Rc<dyn Iden>) -> SelectStatement {
54+
type Schema = InformationSchema;
5355
Query::select()
5456
.columns(vec![
5557
TablesFields::TableName,
@@ -59,7 +61,13 @@ impl SchemaQueryBuilder {
5961
TablesFields::TableComment,
6062
TablesFields::CreateOptions,
6163
])
62-
.from((InformationSchema::Schema, InformationSchema::Tables))
64+
.column((Schema::CollationCharacterSet, CharacterSetFields::CharacterSetName))
65+
.from((Schema::Schema, Schema::Tables))
66+
.left_join(
67+
(Schema::Schema, Schema::CollationCharacterSet),
68+
Expr::tbl(Schema::CollationCharacterSet, CharacterSetFields::CollationName)
69+
.equals(Schema::Tables, TablesFields::TableCollation)
70+
)
6371
.and_where(Expr::col(TablesFields::TableSchema).eq(schema.to_string()))
6472
.and_where(Expr::col(TablesFields::TableType).eq(TableType::BaseTable.to_string()))
6573
.order_by(TablesFields::TableName, Order::Asc)
@@ -77,6 +85,7 @@ impl From<&MySqlRow> for TableQueryResult {
7785
table_collation: row.get(3),
7886
table_comment: row.get(4),
7987
create_options: row.get(5),
88+
table_char_set: row.get(6),
8089
}
8190
}
8291
}

src/util.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
#[macro_export]
2-
#[cfg(feature = "debug_print")]
2+
#[cfg(feature = "debug-print")]
33
macro_rules! debug_print {
44
($( $args:expr ),*) => { println!( $( $args ),* ); }
55
}
66

77
#[macro_export]
88
// Non-debug version
9-
#[cfg(not(feature = "debug_print"))]
9+
#[cfg(not(feature = "debug-print"))]
1010
macro_rules! debug_print {
1111
($( $args:expr ),*) => {}
1212
}

0 commit comments

Comments
 (0)