github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/mysql/statement.go (about) 1 // Go MySQL Driver - A MySQL-Driver for Go's database/sql package 2 // 3 // Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. 4 // 5 // This Source Code Form is subject to the terms of the Mozilla Public 6 // License, v. 2.0. If a copy of the MPL was not distributed with this file, 7 // You can obtain one at http://mozilla.org/MPL/2.0/. 8 9 package mysql 10 11 import ( 12 "database/sql/driver" 13 ) 14 15 type mysqlStmt struct { 16 mc *mysqlConn 17 id uint32 18 paramCount int 19 columns []mysqlField // cached from the first query 20 } 21 22 func (stmt *mysqlStmt) Close() error { 23 if stmt.mc == nil || stmt.mc.netConn == nil { 24 errLog.Print(ErrInvalidConn) 25 return driver.ErrBadConn 26 } 27 28 err := stmt.mc.writeCommandPacketUint32(comStmtClose, stmt.id) 29 stmt.mc = nil 30 return err 31 } 32 33 func (stmt *mysqlStmt) NumInput() int { 34 return stmt.paramCount 35 } 36 37 func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) { 38 if stmt.mc.netConn == nil { 39 errLog.Print(ErrInvalidConn) 40 return nil, driver.ErrBadConn 41 } 42 // Send command 43 err := stmt.writeExecutePacket(args) 44 if err != nil { 45 return nil, err 46 } 47 48 mc := stmt.mc 49 50 mc.affectedRows = 0 51 mc.insertId = 0 52 53 // Read Result 54 resLen, err := mc.readResultSetHeaderPacket() 55 if err == nil { 56 if resLen > 0 { 57 // Columns 58 err = mc.readUntilEOF() 59 if err != nil { 60 return nil, err 61 } 62 63 // Rows 64 err = mc.readUntilEOF() 65 } 66 if err == nil { 67 return &mysqlResult{ 68 affectedRows: int64(mc.affectedRows), 69 insertId: int64(mc.insertId), 70 }, nil 71 } 72 } 73 74 return nil, err 75 } 76 77 func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) { 78 if stmt.mc.netConn == nil { 79 errLog.Print(ErrInvalidConn) 80 return nil, driver.ErrBadConn 81 } 82 // Send command 83 err := stmt.writeExecutePacket(args) 84 if err != nil { 85 return nil, err 86 } 87 88 mc := stmt.mc 89 90 // Read Result 91 resLen, err := mc.readResultSetHeaderPacket() 92 if err != nil { 93 return nil, err 94 } 95 96 rows := new(binaryRows) 97 rows.mc = mc 98 99 if resLen > 0 { 100 // Columns 101 // If not cached, read them and cache them 102 if stmt.columns == nil { 103 rows.columns, err = mc.readColumns(resLen) 104 stmt.columns = rows.columns 105 } else { 106 rows.columns = stmt.columns 107 err = mc.readUntilEOF() 108 } 109 } 110 111 return rows, err 112 }