blob: b1c223db54778bb3aa8d00fc4050c0cbe672e222 [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 Schmidt49659422012-05-26 15:39:3014 "errors"
Julien Schmidtb8ae1f22012-05-04 02:19:1615)
16
Julien Schmidt8416bd02013-02-25 19:25:3517type mysqlStmt struct {
Julien Schmidtb4faadb2012-05-26 15:50:4518 mc *mysqlConn
19 id uint32
20 paramCount int
21 params []mysqlField
Julien Schmidtb8ae1f22012-05-04 02:19:1622}
23
Julien Schmidt8416bd02013-02-25 19:25:3524func (stmt *mysqlStmt) Close() (err error) {
Julien Schmidt96580ec2013-02-20 16:03:1225 err = stmt.mc.writeCommandPacket(COM_STMT_CLOSE, stmt.id)
Julien Schmidtb8ae1f22012-05-04 02:19:1626 stmt.mc = nil
Julien Schmidt07021542013-01-13 05:42:3427 return
Julien Schmidtb8ae1f22012-05-04 02:19:1628}
29
Julien Schmidt8416bd02013-02-25 19:25:3530func (stmt *mysqlStmt) NumInput() int {
Julien Schmidtb8ae1f22012-05-04 02:19:1631 return stmt.paramCount
32}
33
Julien Schmidt8416bd02013-02-25 19:25:3534func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) {
Julien Schmidt49659422012-05-26 15:39:3035 if stmt.mc == nil {
36 return nil, errors.New(`Invalid Statement`)
37 }
Julien Schmidtb8ae1f22012-05-04 02:19:1638 stmt.mc.affectedRows = 0
39 stmt.mc.insertId = 0
Julien Schmidt4d4b4092012-05-04 13:13:5040
Julien Schmidtb8ae1f22012-05-04 02:19:1641 // Send command
Julien Schmidt96580ec2013-02-20 16:03:1242 err := stmt.buildExecutePacket(&args)
43 if err != nil {
44 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1645 }
46
47 // Read Result
48 var resLen int
Julien Schmidt96580ec2013-02-20 16:03:1249 resLen, err = stmt.mc.readResultSetHeaderPacket()
50 if err != nil {
51 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1652 }
53
54 if resLen > 0 {
Julien Schmidt59d433e2012-05-04 20:55:3155 // Columns
Julien Schmidt96580ec2013-02-20 16:03:1256 _, err = stmt.mc.readUntilEOF()
57 if err != nil {
58 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1659 }
60
Julien Schmidt59d433e2012-05-04 20:55:3161 // Rows
Julien Schmidt96580ec2013-02-20 16:03:1262 stmt.mc.affectedRows, err = stmt.mc.readUntilEOF()
63 if err != nil {
64 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1665 }
66 }
Julien Schmidt96580ec2013-02-20 16:03:1267 if err != nil {
68 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1669 }
70
Julien Schmidt8416bd02013-02-25 19:25:3571 return &mysqlResult{
Julien Schmidtb8ae1f22012-05-04 02:19:1672 affectedRows: int64(stmt.mc.affectedRows),
73 insertId: int64(stmt.mc.insertId)},
74 nil
75}
76
Julien Schmidt8416bd02013-02-25 19:25:3577func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) {
Julien Schmidt49659422012-05-26 15:39:3078 if stmt.mc == nil {
79 return nil, errors.New(`Invalid Statement`)
80 }
Julien Schmidtb4faadb2012-05-26 15:50:4581
Julien Schmidtb8ae1f22012-05-04 02:19:1682 // Send command
Julien Schmidt96580ec2013-02-20 16:03:1283 err := stmt.buildExecutePacket(&args)
84 if err != nil {
85 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1686 }
87
Julien Schmidt07021542013-01-13 05:42:3488 // Read Result
Julien Schmidtb8ae1f22012-05-04 02:19:1689 var resLen int
Julien Schmidt96580ec2013-02-20 16:03:1290 resLen, err = stmt.mc.readResultSetHeaderPacket()
91 if err != nil {
92 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1693 }
94
Julien Schmidt8416bd02013-02-25 19:25:3595 rows := &mysqlRows{stmt.mc, true, nil, false}
Julien Schmidt07021542013-01-13 05:42:3496
Julien Schmidtb8ae1f22012-05-04 02:19:1697 if resLen > 0 {
98 // Columns
Julien Schmidt8416bd02013-02-25 19:25:3599 rows.columns, err = stmt.mc.readColumns(resLen)
Julien Schmidt96580ec2013-02-20 16:03:12100 if err != nil {
101 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:16102 }
103 }
104
Julien Schmidt96580ec2013-02-20 16:03:12105 return rows, err
Julien Schmidtb8ae1f22012-05-04 02:19:16106}