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