farm/
lib.rs

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    // ToDo: Work out what to return here? A Vec of columns with success/failure?
75    Ok(false)
76}