blob: f9dc9b00dd7c2abe03424ae30d5546cff1da6162 [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/.
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
28func (stmt mysqlStmt) Close() error {
29 e := stmt.mc.writeCommandPacket(COM_STMT_CLOSE, stmt.id)
Julien Schmidtb8ae1f22012-05-04 02:19:1630 stmt.mc = nil
31 return e
32}
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
75 if stmt.mc.affectedRows == 0 {
76 return driver.ResultNoRows, nil
77 }
78
Julien Schmidt49659422012-05-26 15:39:3079 return mysqlResult{
Julien Schmidtb8ae1f22012-05-04 02:19:1680 affectedRows: int64(stmt.mc.affectedRows),
81 insertId: int64(stmt.mc.insertId)},
82 nil
83}
84
85func (stmt mysqlStmt) Query(args []driver.Value) (dr driver.Rows, e error) {
Julien Schmidt49659422012-05-26 15:39:3086 if stmt.mc == nil {
87 return nil, errors.New(`Invalid Statement`)
88 }
Julien Schmidtb4faadb2012-05-26 15:50:4589
Julien Schmidtb8ae1f22012-05-04 02:19:1690 // Send command
91 e = stmt.buildExecutePacket(&args)
92 if e != nil {
93 return nil, e
94 }
95
96 // Get Result
97 var resLen int
Julien Schmidt49659422012-05-26 15:39:3098 rows := mysqlRows{new(rowsContent)}
Julien Schmidtb8ae1f22012-05-04 02:19:1699 resLen, e = stmt.mc.readResultSetHeaderPacket()
100 if e != nil {
101 return nil, e
102 }
103
104 if resLen > 0 {
105 // Columns
106 rows.content.columns, e = stmt.mc.readColumns(resLen)
107 if e != nil {
108 return
109 }
110
111 // Rows
112 e = stmt.mc.readBinaryRows(rows.content)
113 if e != nil {
114 return
115 }
116 }
117
118 dr = rows
119 return
120}
121
Julien Schmidtb8ae1f22012-05-04 02:19:16122// ColumnConverter returns a ValueConverter for the provided
123// column index. If the type of a specific column isn't known
124// or shouldn't be handled specially, DefaultValueConverter
125// can be returned.
Julien Schmidte4b10482012-05-04 18:07:12126//func (stmt mysqlStmt) ColumnConverter(idx int) driver.ValueConverter {
127// debug(fmt.Sprintf("ColumnConverter(%d)", idx))
128// return driver.DefaultParameterConverter
129//}