8 个版本 (破坏性)

0.7.0 2024年2月21日
0.6.0 2023年12月12日
0.5.0 2023年11月15日
0.4.1 2023年9月9日
0.1.0 2022年6月14日

#151 in 网络编程

Download history 2127/week @ 2024-04-08 2206/week @ 2024-04-15 2724/week @ 2024-04-22 1530/week @ 2024-04-29 3637/week @ 2024-05-06 3589/week @ 2024-05-13 3146/week @ 2024-05-20 2709/week @ 2024-05-27 3570/week @ 2024-06-03 3052/week @ 2024-06-10 2557/week @ 2024-06-17 4330/week @ 2024-06-24 3198/week @ 2024-07-01 3353/week @ 2024-07-08 2648/week @ 2024-07-15 2953/week @ 2024-07-22

12,351 每月下载量

Apache-2.0

350KB
6K SLoC

OpenSrv - MySQL

模拟 MySQL/MariaDB 服务器的绑定。

在开发新的数据库或缓存层时,使用现有应用程序测试您的系统非常有用。然而,这通常需要对应用程序进行大量修改以使用您的数据库。这个 crate 通过充当 MySQL 服务器并将查询和查询执行等操作委托给用户定义的逻辑来解决此问题。

使用方法

首先,为您的后端实现 AsyncMysqlShim,并在您的后端实例和连接流上创建一个 AsyncMysqlIntermediary。当客户端发出 QUERYPREPAREEXECUTE 命令时,将在您的后端上调用相应的方法,您将有机会适当地响应。例如,编写一个始终以“无结果”回复响应所有命令的 shim

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 });
    }
}

此示例可以与此执行

cargo run --example=serve_one

更多示例可以在此处找到。

获取帮助

提交 问题 进行错误报告或在 讨论 中提问。

致谢

此项目是 jonhoo/msql-srv 的一个分支,专注于提供异步支持。

许可证

根据 Apache 许可证版本 2.0 许可。

依赖关系

~15–26MB
~386K SLoC