- 
                Notifications
    
You must be signed in to change notification settings  - Fork 1k
 
Open
Description
In my code:
package main
import (
	"log"
	"net"
	"time"
	"github.com/go-mysql-org/go-mysql/mysql"
	"github.com/go-mysql-org/go-mysql/server"
)
type MySQLStreamResultTestHandler struct {
	clientAddr string
	*server.Conn
}
func (h *MySQLStreamResultTestHandler) UseDB(dbName string) error {
	return nil
}
func (h *MySQLStreamResultTestHandler) HandleQuery(query string) (*mysql.Result, error) {
	log.Printf("Received query: %s from %s", query, h.clientAddr)
	if query == "show binary logs" {
		names := []string{"Log_name", "File_size"}
		values := [][]any{{"mysql-bin.001000", "123"}}
		r1, _ := mysql.BuildSimpleResultset(names, values, false)
		// r1.Streaming = mys
		r1.StreamingDone = false
		r1.Streaming = mysql.StreamingSelect
		r1result := mysql.NewResult(r1)
		h.WriteValue(r1result)
		r2, _ := mysql.BuildSimpleResultset(names, values, false)
		r2.Streaming = mysql.StreamingNone
		r2.StreamingDone = true
		r2result := mysql.NewResult(r2)
		// h.WriteValue(r2result)
		return r2result, nil
	}
	return nil, nil
}
func (h *MySQLStreamResultTestHandler) HandleFieldList(table string, fieldWildcard string) ([]*mysql.Field, error) {
	return nil, nil
}
func (h *MySQLStreamResultTestHandler) HandleStmtPrepare(query string) (params int, columns int, context interface{}, err error) {
	return 0, 0, nil, nil
}
func (h *MySQLStreamResultTestHandler) HandleStmtExecute(context interface{}, query string, args []interface{}) (*mysql.Result, error) {
	return nil, nil
}
func (h *MySQLStreamResultTestHandler) HandleStmtClose(context interface{}) error {
	return nil
}
func (h *MySQLStreamResultTestHandler) HandleOtherCommand(cmd byte, data []byte) error {
	return nil
}
func main() {
	listener, err := net.Listen("tcp", "127.0.0.1:4000")
	if err != nil {
		log.Fatalf("Failed to listen on TCP address: %v", err)
	}
	go func() {
		for {
			conn, err := listener.Accept()
			if err != nil {
				log.Fatalf("Failed to accept TCP connection: %v", err)
				return
			}
			cmdHandler := &MySQLStreamResultTestHandler{
				clientAddr: conn.RemoteAddr().String(),
			}
			mysqlConn, err := server.NewConn(conn, "root", "", cmdHandler)
			if err != nil {
				log.Fatalf("Failed to create MySQL connection: %v", err)
				return
			}
			for {
				if err := mysqlConn.HandleCommand(); err != nil {
					log.Fatal(err)
				}
			}
		}
	}()
	time.Sleep(1000 * time.Second)
}This example will panic!
Some queries have too much data and I need to stream the Result to reduce the server-side memory footprint.
But I have a question about the use of *mysql.Result, can you provide an example that shows me how to query with Stream Result?
Metadata
Metadata
Assignees
Labels
No labels