unidb/
utils.rs

1use std::{ io};
2use std::fs;
3use std::collections::HashMap;
4use regex::Regex;
5use std::path::Path;
6use std::fs::File;
7use std::io::BufRead;
8use crate::model::{ColumnType, Value};
9
10pub fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>>
11    where P: AsRef<Path>, {
12    let file = File::open(filename)?;
13    Ok(io::BufReader::new(file).lines())
14}
15
16
17pub fn read_sql(_filepath : &str, arg : &HashMap<String, Value>) -> String {
18
19    let contents = fs::read_to_string(_filepath) .expect("Something went wrong reading the file");
20
21    bind_variables(&contents.trim(), arg)
22}
23pub fn bind_variables(_sql : &str, arg : &HashMap<String, Value>)  -> String{
24
25    let mut sql = String::from(_sql);
26
27    for(key, value) in arg {
28
29        if let Value::String(m) = &value {
30
31            let n = m.replace("'", "''");
32            sql = sql.replace(&format!("#{}#", key), &format!("'{}'", n));
33            sql = sql.replace(&format!(":{}", key), &format!("'{}'", n));
34
35        }
36        if let Value::StringLikeLeft(m) = &value {
37
38            let n = m.replace("'", "''");
39            sql = sql.replace(&format!("#{}#", key), &format!("'%{}'", n));
40            sql = sql.replace(&format!(":{}", key), &format!("'%{}'", n));
41
42        }
43        if let Value::StringLikeRight(m) = &value {
44
45            let n = m.replace("'", "''");
46            sql = sql.replace(&format!("#{}#", key), &format!("'{}%'", n));
47            sql = sql.replace(&format!(":{}", key), &format!("'{}%'", n));
48
49        }
50        if let Value::StringLikeBoth(m) = &value {
51
52            let n = m.replace("'", "''");
53            sql = sql.replace(&format!("#{}#", key), &format!("'%{}%'", n));
54            sql = sql.replace(&format!(":{}", key), &format!("'%{}%'", n));
55
56        }
57        if let Value::Float(m) = &value {
58            sql = sql.replace(&format!("#{}#", key), &format!("{}", m));
59            sql = sql.replace(&format!(":{}", key),&format!("{}", m));
60
61        }
62        if let Value::Float32(m) = &value {
63            sql = sql.replace(&format!("#{}#", key), &format!("{}", m));
64            sql = sql.replace(&format!(":{}", key),&format!("{}", m));
65        }
66        if let Value::Integer(m) = &value {
67            sql = sql.replace(&format!("#{}#", key), &format!("{}", m));
68            sql = sql.replace(&format!(":{}", key), &format!("{}", m));
69
70        }
71        if let Value::Integer32(m) = &value {
72            sql = sql.replace(&format!("#{}#", key), &format!("{}", m));
73            sql = sql.replace(&format!(":{}", key), &format!("{}", m));
74
75        }
76        if let Value::Bool(m) = &value {
77            sql = sql.replace(&format!("#{}#", key), &format!("{}", m));
78            sql = sql.replace(&format!(":{}", key), &format!("{}", m));
79
80        }
81        if let Value::BareString(m) = &value {
82            sql = sql.replace(&format!("#{}#", key), &format!("{}", m));
83            sql = sql.replace(&format!(":{}", key), &format!("{}", m));
84
85        }
86        if let Value::StringArray(list) =&value{
87
88            let mut m = String::new();
89
90            for (i, item) in list.iter().enumerate() {
91                if i > 0 {
92                    m.push_str(", ");
93                }
94
95                let n = item.replace("'", "''");
96                m.push_str(format!("'{}'", n).as_str());
97            }
98            sql = sql.replace(&format!("#{}#", key), &format!("{}", m));
99            sql = sql.replace(&format!(":{}", key), &format!("{}", m));
100
101        }
102        if let Value::IntegerArray(list) =&value{
103
104            let mut m = String::new();
105
106            for (i, item) in list.iter().enumerate() {
107                if i > 0 {
108                    m.push_str(", ");
109                }
110                m.push_str(format!("{}", item).as_str());
111            }
112            sql = sql.replace(&format!("#{}#", key), &format!("{}", m));
113            sql = sql.replace(&format!(":{}", key), &format!("{}", m));
114
115        }
116        if let Value::Integer32Array(list) =&value{
117
118            let mut m = String::new();
119
120            for (i, item) in list.iter().enumerate() {
121                if i > 0 {
122                    m.push_str(", ");
123                }
124                m.push_str(format!("{}", item).as_str());
125            }
126            sql = sql.replace(&format!("#{}#", key), &format!("{}", m));
127            sql = sql.replace(&format!(":{}", key), &format!("{}", m));
128
129        }
130    }
131    // sql = sql.replace("'", "''");
132    sql
133}
134#[deprecated(
135since = "0.5.01",
136note = "Please use the bind_variables instead"
137)]
138pub fn bind_values(value_map : &HashMap<String, Value>) -> String {
139
140    let mut sql = String::new();
141
142    let mut idx = 0;
143    for (_key, value) in value_map {
144
145        if idx > 0 {
146            sql.push_str(", ");
147        }
148        idx = idx + 1;
149
150        if let Value::String(m) = value {
151            sql.push_str("'");
152            sql.push_str(m.replace("'","''").as_str());
153            sql.push_str("'");
154        }
155
156        if let Value::Float(m) = value {
157            sql.push_str(format!("{}", m).as_str());
158        }
159        if let Value::Integer(m) = value {
160            sql.push_str(format!("{}", m).as_str());
161        }
162    }
163    sql
164
165}
166pub fn get_column_type(column_info : &str) -> ColumnType {
167
168//    let re_str = Regex::new("[A-Z]+[0-9]?").unwrap();
169    let re_str = Regex::new("VARCHAR2").unwrap();
170    let re_int = Regex::new("NUMBER\\(\\d+\\)").unwrap();
171    let re_float = Regex::new("NUMBER\\(\\d+,\\d+\\)").unwrap();
172    let re_date = Regex::new("DATE").unwrap();
173
174    if re_str.is_match(column_info) {
175        ColumnType::String
176
177    } else if re_int.is_match(column_info) {
178        ColumnType::Integer
179
180    } else if re_float.is_match(column_info) {
181        ColumnType::Float
182
183    } else if re_date.is_match(column_info) {
184        ColumnType::Date
185
186    }else {
187        ColumnType::String
188    }
189
190}
191
192pub fn get_string_value (arg : Option<&Value>) -> &str {
193    let mut rt = "";
194
195    if let Some(x) = arg {
196
197        if let Value::String(y) = x {
198            rt = y.as_str();
199        }
200    }
201    rt
202}
203pub fn get_integer_value (arg : Option<&Value>) -> &i64 {
204    let mut rt : &i64 = &0;
205
206    if let Some(x) = arg {
207
208        if let Value::Integer(y) = x {
209            rt = y;
210        }
211    }
212    rt
213}
214pub fn get_float_value (arg : Option<&Value>) -> &f64 {
215    let mut rt  = &0.0;
216
217    if let Some(x) = arg {
218
219        if let Value::Float(y) = x {
220            rt = y;
221        }
222    }
223    rt
224}
225
226
227#[cfg(test)]
228mod tests {
229    #[test]
230    fn hello_test (){
231        println!("Hello");
232    }
233}