8 releases (breaking)
0.7.0 | Feb 21, 2024 |
---|---|
0.6.0 | Dec 12, 2023 |
0.5.0 | Nov 15, 2023 |
0.4.1 | Sep 9, 2023 |
0.1.0 | Jun 14, 2022 |
#254 in Network programming
4,987 downloads per month
350KB
6K
SLoC
OpenSrv - MySQL
Bindings for emulating a MySQL/MariaDB server.
When developing new databases or caching layers, it can be immensely useful to test your system using existing applications. However, this often requires significant work modifying applications to use your database over the existing ones. This crate solves that problem by acting as a MySQL server, and delegating operations such as querying and query execution to user-defined logic.
Usage
To start, implement AsyncMysqlShim
for your backend, and create a AsyncMysqlIntermediary
over an
instance of your backend and a connection stream. The appropriate methods will be called on
your backend whenever a client issues a QUERY
, PREPARE
, or EXECUTE
command, and you will
have a chance to respond appropriately. For example, to write a shim that always responds to
all commands with a "no results" reply:
use std::io;
use tokio::io::AsyncWrite;
use opensrv_mysql::*;
use tokio::net::TcpListener;
struct Backend;
#[async_trait::async_trait]
impl<W: AsyncWrite + Send + Unpin> AsyncMysqlShim<W> for Backend {
type Error = io::Error;
async fn on_prepare<'a>(
&'a mut self,
_: &'a str,
info: StatementMetaWriter<'a, W>,
) -> io::Result<()> {
info.reply(42, &[], &[]).await
}
async fn on_execute<'a>(
&'a mut self,
_: u32,
_: opensrv_mysql::ParamParser<'a>,
results: QueryResultWriter<'a, W>,
) -> io::Result<()> {
results.completed(OkResponse::default()).await
}
async fn on_close(&mut self, _: u32) {}
async fn on_query<'a>(
&'a mut self,
sql: &'a str,
results: QueryResultWriter<'a, W>,
) -> io::Result<()> {
println!("execute sql {:?}", sql);
results.start(&[]).await?.finish().await
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let listener = TcpListener::bind("0.0.0.0:3306").await?;
loop {
let (stream, _) = listener.accept().await?;
let (r, w) = stream.into_split();
tokio::spawn(async move { AsyncMysqlIntermediary::run_on(Backend, r, w).await });
}
}
This example can be exected with:
cargo run --example=serve_one
More examples can be found here.
Getting help
Submit issues for bug report or asking questions in discussion.
Credits
This project is a branch of jonhoo/msql-srv and focuses on providing asynchronous support.
License
Licensed under Apache License, Version 2.0.
Dependencies
~15–26MB
~391K SLoC