1use std::sync::mpsc;
2use std::thread;
3use json::{array, JsonValue, object};
4use crate::{datetime, tools};
5use crate::orm::fields::field;
6use crate::orm::fields::field::Field;
7use crate::orm::mode::mode::Mode;
8use crate::orm::mode::mssql::Mssql;
9use crate::orm::mode::mysql::Mysql;
10
11pub struct Db {
12 model: String,
14 database: String,
16 default: String,
18 connection: JsonValue,
20 connections: JsonValue,
22 prefix: String,
24 idauto: bool,
26 mode: Mode,
27
28 fields: JsonValue,
29 table: String,
31 field: Vec<String>,
32 page: u64,
33 limit: u64,
34 pagelimit: String,
35 order: JsonValue,
37 group: String,
39 fetch_sql: bool,
41 distinct: bool,
43 ids: JsonValue,
45
46 where_and: JsonValue,
47 where_or: JsonValue,
48 where_column: JsonValue,
50 setup: String,
52
53 union: String,
55 union_all: bool,
56}
57
58impl Db {
59 pub fn connect(config: JsonValue) -> Self {
76 let connections = config["connections"].clone();
77 let default = config["default"].to_string();
78 let connection = connections[default.clone()].clone();
79 let database = connection["database"].to_string();
80 let model = connection["type"].to_string();
81 let prefix = connection["prefix"].to_string();
82 let idauto = connection["idauto"].as_bool().unwrap();
83 let mode = Db::_mode(model.as_str(), connection.clone());
84 Self {
85 database,
86 default,
87 connection,
88 connections,
89 model,
90 prefix,
91 idauto,
92 mode,
93
94 table: String::new(),
95 field: vec![],
96 fields: object! {},
97 page: 0,
98 limit: 0,
99 pagelimit: String::new(),
100
101 fetch_sql: false,
102 order: array![],
103 group: String::new(),
104 distinct: false,
105 ids: array![],
106 where_and: array![],
107 where_or: array![],
108 where_column: array![],
109 setup: String::new(),
110 union: String::new(),
111 union_all: false,
112 }
113 }
114 fn _mode(model: &str, connection: JsonValue) -> Mode {
115 match model {
116 "mysql" => {
117 let dsn = format!("mysql://{}:{}@{}:{}/{}", connection["username"], connection["userpass"], connection["hostname"], connection["hostport"], connection["database"]);
118 Mode::Mysql(Mysql::connect(dsn.clone(), connection["database"].to_string()))
119 }
120 "mssql" => {
121 let dsn = format!("mssql://{}:{}@{}:{}/{}", connection["username"], connection["userpass"], connection["hostname"], connection["hostport"], connection["database"]);
122 Mode::Mssql(Mssql::connect(dsn.clone(), connection["database"].to_string()))
123 }
124 _ => {
125 let dsn = format!("mysql://{}:{}@{}:{}/{}", connection["username"], connection["userpass"], connection["hostname"], connection["hostport"], connection["database"]);
126 Mode::Mysql(Mysql::connect(dsn.clone(), connection["database"].to_string()))
127 }
128 }
129 }
130 fn _reset(&mut self) {
132 self.table = String::new();
133 self.field = vec![];
134 self.page = 0;
135 self.limit = 0;
136 self.pagelimit = String::new();
137
138 self.fetch_sql = false;
139 self.order = array![];
140 self.group = String::new();
141 self.distinct = false;
142 self.ids = array![];
143 self.where_and = array![];
144 self.where_or = array![];
145 self.where_column = array![];
146 self.setup = String::new();
147 self.union = String::new();
148 self.union_all = false;
149 }
150 pub fn add_config(mut self, default: &str, config: JsonValue) -> Self {
152 if self.connections[default].is_empty() {
153 self.connections[default] = config;
154 }
155 self
156 }
157 pub fn set_connection(&mut self, default: &str) -> &mut Self {
159 self.default = default.to_string();
160 self.connection = self.connections[default].clone();
161 self.model = self.connection["type"].to_string();
162 self.database = self.connection["database"].to_string();
163 self.mode = Db::_mode(self.model.as_str(), self.connection.clone());
164 self
165 }
166 pub fn get_connections(self) -> JsonValue {
168 return self.connections;
169 }
170 pub fn database(database: &str, config: JsonValue) -> Self {
172 let mut data = Db::connect(config);
173 data.database = database.to_string();
174 data
175 }
176 pub fn query_table(&mut self, table: &str) -> bool {
178 self._reset();
179 self.mode.query_table(table)
180 }
181 pub fn create_table(&mut self, table: &str, fields: JsonValue) -> bool {
183 self._reset();
184 self.table = table.to_string();
185 let title = fields["title"].as_str().unwrap();
186 let key = fields["key"].as_str().unwrap();
187
188 let mut unique_fields = String::new();
190 let mut unique_name = String::new();
191 let mut unique = String::new();
192 for item in fields["unique"].members() {
193 if unique_fields == "" {
194 unique_fields = format!("`{}`", item);
195 unique_name = format!("unique_{}", item);
196 } else {
197 unique_fields = format!("{},`{}`", unique_fields, item);
198 unique_name = format!("{}_{}", unique_name, item);
199 }
200 unique = format!("UNIQUE KEY `{}` ({})", unique_name, unique_fields);
201 }
202
203 let mut index = String::new();
205 for row in fields["index"].members() {
206 let mut index_fields = String::new();
207 let mut index_name = String::new();
208 for item in row.members() {
209 if index_fields == "" {
210 index_fields = format!("`{}`", item);
211 index_name = format!("index_{}", item);
212 } else {
213 index_fields = format!("{},`{}`", index_fields, item);
214 index_name = format!("{}_{}", index_name, item);
215 }
216 }
217 if index == "" {
218 index = format!("INDEX `{}` ({})", index_name, index_fields);
219 } else {
220 index = format!("{},\r\nINDEX `{}` ({})", index, index_name, index_fields);
221 }
222 }
223
224 let auto = fields["auto"].as_bool().unwrap();
225 let mut fieldsql = String::new();
226
227 for (name, field) in fields["fields"].entries() {
228 let row = self._fields(auto, name, field.clone());
229 if fieldsql == "" { fieldsql = format!("\r\n{}", row.clone()) } else { fieldsql = format!("{},\r\n{}", fieldsql, row.clone()); }
230 }
231
232 fieldsql = format!("{},\r\nPRIMARY KEY(`{}`)", fieldsql, key);
233
234 if unique != "" {
235 fieldsql = format!("{},\r\n{}", fieldsql, unique);
236 }
237 if index != "" {
238 fieldsql = format!("{},\r\n{}", fieldsql, index);
239 }
240
241 let charset = self.connection["charset"].to_string();
242 let collate = format!("{}_bin", charset);
243 let sql = format!("create table IF NOT EXISTS {} ({}\r\n) ENGINE = InnoDB CHARSET = '{}' COLLATE '{}' comment '{}'", self._table(), fieldsql, charset, collate, title);
244 let res = self.mode.create_table(sql.as_str().clone());
245 return res;
246 }
247 pub fn update_table(&mut self, table: &str, info: JsonValue) -> bool {
249 self._reset();
250 self.table = table.to_string();
251 let data = self.mode.fieldsinfo(self.table.as_str());
252 let mut add = object! {};
253 let mut del = object! {};
254 let mut put = object! {};
255 let auto = info["auto"].as_bool().unwrap();
257 let fields = info["fields"].clone();
258 for (field, item) in fields.entries() {
259 if data[field].is_empty() {
260 add[field] = item.clone();
261 } else {
262 let old = data[field].clone();
263 let new = item.clone();
264
265 let oldtext = format!("{}|{}|def:{}|r:{}|l:{}|{}|{}|{}|{}|{}", old["title"], old["mode"], old["def"], old["require"], old["length"], old["option"], old["dec"], old["api"], old["table"], old["fields"]);
266 let newtext = format!("{}|{}|def:{}|r:{}|l:{}|{}|{}|{}|{}|{}", new["title"], new["mode"], new["def"], new["require"], new["length"], new["option"], new["dec"], new["api"], new["table"], new["fields"]);
267 if oldtext != newtext {
268 println!("old> {}", old);
269 println!("new> {}", new);
270 println!("old> {}", oldtext);
271 println!("new> {}", newtext);
272 put[field] = item.clone();
273 continue;
274 }
275 }
276 }
277 for (field, item) in data.entries() {
278 if fields[field].is_empty() {
279 del[field] = item.clone();
280 }
281 }
282 let mut sql = array![];
283
284 for (field, _) in del.entries() {
290 sql.push(format!("ALTER TABLE {} DROP {}", table, field)).unwrap();
291 }
292 for (field, item) in add.entries() {
293 sql.push(format!("ALTER TABLE {} ADD COLUMN({})", table, self._fields(auto.clone(), field, item.clone()))).unwrap();
294 }
295 for (field, item) in put.entries() {
296 sql.push(format!("ALTER TABLE {} CHANGE {} {}", table, field, self._fields(auto.clone(), field, item.clone()))).unwrap();
297 }
298
299 let mut unique_fields = String::new();
301 let mut unique_name = String::new();
302 let unique = {
303 let mut unique=String::new();
304 for item in fields["unique"].members() {
305 if unique_fields == "" {
306 unique_fields = format!("`{}`", item);
307 unique_name = format!("unique_{}", item);
308 } else {
309 unique_fields = format!("{},`{}`", unique_fields, item);
310 unique_name = format!("{}_{}", unique_name, item);
311 }
312 unique = format!("UNIQUE KEY `{}` ({})", unique_name, unique_fields);
313 }
314 unique
315 };
316
317 let mut index = String::new();
319 for row in fields["index"].members() {
320 let mut index_fields = String::new();
321 let mut index_name = String::new();
322 for item in row.members() {
323 if index_fields == "" {
324 index_fields = format!("`{}`", item);
325 index_name = format!("index_{}", item);
326 } else {
327 index_fields = format!("{},`{}`", index_fields, item);
328 index_name = format!("{}_{}", index_name, item);
329 }
330 }
331 if index == "" {
332 index = format!("INDEX `{}` ({})", index_name, index_fields);
333 } else {
334 index = format!("{},\r\nINDEX `{}` ({})", index, index_name, index_fields);
335 }
336 }
337
338 if unique != "" {
339 sql.push(format!("ALTER TABLE {} ADD {}", table, unique)).unwrap();
340 }
341 if index != "" {
342 sql.push(format!("ALTER TABLE {} ADD {}", table, index)).unwrap();
343 }
344 let mut error = true;
347 for item in sql.members() {
348 let res = self.mode.update_table(item.as_str().unwrap());
349 println!("{} {}", res, item);
350 if !res {
351 error = false;
352 }
353 }
354 return error;
355 }
356
357 pub fn fieldsinfo(&mut self) -> JsonValue {
359 let mut data = self.mode.fieldsinfo(self.table.as_str());
360 let fields = self.field.clone();
361 let mut list = array![];
362
363 fn row_data(field: &str, mut item: JsonValue) -> JsonValue {
364 item["label"] = item["title"].clone();
365 item["field"] = field.clone().into();
366 item["name"] = field.clone().into();
367 return item;
368 }
369
370 if fields.is_empty() {
371 for (field, item) in data.entries_mut() {
372 let row = row_data(field.clone().into(), item.clone());
373 list.push(row.clone()).unwrap();
374 self.fields[self.table.as_str().clone()][field.clone()] = row.clone();
375 }
376 return list;
377 }
378 for (field, item) in data.entries_mut() {
379 for index in fields.iter() {
380 if index == field {
381 let row = row_data(field.clone().into(), item.clone());
382 list.push(row.clone()).unwrap();
383 self.fields[self.table.as_str().clone()][field.clone()] = row.clone();
384 }
385 }
386 }
387 return list;
388 }
389 pub fn fieldsinfo_obj(&mut self) -> JsonValue {
390 self.fieldsinfo();
391 return self.fields[self.table.as_str().clone()].clone();
392 }
393 fn _fields(&mut self, auto: bool, field: &str, data: JsonValue) -> String {
395 let mut row = format!("");
396 let mode = data["mode"].as_str().unwrap();
397 let require = data["require"].as_bool().unwrap_or(false);
398 let title = data["title"].as_str().unwrap_or("未知标题");
399 match mode {
400 "key" => {
401 let length = data["length"].as_i32().unwrap();
402 row = field::Key::field(field, title, length, auto).sql();
403 }
404 "pass" => {
405 let default = data["def"].as_str().unwrap();
406 let length = data["length"].as_i32().unwrap();
407 row = field::Str::pass(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).sql();
408 }
409 "string" => {
410 let default = data["def"].as_str().unwrap_or("");
411 let length = data["length"].as_i32().unwrap_or(20);
412 row = field::Str::string(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).sql();
413 }
414 "table" => {
415 let table = data["table"].as_str().unwrap();
416 let fields = data["fields"].as_str().unwrap();
417 let api = data["api"].as_str().unwrap();
418 row = field::Table::field(require.clone(), field.clone(), title.clone(),
419 table.clone(), fields.clone(), "", api.clone()).sql();
420 }
421 "text" => {
422 let default = data["def"].as_str().unwrap_or("");
423 row = field::Text::field(require.clone(), field.clone(), title.clone(), default.clone()).sql();
424 }
425 "file" => {
426 let default = data["def"].as_str().unwrap_or("");
427 let length = data["length"].as_i32().unwrap_or(1);
428 row = field::File::field(require.clone(), field.clone(), title.clone(), length.clone(), default.clone()).sql();
429 }
430 "number" => {
431 let length = data["length"].as_i32().unwrap();
432 let dec = data["dec"].as_i32().unwrap();
433 let default = data["def"].as_f32().unwrap();
434 row = field::Number::field(require.clone(), field.clone(), title.clone(),
435 length.clone(), dec.clone(),
436 default.clone()).sql();
437 }
438 "switch" => {
439 let default = data["def"].as_bool().unwrap_or(false);
440 row = field::Switch::field(require.clone(), field.clone(), title.clone(),
441 default.clone()).sql();
442 }
443 "datetime" => {
444 let default = data["def"].as_str().unwrap();
445 row = field::Date::datetime(require.clone(), field.clone(), title.clone(),
446 default.clone()).sql();
447 }
448 "year" => {
449 let default = data["def"].as_str().unwrap();
450 row = field::Date::year(require.clone(), field.clone(), title.clone(),
451 default.clone()).sql();
452 }
453 "date" => {
454 let default = data["def"].as_str().unwrap();
455 row = field::Date::date(require.clone(), field.clone(), title.clone(),
456 default.clone()).sql();
457 }
458 "time" => {
459 let default = data["def"].as_str().unwrap();
460 row = field::Date::time(require.clone(), field.clone(), title.clone(),
461 default.clone()).sql();
462 }
463 "timestamp" => {
464 let dec = data["dec"].as_i32().unwrap();
465 let default = data["def"].as_f64().unwrap_or(0.0);
466 row = field::Timestamp::timestamp(require.clone(), field.clone(), title.clone(),
467 dec.clone(), default.clone()).sql();
468 }
469 "select" => {
470 let option = data["option"].clone();
471 let multiple = data["multiple"].as_bool().unwrap();
472 row = field::Select::field(require.clone(), field.clone(), title.clone(),
473 option.clone(), multiple.clone(), data["def"].clone()).sql();
474 }
475 _ => {}
476 }
477 format!("{}", row.clone())
478 }
479 pub fn delete_table(&mut self, table: &str, all: bool) -> bool {
483 self._reset();
484 self.table = table.to_string();
485 let sql = {
486 if all {
487 format!("drop table {}", self._table())
488 } else {
489 format!("truncate table {}", self.table)
490 }
491 };
492 return self.mode.delete_table(sql.as_str());
493 }
494 fn _where_sql(&mut self) -> String {
496 let wheres = {
497 let mut sql = {
498 if self.where_and.len() <= 0 && self.where_or.len() <= 0
499 {
500 "".to_string()
501 } else {
502 let mut where_and = "".to_string();
503 for item in self.where_and.members() {
504 match item[1].as_str().unwrap() {
505 "between" => {
506 if where_and == "" {
507 where_and = format!("`{}` BETWEEN '{}' AND '{}'", item[0], item[2][0], item[2][1]);
508 } else {
509 where_and = format!("{} AND `{}` BETWEEN '{}' AND '{}'", where_and, item[0], item[2][0], item[2][1]);
510 }
511 }
512 "notbetween" => {
513 if where_and == "" {
514 where_and = format!("`{}` NOT BETWEEN '{}' AND '{}'", item[0], item[2][0], item[2][1]);
515 } else {
516 where_and = format!("{} AND {} NOT BETWEEN '{}' AND '{}'", where_and, item[0], item[2][0], item[2][1]);
517 }
518 }
519 "null" => {
520 let herad = {
521 if where_and == "" {
522 where_and
523 } else {
524 format!("{} AND", where_and)
525 }
526 };
527 if item[2].as_bool().unwrap() {
528 where_and = format!("{} `{}` IS NULL", herad, item[0]);
529 } else {
530 where_and = format!("{} `{}` IS NOT NULL", herad, item[0]);
531 }
532 }
533 "in" => {
534 let inlist = {
535 let mut list = "".to_string();
536 for item in item[2].members() {
537 if list == "" {
538 list = format!("\"{}\"", item);
539 } else {
540 list = format!("{},\"{}\"", list, item);
541 }
542 }
543 list
544 };
545 if where_and == "" {
546 where_and = format!("`{}` {} ({})", item[0], item[1], inlist);
547 } else {
548 where_and = format!("{} AND `{}` {} ({})", where_and, item[0], item[1], inlist);
549 }
550 }
551 "notin" => {
552 let inlist = {
553 let mut list = "".to_string();
554 for item in item[2].members() {
555 if list == "" {
556 list = format!("\"{}\"", item);
557 } else {
558 list = format!("{},\"{}\"", list, item);
559 }
560 }
561 list
562 };
563 if where_and == "" {
564 where_and = format!("`{}` NOT IN ({})", item[0], inlist);
565 } else {
566 where_and = format!("{} AND `{}` NOT IN ({})", where_and, item[0], inlist);
567 }
568 }
569 _ => {
570 let key = item[0].clone();
571 let key = tools::string::split(key.to_string(), "|");
572 if key.len() > 1 {
573 let mut tx = "".to_string();
574 for keys in key.members() {
575 if tx == "" {
576 tx = format!("`{}` {} \"{}\"", keys, item[1], item[2]);
577 } else {
578 tx = format!("{} OR `{}` {} \"{}\"", tx, keys, item[1], item[2]);
579 }
580 }
581 if where_and == "" {
582 where_and = format!("{}", tx);
583 } else {
584 where_and = format!("{} AND ({})", where_and, tx);
585 }
586 } else {
587 if where_and == "" {
588 where_and = format!("`{}` {} \"{}\"", item[0], item[1], item[2]);
589 } else {
590 where_and = format!("{} AND `{}` {} \"{}\"", where_and, item[0], item[1], item[2]);
591 }
592 }
593 }
594 }
595 }
596 if self.where_or.len() > 0 && where_and != "" {
597 where_and = format!("({}) OR", where_and);
598 }
599 let mut where_or = "".to_string();
600
601 for item in self.where_or.members() {
602 match item[1].as_str().unwrap() {
603 "null" => {
604 let herad = {
605 if where_and == "" {
606 where_and
607 } else {
608 format!("{} OR", where_and)
609 }
610 };
611 if item[2].as_bool().unwrap() {
612 where_and = format!("{} `{}` IS NULL", herad, item[0]);
613 } else {
614 where_and = format!("{} `{}` IS NOT NULL", herad, item[0]);
615 }
616 }
617 "in" => {
618 let inlist = {
619 let mut list = "".to_string();
620 for item in item[2].members() {
621 if list == "" {
622 list = format!("\"{}\"", item);
623 } else {
624 list = format!("{},\"{}\"", list, item);
625 }
626 }
627 list
628 };
629 if where_or == "" {
630 where_or = format!("`{}` IN ({})", item[0], inlist);
631 } else {
632 where_or = format!("{} OR `{}` IN ({})", where_or, item[0], inlist);
633 }
634 }
635 "notin" => {
636 let inlist = {
637 let mut list = "".to_string();
638 for item in item[2].members() {
639 if list == "" {
640 list = format!("\"{}\"", item);
641 } else {
642 list = format!("{},\"{}\"", list, item);
643 }
644 }
645 list
646 };
647 if where_or == "" {
648 where_or = format!("`{}` NOT IN ({})", item[0], inlist);
649 } else {
650 where_or = format!("{} OR `{}` NOT IN ({})", where_or, item[0], inlist);
651 }
652 }
653 "between" => {
654 if where_or == "" {
655 where_or = format!("`{}` BETWEEN {} AND {}", item[0], item[2][0], item[2][1]);
656 } else {
657 where_or = format!("{} OR `{}` BETWEEN {} AND {}", where_or, item[0], item[2][0], item[2][1]);
658 }
659 }
660 "notbetween" => {
661 if where_or == "" {
662 where_or = format!("`{}` NOT BETWEEN {} AND {}", item[0], item[2][0], item[2][1]);
663 } else {
664 where_or = format!("{} OR `{}` NOT BETWEEN {} AND {}", where_or, item[0], item[2][0], item[2][1]);
665 }
666 }
667 _ => {
668 let key = item[0].clone();
669 let key = tools::string::split(key.to_string(), "|");
670 if key.len() > 1 {
671 let mut tx = "".to_string();
672 for keys in key.members() {
673 if tx == "" {
674 tx = format!("`{}` {} \"{}\"", keys, item[1], item[2]);
675 } else {
676 tx = format!("{} OR `{}` {} \"{}\"", tx, keys, item[1], item[2]);
677 }
678 }
679 if where_or == "" {
680 where_or = format!("{}", tx);
681 } else {
682 where_or = format!("{} OR ({})", where_and, tx);
683 }
684 } else {
685 if where_or == "" {
686 where_or = format!("`{}` {} \"{}\"", item[0], item[1], item[2]);
687 } else {
688 where_or = format!("{} OR `{}` {} \"{}\"", where_or, item[0], item[1], item[2]);
689 }
690 }
691 }
692 }
693 }
694 format!("WHERE {} {}", where_and, where_or)
695 }
696 };
697 if self.where_column.len() > 0 {
698 let mut where_column = "".to_string();
699 for item in self.where_column.members() {
700 if where_column == "" {
701 where_column = format!("`{}` {} `{}`", item[0], item[1], item[2]);
702 } else {
703 where_column = format!("{} AND `{}` {} `{}`", where_column, item[0], item[1], item[2]);
704 }
705 }
706 if sql.is_empty() {
707 sql = format!("WHERE ({})", where_column);
708 } else {
709 sql = format!("{} AND ({})", sql, where_column);
710 }
711 }
712 sql
713 };
714 wheres
715 }
716 fn _table(&mut self) -> String {
718 let table = {
719 if self.prefix == "" {
720 self.table.clone()
721 } else {
722 format!("{}{}", self.prefix, self.table)
723 }
724 };
725 if self.database == "" {
726 table.clone()
727 } else {
728 format!("`{}`.`{}`", self.database, table)
729 }
730 }
731 fn _select(&mut self) -> String {
733 let table = self._table();
734 let field = {
735 let mut field = String::new();
736 for item in self.field.iter() {
737 if field == "" {
738 field = item.clone();
739 } else {
740 field = format!("{},{}", field, item)
741 }
742 }
743 if field == "" {
744 field = "*".to_string()
745 }
746 if self.distinct {
747 field = format!("DISTINCT {}", field)
748 }
749 field
750 };
751 let order = {
752 let mut order = "".to_string();
753 for item in self.order.members() {
754 if order == "" {
755 order = format!("ORDER BY {} {}", item[0], item[1]);
756 } else {
757 order = format!("{},{} {}", order, item[0], item[1]);
758 }
759 }
760 order
761 };
762 let wheres = self._where_sql();
763 let union = {
764 if self.union == "" {
765 self.union.to_string()
766 } else {
767 if self.union_all {
768 format!("UNION ALL SELECT {} FROM {} {}", field, self.union, wheres)
769 } else {
770 format!("UNION SELECT {} FROM {} {}", field, self.union, wheres)
771 }
772 }
773 };
774 return format!("SELECT {} FROM {} {} {} {} {} {}", field, table, wheres, union, order, self.group, self.pagelimit);
775 }
776 fn _insert(&mut self, data: JsonValue) -> String {
778 self.ids = array![];
779 let table = self._table();
780 let mut fields = "".to_string();
781 let (tx, rx) = mpsc::channel();
782 let mut fields_data = data[0].clone();
783 let idauto = self.idauto;
784 thread::spawn(move || {
785 let mut fields = "".to_string();
786 if !idauto {
787 if fields_data["id"].is_empty() {
788 fields_data["id"] = "".into();
789 }
790 }
791 for (k, _v) in fields_data.entries() {
792 if fields == "" {
793 fields = format!("`{}`", k);
794 } else {
795 fields = format!("{},`{}`", fields, k);
796 }
797 }
798 tx.send(fields).unwrap();
799 });
800
801 for recived in rx {
802 fields = recived
803 }
804
805 let mut thrs = vec![];
806
807 let len = data.len();
808 let num = {
809 if len <= 100 {
810 10
811 } else if len > 100 && len <= 1000 {
812 100
813 } else if len > 1000 && len < 10000 {
814 500
815 } else if len >= 10000 && len < 100000 {
816 1000
817 } else {
818 3000
819 }
820 };
821 let count = len / num + 1;
822 let fields_infos = self.mode.fieldsinfo(self.table.as_str());
823 for index in 0..count {
824 let start = {
825 if index > 0 {
826 index * num
827 } else {
828 index * num
829 }
830 };
831 let end = {
832 let endlen = (index + 1) * num;
833 if len > endlen {
834 endlen
835 } else {
836 len
837 }
838 };
839 let list = data.clone();
840 let pcindex = index.to_string().parse::<i64>().unwrap();
841 let fields_info = fields_infos.clone();
842 let idauto = self.idauto;
843 let thr = thread::spawn(move || {
844 let mut values = "".to_string();
845 let mut ids = vec![];
846 for index in start..end {
847 let mut item = list[index.clone()].clone();
848 if item["id"].is_empty() {
849 if !idauto {
850 let id = datetime::timestamp::timestamp("us") + pcindex;
851 item["id"] = format!("{:X}", id).into();
852 }
853 }
854 ids.push(item["id"].clone());
855 let mut row = "".to_string();
856 for (k, v) in item.entries() {
857 let key = fields_info[k].clone();
858 let mode = key["mode"].as_str().unwrap();
859 match mode {
860 "switch" => {
861 let t = {
862 if v.clone() == JsonValue::from(1) {
863 true
864 } else {
865 false
866 }
867 };
868 if row == "" {
869 row = format!("{}", t);
870 } else {
871 row = format!("{},{}", row, t);
872 }
873 }
874 "int" => {
875 if row == "" {
876 row = format!("{}", v);
877 } else {
878 row = format!("{},{}", row, v);
879 }
880 }
881 "float" => {
882 if row == "" {
883 row = format!("{}", v);
884 } else {
885 row = format!("{},{}", row, v);
886 }
887 }
888 _ => {
889 if row == "" {
890 row = format!("\"{}\"", v);
891 } else {
892 row = format!("{},\"{}\"", row, v);
893 }
894 }
895 }
896 }
897 if values == "" {
898 values = format!("({})", row);
899 } else {
900 values = format!("{},({})", values, row);
901 }
902 }
903 (ids, values)
904 });
905 thrs.push(thr);
906 }
907
908 let mut values = "".to_string();
909 for thr in thrs {
910 let (ids, value) = thr.join().unwrap();
911 if value.is_empty() {
912 continue;
913 }
914 self.ids.push(ids.clone()).expect("id 加入 错误");
915 if values == "" {
916 values = format!("{}", value);
917 } else {
918 values = format!("{},{}", values, value);
919 }
920 }
921 return format!("INSERT INTO {} ({}) VALUES {}", table, fields, values);
922 }
923 fn _update(&mut self, mut data: JsonValue) -> String {
925 self.fieldsinfo();
926 let table = self._table();
927 let mut values = "".to_string();
928 for (k, v) in data.entries_mut() {
929 let field = self.fields[self.table.as_str().clone()][k].clone();
930 match field["mode"].as_str().unwrap() {
931 "switch" => {
932 if v.to_string() == "0" {
933 *v = JsonValue::from(false)
934 }
935 if v.to_string() == "1" {
936 *v = JsonValue::from(true)
937 }
938 let t = match v.as_bool().unwrap() {
939 false => {
940 JsonValue::from(0)
941 }
942 true => {
943 JsonValue::from(1)
944 }
945 };
946 *v = t.clone();
947 }
948 _ => {}
949 }
950
951 if values == "" {
952 values = format!("`{}`=\"{}\"", k, v);
953 } else {
954 values = format!("{},`{}`=\"{}\"", values, k, v);
955 }
956 }
957 if self.setup != "" {
958 if values == "" {
959 values = format!("{}", self.setup);
960 } else {
961 values = format!("{},{}", values, self.setup);
962 }
963 }
964 let wheres = self._where_sql();
965 return format!("UPDATE {} SET {} {}", table, values, wheres);
966 }
967 fn _update_case(&mut self, field: &str, data: JsonValue) -> String {
970 let table = self._table();
971 let mut ids = array![];
972 let mut setlist = object! {};
973 for item in data.members() {
974 let wheres_value = item[field].to_string();
975 ids.push(wheres_value.clone()).expect("加入 wheres_fields 值");
976 for (k, v) in item.entries() {
977 if k == field {
978 continue;
979 }
980 if setlist[k].is_empty() {
981 setlist[k] = format!("WHEN {} THEN {}", wheres_value, v).into();
982 } else {
983 setlist[k] = format!("{} WHEN {} THEN {}", setlist[k], wheres_value, v).into();
984 }
985 }
986 }
987 let mut values = "".to_string();
988 for (key, item) in setlist.entries() {
989 if values == "" {
990 values = format!("`{}` = CASE `{}` {} END", key, field, item);
991 } else {
992 values = format!("{},`{}` = CASE `{}` {} END", values, key, field, item);
993 }
994 }
995 self.where_and(field, "in", ids.into());
996 let wheres = self._where_sql();
997 return format!("UPDATE {} SET {} {}", table, values, wheres);
998 }
999 fn _delete(&mut self) -> String {
1001 let table = self._table();
1002
1003 let wheres = self._where_sql();
1004
1005 let order = {
1006 let mut order = "".to_string();
1007 for item in self.order.members() {
1008 if order == "" {
1009 order = format!("ORDER BY {} {}", item[0], item[1]);
1010 } else {
1011 order = format!("{},{} {}", order, item[0], item[1]);
1012 }
1013 }
1014 order
1015 };
1016 return format!("DELETE FROM {} {} {} {}", table, wheres, order, self.pagelimit);
1017 }
1018
1019
1020 pub fn transaction(&mut self) -> bool {
1022 return self.mode.transaction();
1023 }
1024 pub fn commit(&mut self) -> bool {
1026 return self.mode.commit();
1027 }
1028 pub fn rollback(&mut self) -> bool {
1030 return self.mode.rollback();
1031 }
1032
1033 pub fn table(&mut self, name: &str) -> &mut Self {
1035 self._reset();
1036 self.table = name.to_string();
1037 self
1038 }
1039
1040 pub fn fields(&mut self, name: &str) -> &mut Self {
1042 self.field = vec![];
1043 let list = tools::string::split(name.to_string(), ",");
1044 for item in list.members() {
1045 self.field.push(item.to_string());
1046 }
1047 self
1048 }
1049 pub fn hidden(&mut self, name: &str) -> &mut Self {
1050 let list = tools::string::split(name.to_string(), ",");
1051 let fields = self.mode.fieldsinfo(self.table.as_str());
1052 let mut row = vec![];
1053 for (field, _) in fields.entries() {
1054 row.push(field.to_string());
1055 }
1056 for item in list.members() {
1057 row.retain(|items| if *items == item.to_string() { false } else { true });
1058 }
1059 self.field = row;
1060 self
1061 }
1062
1063 pub fn page(&mut self, mut page: u64) -> &mut Self {
1065 if page <= 0 {
1066 page = 1;
1067 }
1068 self.page = page;
1069 self.pagelimit = format!("LIMIT {},{}", (self.page - 1) * self.limit, self.limit);
1070 self
1071 }
1072 pub fn fetch_sql(&mut self, open: bool) -> &mut Self {
1074 self.fetch_sql = open;
1075 self
1076 }
1077 pub fn order(&mut self, field: &str, sort: i8) -> &mut Self {
1079 let mut model = "ASC";
1080 if sort != 0 {
1081 model = "DESC";
1082 }
1083 self.order.push(vec![field, model].clone()).expect("插入排序内容");
1084 self
1085 }
1086 pub fn group(&mut self, fields: &str) -> &mut Self {
1088 self.fields(fields);
1089 self.group = format!("GROUP BY {}", fields);
1090 self
1091 }
1092 pub fn limit(&mut self, mut limit: u64) -> &mut Self {
1094 if limit <= 0 {
1095 limit = 10;
1096 }
1097 if self.page <= 0 {
1098 self.page = 1;
1099 }
1100 self.limit = limit;
1101 if self.page == 1 {
1102 self.pagelimit = format!("LIMIT {}", self.limit);
1103 } else {
1104 self.pagelimit = format!("LIMIT {},{}", (self.page - 1) * self.limit, self.limit);
1105 }
1106 self
1107 }
1108
1109 pub fn distinct(&mut self, open: bool) -> &mut Self {
1111 self.distinct = open;
1112 self
1113 }
1114
1115 pub fn union(&mut self, table: &str, all: bool) -> &mut Self {
1117 self.union = table.to_string();
1118 self.union_all = all;
1119 self
1120 }
1121 pub fn where_and(&mut self, k: &str, compare: &str, mut v: JsonValue) -> &mut Self {
1123 if v == JsonValue::from(true) {
1124 v = 1.into();
1125 }
1126 if v == JsonValue::from(false) {
1127 v = 0.into();
1128 }
1129 self.where_and.push(array![k, compare, v]).expect("设置or条件 错误");
1130 self
1131 }
1132
1133 pub fn where_or(&mut self, k: &str, compare: &str, mut v: JsonValue) -> &mut Self {
1135 if v == JsonValue::from(true) {
1136 v = 1.into();
1137 }
1138 if v == JsonValue::from(false) {
1139 v = 0.into();
1140 }
1141 self.where_or.push(array![k, compare, v]).expect("设置or条件 错误");
1142 self
1143 }
1144
1145 pub fn where_column(&mut self, field1: &str, compare: &str, field2: &str) -> &mut Self {
1146 self.where_column.push(array![field1, compare, field2]).expect("设置where_column条件 错误");
1147 self
1148 }
1149
1150
1151 pub fn inc(&mut self, field: &str, mut data: JsonValue) -> &mut Self {
1153 if data == 0 {
1154 data = JsonValue::from(1);
1155 }
1156 if self.setup == "" {
1157 self.setup = format!("`{}`={}+{}", field, field, data);
1158 } else {
1159 self.setup = format!("{},`{}`={}+{}", self.setup, field, field, data);
1160 }
1161 self
1162 }
1163 pub fn dec(&mut self, field: &str, mut data: JsonValue) -> &mut Self {
1165 if data == 0 {
1166 data = JsonValue::from(1);
1167 }
1168 if self.setup == "" {
1169 self.setup = format!("`{}`= {}-{}", field, field, data);
1170 } else {
1171 self.setup = format!("{} , `{}`= {}-{}", self.setup, field, field, data);
1172 }
1173 self
1174 }
1175
1176
1177 pub fn find(&mut self) -> JsonValue {
1179 self.page(1);
1180 self.limit(1);
1181 let sql = self._select();
1182 if self.fetch_sql {
1183 return JsonValue::String(sql);
1184 }
1185 let res = self.mode.select(sql, self.table.clone(), self.field.clone());
1186 if res.len() >= 1 {
1187 return res[0].clone();
1188 }
1189 return res;
1190 }
1191 pub fn select(&mut self) -> JsonValue {
1193 let sql = self._select();
1194 if self.fetch_sql {
1195 return JsonValue::String(sql);
1196 }
1197 let res = self.mode.select(sql, self.table.clone(), self.field.clone());
1198 return res;
1199 }
1200
1201 pub fn column(&mut self) -> JsonValue {
1203 let sql = self._select();
1204 if self.fetch_sql {
1205 return JsonValue::String(sql);
1206 }
1207 let res = self.mode.select(sql, self.table.clone(), self.field.clone());
1208 if self.field.len() == 1 {
1209 let mut column = array![];
1210 for item in res.members() {
1211 column.push(item[self.field[0].clone()].clone()).expect("列加入错误");
1212 }
1213 return column;
1214 }
1215 return res;
1216 }
1217
1218
1219 pub fn value(&mut self, field: &str) -> JsonValue {
1221 self.page(1);
1222 self.limit(1);
1223 self.fields(field);
1224 let sql = self._select();
1225 if self.fetch_sql {
1226 return JsonValue::String(sql);
1227 }
1228 let res = self.mode.select(sql, self.table.clone(), self.field.clone());
1229 if res.len() >= 1 {
1230 return res[0][field].clone();
1231 }
1232 return JsonValue::Null;
1233 }
1234 pub fn add(&mut self, data: JsonValue) -> JsonValue {
1236 let only = data[0].is_empty();
1237 let sql = {
1238 if only {
1239 self._insert(array![data])
1240 } else {
1241 self._insert(data)
1242 }
1243 };
1244 if self.fetch_sql {
1245 return JsonValue::String(sql);
1246 }
1247 let res = self.mode.insert(sql);
1248 if res == self.ids.len() {
1249 if only {
1250 return self.ids[0].clone();
1251 }
1252 return self.ids.clone();
1253 }
1254 return res;
1255 }
1256 pub fn update(&mut self, data: JsonValue) -> JsonValue {
1258 let sql = self._update(data);
1259 if self.fetch_sql {
1260 return JsonValue::String(sql);
1261 }
1262 let res = self.mode.update(sql);
1263 return res;
1264 }
1265 pub fn update_case(&mut self, field: &str, data: JsonValue) -> JsonValue {
1268 let sql = self._update_case(field, data);
1269 if self.fetch_sql {
1270 return JsonValue::String(sql);
1271 }
1272 let res = self.mode.update(sql);
1273 return res;
1274 }
1275 pub fn delete(&mut self) -> JsonValue {
1277 let sql = self._delete();
1278 if self.fetch_sql {
1279 return JsonValue::String(sql);
1280 }
1281 let res = self.mode.delete(sql);
1282 return res;
1283 }
1284
1285
1286 pub fn count(&mut self) -> JsonValue {
1288 self.field = vec![];
1289 self.fields("COUNT(*) as count");
1290 let sql = self._select();
1291 if self.fetch_sql {
1292 return JsonValue::String(sql);
1293 }
1294 if self.group.is_empty() {
1295 let res = self.mode.aggregate_query("count", sql, self.field.clone());
1296 return res;
1297 }
1298 let res = self.mode.aggregate_query("count_group", sql, self.field.clone());
1299 return res;
1300 }
1301 pub fn max(&mut self, fields: &str) -> JsonValue {
1303 let list = tools::string::split(fields.to_string(), ",");
1304 for field in list.members() {
1305 self.fields(format!("MAX({}) as {}", field.clone(), field.clone()).as_str());
1306 }
1307 let sql = self._select();
1308 if self.fetch_sql {
1309 return JsonValue::String(sql);
1310 }
1311 let res = self.mode.aggregate_query("max", sql, self.field.clone());
1312 return res;
1313 }
1314 pub fn min(&mut self, fields: &str) -> JsonValue {
1316 let list = tools::string::split(fields.to_string(), ",");
1317 for field in list.members() {
1318 self.fields(format!("MIN({}) as {}", field.clone(), field.clone()).as_str());
1319 }
1320 let sql = self._select();
1321 if self.fetch_sql {
1322 return JsonValue::String(sql);
1323 }
1324 let res = self.mode.aggregate_query("min", sql, self.field.clone());
1325 return res;
1326 }
1327 pub fn avg(&mut self, fields: &str) -> JsonValue {
1329 let list = tools::string::split(fields.to_string(), ",");
1330 for field in list.members() {
1331 self.fields(format!("AVG({}) as {}", field.clone(), field.clone()).as_str());
1332 }
1333 let sql = self._select();
1334 if self.fetch_sql {
1335 return JsonValue::String(sql);
1336 }
1337 let res = self.mode.aggregate_query("avg", sql, self.field.clone());
1338 return res;
1339 }
1340 pub fn sum(&mut self, fields: &str) -> JsonValue {
1342 let list = tools::string::split(fields.to_string(), ",");
1343 for field in list.members() {
1344 self.fields(format!("SUM({}) as {}", field.clone(), field.clone()).as_str());
1345 }
1346 let sql = self._select();
1347 if self.fetch_sql {
1348 return JsonValue::String(sql);
1349 }
1350 let res = self.mode.aggregate_query("sum", sql, self.field.clone());
1351 return res;
1352 }
1353}