go实现一个兼容mysql协议的虚拟数据库代码

代码语言:golang

所属分类:其他

代码描述:go实现一个兼容mysql协议的虚拟数据库代码,对外可以连接执行sql命令并返回数据,客户端看上去像一个真的mysql数据,其实都是go返回的虚假数据。

代码标签: go 兼容 mysql 协议 虚拟 数据库 代码

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

package main

import (
    "bytes"
    "encoding/binary"
    "fmt"
    "log"
    "net"

    "github.com/go-mysql-org/go-mysql/mysql"
    "github.com/go-mysql-org/go-mysql/server"
)

func main() {
    // 启动虚拟 MySQL 服务器
    l, err := net.Listen("tcp", "127.0.0.1:3307")
    if err != nil {
        log.Fatal(err)
    }
    defer l.Close()
    log.Println("Virtual MySQL server is listening on 127.0.0.1:3307")

    for {
        conn, err := l.Accept()
        if err != nil {
            log.Println(err)
            continue
        }

        go handleConnection(conn)
    }
}

func handleConnection(conn net.Conn) {
    // 确保连接在所有情况下都被关闭
    defer conn.Close()

    // 创建一个新的 MySQL 连接
    c, err := server.NewConn(conn, "root", "passwd", &MySQLHandler{})
    if err != nil {
        log.Println("Failed to create MySQL connection:", err)
        return
    }

    for {
        if err := c.HandleCommand(); err != nil {
            log.Println("Connection closed:", err)
            return
        }
    }
}

type MySQLHandler struct{}

func (h *MySQLHandler) UseDB(dbName string) error {
    fmt.Printf("Use database: %s\n", dbName)
    return nil
}

func (h *MySQLHandler) HandleQuery(query string) (*mysql.Result, error) {
    fmt.Printf("SQL Query: %s\n", query)

    // 这里伪造一些数据返回给客户端
    columns := []*mysql.Field{
        {Name: []byte("id"), Type: mysql.MYSQL_TYPE_LONG},
        {Name: []byte("name"), Type: mysql.MYSQL_TYPE_VAR_STRING},
    }

    rows := make([][]interface{}, 0)
    rows = append(rows, []interface{}{1, "Alice"})
    rows = append(rows, []interface{}{2, "Bob"})

    // 创建结果集
    resultset := &mysql.Resultset{
        Fields: columns,
    }

    for _, row := range rows {
        rowData := make([]byte, 0)
        for _, col := range row {
            encoded, err := encodeValue(col)
            if err != nil {
                return nil, err
            }
     .........完整代码请登录后点击上方下载按钮下载查看

网友评论0