diff --git a/Cargo.toml b/Cargo.toml
index 1d57c3f0..a26da4dc 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,7 +16,7 @@ itoa = "0.4.4"
log = "0.4.7"
md-5 = "0.8.0"
memchr = "2.2.1"
-runtime = { version = "=0.3.0-alpha.6", default-features = false }
+runtime = { version = "=0.3.0-alpha.6", default-features = true }
bitflags = "1.1.0"
enum-tryfrom = "0.2.1"
enum-tryfrom-derive = "0.2.1"
diff --git a/src/mariadb/connection/establish.rs b/src/mariadb/connection/establish.rs
index 873fc33e..6a4c262f 100644
--- a/src/mariadb/connection/establish.rs
+++ b/src/mariadb/connection/establish.rs
@@ -8,6 +8,7 @@ use crate::mariadb::protocol::{
use bytes::{BufMut, Bytes};
use failure::{err_msg, Error};
use crate::ConnectOptions;
+use std::ops::BitAnd;
pub async fn establish<'a, 'b: 'a>(
conn: &'a mut Connection,
@@ -15,11 +16,13 @@ pub async fn establish<'a, 'b: 'a>(
) -> Result<(), Error> {
let buf = &conn.stream.next_bytes().await?;
let mut de_ctx = DeContext::new(&mut conn.context, &buf);
- let _ = InitialHandshakePacket::deserialize(&mut de_ctx)?;
+ let initial = InitialHandshakePacket::deserialize(&mut de_ctx)?;
+
+ de_ctx.ctx.capabilities = de_ctx.ctx.capabilities.bitand(initial.capabilities);
let handshake: HandshakeResponsePacket = HandshakeResponsePacket {
// Minimum client capabilities required to establish connection
- capabilities: Capabilities::CLIENT_PROTOCOL_41,
+ capabilities: de_ctx.ctx.capabilities,
max_packet_size: 1024,
extended_capabilities: Some(Capabilities::from_bits_truncate(0)),
username: Bytes::from(options.user.unwrap_or("")),
@@ -51,35 +54,97 @@ mod test {
use super::*;
use failure::Error;
-// #[runtime::test]
-// async fn it_connects() -> Result<(), Error> {
-// let mut conn = Connection::establish(ConnectOptions {
-// host: "127.0.0.1",
-// port: 3306,
-// user: Some("root"),
-// database: None,
-// password: None,
-// })
-// .await?;
-//
-// conn.ping().await?;
-//
-// Ok(())
-// }
-//
-// #[runtime::test]
-// async fn it_does_not_connect() -> Result<(), Error> {
-// match Connection::establish(ConnectOptions {
-// host: "127.0.0.1",
-// port: 3306,
-// user: Some("roote"),
-// database: None,
-// password: None,
-// })
-// .await
-// {
-// Ok(_) => Err(err_msg("Bad username still worked?")),
-// Err(_) => Ok(()),
-// }
-// }
+ #[runtime::test]
+ async fn it_can_connect() -> Result<(), Error> {
+ let mut conn = Connection::establish(ConnectOptions {
+ host: "127.0.0.1",
+ port: 3306,
+ user: Some("root"),
+ database: None,
+ password: None,
+ })
+ .await?;
+
+ Ok(())
+ }
+
+ #[runtime::test]
+ async fn it_can_ping() -> Result<(), Error> {
+ let mut conn = Connection::establish(ConnectOptions {
+ host: "127.0.0.1",
+ port: 3306,
+ user: Some("root"),
+ database: None,
+ password: None,
+ }).await?;
+
+ conn.ping().await?;
+
+ Ok(())
+ }
+
+ #[runtime::test]
+ async fn it_can_select_db() -> Result<(), Error> {
+ let mut conn = Connection::establish(ConnectOptions {
+ host: "127.0.0.1",
+ port: 3306,
+ user: Some("root"),
+ database: None,
+ password: None,
+ }).await?;
+
+ conn.select_db("test").await?;
+
+ Ok(())
+ }
+
+ #[runtime::test]
+ async fn it_can_query() -> Result<(), Error> {
+ let mut conn = Connection::establish(ConnectOptions {
+ host: "127.0.0.1",
+ port: 3306,
+ user: Some("root"),
+ database: None,
+ password: None,
+ }).await?;
+
+ conn.select_db("test").await?;
+
+ conn.query("SELECT * FROM users").await?;
+
+ Ok(())
+ }
+
+ #[runtime::test]
+ async fn it_can_prepare() -> Result<(), Error> {
+ let mut conn = Connection::establish(ConnectOptions {
+ host: "127.0.0.1",
+ port: 3306,
+ user: Some("root"),
+ database: None,
+ password: None,
+ }).await?;
+
+ conn.select_db("test").await?;
+
+ conn.prepare("SELECT * FROM users WHERE username = ?").await?;
+
+ Ok(())
+ }
+
+ #[runtime::test]
+ async fn it_does_not_connect() -> Result<(), Error> {
+ match Connection::establish(ConnectOptions {
+ host: "127.0.0.1",
+ port: 3306,
+ user: Some("roote"),
+ database: None,
+ password: None,
+ })
+ .await
+ {
+ Ok(_) => Err(err_msg("Bad username still worked?")),
+ Err(_) => Ok(()),
+ }
+ }
}
diff --git a/src/mariadb/connection/mod.rs b/src/mariadb/connection/mod.rs
index afcb7e5c..4d5531dc 100644
--- a/src/mariadb/connection/mod.rs
+++ b/src/mariadb/connection/mod.rs
@@ -6,7 +6,7 @@ use futures::{
prelude::*,
};
use runtime::net::TcpStream;
-use crate::{ConnectOptions, mariadb::protocol::{DeContext, Deserialize, Encoder, ComInitDb, ComPing, ComQuery, ComQuit, OkPacket, Serialize, Message, Capabilities, ServerStatusFlag}};
+use crate::{ConnectOptions, mariadb::protocol::{DeContext, Deserialize, Encoder, ComInitDb, ComPing, ComQuery, ComQuit, OkPacket, Serialize, Message, Capabilities, ServerStatusFlag, ComStmtPrepare, ComStmtPrepareResp, ResultSet, ErrPacket}};
mod establish;
@@ -46,26 +46,18 @@ impl ConnContext {
connection_id: 0,
seq_no: 2,
last_seq_no: 0,
- capabilities: Capabilities::FOUND_ROWS
- | Capabilities::CONNECT_WITH_DB
- | Capabilities::COMPRESS
- | Capabilities::LOCAL_FILES
- | Capabilities::IGNORE_SPACE
- | Capabilities::CLIENT_PROTOCOL_41
- | Capabilities::CLIENT_INTERACTIVE
- | Capabilities::TRANSACTIONS
- | Capabilities::SECURE_CONNECTION
- | Capabilities::MULTI_STATEMENTS
- | Capabilities::MULTI_RESULTS
- | Capabilities::PS_MULTI_RESULTS
- | Capabilities::PLUGIN_AUTH
- | Capabilities::CONNECT_ATTRS
- | Capabilities::PLUGIN_AUTH_LENENC_CLIENT_DATA
- | Capabilities::CLIENT_SESSION_TRACK
- | Capabilities::CLIENT_DEPRECATE_EOF
- | Capabilities::MARIA_DB_CLIENT_PROGRESS
- | Capabilities::MARIA_DB_CLIENT_COM_MULTI
- | Capabilities::MARIA_CLIENT_STMT_BULK_OPERATIONS,
+ capabilities: Capabilities::CLIENT_PROTOCOL_41,
+ status: ServerStatusFlag::SERVER_STATUS_IN_TRANS
+ }
+ }
+
+ #[cfg(test)]
+ pub fn with_eof() -> Self {
+ ConnContext {
+ connection_id: 0,
+ seq_no: 2,
+ last_seq_no: 0,
+ capabilities: Capabilities::CLIENT_PROTOCOL_41 | Capabilities::CLIENT_DEPRECATE_EOF,
status: ServerStatusFlag::SERVER_STATUS_IN_TRANS
}
}
@@ -81,7 +73,7 @@ impl Connection {
connection_id: -1,
seq_no: 1,
last_seq_no: 0,
- capabilities: Capabilities::default(),
+ capabilities: Capabilities::CLIENT_PROTOCOL_41,
status: ServerStatusFlag::default(),
},
};
@@ -103,22 +95,33 @@ impl Connection {
}
pub async fn quit(&mut self) -> Result<(), Error> {
- self.context.seq_no = 0;
self.send(ComQuit()).await?;
Ok(())
}
- pub async fn query<'a>(&'a mut self, sql_statement: &'a str) -> Result<(), Error> {
- self.context.seq_no = 0;
+ pub async fn query<'a>(&'a mut self, sql_statement: &'a str) -> Result