sea_schema/mysql/parser/
system.rs1use crate::mysql::def::*;
2use crate::mysql::query::VersionQueryResult;
3
4impl VersionQueryResult {
5 pub fn parse(self) -> SystemInfo {
6 parse_version_query_result(self)
7 }
8}
9
10pub fn parse_version_query_result(result: VersionQueryResult) -> SystemInfo {
11 parse_version_string(result.version.as_str())
12}
13
14pub fn parse_version_string(string: &str) -> SystemInfo {
15 let mut system = SystemInfo::default();
16 for (i, part) in string.split('-').enumerate() {
17 if i == 0 {
18 system.version = parse_version_number(part);
19 } else if i == 1 {
20 system.system = part.to_string();
21 } else {
22 system.suffix.push(part.to_owned());
23 }
24 }
25 system
26}
27
28pub fn parse_version_number(string: &str) -> u32 {
29 let mut number: u32 = 0;
30 let numbers: Vec<&str> = string.split('.').collect();
31 #[allow(clippy::len_zero)]
32 if numbers.len() > 0 {
33 number += numbers[0].parse::<u32>().unwrap() * 10000
34 }
35 if numbers.len() > 1 {
36 number += numbers[1].parse::<u32>().unwrap() * 100
37 }
38 if numbers.len() > 2 {
39 number += numbers[2].parse::<u32>().unwrap()
40 }
41 number
42}
43
44#[cfg(test)]
45mod tests {
46 use super::*;
47
48 #[test]
49 fn test_0() {
50 assert_eq!(parse_version_number("5.1.10"), 50110);
51 }
52
53 #[test]
54 fn test_1() {
55 assert_eq!(parse_version_number("8.0.23"), 80023);
56 }
57
58 #[test]
59 fn test_2() {
60 assert_eq!(
61 parse_version_string("8.0.23-0ubuntu0.20.04.1"),
62 SystemInfo {
63 version: 80023,
64 system: "0ubuntu0.20.04.1".to_owned(),
65 suffix: vec![],
66 }
67 )
68 }
69
70 #[test]
71 fn test_3() {
72 assert_eq!(
73 parse_version_string("10.2.31-MariaDB"),
74 SystemInfo {
75 version: 100231,
76 system: "MariaDB".to_owned(),
77 suffix: vec![],
78 }
79 )
80 }
81
82 #[test]
83 fn test_4() {
84 assert_eq!(
85 parse_version_string("10.2.31-MariaDB-debug"),
86 SystemInfo {
87 version: 100231,
88 system: "MariaDB".to_owned(),
89 suffix: vec!["debug".to_owned()],
90 }
91 )
92 }
93}