blob: 142ef5416aee2603cb4898fef1619ee59354d2d5 [file] [log] [blame]
Julien Schmidtb8ae1f22012-05-04 02:19:161// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
2//
Julien Schmidtff970042013-09-13 18:36:043// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved.
Julien Schmidtd18a8c12013-02-20 15:12:574//
Julien Schmidtb8ae1f22012-05-04 02:19:165// 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/.
Julien Schmidt04d90432012-10-29 14:25:288
Julien Schmidtb8ae1f22012-05-04 02:19:169package mysql
10
11import (
12 "database/sql/driver"
Julien Schmidtb8ae1f22012-05-04 02:19:1613)
14
Julien Schmidt8416bd02013-02-25 19:25:3515type mysqlStmt struct {
Julien Schmidtb4faadb2012-05-26 15:50:4516 mc *mysqlConn
17 id uint32
18 paramCount int
Julien Schmidtc4a3fc12013-10-24 07:13:1819 columns []mysqlField // cached from the first query
Julien Schmidtb8ae1f22012-05-04 02:19:1620}
21
Julien Schmidt5975ca92013-10-23 11:17:5922func (stmt *mysqlStmt) Close() error {
Julien Schmidt3c1e4f12013-09-13 17:16:0323 if stmt.mc == nil || stmt.mc.netConn == nil {
Gustavo Kristic734d65e2014-05-01 20:03:4424 errLog.Print(ErrInvalidConn)
Julien Schmidt4d3764b2013-11-02 09:45:0625 return driver.ErrBadConn
Julien Schmidt3c1e4f12013-09-13 17:16:0326 }
27
Julien Schmidt5975ca92013-10-23 11:17:5928 err := stmt.mc.writeCommandPacketUint32(comStmtClose, stmt.id)
Julien Schmidtb8ae1f22012-05-04 02:19:1629 stmt.mc = nil
Julien Schmidt5975ca92013-10-23 11:17:5930 return err
Julien Schmidtb8ae1f22012-05-04 02:19:1631}
32
Julien Schmidt8416bd02013-02-25 19:25:3533func (stmt *mysqlStmt) NumInput() int {
Julien Schmidtb8ae1f22012-05-04 02:19:1634 return stmt.paramCount
35}
36
Julien Schmidt8416bd02013-02-25 19:25:3537func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) {
Arne Hormann06d54832013-10-30 10:21:3538 if stmt.mc.netConn == nil {
Gustavo Kristic734d65e2014-05-01 20:03:4439 errLog.Print(ErrInvalidConn)
Julien Schmidt4d3764b2013-11-02 09:45:0640 return nil, driver.ErrBadConn
Arne Hormann32e5cee2013-10-29 10:57:5841 }
Julien Schmidtb8ae1f22012-05-04 02:19:1642 // Send command
Julien Schmidt80ad0732013-03-03 04:02:3043 err := stmt.writeExecutePacket(args)
Julien Schmidt96580ec2013-02-20 16:03:1244 if err != nil {
45 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1646 }
47
Julien Schmidt5975ca92013-10-23 11:17:5948 mc := stmt.mc
49
50 mc.affectedRows = 0
51 mc.insertId = 0
52
Julien Schmidtb8ae1f22012-05-04 02:19:1653 // Read Result
Julien Schmidt5975ca92013-10-23 11:17:5954 resLen, err := mc.readResultSetHeaderPacket()
Julien Schmidtd571cda2013-03-03 16:40:4755 if err == nil {
56 if resLen > 0 {
57 // Columns
Julien Schmidt5975ca92013-10-23 11:17:5958 err = mc.readUntilEOF()
Julien Schmidtd571cda2013-03-03 16:40:4759 if err != nil {
60 return nil, err
61 }
Julien Schmidtb8ae1f22012-05-04 02:19:1662
Julien Schmidtd571cda2013-03-03 16:40:4763 // Rows
Julien Schmidt5975ca92013-10-23 11:17:5964 err = mc.readUntilEOF()
Julien Schmidtb8ae1f22012-05-04 02:19:1665 }
Julien Schmidtd571cda2013-03-03 16:40:4766 if err == nil {
67 return &mysqlResult{
Julien Schmidt5975ca92013-10-23 11:17:5968 affectedRows: int64(mc.affectedRows),
69 insertId: int64(mc.insertId),
Julien Schmidtd571cda2013-03-03 16:40:4770 }, nil
Julien Schmidtb8ae1f22012-05-04 02:19:1671 }
72 }
Julien Schmidtb8ae1f22012-05-04 02:19:1673
Julien Schmidtd571cda2013-03-03 16:40:4774 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1675}
76
Julien Schmidt8416bd02013-02-25 19:25:3577func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) {
Arne Hormann06d54832013-10-30 10:21:3578 if stmt.mc.netConn == nil {
Gustavo Kristic734d65e2014-05-01 20:03:4479 errLog.Print(ErrInvalidConn)
Julien Schmidt4d3764b2013-11-02 09:45:0680 return nil, driver.ErrBadConn
Arne Hormann32e5cee2013-10-29 10:57:5881 }
Julien Schmidtb8ae1f22012-05-04 02:19:1682 // Send command
Julien Schmidt80ad0732013-03-03 04:02:3083 err := stmt.writeExecutePacket(args)
Julien Schmidt96580ec2013-02-20 16:03:1284 if err != nil {
85 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1686 }
87
Julien Schmidt5975ca92013-10-23 11:17:5988 mc := stmt.mc
89
Julien Schmidt07021542013-01-13 05:42:3490 // Read Result
Julien Schmidt5975ca92013-10-23 11:17:5991 resLen, err := mc.readResultSetHeaderPacket()
Julien Schmidt96580ec2013-02-20 16:03:1292 if err != nil {
93 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1694 }
95
Julien Schmidtc727bbb2013-10-30 19:11:5796 rows := new(binaryRows)
97 rows.mc = mc
Julien Schmidt07021542013-01-13 05:42:3498
Julien Schmidtb8ae1f22012-05-04 02:19:1699 if resLen > 0 {
100 // Columns
Julien Schmidtc4a3fc12013-10-24 07:13:18101 // 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 }
Julien Schmidtb8ae1f22012-05-04 02:19:16109 }
110
Julien Schmidt96580ec2013-02-20 16:03:12111 return rows, err
Julien Schmidtb8ae1f22012-05-04 02:19:16112}