feat: add mysql svr
This commit is contained in:
1333
__database/mysqlsvr/Cargo.lock
generated
Normal file
1333
__database/mysqlsvr/Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
12
__database/mysqlsvr/Cargo.toml
Normal file
12
__database/mysqlsvr/Cargo.toml
Normal 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"
|
||||
|
||||
49
__database/mysqlsvr/src/backend.rs
Normal file
49
__database/mysqlsvr/src/backend.rs
Normal 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()
|
||||
}
|
||||
}
|
||||
26
__database/mysqlsvr/src/main.rs
Normal file
26
__database/mysqlsvr/src/main.rs
Normal 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();
|
||||
}
|
||||
Reference in New Issue
Block a user