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().map(|v| match v {
472 JsonValue::Short(s) => JsonValue::String(s.as_str().replace("'", "''")),
473 JsonValue::String(s) => JsonValue::String(s.replace("'", "''")),
474 _ => v.clone(),
475 }).collect()
476 )
477 }
478 JsonValue::Object(obj) => {
479 let mut new_obj = object::Object::new();
480 for (k, v) in obj.iter() {
481 let vv = match v {
482 JsonValue::Short(s) => JsonValue::String(s.as_str().replace("'", "''")),
483 JsonValue::String(s) => JsonValue::String(s.replace("'", "''")),
484 _ => v.clone(),
485 };
486 new_obj.insert(k, vv);
487 }
488 JsonValue::Object(new_obj)
489 }
490 _ => value.clone(),
491 };
492 match self {
493 #[cfg(feature = "db-mysql")]
494 Db::Mysql(db) => {
495 db.where_and(field, compare, value);
496 }
497 #[cfg(feature = "db-sqlite")]
498 Db::Sqlite(db) => {
499 db.where_and(field, compare, value);
500 }
501 #[cfg(feature = "db-mssql")]
502 Db::Mssql(db) => {
503 db.where_and(field, compare, value);
504 }
505 #[cfg(feature = "db-pgsql")]
506 Db::Pgsql(db) => {
507 db.where_and(field, compare, value);
508 }
509 _ => {}
510 };
511 self
512 }
513
514 pub fn where_or(&mut self, field: &str, compare: &str, value: JsonValue) -> &mut Self {
515 if field.contains("|") {
516 let fields: Vec<&str> = field.split("|").collect();
517 for field in fields.iter() {
518 self.where_or(field.to_string().as_str(), compare, value.clone());
519 }
520 return self;
521 }
522 let compare = compare.to_lowercase();
523 let compare = compare.replace(" ", "");
524 let compare = compare.as_str();
525
526 let value = match &value {
527 JsonValue::Short(s) => JsonValue::String(s.as_str().replace("'", "''")),
528 JsonValue::String(s) => JsonValue::String(s.replace("'", "''")),
529 JsonValue::Array(arr) => {
530 JsonValue::Array(
531 arr.iter().map(|v| match v {
532 JsonValue::Short(s) => JsonValue::String(s.as_str().replace("'", "''")),
533 JsonValue::String(s) => JsonValue::String(s.replace("'", "''")),
534 _ => v.clone(),
535 }).collect()
536 )
537 }
538 JsonValue::Object(obj) => {
539 let mut new_obj = object::Object::new();
540 for (k, v) in obj.iter() {
541 let vv = match v {
542 JsonValue::Short(s) => JsonValue::String(s.as_str().replace("'", "''")),
543 JsonValue::String(s) => JsonValue::String(s.replace("'", "''")),
544 _ => v.clone(),
545 };
546 new_obj.insert(k, vv);
547 }
548 JsonValue::Object(new_obj)
549 }
550 _ => value.clone(),
551 };
552 match self {
553 #[cfg(feature = "db-mysql")]
554 Db::Mysql(db) => {
555 db.where_or(field, compare, value);
556 }
557 #[cfg(feature = "db-sqlite")]
558 Db::Sqlite(db) => {
559 db.where_or(field, compare, value);
560 }
561 #[cfg(feature = "db-mssql")]
562 Db::Mssql(db) => {
563 db.where_or(field, compare, value);
564 }
565 #[cfg(feature = "db-pgsql")]
566 Db::Pgsql(db) => {
567 db.where_or(field, compare, value);
568 }
569 _ => {}
570 };
571 self
572 }
573 pub fn where_column(&mut self, field_a: &str, compare: &str, field_b: &str) -> &mut Self {
574 match self {
575 #[cfg(feature = "db-mysql")]
576 Db::Mysql(db) => {
577 db.where_column(field_a, compare, field_b);
578 }
579 #[cfg(feature = "db-sqlite")]
580 Db::Sqlite(db) => {
581 db.where_column(field_a, compare, field_b);
582 }
583 #[cfg(feature = "db-mssql")]
584 Db::Mssql(db) => {
585 db.where_column(field_a, compare, field_b);
586 }
587 #[cfg(feature = "db-pgsql")]
588 Db::Pgsql(db) => {
589 db.where_column(field_a, compare, field_b);
590 }
591 _ => {}
592 };
593 self
594 }
595
596 pub fn count(&mut self) -> JsonValue {
597 match self {
598 #[cfg(feature = "db-mysql")]
599 Db::Mysql(db) => db.count(),
600 #[cfg(feature = "db-sqlite")]
601 Db::Sqlite(db) => db.count(),
602 #[cfg(feature = "db-mssql")]
603 Db::Mssql(db) => db.count(),
604 #[cfg(feature = "db-pgsql")]
605 Db::Pgsql(db) => db.count(),
606 _ => JsonValue::from(0),
607 }
608 }
609 pub fn max(&mut self, field: &str) -> JsonValue {
610 match self {
611 #[cfg(feature = "db-mysql")]
612 Db::Mysql(db) => db.max(field),
613 #[cfg(feature = "db-sqlite")]
614 Db::Sqlite(db) => db.max(field),
615 #[cfg(feature = "db-mssql")]
616 Db::Mssql(db) => db.max(field),
617 #[cfg(feature = "db-pgsql")]
618 Db::Pgsql(db) => db.max(field),
619 _ => object! {},
620 }
621 }
622
623 pub fn min(&mut self, field: &str) -> JsonValue {
624 match self {
625 #[cfg(feature = "db-mysql")]
626 Db::Mysql(db) => db.min(field),
627 #[cfg(feature = "db-sqlite")]
628 Db::Sqlite(db) => db.min(field),
629 #[cfg(feature = "db-mssql")]
630 Db::Mssql(db) => db.min(field),
631 #[cfg(feature = "db-pgsql")]
632 Db::Pgsql(db) => db.min(field),
633 _ => object! {},
634 }
635 }
636
637 pub fn sum(&mut self, field: &str) -> JsonValue {
638 match self {
639 #[cfg(feature = "db-mysql")]
640 Db::Mysql(db) => db.sum(field),
641 #[cfg(feature = "db-sqlite")]
642 Db::Sqlite(db) => db.sum(field),
643 #[cfg(feature = "db-mssql")]
644 Db::Mssql(db) => db.sum(field),
645 #[cfg(feature = "db-pgsql")]
646 Db::Pgsql(db) => db.sum(field),
647 _ => object! {},
648 }
649 }
650
651 pub fn avg(&mut self, field: &str) -> JsonValue {
652 match self {
653 #[cfg(feature = "db-mysql")]
654 Db::Mysql(db) => db.avg(field),
655 #[cfg(feature = "db-sqlite")]
656 Db::Sqlite(db) => db.avg(field),
657 #[cfg(feature = "db-mssql")]
658 Db::Mssql(db) => db.avg(field),
659 #[cfg(feature = "db-pgsql")]
660 Db::Pgsql(db) => db.avg(field),
661 _ => object! {},
662 }
663 }
664
665 pub fn select(&mut self) -> JsonValue {
666 match self {
667 #[cfg(feature = "db-mysql")]
668 Db::Mysql(db) => db.select(),
669 #[cfg(feature = "db-sqlite")]
670 Db::Sqlite(db) => db.select(),
671 #[cfg(feature = "db-mssql")]
672 Db::Mssql(db) => db.select(),
673 #[cfg(feature = "db-pgsql")]
674 Db::Pgsql(db) => db.select(),
675 _ => object! {},
676 }
677 }
678
679 pub fn find(&mut self) -> JsonValue {
680 match self {
681 #[cfg(feature = "db-mysql")]
682 Db::Mysql(db) => db.find(),
683 #[cfg(feature = "db-sqlite")]
684 Db::Sqlite(db) => db.find(),
685 #[cfg(feature = "db-mssql")]
686 Db::Mssql(db) => db.find(),
687 #[cfg(feature = "db-pgsql")]
688 Db::Pgsql(db) => db.find(),
689 _ => object! {},
690 }
691 }
692
693 pub fn value(&mut self, field: &str) -> JsonValue {
694 match self {
695 #[cfg(feature = "db-mysql")]
696 Db::Mysql(db) => db.value(field),
697 #[cfg(feature = "db-sqlite")]
698 Db::Sqlite(db) => db.value(field),
699 #[cfg(feature = "db-mssql")]
700 Db::Mssql(db) => db.value(field),
701 #[cfg(feature = "db-pgsql")]
702 Db::Pgsql(db) => db.value(field),
703 _ => Null,
704 }
705 }
706
707 pub fn insert(&mut self, data: JsonValue) -> JsonValue {
708 match self {
709 #[cfg(feature = "db-mysql")]
710 Db::Mysql(db) => db.insert(data.clone()),
711 #[cfg(feature = "db-sqlite")]
712 Db::Sqlite(db) => db.insert(data.clone()),
713 #[cfg(feature = "db-mssql")]
714 Db::Mssql(db) => db.insert(data.clone()),
715 #[cfg(feature = "db-pgsql")]
716 Db::Pgsql(db) => db.insert(data.clone()),
717 _ => JsonValue::from(""),
718 }
719 }
720
721 pub fn insert_all(&mut self, data: JsonValue) -> JsonValue {
722 let data = if data.is_object() {
723 JsonValue::from(vec![data])
724 } else {
725 data
726 };
727 match self {
728 #[cfg(feature = "db-mysql")]
729 Db::Mysql(db) => db.insert_all(data.clone()),
730 #[cfg(feature = "db-sqlite")]
731 Db::Sqlite(db) => db.insert_all(data.clone()),
732 #[cfg(feature = "db-mssql")]
733 Db::Mssql(db) => db.insert_all(data.clone()),
734 #[cfg(feature = "db-pgsql")]
735 Db::Pgsql(db) => db.insert_all(data.clone()),
736 _ => object! {},
737 }
738 }
739
740 pub fn page(&mut self, mut page: i32, limit: i32) -> &mut Self {
741 if page <= 0 {
742 page = 1;
743 }
744 match self {
745 #[cfg(feature = "db-mysql")]
746 Db::Mysql(db) => {
747 db.page(page, limit);
748 }
749 #[cfg(feature = "db-sqlite")]
750 Db::Sqlite(db) => {
751 db.page(page, limit);
752 }
753 #[cfg(feature = "db-mssql")]
754 Db::Mssql(db) => {
755 db.page(page, limit);
756 }
757 #[cfg(feature = "db-pgsql")]
758 Db::Pgsql(db) => {
759 db.page(page, limit);
760 }
761 _ => {}
762 };
763 self
764 }
765
766 pub fn update(&mut self, data: JsonValue) -> JsonValue {
767 match self {
768 #[cfg(feature = "db-mysql")]
769 Db::Mysql(db) => db.update(data.clone()),
770 #[cfg(feature = "db-sqlite")]
771 Db::Sqlite(db) => db.update(data.clone()),
772 #[cfg(feature = "db-mssql")]
773 Db::Mssql(db) => db.update(data.clone()),
774 #[cfg(feature = "db-pgsql")]
775 Db::Pgsql(db) => db.update(data.clone()),
776 _ => JsonValue::from(0),
777 }
778 }
779
780 pub fn update_all(&mut self, data: JsonValue) -> JsonValue {
781 match self {
782 #[cfg(feature = "db-mysql")]
783 Db::Mysql(db) => db.update_all(data.clone()),
784 #[cfg(feature = "db-sqlite")]
785 Db::Sqlite(db) => db.update_all(data.clone()),
786 #[cfg(feature = "db-mssql")]
787 Db::Mssql(db) => db.update_all(data.clone()),
788 #[cfg(feature = "db-pgsql")]
789 Db::Pgsql(db) => db.update_all(data.clone()),
790 _ => JsonValue::from(0),
791 }
792 }
793
794 pub fn get_connection(&mut self) -> Connection {
795 match self {
796 #[cfg(feature = "db-mysql")]
797 Db::Mysql(db) => db.connection.clone(),
798 #[cfg(feature = "db-sqlite")]
799 Db::Sqlite(db) => db.connection.clone(),
800 #[cfg(feature = "db-mssql")]
801 Db::Mssql(db) => db.connection.clone(),
802 #[cfg(feature = "db-pgsql")]
803 Db::Pgsql(db) => db.connection.clone(),
804 _ => Connection::new(""),
805 }
806 }
807 pub fn database_tables(&mut self) -> JsonValue {
808 match self {
809 #[cfg(feature = "db-mysql")]
810 Db::Mysql(db) => db.database_tables(),
811 #[cfg(feature = "db-sqlite")]
812 Db::Sqlite(db) => db.database_tables(),
813 #[cfg(feature = "db-mssql")]
814 Db::Mssql(db) => db.database_tables(),
815 #[cfg(feature = "db-pgsql")]
816 Db::Pgsql(db) => db.database_tables(),
817 _ => JsonValue::Array(vec![]),
818 }
819 }
820 pub fn database_create(&mut self, name: &str) -> bool {
821 match self {
822 #[cfg(feature = "db-mysql")]
823 Db::Mysql(db) => db.database_create(name),
824 #[cfg(feature = "db-sqlite")]
825 Db::Sqlite(db) => db.database_create(name),
826 #[cfg(feature = "db-mssql")]
827 Db::Mssql(db) => db.database_create(name),
828 #[cfg(feature = "db-pgsql")]
829 Db::Pgsql(db) => db.database_create(name),
830 _ => false,
831 }
832 }
833 pub fn backups(&mut self, filename: &str) -> bool {
834 match self {
835 #[cfg(feature = "db-mysql")]
836 Db::Mysql(db) => {
837 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() {
839 Ok(output) => {
840 if output.status.success() {
841 info!("数据库备份完成!");
843 return true;
844 }
845 true
846 }
847 Err(e) => {
848 error!("mysqldump 命令执行失败:{e}");
850 false
851 }
852 }
853 }
854 #[cfg(feature = "db-sqlite")]
855 Db::Sqlite(_db) => false,
856 #[cfg(feature = "db-mssql")]
857 Db::Mssql(_db) => false,
858 #[cfg(feature = "db-pgsql")]
859 Db::Pgsql(_db) => false,
860 _ => false,
861 }
862 }
863
864 pub fn delete(&mut self) -> JsonValue {
865 match self {
866 #[cfg(feature = "db-mysql")]
867 Db::Mysql(db) => db.delete(),
868 #[cfg(feature = "db-sqlite")]
869 Db::Sqlite(db) => db.delete(),
870 #[cfg(feature = "db-mssql")]
871 Db::Mssql(db) => db.delete(),
872 #[cfg(feature = "db-pgsql")]
873 Db::Pgsql(db) => db.delete(),
874 _ => JsonValue::from(0),
875 }
876 }
877 pub fn field(&mut self, name: &str) -> &mut Self {
878 match self {
879 #[cfg(feature = "db-mysql")]
880 Db::Mysql(db) => {
881 db.field(name);
882 }
883 #[cfg(feature = "db-sqlite")]
884 Db::Sqlite(db) => {
885 db.field(name);
886 }
887 #[cfg(feature = "db-mssql")]
888 Db::Mssql(db) => {
889 db.field(name);
890 }
891 #[cfg(feature = "db-pgsql")]
892 Db::Pgsql(db) => {
893 db.field(name);
894 }
895 _ => {}
896 };
897 self
898 }
899 pub fn hidden(&mut self, name: &str) -> &mut Self {
900 match self {
901 #[cfg(feature = "db-mysql")]
902 Db::Mysql(db) => {
903 db.hidden(name);
904 }
905 #[cfg(feature = "db-sqlite")]
906 Db::Sqlite(db) => {
907 db.hidden(name);
908 }
909 #[cfg(feature = "db-mssql")]
910 Db::Mssql(db) => {
911 db.hidden(name);
912 }
913 #[cfg(feature = "db-pgsql")]
914 Db::Pgsql(db) => {
915 db.hidden(name);
916 }
917 _ => {}
918 };
919 self
920 }
921
922 pub fn transaction(&mut self) -> bool {
923 match self {
924 #[cfg(feature = "db-mysql")]
925 Db::Mysql(db) => db.transaction(),
926 #[cfg(feature = "db-sqlite")]
927 Db::Sqlite(db) => db.transaction(),
928 #[cfg(feature = "db-mssql")]
929 Db::Mssql(db) => db.transaction(),
930 #[cfg(feature = "db-pgsql")]
931 Db::Pgsql(db) => db.transaction(),
932 _ => false,
933 }
934 }
935
936 pub fn commit(&mut self) -> bool {
937 match self {
938 #[cfg(feature = "db-mysql")]
939 Db::Mysql(db) => db.commit(),
940 #[cfg(feature = "db-sqlite")]
941 Db::Sqlite(db) => db.commit(),
942 #[cfg(feature = "db-mssql")]
943 Db::Mssql(db) => db.commit(),
944 #[cfg(feature = "db-pgsql")]
945 Db::Pgsql(db) => db.commit(),
946 _ => false,
947 }
948 }
949
950 pub fn rollback(&mut self) -> bool {
951 match self {
952 #[cfg(feature = "db-mysql")]
953 Db::Mysql(db) => db.rollback(),
954 #[cfg(feature = "db-sqlite")]
955 Db::Sqlite(db) => db.rollback(),
956 #[cfg(feature = "db-mssql")]
957 Db::Mssql(db) => db.rollback(),
958 #[cfg(feature = "db-pgsql")]
959 Db::Pgsql(db) => db.rollback(),
960 _ => false,
961 }
962 }
963
964 pub fn sql(&mut self, sql: &str) -> Result<JsonValue, String> {
965 match self {
966 #[cfg(feature = "db-mysql")]
967 Db::Mysql(db) => db.sql(sql),
968 #[cfg(feature = "db-sqlite")]
969 Db::Sqlite(db) => db.sql(sql),
970 #[cfg(feature = "db-mssql")]
971 Db::Mssql(db) => db.sql(sql),
972 #[cfg(feature = "db-pgsql")]
973 Db::Pgsql(db) => db.sql(sql),
974 _ => Err("".to_string()),
975 }
976 }
977
978 pub fn sql_execute(&mut self, sql: &str) -> Result<JsonValue, String> {
979 match self {
980 #[cfg(feature = "db-mysql")]
981 Db::Mysql(db) => db.sql_execute(sql),
982 #[cfg(feature = "db-sqlite")]
983 Db::Sqlite(db) => db.sql_execute(sql),
984 #[cfg(feature = "db-mssql")]
985 Db::Mssql(db) => db.sql_execute(sql),
986 #[cfg(feature = "db-pgsql")]
987 Db::Pgsql(db) => db.sql_execute(sql),
988 _ => Err("".to_string()),
989 }
990 }
991
992 pub fn inc(&mut self, field: &str, num: f64) -> &mut Self {
994 match self {
995 #[cfg(feature = "db-mysql")]
996 Db::Mysql(db) => {
997 db.inc(field, num);
998 }
999 #[cfg(feature = "db-sqlite")]
1000 Db::Sqlite(db) => {
1001 db.inc(field, num);
1002 }
1003 #[cfg(feature = "db-mssql")]
1004 Db::Mssql(db) => {
1005 db.inc(field, num);
1006 }
1007 #[cfg(feature = "db-pgsql")]
1008 Db::Pgsql(db) => {
1009 db.inc(field, num);
1010 }
1011 _ => {}
1012 }
1013 self
1014 }
1015 pub fn dec(&mut self, field: &str, num: f64) -> &mut Self {
1017 match self {
1018 #[cfg(feature = "db-mysql")]
1019 Db::Mysql(db) => {
1020 db.dec(field, num);
1021 }
1022 #[cfg(feature = "db-sqlite")]
1023 Db::Sqlite(db) => {
1024 db.dec(field, num);
1025 }
1026 #[cfg(feature = "db-mssql")]
1027 Db::Mssql(db) => {
1028 db.dec(field, num);
1029 }
1030 #[cfg(feature = "db-pgsql")]
1031 Db::Pgsql(db) => {
1032 db.dec(field, num);
1033 }
1034 _ => {}
1035 }
1036 self
1037 }
1038
1039 pub fn buildsql(&mut self) -> String {
1040 match self {
1041 #[cfg(feature = "db-mysql")]
1042 Db::Mysql(db) => db.buildsql(),
1043 #[cfg(feature = "db-sqlite")]
1044 Db::Sqlite(db) => db.buildsql(),
1045 #[cfg(feature = "db-mssql")]
1046 Db::Mssql(db) => db.buildsql(),
1047 #[cfg(feature = "db-pgsql")]
1048 Db::Pgsql(db) => db.buildsql(),
1049 _ => "".to_string(),
1050 }
1051 }
1052 pub fn join(&mut self, table: &str, main_fields: &str, right_fields: &str) -> &mut Self {
1058 match self {
1059 #[cfg(feature = "db-mysql")]
1060 Db::Mysql(db) => {
1061 db.join(table, main_fields, right_fields);
1062 }
1063 #[cfg(feature = "db-sqlite")]
1064 Db::Sqlite(db) => {
1065 db.join(table, main_fields, right_fields);
1066 }
1067 #[cfg(feature = "db-mssql")]
1068 Db::Mssql(db) => {
1069 db.join(table, main_fields, right_fields);
1070 }
1071 #[cfg(feature = "db-pgsql")]
1072 Db::Pgsql(db) => {
1073 db.join(table, main_fields, right_fields);
1074 }
1075 _ => {}
1076 }
1077 self
1078 }
1079
1080 pub fn join_inner(&mut self, table: &str, main_fields: &str, second_fields: &str) -> &mut Self {
1086 match self {
1087 #[cfg(feature = "db-mysql")]
1088 Db::Mysql(db) => {
1089 db.join_inner(table, main_fields, second_fields);
1090 }
1091 #[cfg(feature = "db-sqlite")]
1092 Db::Sqlite(db) => {
1093 db.join_inner(table, main_fields, second_fields);
1094 }
1095 #[cfg(feature = "db-mssql")]
1096 Db::Mssql(db) => {
1097 db.join_inner(table, main_fields, second_fields);
1098 }
1099 #[cfg(feature = "db-pgsql")]
1100 Db::Pgsql(db) => {
1101 db.join_inner(table, main_fields, second_fields);
1102 }
1103 _ => {}
1104 }
1105 self
1106 }
1107}
1108
1109#[derive(Clone, Debug)]
1111pub struct Table {
1112 pub version: String,
1113 pub table: String,
1114 pub title: String,
1115 pub primary_key: String,
1116 pub unique: Vec<String>,
1117 pub index: Vec<Vec<String>>,
1118 pub fields: JsonValue,
1119 pub partition: bool,
1120 pub partition_columns: JsonValue,
1121}
1122
1123impl Table {
1124 pub fn to_str(self) -> String {
1125 let data = object! {
1126 version:self.version,
1127 table:self.table,
1128 title:self.title,
1129 primary_key:self.primary_key,
1130 unique:self.unique,
1131 index:self.index,
1132 fields:self.fields,
1133 partition:self.partition,
1134 partition_columns:self.partition_columns,
1135 };
1136 data.to_string()
1137 }
1138 pub fn parse(mut data: JsonValue) -> Table {
1139 let mut unique = vec![];
1140 for item in 0..data["unique"].len() {
1141 let str = data["unique"][item].clone().to_string();
1142 unique.push(str);
1143 }
1144 let mut index = vec![];
1145 for item in data["index"].members_mut() {
1146 let mut row = vec![];
1147 for col in item.members_mut() {
1148 row.push(col.to_string());
1149 }
1150 if !row.is_empty() {
1151 index.push(row);
1152 }
1153 }
1154 Self {
1155 version: data["version"].to_string(),
1156 table: data["table"].to_string(),
1157 title: data["title"].to_string(),
1158 primary_key: data["primary_key"].to_string(),
1159 unique,
1160 index,
1161 fields: data["fields"].clone(),
1162 partition: data["partition"].as_bool().unwrap_or(false),
1163 partition_columns: data["partition_columns"].clone(),
1164 }
1165 }
1166}