blob: 35473f74baa274ac15bbbe90f9c97c143b8821ae [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 Schmidt3c1e4f12013-09-13 17:16:0324 if stmt.mc == nil || stmt.mc.netConn == nil {
25 return errInvalidConn
26 }
27
Julien Schmidtd1deaee2013-03-06 02:06:5028 err = stmt.mc.writeCommandPacketUint32(comStmtClose, stmt.id)
Julien Schmidtb8ae1f22012-05-04 02:19:1629 stmt.mc = nil
Julien Schmidt07021542013-01-13 05:42:3430 return
Julien Schmidtb8ae1f22012-05-04 02:19:1631}
32
Julien Schmidt8416bd02013-02-25 19:25:3533func (stmt *mysqlStmt) NumInput() int {
Julien Schmidtb8ae1f22012-05-04 02:19:1634 return stmt.paramCount
35}
36
Julien Schmidt8416bd02013-02-25 19:25:3537func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) {
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 Schmidt80ad0732013-03-03 04:02:3042 err := stmt.writeExecutePacket(args)
Julien Schmidt96580ec2013-02-20 16:03:1243 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()
Julien Schmidtd571cda2013-03-03 16:40:4750 if err == nil {
51 if resLen > 0 {
52 // Columns
Julien Schmidt74a64522013-03-03 17:41:1353 err = stmt.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 Schmidt74a64522013-03-03 17:41:1359 err = stmt.mc.readUntilEOF()
Julien Schmidtb8ae1f22012-05-04 02:19:1660 }
Julien Schmidtd571cda2013-03-03 16:40:4761 if err == nil {
62 return &mysqlResult{
63 affectedRows: int64(stmt.mc.affectedRows),
64 insertId: int64(stmt.mc.insertId),
65 }, 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 Schmidt07021542013-01-13 05:42:3479 // Read Result
Julien Schmidtb8ae1f22012-05-04 02:19:1680 var resLen int
Julien Schmidt96580ec2013-02-20 16:03:1281 resLen, err = stmt.mc.readResultSetHeaderPacket()
82 if err != nil {
83 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1684 }
85
Julien Schmidt8416bd02013-02-25 19:25:3586 rows := &mysqlRows{stmt.mc, true, nil, false}
Julien Schmidt07021542013-01-13 05:42:3487
Julien Schmidtb8ae1f22012-05-04 02:19:1688 if resLen > 0 {
89 // Columns
Julien Schmidt8416bd02013-02-25 19:25:3590 rows.columns, err = stmt.mc.readColumns(resLen)
Julien Schmidt96580ec2013-02-20 16:03:1291 if err != nil {
92 return nil, err
Julien Schmidtb8ae1f22012-05-04 02:19:1693 }
94 }
95
Julien Schmidt96580ec2013-02-20 16:03:1296 return rows, err
Julien Schmidtb8ae1f22012-05-04 02:19:1697}