2 Star 2 Fork 2

tym_hmm/mysql-mydumper

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
statement.go 2.87 KB
一键复制 编辑 原始数据 按行查看 历史
天蝎儿 提交于 2021-12-16 21:06 +08:00 . 完成底层封装
/*
* go-mysqlstack
* xelabs.org
*
* Copyright (c) XeLabs
* GPL License
*
*/
package driver
import (
"gitee.com/tym_hmm/mysql-mydumper/extend/mysql/proto"
"gitee.com/tym_hmm/mysql-mydumper/extend/mysql/sqldb"
"gitee.com/tym_hmm/mysql-mydumper/extend/mysql/sqlparser/depends/sqltypes"
querypb "gitee.com/tym_hmm/mysql-mydumper/extend/mysql/sqlparser/depends/query"
)
// Statement --
type Statement struct {
conn *conn
ID uint32
ParamCount uint16
PrepareStmt string
ParamsType []int32
ColumnNames []string
BindVars map[string]*querypb.BindVariable
}
// ComStatementExecute -- statement execute write.
func (s *Statement) ComStatementExecute(parameters []sqltypes.Value) error {
var err error
var datas []byte
var iRows Rows
if datas, err = proto.PackStatementExecute(s.ID, parameters); err != nil {
return err
}
if iRows, err = s.conn.stmtQuery(sqldb.COM_STMT_EXECUTE, datas); err != nil {
return err
}
for iRows.Next() {
if _, err := iRows.RowValues(); err != nil {
s.conn.Cleanup()
return err
}
}
// Drain the results and check last error.
if err := iRows.Close(); err != nil {
s.conn.Cleanup()
return err
}
return nil
}
// ComStatementExecute -- statement execute write.
func (s *Statement) ComStatementQuery(parameters []sqltypes.Value) (*sqltypes.Result, error) {
var err error
var datas []byte
var iRows Rows
var qrRow []sqltypes.Value
var qrRows [][]sqltypes.Value
if datas, err = proto.PackStatementExecute(s.ID, parameters); err != nil {
return nil, err
}
if iRows, err = s.conn.stmtQuery(sqldb.COM_STMT_EXECUTE, datas); err != nil {
return nil, err
}
for iRows.Next() {
if qrRow, err = iRows.RowValues(); err != nil {
s.conn.Cleanup()
return nil, err
}
if qrRow != nil {
qrRows = append(qrRows, qrRow)
}
}
// Drain the results and check last error.
if err := iRows.Close(); err != nil {
s.conn.Cleanup()
return nil, err
}
rowsAffected := iRows.RowsAffected()
if rowsAffected == 0 {
rowsAffected = uint64(len(qrRows))
}
qr := &sqltypes.Result{
Fields: iRows.Fields(),
RowsAffected: rowsAffected,
InsertID: iRows.LastInsertID(),
Rows: qrRows,
}
return qr, err
}
// ComStatementReset -- reset the stmt.
func (s *Statement) ComStatementReset() error {
var data [4]byte
// Add arg [32 bit]
data[0] = byte(s.ID)
data[1] = byte(s.ID >> 8)
data[2] = byte(s.ID >> 16)
data[3] = byte(s.ID >> 24)
if err := s.conn.packets.WriteCommand(sqldb.COM_STMT_RESET, data[:]); err != nil {
return err
}
return s.conn.packets.ReadOK()
}
// ComStatementClose -- close the stmt.
func (s *Statement) ComStatementClose() error {
var data [4]byte
// Add arg [32 bit]
data[0] = byte(s.ID)
data[1] = byte(s.ID >> 8)
data[2] = byte(s.ID >> 16)
data[3] = byte(s.ID >> 24)
if err := s.conn.packets.WriteCommand(sqldb.COM_STMT_CLOSE, data[:]); err != nil {
return err
}
return nil
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/tym_hmm/mysql-mydumper.git
git@gitee.com:tym_hmm/mysql-mydumper.git
tym_hmm
mysql-mydumper
mysql-mydumper
v1.0.3

搜索帮助