blob: a44b94498c7068dcc0cfd2a3cb4c314000c7de9d [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 Schmidt80ad0732013-03-03 04:02:3024 err = stmt.mc.writeCommandPacketUint32(COM_STMT_CLOSE, 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()
46 if err != nil {
47 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1648 }
49
50 if resLen > 0 {
Julien Schmidt59d433e2012-05-04 20:55:3151 // Columns
Julien Schmidt96580ec2013-02-20 16:03:1252 _, err = stmt.mc.readUntilEOF()
53 if err != nil {
54 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1655 }
56
Julien Schmidt59d433e2012-05-04 20:55:3157 // Rows
Julien Schmidt96580ec2013-02-20 16:03:1258 stmt.mc.affectedRows, err = stmt.mc.readUntilEOF()
59 if err != nil {
60 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1661 }
62 }
Julien Schmidt96580ec2013-02-20 16:03:1263 if err != nil {
64 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1665 }
66
Julien Schmidt8416bd02013-02-25 19:25:3567 return &mysqlResult{
Julien Schmidt80ad0732013-03-03 04:02:3068 affectedRows: int64(stmt.mc.affectedRows),
69 insertId: int64(stmt.mc.insertId),
70 }, nil
Julien Schmidtb8ae1f22012-05-04 02:19:1671}
72
Julien Schmidt8416bd02013-02-25 19:25:3573func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) {
Julien Schmidtb8ae1f22012-05-04 02:19:1674 // Send command
Julien Schmidt80ad0732013-03-03 04:02:3075 err := stmt.writeExecutePacket(args)
Julien Schmidt96580ec2013-02-20 16:03:1276 if err != nil {
77 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1678 }
79
Julien Schmidt07021542013-01-13 05:42:3480 // Read Result
Julien Schmidtb8ae1f22012-05-04 02:19:1681 var resLen int
Julien Schmidt96580ec2013-02-20 16:03:1282 resLen, err = stmt.mc.readResultSetHeaderPacket()
83 if err != nil {
84 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1685 }
86
Julien Schmidt8416bd02013-02-25 19:25:3587 rows := &mysqlRows{stmt.mc, true, nil, false}
Julien Schmidt07021542013-01-13 05:42:3488
Julien Schmidtb8ae1f22012-05-04 02:19:1689 if resLen > 0 {
90 // Columns
Julien Schmidt8416bd02013-02-25 19:25:3591 rows.columns, err = stmt.mc.readColumns(resLen)
Julien Schmidt96580ec2013-02-20 16:03:1292 if err != nil {
93 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1694 }
95 }
96
Julien Schmidt96580ec2013-02-20 16:03:1297 return rows, err
Julien Schmidtb8ae1f22012-05-04 02:19:1698}