blob: 9ada679ae1538ccd400ca31cb5952c206e0fb402 [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
5//
6// 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/.
9package mysql
10
11import (
12 "database/sql/driver"
Julien Schmidt49659422012-05-26 15:39:3013 "errors"
Julien Schmidtb8ae1f22012-05-04 02:19:1614)
15
16type stmtContent 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
23type mysqlStmt struct {
24 *stmtContent
25}
26
27func (stmt mysqlStmt) Close() error {
28 e := stmt.mc.writeCommandPacket(COM_STMT_CLOSE, stmt.id)
Julien Schmidtb8ae1f22012-05-04 02:19:1629 stmt.mc = nil
30 return e
31}
32
33func (stmt mysqlStmt) NumInput() int {
34 return stmt.paramCount
35}
36
37func (stmt mysqlStmt) Exec(args []driver.Value) (driver.Result, error) {
Julien Schmidt49659422012-05-26 15:39:3038 if stmt.mc == nil {
39 return nil, errors.New(`Invalid Statement`)
40 }
Julien Schmidtb8ae1f22012-05-04 02:19:1641 stmt.mc.affectedRows = 0
42 stmt.mc.insertId = 0
Julien Schmidt4d4b4092012-05-04 13:13:5043
Julien Schmidtb8ae1f22012-05-04 02:19:1644 // Send command
45 e := stmt.buildExecutePacket(&args)
46 if e != nil {
47 return nil, e
48 }
49
50 // Read Result
51 var resLen int
52 resLen, e = stmt.mc.readResultSetHeaderPacket()
53 if e != nil {
54 return nil, e
55 }
56
57 if resLen > 0 {
Julien Schmidt59d433e2012-05-04 20:55:3158 // Columns
Julien Schmidtb8ae1f22012-05-04 02:19:1659 _, e = stmt.mc.readUntilEOF()
60 if e != nil {
61 return nil, e
62 }
63
Julien Schmidt59d433e2012-05-04 20:55:3164 // Rows
Julien Schmidtb8ae1f22012-05-04 02:19:1665 stmt.mc.affectedRows, e = stmt.mc.readUntilEOF()
66 if e != nil {
67 return nil, e
68 }
69 }
70 if e != nil {
71 return nil, e
72 }
73
74 if stmt.mc.affectedRows == 0 {
75 return driver.ResultNoRows, nil
76 }
77
Julien Schmidt49659422012-05-26 15:39:3078 return mysqlResult{
Julien Schmidtb8ae1f22012-05-04 02:19:1679 affectedRows: int64(stmt.mc.affectedRows),
80 insertId: int64(stmt.mc.insertId)},
81 nil
82}
83
84func (stmt mysqlStmt) Query(args []driver.Value) (dr driver.Rows, e error) {
Julien Schmidt49659422012-05-26 15:39:3085 if stmt.mc == nil {
86 return nil, errors.New(`Invalid Statement`)
87 }
Julien Schmidtb4faadb2012-05-26 15:50:4588
Julien Schmidtb8ae1f22012-05-04 02:19:1689 // Send command
90 e = stmt.buildExecutePacket(&args)
91 if e != nil {
92 return nil, e
93 }
94
95 // Get Result
96 var resLen int
Julien Schmidt49659422012-05-26 15:39:3097 rows := mysqlRows{new(rowsContent)}
Julien Schmidtb8ae1f22012-05-04 02:19:1698 resLen, e = stmt.mc.readResultSetHeaderPacket()
99 if e != nil {
100 return nil, e
101 }
102
103 if resLen > 0 {
104 // Columns
105 rows.content.columns, e = stmt.mc.readColumns(resLen)
106 if e != nil {
107 return
108 }
109
110 // Rows
111 e = stmt.mc.readBinaryRows(rows.content)
112 if e != nil {
113 return
114 }
115 }
116
117 dr = rows
118 return
119}
120
Julien Schmidtb8ae1f22012-05-04 02:19:16121// ColumnConverter returns a ValueConverter for the provided
122// column index. If the type of a specific column isn't known
123// or shouldn't be handled specially, DefaultValueConverter
124// can be returned.
Julien Schmidte4b10482012-05-04 18:07:12125//func (stmt mysqlStmt) ColumnConverter(idx int) driver.ValueConverter {
126// debug(fmt.Sprintf("ColumnConverter(%d)", idx))
127// return driver.DefaultParameterConverter
128//}