mirror of
https://github.com/launchbadge/sqlx.git
synced 2025-10-02 15:25:32 +00:00
Establish connection and ping server
This commit is contained in:
parent
f2e0b0e904
commit
f107f1de6c
@ -5,6 +5,8 @@ use crate::protocol::{
|
|||||||
server::Deserialize,
|
server::Deserialize,
|
||||||
server::Capabilities,
|
server::Capabilities,
|
||||||
client::HandshakeResponsePacket,
|
client::HandshakeResponsePacket,
|
||||||
|
client::ComQuit,
|
||||||
|
client::ComPing,
|
||||||
client::Serialize
|
client::Serialize
|
||||||
};
|
};
|
||||||
use futures::StreamExt;
|
use futures::StreamExt;
|
||||||
@ -18,6 +20,7 @@ pub async fn establish<'a, 'b: 'a>(
|
|||||||
options: ConnectOptions<'b>,
|
options: ConnectOptions<'b>,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
let init_packet = if let Some(message) = conn.incoming.next().await {
|
let init_packet = if let Some(message) = conn.incoming.next().await {
|
||||||
|
conn.sequence_number = message.sequence_number();
|
||||||
match message {
|
match message {
|
||||||
ServerMessage::InitialHandshakePacket(message) => {
|
ServerMessage::InitialHandshakePacket(message) => {
|
||||||
Ok(message)
|
Ok(message)
|
||||||
@ -50,6 +53,7 @@ pub async fn establish<'a, 'b: 'a>(
|
|||||||
|
|
||||||
if let Some(message) = conn.incoming.next().await {
|
if let Some(message) = conn.incoming.next().await {
|
||||||
println!("{:?}", message);
|
println!("{:?}", message);
|
||||||
|
conn.sequence_number = message.sequence_number();
|
||||||
Ok(())
|
Ok(())
|
||||||
} else {
|
} else {
|
||||||
Err(failure::err_msg("Handshake Failed"))
|
Err(failure::err_msg("Handshake Failed"))
|
||||||
@ -60,10 +64,11 @@ pub async fn establish<'a, 'b: 'a>(
|
|||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
use failure::Error;
|
use failure::Error;
|
||||||
|
use failure::err_msg;
|
||||||
|
|
||||||
#[runtime::test]
|
#[runtime::test]
|
||||||
async fn it_connects() -> Result<(), Error> {
|
async fn it_connects() -> Result<(), Error> {
|
||||||
Connection::establish(ConnectOptions {
|
let mut conn = Connection::establish(ConnectOptions {
|
||||||
host: "localhost",
|
host: "localhost",
|
||||||
port: 3306,
|
port: 3306,
|
||||||
user: Some("root"),
|
user: Some("root"),
|
||||||
@ -71,7 +76,22 @@ mod test {
|
|||||||
password: None,
|
password: None,
|
||||||
}).await?;
|
}).await?;
|
||||||
|
|
||||||
Ok(())
|
conn.ping().await?;
|
||||||
|
|
||||||
|
if let Some(message) = conn.incoming.next().await {
|
||||||
|
match message {
|
||||||
|
ServerMessage::OkPacket(packet) => {
|
||||||
|
conn.quit().await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
ServerMessage::ErrPacket(packet) => {
|
||||||
|
Err(err_msg(format!("{:?}", packet)))
|
||||||
|
}
|
||||||
|
_ => Err(err_msg("Server Failed"))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Err(err_msg("Server Failed"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
use crate::protocol::{
|
use crate::protocol::{
|
||||||
client::Serialize,
|
client::Serialize,
|
||||||
|
client::ComQuit,
|
||||||
|
client::ComPing,
|
||||||
server::Message as ServerMessage,
|
server::Message as ServerMessage,
|
||||||
server::Capabilities,
|
server::Capabilities,
|
||||||
server::InitialHandshakePacket,
|
server::InitialHandshakePacket,
|
||||||
@ -79,17 +81,31 @@ impl Connection {
|
|||||||
*/
|
*/
|
||||||
// Reserve space for packet header; Packet Body Length (3 bytes) and sequence number (1 byte)
|
// Reserve space for packet header; Packet Body Length (3 bytes) and sequence number (1 byte)
|
||||||
self.wbuf.extend_from_slice(&[0; 4]);
|
self.wbuf.extend_from_slice(&[0; 4]);
|
||||||
self.wbuf[3] =self.sequence_number;
|
self.wbuf[3] = self.sequence_number;
|
||||||
self.sequence_number += 1;
|
|
||||||
|
|
||||||
message.serialize(&mut self.wbuf, &self.server_capabilities)?;
|
message.serialize(&mut self.wbuf, &self.server_capabilities)?;
|
||||||
serialize_length(&mut self.wbuf);
|
serialize_length(&mut self.wbuf);
|
||||||
|
|
||||||
|
println!("{:?}", self.wbuf);
|
||||||
|
|
||||||
self.writer.write_all(&self.wbuf).await?;
|
self.writer.write_all(&self.wbuf).await?;
|
||||||
self.writer.flush().await?;
|
self.writer.flush().await?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn quit(&mut self) -> Result<(), Error> {
|
||||||
|
self.send(ComQuit()).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn ping(&mut self) -> Result<(), Error> {
|
||||||
|
self.sequence_number = 0;
|
||||||
|
self.send(ComPing()).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn receiver(
|
async fn receiver(
|
||||||
|
@ -18,6 +18,17 @@ pub enum Message {
|
|||||||
ErrPacket(ErrPacket),
|
ErrPacket(ErrPacket),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Message {
|
||||||
|
pub fn sequence_number(&self) -> u8 {
|
||||||
|
match self {
|
||||||
|
Message::InitialHandshakePacket(InitialHandshakePacket{ sequence_number, ..}) => sequence_number + 1,
|
||||||
|
Message::OkPacket(OkPacket{ sequence_number, ..}) => sequence_number + 1,
|
||||||
|
Message::ErrPacket(ErrPacket { sequence_number, .. }) => sequence_number + 1,
|
||||||
|
_ => 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bitflags! {
|
bitflags! {
|
||||||
pub struct Capabilities: u128 {
|
pub struct Capabilities: u128 {
|
||||||
const CLIENT_MYSQL = 1;
|
const CLIENT_MYSQL = 1;
|
||||||
@ -123,6 +134,7 @@ pub struct InitialHandshakePacket {
|
|||||||
|
|
||||||
#[derive(Default, Debug)]
|
#[derive(Default, Debug)]
|
||||||
pub struct OkPacket {
|
pub struct OkPacket {
|
||||||
|
pub sequence_number: u8,
|
||||||
pub affected_rows: Option<usize>,
|
pub affected_rows: Option<usize>,
|
||||||
pub last_insert_id: Option<usize>,
|
pub last_insert_id: Option<usize>,
|
||||||
pub server_status: ServerStatusFlag,
|
pub server_status: ServerStatusFlag,
|
||||||
@ -134,6 +146,7 @@ pub struct OkPacket {
|
|||||||
|
|
||||||
#[derive(Default, Debug)]
|
#[derive(Default, Debug)]
|
||||||
pub struct ErrPacket {
|
pub struct ErrPacket {
|
||||||
|
pub sequence_number: u8,
|
||||||
pub error_code: u16,
|
pub error_code: u16,
|
||||||
pub stage: Option<u8>,
|
pub stage: Option<u8>,
|
||||||
pub max_stage: Option<u8>,
|
pub max_stage: Option<u8>,
|
||||||
@ -269,7 +282,7 @@ impl Deserialize for OkPacket {
|
|||||||
|
|
||||||
// Packet header
|
// Packet header
|
||||||
let length = deserialize_length(&buf, &mut index)?;
|
let length = deserialize_length(&buf, &mut index)?;
|
||||||
let _sequence_number = deserialize_int_1(&buf, &mut index);
|
let sequence_number = deserialize_int_1(&buf, &mut index);
|
||||||
|
|
||||||
// Packet body
|
// Packet body
|
||||||
let packet_header = deserialize_int_1(&buf, &mut index);
|
let packet_header = deserialize_int_1(&buf, &mut index);
|
||||||
@ -289,6 +302,7 @@ impl Deserialize for OkPacket {
|
|||||||
let info = Bytes::from(&buf[index..]);
|
let info = Bytes::from(&buf[index..]);
|
||||||
|
|
||||||
Ok(OkPacket {
|
Ok(OkPacket {
|
||||||
|
sequence_number,
|
||||||
affected_rows,
|
affected_rows,
|
||||||
last_insert_id,
|
last_insert_id,
|
||||||
server_status,
|
server_status,
|
||||||
@ -305,7 +319,7 @@ impl Deserialize for ErrPacket {
|
|||||||
let mut index = 0;
|
let mut index = 0;
|
||||||
|
|
||||||
let length = deserialize_length(&buf, &mut index)?;
|
let length = deserialize_length(&buf, &mut index)?;
|
||||||
let _sequence_number = deserialize_int_1(&buf, &mut index);
|
let sequence_number = deserialize_int_1(&buf, &mut index);
|
||||||
|
|
||||||
let packet_header = deserialize_int_1(&buf, &mut index);
|
let packet_header = deserialize_int_1(&buf, &mut index);
|
||||||
if packet_header != 0xFF {
|
if packet_header != 0xFF {
|
||||||
@ -340,6 +354,7 @@ impl Deserialize for ErrPacket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Ok(ErrPacket {
|
Ok(ErrPacket {
|
||||||
|
sequence_number,
|
||||||
error_code,
|
error_code,
|
||||||
stage,
|
stage,
|
||||||
max_stage,
|
max_stage,
|
||||||
@ -366,7 +381,7 @@ mod test {
|
|||||||
#[test]
|
#[test]
|
||||||
fn it_decodes_errpacket_real() -> Result<(), Error> {
|
fn it_decodes_errpacket_real() -> Result<(), Error> {
|
||||||
let buf = BytesMut::from(b"!\0\0\x01\xff\x84\x04#08S01Got packets out of order".to_vec());
|
let buf = BytesMut::from(b"!\0\0\x01\xff\x84\x04#08S01Got packets out of order".to_vec());
|
||||||
let _message = InitialHandshakePacket::deserialize(&buf.freeze())?;
|
let _message = ErrPacket::deserialize(&buf.freeze())?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user