blob: 025f2ecf58e7b107f190ed0380e8b9e6df7ba544 [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
19 params []mysqlField
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) {
Julien Schmidtb8ae1f22012-05-04 02:19:1637 // Send command
Julien Schmidt80ad0732013-03-03 04:02:3038 err := stmt.writeExecutePacket(args)
Julien Schmidt96580ec2013-02-20 16:03:1239 if err != nil {
40 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1641 }
42
Julien Schmidt5975ca92013-10-23 11:17:5943 mc := stmt.mc
44
45 mc.affectedRows = 0
46 mc.insertId = 0
47
Julien Schmidtb8ae1f22012-05-04 02:19:1648 // Read Result
Julien Schmidt5975ca92013-10-23 11:17:5949 resLen, err := mc.readResultSetHeaderPacket()
Julien Schmidtd571cda2013-03-03 16:40:4750 if err == nil {
51 if resLen > 0 {
52 // Columns
Julien Schmidt5975ca92013-10-23 11:17:5953 err = mc.readUntilEOF()
Julien Schmidtd571cda2013-03-03 16:40:4754 if err != nil {
55 return nil, err
56 }
Julien Schmidtb8ae1f22012-05-04 02:19:1657
Julien Schmidtd571cda2013-03-03 16:40:4758 // Rows
Julien Schmidt5975ca92013-10-23 11:17:5959 err = mc.readUntilEOF()
Julien Schmidtb8ae1f22012-05-04 02:19:1660 }
Julien Schmidtd571cda2013-03-03 16:40:4761 if err == nil {
62 return &mysqlResult{
Julien Schmidt5975ca92013-10-23 11:17:5963 affectedRows: int64(mc.affectedRows),
64 insertId: int64(mc.insertId),
Julien Schmidtd571cda2013-03-03 16:40:4765 }, nil
Julien Schmidtb8ae1f22012-05-04 02:19:1666 }
67 }
Julien Schmidtb8ae1f22012-05-04 02:19:1668
Julien Schmidtd571cda2013-03-03 16:40:4769 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1670}
71
Julien Schmidt8416bd02013-02-25 19:25:3572func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) {
Julien Schmidtb8ae1f22012-05-04 02:19:1673 // Send command
Julien Schmidt80ad0732013-03-03 04:02:3074 err := stmt.writeExecutePacket(args)
Julien Schmidt96580ec2013-02-20 16:03:1275 if err != nil {
76 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1677 }
78
Julien Schmidt5975ca92013-10-23 11:17:5979 mc := stmt.mc
80
Julien Schmidt07021542013-01-13 05:42:3481 // Read Result
Julien Schmidt5975ca92013-10-23 11:17:5982 resLen, err := mc.readResultSetHeaderPacket()
Julien Schmidt96580ec2013-02-20 16:03:1283 if err != nil {
84 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1685 }
86
Julien Schmidt5975ca92013-10-23 11:17:5987 rows := &mysqlRows{mc, true, nil, false}
Julien Schmidt07021542013-01-13 05:42:3488
Julien Schmidtb8ae1f22012-05-04 02:19:1689 if resLen > 0 {
90 // Columns
Julien Schmidt5975ca92013-10-23 11:17:5991 rows.columns, err = mc.readColumns(resLen)
Julien Schmidtb8ae1f22012-05-04 02:19:1692 }
93
Julien Schmidt96580ec2013-02-20 16:03:1294 return rows, err
Julien Schmidtb8ae1f22012-05-04 02:19:1695}