1#[macro_use]
2extern crate failure;
3#[macro_use]
4extern crate mysql;
5extern crate r2d2;
6extern crate r2d2_mysql;
7extern crate rayon;
8
9pub mod error;
10pub mod model;
11
12use mysql::{OptsBuilder, Opts};
13use r2d2::Pool;
14use r2d2_mysql::MysqlConnectionManager;
15use rayon::prelude::*;
16
17use error::{Result, error::Error};
18use model::column::Column;
19
20fn get_db_connection<T>(database_url: T) -> Result<Pool<MysqlConnectionManager>>
21where
22 T: AsRef<str>,
23{
24 let mut opts_builder = OptsBuilder::from_opts(database_url.as_ref());
25 opts_builder.prefer_socket(false);
26 let manager = MysqlConnectionManager::new(opts_builder);
27 let pool = Pool::builder().max_size(15).build(manager)?;
28 Ok(pool)
29}
30
31pub fn get_affected_columns<T, U>(database_url: T, find: U) -> Result<Vec<Column>>
32where
33 T: AsRef<str>,
34 U: AsRef<str> + Send + Sync,
35{
36 let opts: Opts = OptsBuilder::from_opts(database_url.as_ref()).into();
37 let schema = opts.get_db_name().ok_or(Error::SchemaError(database_url.as_ref().to_string()))?;
38 let pool = get_db_connection(database_url)?;
39
40 let mut connection = pool.get()?;
41 let all_columns = Column::get_all_in_schema(&mut connection, schema)?;
42
43 let prepared_columns: Vec<(Column, Pool<MysqlConnectionManager>)> = all_columns.into_iter()
44 .filter(|column| column.is_string())
45 .map(|column| (column, pool.clone()))
46 .collect();
47 let possible_columns = prepared_columns.into_par_iter()
48 .filter(|(column, pool)| {
49 let mut conn = pool.get().expect("Connection Pool broke");
50 column.contains(&mut conn, &find).expect("Something has gone wrong")
51 })
52 .map(|(column, _conn)| column)
53 .collect();
54
55 Ok(possible_columns)
56}
57
58pub fn replace_in_columns<T, U,V>(database_url: T, columns: Vec<Column>, find: U, replace: V) -> Result<bool>
59where
60 T: AsRef<str>,
61 U: AsRef<str> + Send + Sync,
62 V: AsRef<str> + Send + Sync,
63{
64 let pool = get_db_connection(database_url)?;
65
66 let prepared_columns: Vec<(Column, Pool<MysqlConnectionManager>)> = columns
67 .into_iter().map(|column| (column, pool.clone())).collect();
68
69 prepared_columns.into_par_iter().for_each(|(column, pool)| {
70 let mut conn = pool.get().expect("Connection Pool broke");
71 column.replace(&mut conn, &find, &replace);
72 });
73
74 Ok(false)
76}