spawnflake/datastores/my_sql/
random_values.rs1use crate::{
2 date_generator::datetime::{date_formats, generate_random_date_type},
3 random_number,
4};
5
6use super::const_types::db_types;
7
8pub fn generate_date_time(ctype: &str) -> Option<String> {
9 if ctype.starts_with(db_types::DATETIME) {
10 Some(generate_random_date_type(date_formats::DATETIME_FORMAT))
11 } else if ctype.starts_with(db_types::DATE) {
12 Some(generate_random_date_type(date_formats::DATE_FORMAT))
13 } else if ctype.starts_with(db_types::TIMESTAMP) {
14 Some(generate_random_date_type(date_formats::DATETIME_FORMAT))
15 } else if ctype.starts_with(db_types::TIME) {
16 Some(generate_random_date_type(date_formats::TIME_FORMAT))
17 } else {
18 None
19 }
20}
21
22pub fn generate_numeric(ctype: &str) -> Option<String> {
23 if ctype.starts_with(db_types::TINYINT) {
24 Some(random_number!(i8)(0, i8::MAX).to_string())
25 } else if ctype.starts_with(db_types::UNSINGED_TINYINT) {
26 Some(random_number!(i8)(0, i8::MAX).to_string())
27 } else if ctype.starts_with(db_types::SMALLINT) {
28 Some(random_number!(i16)(0, i16::MAX).to_string())
29 } else if ctype.starts_with(db_types::UNSINGED_SMALLINT) {
30 Some(random_number!(u16)(u16::MIN, u16::MAX).to_string())
31 } else if ctype.starts_with(db_types::MEDIUMINT) {
32 Some(random_number!(i32)(0, 8388607).to_string())
33 } else if ctype.starts_with(db_types::INT) {
34 Some(random_number!(i32)(0, i32::MAX).to_string())
35 } else if ctype.starts_with(db_types::UNSIGNED_INT) {
36 Some(random_number!(u32)(u32::MIN, u32::MAX).to_string())
37 } else if ctype.starts_with(db_types::BIGINT) {
38 Some(random_number!(i64)(0, 2_i64.pow(31) - 1).to_string())
39 } else if ctype.starts_with(db_types::UNSINGED_BIGINT) {
40 Some(random_number!(i64)(0, 2_i64.pow(31) - 1).to_string())
41 } else if ctype.starts_with(db_types::DECIMAL) || ctype.starts_with(db_types::DOUBLE) {
42 let start_bytes = ctype.find('(').unwrap_or(0);
43 let end_bytes = ctype.find(')').unwrap_or(ctype.len());
44
45 let d_size = ctype[(start_bytes + 1)..end_bytes].split(',');
46 let md_size = d_size.collect::<Vec<&str>>();
47 if md_size.len() == 2 {
48 let a = md_size[0].parse::<i32>().unwrap_or(1);
49 let b = md_size[1].parse::<i32>().unwrap_or(1);
50
51 let mut num_a = "".to_string();
52 for _i in 0..a {
53 num_a = format!("{}{}", num_a, 9);
54 }
55
56 if b > 0 {
57 let mut num_b = "".to_string();
58 for _i in 0..b {
59 num_b = format!("{}{}", num_b, 9);
60 }
61 num_a.truncate(i32::abs(num_a.len() as i32 - num_b.len() as i32) as usize);
62 return Some(format!(
63 "{}.{}", random_number!(i64)(0, num_a.parse::<i64>().unwrap_or(1)),
65 random_number!(i64)(0, num_b.parse::<i64>().unwrap_or(1)),
66 ));
67 } else {
68 return Some(format!(
69 "{}",
70 random_number!(i64)(0, num_a.parse::<i64>().unwrap_or(1))
71 ));
72 }
73 }
74 Some(format!(
75 "{}.{}",
76 random_number!(i32)(1, 10),
77 random_number!(i32)(1, 10),
78 ))
79 } else if ctype.starts_with(db_types::FLOAT) {
80 Some(random_number!(f32)(0., f32::MAX).to_string())
81 } else {
82 None
83 }
84}
85
86pub fn select_enum(ctype: &str) -> Option<String> {
87 let start_bytes = ctype.find('(').unwrap_or(0);
88 let end_bytes = ctype.find(')').unwrap_or(ctype.len());
89
90 let enum_collection = &ctype[(start_bytes + 1)..end_bytes];
91 let enum_values: Vec<&str> = enum_collection.split(',').collect();
92 let enum_index = random_number!(usize)(0, enum_values.len());
93 Some(enum_values[enum_index].to_string())
94}
95
96#[cfg(test)]
97mod tests {
98 use crate::datastores::my_sql::random_values::{generate_date_time, generate_numeric};
99
100 #[test]
101 fn generate_numeric_succesfully() {
102 assert!(
103 generate_numeric("int")
104 .unwrap()
105 .parse::<i32>()
106 .unwrap_or(-1)
107 > 0
108 );
109 }
110
111 #[test]
112 fn generate_time_succesfully() {
113 assert!(generate_date_time("time").unwrap().len() == 8);
115 }
116}