4
"github.com/ziutek/mymysql/mysql"
12
sql string // For reprepare during reconnect
14
params []paramValue // Parameters binding
28
func (stmt *Stmt) Fields() []*mysql.Field {
32
func (stmt *Stmt) NumParam() int {
33
return stmt.param_count
36
func (stmt *Stmt) WarnCount() int {
37
return stmt.warning_count
40
func (stmt *Stmt) sendCmdExec() {
41
// Calculate packet length and NULL bitmap
42
pkt_len := 1 + 4 + 1 + 4 + 1 + len(stmt.null_bitmap)
43
for ii, param := range stmt.params {
44
par_len := param.Len()
48
null_mask := byte(1) << uint(ii-(null_byte<<3))
49
stmt.null_bitmap[null_byte] |= null_mask
53
pkt_len += stmt.param_count * 2
55
// Reset sequence number
58
pw := stmt.my.newPktWriter(pkt_len)
59
pw.writeByte(_COM_STMT_EXECUTE)
61
pw.writeByte(0) // flags = CURSOR_TYPE_NO_CURSOR
62
pw.writeU32(1) // iteration_count
63
pw.write(stmt.null_bitmap)
67
for _, param := range stmt.params {
68
pw.writeU16(param.typ)
74
for i := range stmt.params {
75
pw.writeValue(&stmt.params[i])
79
log.Printf("[%2d <-] Exec command packet: len=%d, null_bitmap=%v, rebind=%t",
80
stmt.my.seq-1, pkt_len, stmt.null_bitmap, stmt.rebind)
83
// Mark that we sended information about binded types
87
func (my *Conn) getPrepareResult(stmt *Stmt) interface{} {
89
pr := my.newPktReader() // New reader for next packet
92
//log.Println("pkt0:", pkt0, "stmt:", stmt)
102
return my.getPrepareOkPacket(pr)
105
unreaded_params := (stmt.param_count < len(stmt.params))
109
stmt.warning_count, stmt.status = my.getEofPacket(pr)
110
stmt.my.status = stmt.status
113
case pkt0 > 0 && pkt0 < 251 && (stmt.field_count < len(stmt.fields) ||
117
// Read and ignore parameter field. Sentence from MySQL source:
118
/* skip parameters data: we don't support it yet */
120
// Increment param_count count
123
field := my.getFieldPacket(pr)
124
stmt.fields[stmt.field_count] = field
125
// Increment field count
132
panic(mysql.ErrUnkResultPkt)
135
func (my *Conn) getPrepareOkPacket(pr *pktReader) (stmt *Stmt) {
137
log.Printf("[%2d ->] Perpared OK packet:", my.seq-1)
142
// First byte was readed by getPrepRes
143
stmt.id = pr.readU32()
144
stmt.fields = make([]*mysql.Field, int(pr.readU16())) // FieldCount
145
pl := int(pr.readU16()) // ParamCount
147
stmt.params = make([]paramValue, pl)
148
stmt.null_bitmap = make([]byte, (pl+7)>>3)
151
stmt.warning_count = int(pr.readU16())
155
log.Printf(tab8s+"ID=0x%x ParamCount=%d FieldsCount=%d WarnCount=%d",
156
stmt.id, len(stmt.params), len(stmt.fields), stmt.warning_count,