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
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
168let 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}