blob: bceb38917eebe17c1d4b251a1506c8b81a0b4c98 [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 {
24 return errInvalidConn
25 }
26
Julien Schmidt5975ca92013-10-23 11:17:5927 err := stmt.mc.writeCommandPacketUint32(comStmtClose, stmt.id)
Julien Schmidtb8ae1f22012-05-04 02:19:1628 stmt.mc = nil
Julien Schmidt5975ca92013-10-23 11:17:5929 return err
Julien Schmidtb8ae1f22012-05-04 02:19:1630}
31
Julien Schmidt8416bd02013-02-25 19:25:3532func (stmt *mysqlStmt) NumInput() int {
Julien Schmidtb8ae1f22012-05-04 02:19:1633 return stmt.paramCount
34}
35
Julien Schmidt8416bd02013-02-25 19:25:3536func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) {
Arne Hormann06d54832013-10-30 10:21:3537 if stmt.mc.netConn == nil {
Arne Hormann32e5cee2013-10-29 10:57:5838 return nil, errInvalidConn
39 }
Julien Schmidtb8ae1f22012-05-04 02:19:1640 // Send command
Julien Schmidt80ad0732013-03-03 04:02:3041 err := stmt.writeExecutePacket(args)
Julien Schmidt96580ec2013-02-20 16:03:1242 if err != nil {
43 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1644 }
45
Julien Schmidt5975ca92013-10-23 11:17:5946 mc := stmt.mc
47
48 mc.affectedRows = 0
49 mc.insertId = 0
50
Julien Schmidtb8ae1f22012-05-04 02:19:1651 // Read Result
Julien Schmidt5975ca92013-10-23 11:17:5952 resLen, err := mc.readResultSetHeaderPacket()
Julien Schmidtd571cda2013-03-03 16:40:4753 if err == nil {
54 if resLen > 0 {
55 // Columns
Julien Schmidt5975ca92013-10-23 11:17:5956 err = mc.readUntilEOF()
Julien Schmidtd571cda2013-03-03 16:40:4757 if err != nil {
58 return nil, err
59 }
Julien Schmidtb8ae1f22012-05-04 02:19:1660
Julien Schmidtd571cda2013-03-03 16:40:4761 // Rows
Julien Schmidt5975ca92013-10-23 11:17:5962 err = mc.readUntilEOF()
Julien Schmidtb8ae1f22012-05-04 02:19:1663 }
Julien Schmidtd571cda2013-03-03 16:40:4764 if err == nil {
65 return &mysqlResult{
Julien Schmidt5975ca92013-10-23 11:17:5966 affectedRows: int64(mc.affectedRows),
67 insertId: int64(mc.insertId),
Julien Schmidtd571cda2013-03-03 16:40:4768 }, nil
Julien Schmidtb8ae1f22012-05-04 02:19:1669 }
70 }
Julien Schmidtb8ae1f22012-05-04 02:19:1671
Julien Schmidtd571cda2013-03-03 16:40:4772 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1673}
74
Julien Schmidt8416bd02013-02-25 19:25:3575func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) {
Arne Hormann06d54832013-10-30 10:21:3576 if stmt.mc.netConn == nil {
Arne Hormann32e5cee2013-10-29 10:57:5877 return nil, errInvalidConn
78 }
Julien Schmidtb8ae1f22012-05-04 02:19:1679 // Send command
Julien Schmidt80ad0732013-03-03 04:02:3080 err := stmt.writeExecutePacket(args)
Julien Schmidt96580ec2013-02-20 16:03:1281 if err != nil {
82 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1683 }
84
Julien Schmidt5975ca92013-10-23 11:17:5985 mc := stmt.mc
86
Julien Schmidt07021542013-01-13 05:42:3487 // Read Result
Julien Schmidt5975ca92013-10-23 11:17:5988 resLen, err := mc.readResultSetHeaderPacket()
Julien Schmidt96580ec2013-02-20 16:03:1289 if err != nil {
90 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1691 }
92
Julien Schmidt72676902013-10-25 16:25:2693 rows := &mysqlRows{mc, nil, true, false}
Julien Schmidt07021542013-01-13 05:42:3494
Julien Schmidtb8ae1f22012-05-04 02:19:1695 if resLen > 0 {
96 // Columns
Julien Schmidtc4a3fc12013-10-24 07:13:1897 // If not cached, read them and cache them
98 if stmt.columns == nil {
99 rows.columns, err = mc.readColumns(resLen)
100 stmt.columns = rows.columns
101 } else {
102 rows.columns = stmt.columns
103 err = mc.readUntilEOF()
104 }
Julien Schmidtb8ae1f22012-05-04 02:19:16105 }
106
Julien Schmidt96580ec2013-02-20 16:03:12107 return rows, err
Julien Schmidtb8ae1f22012-05-04 02:19:16108}