#![recursion_limit = "1024"]
#![cfg_attr(feature = "nightly", feature(test, const_fn))]
#[cfg(feature = "nightly")]
extern crate test;
extern crate bit_vec;
extern crate byteorder;
#[macro_use]
extern crate error_chain;
extern crate fnv;
#[macro_use]
extern crate futures as lib_futures;
#[cfg(test)]
#[macro_use]
extern crate lazy_static;
extern crate mio;
extern crate mysql_common as myc;
#[cfg(feature = "ssl")]
extern crate native_tls;
extern crate regex;
extern crate serde;
extern crate serde_json;
extern crate tokio;
extern crate tokio_io;
extern crate twox_hash;
extern crate url;
pub use myc::chrono;
pub use myc::constants as consts;
pub use myc::time;
pub use myc::uuid;
#[macro_export]
macro_rules! params {
() => {};
(@to_pair $name:expr => $value:expr) => (
(::std::string::String::from($name), $crate::Value::from($value))
);
(@to_pair $name:ident) => (
(::std::string::String::from(stringify!($name)), $crate::Value::from($name))
);
(@expand $vec:expr;) => {};
(@expand $vec:expr; $name:expr => $value:expr, $($tail:tt)*) => {
$vec.push(params!(@to_pair $name => $value));
params!(@expand $vec; $($tail)*);
};
(@expand $vec:expr; $name:expr => $value:expr $(, $tail:tt)*) => {
$vec.push(params!(@to_pair $name => $value));
params!(@expand $vec; $($tail)*);
};
(@expand $vec:expr; $name:ident, $($tail:tt)*) => {
$vec.push(params!(@to_pair $name));
params!(@expand $vec; $($tail)*);
};
(@expand $vec:expr; $name:ident $(, $tail:tt)*) => {
$vec.push(params!(@to_pair $name));
params!(@expand $vec; $($tail)*);
};
($i:ident, $($tail:tt)*) => {
{
let mut output = ::std::vec::Vec::new();
params!(@expand output; $i, $($tail)*);
output
}
};
($i:expr => $($tail:tt)*) => {
{
let mut output = ::std::vec::Vec::new();
params!(@expand output; $i => $($tail)*);
output
}
};
($i:ident) => {
{
let mut output = ::std::vec::Vec::new();
params!(@expand output; $i);
output
}
}
}
#[macro_use]
pub mod macros;
mod conn;
mod connection_like;
pub mod errors;
mod io;
mod local_infile_handler;
mod opts;
mod queryable;
pub type BoxFuture<T> = Box<lib_futures::Future<Item = T, Error = errors::Error> + Send + 'static>;
pub trait MyFuture<T>:
lib_futures::Future<Item = T, Error = errors::Error> + Send + 'static
{
}
impl<T, U> MyFuture<T> for U where
U: lib_futures::Future<Item = T, Error = errors::Error> + Send + 'static
{}
#[doc(inline)]
pub use self::conn::Conn;
#[doc(inline)]
pub use self::conn::pool::Pool;
#[doc(inline)]
pub use self::queryable::transaction::IsolationLevel;
#[doc(inline)]
pub use self::opts::{Opts, OptsBuilder, SslOpts};
#[doc(inline)]
pub use self::local_infile_handler::builtin::WhiteListFsLocalInfileHandler;
#[doc(inline)]
pub use myc::packets::Column;
#[doc(inline)]
pub use myc::row::Row;
#[doc(inline)]
pub use myc::params::Params;
#[doc(inline)]
pub use myc::value::Value;
#[doc(inline)]
pub use myc::row::convert::{from_row, from_row_opt, FromRowError};
#[doc(inline)]
pub use myc::value::convert::{from_value, from_value_opt, FromValueError};
#[doc(inline)]
pub use myc::value::json::{Deserialized, Serialized};
#[doc(inline)]
pub use self::queryable::query_result::QueryResult;
#[doc(inline)]
pub use self::queryable::transaction::{Transaction, TransactionOptions};
#[doc(inline)]
pub use self::queryable::{BinaryProtocol, TextProtocol};
#[doc(inline)]
pub use self::queryable::stmt::Stmt;
pub mod futures {
#[doc(inline)]
pub use queryable::query_result::{
ForEach, ForEachAndDrop, Map, MapAndDrop, Reduce, ReduceAndDrop,
};
#[doc(inline)]
pub use conn::pool::futures::{GetConn, DisconnectPool};
}
pub mod prelude {
#[doc(inline)]
pub use local_infile_handler::LocalInfileHandler;
#[doc(inline)]
pub use myc::row::convert::FromRow;
#[doc(inline)]
pub use myc::value::convert::{ConvIr, FromValue, ToValue};
#[doc(inline)]
pub use queryable::Queryable;
}
#[cfg(test)]
mod test_misc {
use opts;
use std::env;
lazy_static! {
pub static ref DATABASE_URL: String = {
if let Ok(url) = env::var("DATABASE_URL") {
let opts = opts::Opts::from_url(&url).expect("DATABASE_URL invalid");
if opts
.get_db_name()
.expect("a database name is required")
.is_empty()
{
panic!("database name is empty");
}
url
} else {
"mysql://root:password@127.0.0.1:3307/mysql".into()
}
};
}
}