1extern crate core;
2
3use std::path::Path;
4use json::{array, JsonValue, Null, object};
5use lazy_static::lazy_static;
6use std::sync::Mutex;
7use std::collections::HashMap;
8use ::mysql::Pool;
9
10use crate::mssql::Mssql;
11use crate::mysql::Mysql;
12use crate::sqlite::Sqlite;
13
14pub mod pools;
15lazy_static! {
16 pub static ref DB: Mutex<HashMap<String,Db>> =Mutex::new(HashMap::new());
17 pub static ref CONNECTION: Mutex<HashMap<String,Connection>> =Mutex::new(HashMap::new());
18 pub static ref DEFAULT: Mutex<HashMap<usize,String>> =Mutex::new(HashMap::new());
19}
20
21mod sqlite;
22mod mysql;
23mod mssql;
24
25pub trait Mode {
26 fn table_create(&mut self, data: Table) -> bool;
27 fn table_update(&mut self, data: Table) -> bool;
28 fn table_info(&mut self, table: &str) -> JsonValue;
29 fn table_is_exist(&mut self, name: &str) -> bool;
30 fn table(&mut self, name: &str) -> &mut Self;
32
33 fn autoinc(&mut self) -> &mut Self;
35 fn fetch_sql(&mut self) -> &mut Self;
37 fn order(&mut self, field: &str, by: bool) -> &mut Self;
39 fn group(&mut self, field: &str) -> &mut Self;
41 fn distinct(&mut self) -> &mut Self;
43 fn json(&mut self, field: &str) -> &mut Self;
45 fn column(&mut self, field: &str) -> JsonValue;
47 fn where_and(&mut self, field: &str, compare: &str, value: JsonValue) -> &mut Self;
49 fn where_or(&mut self, field: &str, compare: &str, value: JsonValue) -> &mut Self;
50
51 fn where_column(&mut self, field_a: &str, compare: &str, field_b: &str) -> &mut Self;
53
54 fn count(&mut self) -> JsonValue;
56 fn max(&mut self, field: &str) -> JsonValue;
58 fn min(&mut self, field: &str) -> JsonValue;
60 fn sum(&mut self, field: &str) -> JsonValue;
62 fn avg(&mut self, field: &str) -> JsonValue;
64 fn select(&mut self) -> JsonValue;
66 fn find(&mut self) -> JsonValue;
68 fn value(&mut self, field: &str) -> JsonValue;
70 fn insert(&mut self, data: JsonValue) -> JsonValue;
72 fn insert_all(&mut self, data: JsonValue) -> JsonValue;
74 fn page(&mut self, page: i32, limit: i32) -> &mut Self;
76 fn update(&mut self, data: JsonValue) -> JsonValue;
78 fn delete(&mut self) -> JsonValue;
80 fn field(&mut self, name: &str) -> &mut Self;
82 fn hidden(&mut self, name: &str) -> &mut Self;
84 fn pool(&mut self) -> Pool;
86
87 fn transaction(&mut self) -> bool;
89 fn commit(&mut self) -> bool;
91 fn rollback(&mut self) -> bool;
93 fn sql(&mut self, sql: String) -> JsonValue;
95}
96
97
98#[derive(Clone, Debug)]
99pub enum Db {
100 Mysql(Mysql),
101 Sqlite(Sqlite),
102 Mssql(Mssql),
103 None,
104}
105
106impl Db {
107 pub fn new(conf: JsonValue) -> Db {
108 if conf.is_empty() {
109 return Db::None;
110 }
111 let default = conf["default"].as_str().unwrap_or("").to_string();
112 let mut connections = conf["connections"].clone();
113 if connections.is_empty() {
114 connections = object! {};
115 }
116 let connection = Connection::from(connections[default.clone()].clone().into());
117 for (name, conn) in connections.entries() {
118 CONNECTION.lock().unwrap().insert(name.to_string(), Connection::from(conn.clone().into()));
119 }
120 let connections = CONNECTION.lock().unwrap().clone();
121 DEFAULT.lock().unwrap().insert(0, default.clone());
122
123 let db = Db::setlist(connections.clone(), connection.clone(), default.clone());
124 DB.lock().unwrap().insert(default.clone(), db.clone());
125 DB.lock().unwrap().get(&*default.clone()).unwrap().clone()
126 }
127 fn setlist(connections: HashMap<String, Connection>, connection: Connection, default: String) -> Db {
128 match connection.mode.as_str() {
129 "mysql" => {
130 Mysql::connect(connection.clone(), default.clone());
131 Db::Mysql(Mysql {
132 connections: connections.clone(),
133 connection: connection.clone(),
134 default: default.clone(),
135 params: Params::default("mysql"),
136 transaction: 0,
137 })
138 }
139 "sqlite" => {
140 Sqlite::connect(connection.clone(), default.clone());
141 Db::Sqlite(Sqlite {
142 connections: connections.clone(),
143 connection: connection.clone(),
144 default: default.clone(),
145 params: Params::default("sqlite"),
146 transaction: 0,
147 })
148 }
149 "mssql" => {
150 Db::Mssql(Mssql {
151 connections: connections.clone(),
152 connection: connection.clone(),
153 default: default.clone(),
154 params: Params::default("mssql"),
155 })
156 }
157 _ => Db::None
158 }
159 }
160 pub fn connection(&mut self, name: &str) -> Db {
161 let default = DEFAULT.lock().unwrap();
162 let default = default.get(&0).unwrap();
163 let connections = CONNECTION.lock().unwrap().clone();
164 let name = {
165 if name == "" {
166 default
167 } else {
168 name
169 }
170 }.clone();
171
172 let dbmode = DB.lock().unwrap().get(&*name.clone()).is_none();
173 if !dbmode {
174 let db = DB.lock().unwrap().get(&*name.clone()).unwrap().clone();
175 return db;
176 }
177 let connection = connections.get(&*name.clone()).unwrap().clone();
178 let db = Db::setlist(connections.clone(), connection.clone(), name.to_string().clone());
179 DB.lock().unwrap().insert((&*name.clone()).parse().unwrap(), db.clone());
180 db
181 }
182}
183
184impl Mode for Db {
185 fn table(&mut self, name: &str) -> &mut Self {
186 match self {
187 Db::Mysql(db) => {
188 db.table(name);
189 }
190 Db::Sqlite(db) => {
191 db.table(name);
192 }
193 Db::Mssql(db) => {
194 db.table(name);
195 }
196 _ => {}
197 };
198 self
199 }
200 fn table_create(&mut self, data: Table) -> bool {
201 match self {
202 Db::Mysql(db) => {
203 db.table_create(data)
204 }
205 Db::Sqlite(db) => {
206 db.table_create(data)
207 }
208 Db::Mssql(db) => {
209 db.table_create(data)
210 }
211 _ => false
212 }
213 }
214
215 fn table_update(&mut self, data: Table) -> bool {
216 match self {
217 Db::Mysql(db) => {
218 db.table_update(data)
219 }
220 Db::Sqlite(db) => {
221 db.table_update(data)
222 }
223 Db::Mssql(db) => {
224 db.table_update(data)
225 }
226 _ => false
227 }
228 }
229
230 fn table_info(&mut self, table: &str) -> JsonValue {
231 match self {
232 Db::Mysql(db) => {
233 db.table_info(table)
234 }
235 Db::Sqlite(db) => {
236 db.table_info(table)
237 }
238 Db::Mssql(db) => {
239 db.table_info(table)
240 }
241 _ => object! {}
242 }
243 }
244
245 fn table_is_exist(&mut self, name: &str) -> bool {
246 match self {
247 Db::Mysql(db) => {
248 db.table_is_exist(name)
249 }
250 Db::Sqlite(db) => {
251 db.table_is_exist(name)
252 }
253 Db::Mssql(db) => {
254 db.table_is_exist(name)
255 }
256 _ => false
257 }
258 }
259
260 fn order(&mut self, field: &str, by: bool) -> &mut Self {
265 match self {
266 Db::Mysql(db) => {
267 db.order(field, by);
268 }
269 Db::Sqlite(db) => {
270 db.order(field, by);
271 }
272 Db::Mssql(db) => {
273 db.order(field, by);
274 }
275 _ => {}
276 }
277 self
278 }
279
280 fn group(&mut self, field: &str) -> &mut Self {
281 match self {
282 Db::Mysql(db) => {
283 db.group(field);
284 }
285 Db::Sqlite(db) => {
286 db.group(field);
287 }
288 Db::Mssql(db) => {
289 db.group(field);
290 }
291 _ => {}
292 }
293 self
294 }
295
296 fn distinct(&mut self) -> &mut Self {
297 match self {
298 Db::Mysql(db) => {
299 db.distinct();
300 }
301 Db::Sqlite(db) => {
302 db.distinct();
303 }
304 Db::Mssql(db) => {
305 db.distinct();
306 }
307 _ => {}
308 }
309 self
310 }
311
312 fn json(&mut self, field: &str) -> &mut Self {
313 match self {
314 Db::Mysql(db) => {
315 db.json(field);
316 }
317 Db::Sqlite(db) => {
318 db.json(field);
319 }
320 Db::Mssql(db) => {
321 db.json(field);
322 }
323 _ => {}
324 }
325 self
326 }
327
328 fn column(&mut self, field: &str) -> JsonValue {
329 match self {
330 Db::Mysql(db) => {
331 db.column(field)
332 }
333 Db::Sqlite(db) => {
334 db.column(field)
335 }
336 Db::Mssql(db) => {
337 db.column(field)
338 }
339 _ => object! {}
340 }
341 }
342
343 fn where_and(&mut self, field: &str, compare: &str, value: JsonValue) -> &mut Self {
344 if field.contains("|") {
345 let fields: Vec<&str> = field.split("|").collect();
346 for field in fields.iter() {
347 self.where_and(field, compare, value.clone());
348 }
349 return self;
350 }
351 let compare = compare.to_lowercase();
352 let compare = compare.replace(" ", "");
353 let compare = compare.as_str();
354 match self {
355 Db::Mysql(db) => {
356 db.where_and(field.clone(), compare.clone(), value);
357 }
358 Db::Sqlite(db) => {
359 db.where_and(field.clone(), compare.clone(), value);
360 }
361 Db::Mssql(db) => {
362 db.where_and(field.clone(), compare.clone(), value);
363 }
364 _ => {}
365 };
366 self
367 }
368
369 fn where_or(&mut self, field: &str, compare: &str, value: JsonValue) -> &mut Self {
370 if field.contains("|") {
371 let fields: Vec<&str> = field.split("|").collect();
372 for field in fields.iter() {
373 self.where_or(field, compare, value.clone());
374 }
375 return self;
376 }
377 let compare = compare.to_lowercase();
378 let compare = compare.replace(" ", "");
379 let compare = compare.as_str();
380 match self {
381 Db::Mysql(db) => {
382 db.where_or(field.clone(), compare.clone(), value);
383 }
384 Db::Sqlite(db) => {
385 db.where_or(field.clone(), compare.clone(), value);
386 }
387 Db::Mssql(db) => {
388 db.where_or(field.clone(), compare.clone(), value);
389 }
390 _ => {}
391 };
392 self
393 }
394
395 fn count(&mut self) -> JsonValue {
396 match self {
397 Db::Mysql(db) => {
398 db.count()
399 }
400 Db::Sqlite(db) => {
401 db.count()
402 }
403 Db::Mssql(db) => {
404 db.count()
405 }
406 _ => JsonValue::from(0)
407 }
408 }
409
410 fn max(&mut self, field: &str) -> JsonValue {
411 match self {
412 Db::Mysql(db) => {
413 db.max(field)
414 }
415 Db::Sqlite(db) => {
416 db.max(field)
417 }
418 Db::Mssql(db) => {
419 db.max(field)
420 }
421 _ => object! {}
422 }
423 }
424
425 fn min(&mut self, field: &str) -> JsonValue {
426 match self {
427 Db::Mysql(db) => {
428 db.min(field)
429 }
430 Db::Sqlite(db) => {
431 db.min(field)
432 }
433 Db::Mssql(db) => {
434 db.min(field)
435 }
436 _ => object! {}
437 }
438 }
439
440 fn sum(&mut self, field: &str) -> JsonValue {
441 match self {
442 Db::Mysql(db) => {
443 db.sum(field)
444 }
445 Db::Sqlite(db) => {
446 db.sum(field)
447 }
448 Db::Mssql(db) => {
449 db.sum(field)
450 }
451 _ => object! {}
452 }
453 }
454 fn avg(&mut self, field: &str) -> JsonValue {
455 match self {
456 Db::Mysql(db) => {
457 db.avg(field)
458 }
459 Db::Sqlite(db) => {
460 db.avg(field)
461 }
462 Db::Mssql(db) => {
463 db.avg(field)
464 }
465 _ => object! {}
466 }
467 }
468
469 fn select(&mut self) -> JsonValue {
470 match self {
471 Db::Mysql(db) => {
472 db.select()
473 }
474 Db::Sqlite(db) => {
475 db.select()
476 }
477 Db::Mssql(db) => {
478 db.select()
479 }
480 _ => object! {}
481 }
482 }
483
484 fn find(&mut self) -> JsonValue {
485 match self {
486 Db::Mysql(db) => {
487 db.find()
488 }
489 Db::Sqlite(db) => {
490 db.find()
491 }
492 Db::Mssql(db) => {
493 db.find()
494 }
495 _ => object! {}
496 }
497 }
498
499 fn insert(&mut self, data: JsonValue) -> JsonValue {
500 match self {
501 Db::Mysql(db) => {
502 db.insert(data.clone())
503 }
504 Db::Sqlite(db) => {
505 db.insert(data.clone())
506 }
507 Db::Mssql(db) => {
508 db.insert(data.clone())
509 }
510 _ => JsonValue::from("")
511 }
512 }
513
514 fn insert_all(&mut self, mut data: JsonValue) -> JsonValue {
515 if data[0].is_empty() {
516 data = array![data].into();
517 }
518 match self {
519 Db::Mysql(db) => {
520 db.insert_all(data.clone())
521 }
522 Db::Sqlite(db) => {
523 db.insert_all(data.clone())
524 }
525 Db::Mssql(db) => {
526 db.insert_all(data.clone())
527 }
528 _ => object! {}
529 }
530 }
531
532 fn page(&mut self, mut page: i32, limit: i32) -> &mut Self {
533 match self {
534 Db::Mysql(db) => {
535 if page <= 0 {
536 page = 1;
537 }
538 db.page(page.clone(), limit.clone());
539 }
540 Db::Sqlite(db) => {
541 db.page(page.clone(), limit.clone());
542 }
543 Db::Mssql(db) => {
544 if page <= 0 {
545 page = 1;
546 }
547 db.page(page.clone(), limit.clone());
548 }
549 _ => {}
550 };
551 self
552 }
553
554 fn update(&mut self, data: JsonValue) -> JsonValue {
555 match self {
556 Db::Mysql(db) => {
557 db.update(data.clone())
558 }
559 Db::Sqlite(db) => {
560 db.update(data.clone())
561 }
562 Db::Mssql(db) => {
563 db.update(data.clone())
564 }
565 _ => JsonValue::from(0)
566 }
567 }
568
569 fn delete(&mut self) -> JsonValue {
570 match self {
571 Db::Mysql(db) => {
572 db.delete()
573 }
574 Db::Sqlite(db) => {
575 db.delete()
576 }
577 Db::Mssql(db) => {
578 db.delete()
579 }
580 _ => JsonValue::from(0)
581 }
582 }
583
584 fn field(&mut self, name: &str) -> &mut Self {
585 match self {
586 Db::Mysql(db) => {
587 db.field(name.clone());
588 }
589 Db::Sqlite(db) => {
590 db.field(name.clone());
591 }
592 Db::Mssql(db) => {
593 db.field(name.clone());
594 }
595 _ => {}
596 };
597 self
598 }
599
600 fn transaction(&mut self) -> bool {
601 match self {
602 Db::Mysql(db) => {
603 db.transaction()
604 }
605 Db::Sqlite(db) => {
606 db.transaction()
607 }
608 Db::Mssql(db) => {
609 db.transaction()
610 }
611 _ => false
612 }
613 }
614
615 fn commit(&mut self) -> bool {
616 match self {
617 Db::Mysql(db) => {
618 db.commit()
619 }
620 Db::Sqlite(db) => {
621 db.commit()
622 }
623 Db::Mssql(db) => {
624 db.commit()
625 }
626 _ => false
627 }
628 }
629 fn rollback(&mut self) -> bool {
630 match self {
631 Db::Mysql(db) => {
632 db.rollback()
633 }
634 Db::Sqlite(db) => {
635 db.rollback()
636 }
637 Db::Mssql(db) => {
638 db.rollback()
639 }
640 _ => false
641 }
642 }
643
644 fn sql(&mut self, sql: String) -> JsonValue {
645 match self {
646 Db::Mysql(db) => {
647 db.sql(sql)
648 }
649 Db::Sqlite(db) => {
650 db.sql(sql)
651 }
652 Db::Mssql(db) => {
653 db.sql(sql)
654 }
655 _ => object! {}
656 }
657 }
658
659 fn pool(&mut self) -> Pool {
660 match self {
661 Db::Mysql(db) => {
662 db.pool()
663 }
664 Db::Sqlite(db) => {
665 db.pool()
666 }
667 Db::Mssql(db) => {
668 db.pool()
669 }
670 _ => Pool::new("").unwrap()
671 }
672 }
673
674 fn fetch_sql(&mut self) -> &mut Self {
675 match self {
676 Db::Mysql(db) => {
677 db.fetch_sql();
678 }
679 Db::Sqlite(db) => {
680 db.fetch_sql();
681 }
682 Db::Mssql(db) => {
683 db.fetch_sql();
684 }
685 _ => {}
686 };
687 self
688 }
689
690 fn autoinc(&mut self) -> &mut Self {
691 match self {
692 Db::Mysql(db) => {
693 db.autoinc();
694 }
695 Db::Sqlite(db) => {
696 db.autoinc();
697 }
698 Db::Mssql(db) => {
699 db.autoinc();
700 }
701 _ => {}
702 };
703 self
704 }
705
706 fn where_column(&mut self, field_a: &str, compare: &str, field_b: &str) -> &mut Self {
707 match self {
708 Db::Mysql(db) => {
709 db.where_column(field_a, compare, field_b);
710 }
711 Db::Sqlite(db) => {
712 db.where_column(field_a, compare, field_b);
713 }
714 Db::Mssql(db) => {
715 db.where_column(field_a, compare, field_b);
716 }
717 _ => {}
718 };
719 self
720 }
721
722 fn value(&mut self, field: &str) -> JsonValue {
723 match self {
724 Db::Mysql(db) => {
725 db.value(field)
726 }
727 Db::Sqlite(db) => {
728 db.value(field)
729 }
730 Db::Mssql(db) => {
731 db.value(field)
732 }
733 _ => JsonValue::from(Null)
734 }
735 }
736
737 fn hidden(&mut self, name: &str) -> &mut Self {
738 match self {
739 Db::Mysql(db) => {
740 db.hidden(name.clone());
741 }
742 Db::Sqlite(db) => {
743 db.hidden(name.clone());
744 }
745 Db::Mssql(db) => {
746 db.hidden(name.clone());
747 }
748 _ => {}
749 };
750 self
751 }
752}
753
754
755#[derive(Clone, Debug)]
756pub struct Connection {
757 pub mode: String,
758 pub hostname: String,
759 pub hostport: String,
760 pub database: String,
761 pub username: String,
762 pub userpass: String,
763 pub charset: String,
764 pub prefix: String,
765 pub params: Vec<String>,
766 pub debug: bool,
767}
768
769impl Connection {
770 pub fn default() -> Self {
771 Self {
772 mode: "".to_string(),
773 hostname: "".to_string(),
774 hostport: "".to_string(),
775 database: "".to_string(),
776 username: "".to_string(),
777 userpass: "".to_string(),
778 charset: "".to_string(),
779 prefix: "".to_string(),
780 params: vec![],
781 debug: false,
782 }
783 }
784 pub fn from(connection: JsonValue) -> Self {
785 Self {
786 mode: connection["mode"].to_string(),
787 hostname: connection["hostname"].to_string(),
788 hostport: connection["hostport"].to_string(),
789 database: connection["database"].to_string(),
790 username: connection["username"].to_string(),
791 userpass: connection["userpass"].to_string(),
792 charset: connection["charset"].to_string(),
793 prefix: connection["prefix"].to_string(),
794 params: connection["params"].members().map(|x| x.to_string()).collect(),
795 debug: connection["debug"].as_bool().unwrap_or(false),
796 }
797 }
798 pub fn get_dsn(self) -> String {
799 match self.mode.as_str() {
800 "mysql" => {
801 format!("mysql://{}:{}@{}:{}/{}", self.username, self.userpass, self.hostname, self.hostport, self.database)
802 }
803 "sqlite" => {
804 let data = Path::new(self.hostname.as_str());
805 let data = data.join(format!("{}.db", self.database));
806 format!("{}", data.to_str().unwrap())
807 }
808 "mssql" => format!("sqlsrv://{}:{}@{}:{}/{}", self.username, self.userpass, self.hostname, self.hostport, self.database),
809 _ => "".to_string()
810 }
811 }
812}
813
814
815#[derive(Clone, Debug)]
817pub struct Table {
818 pub version: String,
819 pub table: String,
820 pub title: String,
821 pub primary_key: String,
822 pub auto: bool,
823 pub unique: Vec<String>,
824 pub index: Vec<Vec<String>>,
825 pub fields: JsonValue,
826}
827
828impl Table {
829 pub fn to_string(self) -> String {
830 let data = object! {
831 version:self.version,
832 table:self.table,
833 title:self.title,
834 primary_key:self.primary_key,
835 auto:self.auto,
836 unique:self.unique,
837 index:self.index,
838 fields:self.fields
839 };
840 data.to_string()
841 }
842 pub fn parse(mut data: JsonValue) -> Table {
843 let mut unique = vec![];
844 for item in 0..data["unique"].len() {
845 let str = data["unique"][item].clone().to_string();
846 unique.push(str);
847 }
848 let mut index = vec![];
849 for item in data["index"].members_mut() {
850 let mut row = vec![];
851 for col in item.members_mut() {
852 row.push(col.to_string());
853 }
854 if row.len() > 0 {
855 index.push(row);
856 }
857 }
858 Self {
859 version: data["version"].to_string(),
860 table: data["table"].to_string(),
861 title: data["title"].to_string(),
862 primary_key: data["primary_key"].to_string(),
863 auto: data["auto"].as_bool().unwrap(),
864 unique,
865 index,
866 fields: data["fields"].clone(),
867 }
868 }
869}
870
871
872#[derive(Clone, Debug)]
873pub struct Params {
874 pub mode: String,
875 pub autoinc: bool,
876 pub table: String,
877 pub where_and: Vec<String>,
878 pub where_or: Vec<String>,
879 pub where_column: String,
880 pub page: i32,
881 pub limit: i32,
882 pub fields: JsonValue,
883 pub top: String,
884 pub top2: String,
885 pub order: JsonValue,
886 pub group: JsonValue,
887 pub distinct: bool,
888 pub json: JsonValue,
889 pub sql: bool,
890}
891
892impl Params {
893 pub fn default(mode: &str) -> Self {
894 Self {
895 mode: mode.to_string(),
896 autoinc: false,
897 table: "".to_string(),
898 where_and: vec![],
899 where_or: vec![],
900 where_column: "".to_string(),
901 page: -1,
902 limit: 10,
903 fields: object! {},
904 top: String::new(),
905 top2: String::new(),
906 order: object! {},
907 group: object! {},
908 distinct: false,
909 json: object! {},
910 sql: false,
911 }
912 }
913 pub fn where_sql(&mut self) -> String {
914 let mut where_and_sql = vec![];
915 let mut where_or_sql = vec![];
916 let mut sql = vec![];
917
918 for item in self.where_or.iter() {
919 where_or_sql.push(item.clone());
920 }
921 if where_or_sql.len() > 0 {
922 sql.push(where_or_sql.join(" OR "));
923 }
924
925 for item in self.where_and.iter() {
926 where_and_sql.push(item.clone());
927 }
928 if where_and_sql.len() > 0 {
929 sql.push(where_and_sql.join(" AND "));
930 }
931
932 if self.where_column != "" {
933 sql.push(self.where_column.clone());
934 }
935
936 if sql.len() > 0 {
937 return format!("WHERE {}", sql.join(" AND "));
938 }
939 return format!("");
940 }
941 pub fn page_limit_sql(&mut self) -> String {
942 if self.page == -1 {
943 return format!("");
944 }
945 match self.mode.as_str() {
946 "mysql" => {
947 return format!("LIMIT {},{}", self.page * self.limit - self.limit, self.limit);
948 }
949 "sqlite" => {
950 return format!("LIMIT {} OFFSET {}", self.limit, self.page * self.limit - self.limit);
951 }
952 "mssql" => return format!(""),
953 _ => return format!("")
954 }
955 }
956 pub fn fields(&mut self) -> String {
957 let mut fields = vec![];
958 for (_, value) in self.fields.entries() {
959 fields.push(value.to_string());
960 }
961 let fields = {
962 if fields.len() == 0 {
963 "*".into()
964 } else {
965 fields.join(",")
966 }
967 };
968 match self.mode.as_str() {
969 "mysql" => {
970 return format!("{}", fields);
971 }
972 "sqlite" => {
973 return format!("{}", fields);
974 }
975 "mssql" => {
976 return format!("{}", fields);
977 }
978 _ => return format!("{}", fields)
979 }
980 }
981 pub fn top(&mut self) -> String {
982 match self.mode.as_str() {
983 "mssql" => {
984 return format!("{}", self.top);
985 }
986 "mysql" | "sqlite" | _ => {
987 return format!("");
988 }
989 }
990 }
991 pub fn top2(&mut self) -> String {
992 match self.mode.as_str() {
993 "mssql" => {
994 if self.where_and.len() == 0 && self.where_or.len() == 0 {
995 return format!("where {}", self.top2);
996 }
997 return format!("{}", self.top2);
998 }
999 "mysql" | "sqlite" | _ => {
1000 return format!("");
1001 }
1002 }
1003 }
1004 pub fn table(&mut self) -> String {
1005 match self.mode.as_str() {
1006 "mssql" => {
1007 if self.top2 != "" {
1008 return format!("t");
1009 }
1010 return format!("{}", self.table);
1011 }
1012 "mysql" | "sqlite" | _ => {
1013 return format!("{}", self.table);
1014 }
1015 }
1016 }
1017 pub fn order(&mut self) -> String {
1018 let mut sql = vec![];
1019 for (field, item) in self.order.entries() {
1020 sql.push(format!("{} {}", field, item));
1021 }
1022 if sql.len() > 0 {
1023 return format!("ORDER BY {}", sql.join(","));
1024 }
1025 return format!("");
1026 }
1027 pub fn group(&mut self) -> String {
1028 let mut sql = vec![];
1029 for (field, _) in self.group.entries() {
1030 sql.push(format!("{}", field));
1031 }
1032 if sql.len() > 0 {
1033 return format!("GROUP BY {}", sql.join(","));
1034 }
1035 return format!("");
1036 }
1037 pub fn distinct(&self) -> String {
1038 if self.distinct {
1039 return "DISTINCT".to_string();
1040 } else {
1041 return "".to_string();
1042 }
1043 }
1044 pub fn select_sql(&mut self) -> String {
1045 return format!("SELECT {} {} FROM {} {} {} {} {} {} {}", self.distinct(), self.fields(), self.top(), self.table(), self.where_sql(), self.top2(), self.group(), self.order(), self.page_limit_sql());
1046 }
1047}
1048
1049
1050#[derive(Clone, Debug)]
1051pub enum Charset {
1052 Utf8mb4,
1053 Utf8,
1054}
1055
1056impl Charset {
1057 pub fn from(str: &str) -> Charset {
1058 match str {
1059 "utf8" => Charset::Utf8,
1060 "utf8mb4" => Charset::Utf8mb4,
1061 _ => Charset::Utf8mb4
1062 }
1063 }
1064}