blob: faa1ad0322678272e951468e612a1863610d00fb [file] [log] [blame]
Julien Schmidtb8ae1f22012-05-04 02:19:161// Go MySQL Driver - A MySQL-Driver for Go's database/sql package
2//
3// Copyright 2012 Julien Schmidt. All rights reserved.
4// http://www.julienschmidt.com
Julien Schmidtd18a8c12013-02-20 15:12:575//
Julien Schmidtb8ae1f22012-05-04 02:19:166// This Source Code Form is subject to the terms of the Mozilla Public
7// License, v. 2.0. If a copy of the MPL was not distributed with this file,
8// You can obtain one at http://mozilla.org/MPL/2.0/.
Julien Schmidt04d90432012-10-29 14:25:289
Julien Schmidtb8ae1f22012-05-04 02:19:1610package mysql
11
12import (
13 "database/sql/driver"
Julien Schmidtb8ae1f22012-05-04 02:19:1614)
15
Julien Schmidt8416bd02013-02-25 19:25:3516type mysqlStmt struct {
Julien Schmidtb4faadb2012-05-26 15:50:4517 mc *mysqlConn
18 id uint32
19 paramCount int
20 params []mysqlField
Julien Schmidtb8ae1f22012-05-04 02:19:1621}
22
Julien Schmidt8416bd02013-02-25 19:25:3523func (stmt *mysqlStmt) Close() (err error) {
Julien Schmidtd1deaee2013-03-06 02:06:5024 err = stmt.mc.writeCommandPacketUint32(comStmtClose, stmt.id)
Julien Schmidtb8ae1f22012-05-04 02:19:1625 stmt.mc = nil
Julien Schmidt07021542013-01-13 05:42:3426 return
Julien Schmidtb8ae1f22012-05-04 02:19:1627}
28
Julien Schmidt8416bd02013-02-25 19:25:3529func (stmt *mysqlStmt) NumInput() int {
Julien Schmidtb8ae1f22012-05-04 02:19:1630 return stmt.paramCount
31}
32
Julien Schmidt8416bd02013-02-25 19:25:3533func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) {
Julien Schmidtb8ae1f22012-05-04 02:19:1634 stmt.mc.affectedRows = 0
35 stmt.mc.insertId = 0
Julien Schmidt4d4b4092012-05-04 13:13:5036
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
43 // Read Result
44 var resLen int
Julien Schmidt96580ec2013-02-20 16:03:1245 resLen, err = stmt.mc.readResultSetHeaderPacket()
Julien Schmidtd571cda2013-03-03 16:40:4746 if err == nil {
47 if resLen > 0 {
48 // Columns
Julien Schmidt74a64522013-03-03 17:41:1349 err = stmt.mc.readUntilEOF()
Julien Schmidtd571cda2013-03-03 16:40:4750 if err != nil {
51 return nil, err
52 }
Julien Schmidtb8ae1f22012-05-04 02:19:1653
Julien Schmidtd571cda2013-03-03 16:40:4754 // Rows
Julien Schmidt74a64522013-03-03 17:41:1355 err = stmt.mc.readUntilEOF()
Julien Schmidtb8ae1f22012-05-04 02:19:1656 }
Julien Schmidtd571cda2013-03-03 16:40:4757 if err == nil {
58 return &mysqlResult{
59 affectedRows: int64(stmt.mc.affectedRows),
60 insertId: int64(stmt.mc.insertId),
61 }, nil
Julien Schmidtb8ae1f22012-05-04 02:19:1662 }
63 }
Julien Schmidtb8ae1f22012-05-04 02:19:1664
Julien Schmidtd571cda2013-03-03 16:40:4765 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1666}
67
Julien Schmidt8416bd02013-02-25 19:25:3568func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) {
Julien Schmidtb8ae1f22012-05-04 02:19:1669 // Send command
Julien Schmidt80ad0732013-03-03 04:02:3070 err := stmt.writeExecutePacket(args)
Julien Schmidt96580ec2013-02-20 16:03:1271 if err != nil {
72 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1673 }
74
Julien Schmidt07021542013-01-13 05:42:3475 // Read Result
Julien Schmidtb8ae1f22012-05-04 02:19:1676 var resLen int
Julien Schmidt96580ec2013-02-20 16:03:1277 resLen, err = stmt.mc.readResultSetHeaderPacket()
78 if err != nil {
79 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1680 }
81
Julien Schmidt8416bd02013-02-25 19:25:3582 rows := &mysqlRows{stmt.mc, true, nil, false}
Julien Schmidt07021542013-01-13 05:42:3483
Julien Schmidtb8ae1f22012-05-04 02:19:1684 if resLen > 0 {
85 // Columns
Julien Schmidt8416bd02013-02-25 19:25:3586 rows.columns, err = stmt.mc.readColumns(resLen)
Julien Schmidt96580ec2013-02-20 16:03:1287 if err != nil {
88 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1689 }
90 }
91
Julien Schmidt96580ec2013-02-20 16:03:1292 return rows, err
Julien Schmidtb8ae1f22012-05-04 02:19:1693}