blob: 4cefc408abe2683dc296f81ff0310a3fcadf89e3 [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
17type stmtContent 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
24type mysqlStmt struct {
25 *stmtContent
26}
27
Julien Schmidt07021542013-01-13 05:42:3428func (stmt mysqlStmt) Close() (e error) {
29 e = stmt.mc.writeCommandPacket(COM_STMT_CLOSE, stmt.id)
Julien Schmidtb8ae1f22012-05-04 02:19:1630 stmt.mc = nil
Julien Schmidt07021542013-01-13 05:42:3431 return
Julien Schmidtb8ae1f22012-05-04 02:19:1632}
33
34func (stmt mysqlStmt) NumInput() int {
35 return stmt.paramCount
36}
37
38func (stmt mysqlStmt) Exec(args []driver.Value) (driver.Result, error) {
Julien Schmidt49659422012-05-26 15:39:3039 if stmt.mc == nil {
40 return nil, errors.New(`Invalid Statement`)
41 }
Julien Schmidtb8ae1f22012-05-04 02:19:1642 stmt.mc.affectedRows = 0
43 stmt.mc.insertId = 0
Julien Schmidt4d4b4092012-05-04 13:13:5044
Julien Schmidtb8ae1f22012-05-04 02:19:1645 // Send command
46 e := stmt.buildExecutePacket(&args)
47 if e != nil {
48 return nil, e
49 }
50
51 // Read Result
52 var resLen int
53 resLen, e = stmt.mc.readResultSetHeaderPacket()
54 if e != nil {
55 return nil, e
56 }
57
58 if resLen > 0 {
Julien Schmidt59d433e2012-05-04 20:55:3159 // Columns
Julien Schmidtb8ae1f22012-05-04 02:19:1660 _, e = stmt.mc.readUntilEOF()
61 if e != nil {
62 return nil, e
63 }
64
Julien Schmidt59d433e2012-05-04 20:55:3165 // Rows
Julien Schmidtb8ae1f22012-05-04 02:19:1666 stmt.mc.affectedRows, e = stmt.mc.readUntilEOF()
67 if e != nil {
68 return nil, e
69 }
70 }
71 if e != nil {
72 return nil, e
73 }
74
Julien Schmidt49659422012-05-26 15:39:3075 return mysqlResult{
Julien Schmidtb8ae1f22012-05-04 02:19:1676 affectedRows: int64(stmt.mc.affectedRows),
77 insertId: int64(stmt.mc.insertId)},
78 nil
79}
80
Julien Schmidt07021542013-01-13 05:42:3481func (stmt mysqlStmt) Query(args []driver.Value) (driver.Rows, error) {
Julien Schmidt49659422012-05-26 15:39:3082 if stmt.mc == nil {
83 return nil, errors.New(`Invalid Statement`)
84 }
Julien Schmidtb4faadb2012-05-26 15:50:4585
Julien Schmidtb8ae1f22012-05-04 02:19:1686 // Send command
Julien Schmidt07021542013-01-13 05:42:3487 e := stmt.buildExecutePacket(&args)
Julien Schmidtb8ae1f22012-05-04 02:19:1688 if e != nil {
89 return nil, e
90 }
91
Julien Schmidt07021542013-01-13 05:42:3492 // Read Result
Julien Schmidtb8ae1f22012-05-04 02:19:1693 var resLen int
Julien Schmidtb8ae1f22012-05-04 02:19:1694 resLen, e = stmt.mc.readResultSetHeaderPacket()
95 if e != nil {
96 return nil, e
97 }
98
Julien Schmidt57fe6e42013-01-15 05:19:3799 rows := mysqlRows{&rowsContent{stmt.mc, true, nil, false}}
Julien Schmidt07021542013-01-13 05:42:34100
Julien Schmidtb8ae1f22012-05-04 02:19:16101 if resLen > 0 {
102 // Columns
103 rows.content.columns, e = stmt.mc.readColumns(resLen)
104 if e != nil {
Julien Schmidt07021542013-01-13 05:42:34105 return nil, e
Julien Schmidtb8ae1f22012-05-04 02:19:16106 }
107 }
108
Julien Schmidt07021542013-01-13 05:42:34109 return rows, e
Julien Schmidtb8ae1f22012-05-04 02:19:16110}