feat: add mysql svr

This commit is contained in:
2021-02-17 12:01:37 +08:00
parent 4c5ee6f908
commit ed41681faf
4 changed files with 1420 additions and 0 deletions

1333
__database/mysqlsvr/Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,12 @@
[package]
name = "mysqlsvr"
version = "0.1.0"
authors = ["Hatter Jiang@Pixelbook <jht5945@gmail.com>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
mysql = "20.1.0"
msql-srv = "0.9.3"

View File

@@ -0,0 +1,49 @@
use std::io;
use msql_srv::*;
pub struct Backend;
impl<W: io::Write> MysqlShim<W> for Backend {
type Error = io::Error;
fn on_prepare(&mut self, query: &str, info: StatementMetaWriter<W>) -> io::Result<()> {
println!("Backend on prepare, query: {}", query);
info.reply(42, &[], &[])
}
fn on_execute(&mut self, id: u32, _params: ParamParser, results: QueryResultWriter<W>, ) -> io::Result<()> {
println!("Backend on execute, id: {}", id);
results.completed(0, 0)
}
fn on_close(&mut self, stmt: u32) {
println!("Backend on close, stmt: {}", stmt);
}
fn on_init(&mut self, _unknown: &str, _writer: InitWriter<W>) -> io::Result<()> {
println!("Backend on init, param2: {}", _unknown);
Ok(())
}
fn on_query(&mut self, query: &str, results: QueryResultWriter<W>) -> io::Result<()> {
println!("Backend on query, query: {}", query);
let cols = [
Column {
table: "foo".to_string(),
column: "a".to_string(),
coltype: ColumnType::MYSQL_TYPE_LONGLONG,
colflags: ColumnFlags::empty(),
},
Column {
table: "foo".to_string(),
column: "b".to_string(),
coltype: ColumnType::MYSQL_TYPE_STRING,
colflags: ColumnFlags::empty(),
},
];
let mut rw = results.start(&cols)?;
rw.write_col(42)?;
rw.write_col("b's value")?;
rw.finish()
}
}

View File

@@ -0,0 +1,26 @@
mod backend;
use std::net::TcpListener;
use std::thread;
use msql_srv::*;
use mysql::prelude::*;
use backend::*;
fn main() {
let listener = TcpListener::bind("127.0.0.1:0").unwrap();
let port = listener.local_addr().unwrap().port();
let jh = thread::spawn(move || {
if let Ok((s, _)) = listener.accept() {
MysqlIntermediary::run_on_tcp(Backend, s).unwrap();
}
});
println!("MySQL port: {}", port);
let mut db = mysql::Conn::new(&format!("mysql://127.0.0.1:{}", port)).unwrap();
assert_eq!(db.ping(), true);
assert_eq!(db.query_iter("SELECT a, b FROM foo").unwrap().count(), 1);
drop(db);
jh.join().unwrap();
}