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