# 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: ```rust use std::io; use tokio::io::AsyncWrite; use opensrv_mysql::*; use tokio::net::TcpListener; struct Backend; #[async_trait::async_trait] impl AsyncMysqlShim 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> { 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](examples). ## Getting help Submit [issues](https://github.com/datafuselabs/opensrv/issues/new/choose) for bug report or asking questions in [discussion](https://github.com/datafuselabs/opensrv/discussions/new?category=q-a). ## Credits This project is a branch of [jonhoo/msql-srv](https://github.com/jonhoo/msql-srv) and focuses on providing asynchronous support. ## License Licensed under Apache License, Version 2.0.