github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/mysql/statement.go (about)

     1  // Go MySQL Driver - A MySQL-Driver for Go's database/sql package
     2  //
     3  // Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved.
     4  //
     5  // This Source Code Form is subject to the terms of the Mozilla Public
     6  // License, v. 2.0. If a copy of the MPL was not distributed with this file,
     7  // You can obtain one at http://mozilla.org/MPL/2.0/.
     8  
     9  package mysql
    10  
    11  import (
    12  	"database/sql/driver"
    13  )
    14  
    15  type mysqlStmt struct {
    16  	mc         *mysqlConn
    17  	id         uint32
    18  	paramCount int
    19  	columns    []mysqlField // cached from the first query
    20  }
    21  
    22  func (stmt *mysqlStmt) Close() error {
    23  	if stmt.mc == nil || stmt.mc.netConn == nil {
    24  		errLog.Print(ErrInvalidConn)
    25  		return driver.ErrBadConn
    26  	}
    27  
    28  	err := stmt.mc.writeCommandPacketUint32(comStmtClose, stmt.id)
    29  	stmt.mc = nil
    30  	return err
    31  }
    32  
    33  func (stmt *mysqlStmt) NumInput() int {
    34  	return stmt.paramCount
    35  }
    36  
    37  func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) {
    38  	if stmt.mc.netConn == nil {
    39  		errLog.Print(ErrInvalidConn)
    40  		return nil, driver.ErrBadConn
    41  	}
    42  	// Send command
    43  	err := stmt.writeExecutePacket(args)
    44  	if err != nil {
    45  		return nil, err
    46  	}
    47  
    48  	mc := stmt.mc
    49  
    50  	mc.affectedRows = 0
    51  	mc.insertId = 0
    52  
    53  	// Read Result
    54  	resLen, err := mc.readResultSetHeaderPacket()
    55  	if err == nil {
    56  		if resLen > 0 {
    57  			// Columns
    58  			err = mc.readUntilEOF()
    59  			if err != nil {
    60  				return nil, err
    61  			}
    62  
    63  			// Rows
    64  			err = mc.readUntilEOF()
    65  		}
    66  		if err == nil {
    67  			return &mysqlResult{
    68  				affectedRows: int64(mc.affectedRows),
    69  				insertId:     int64(mc.insertId),
    70  			}, nil
    71  		}
    72  	}
    73  
    74  	return nil, err
    75  }
    76  
    77  func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) {
    78  	if stmt.mc.netConn == nil {
    79  		errLog.Print(ErrInvalidConn)
    80  		return nil, driver.ErrBadConn
    81  	}
    82  	// Send command
    83  	err := stmt.writeExecutePacket(args)
    84  	if err != nil {
    85  		return nil, err
    86  	}
    87  
    88  	mc := stmt.mc
    89  
    90  	// Read Result
    91  	resLen, err := mc.readResultSetHeaderPacket()
    92  	if err != nil {
    93  		return nil, err
    94  	}
    95  
    96  	rows := new(binaryRows)
    97  	rows.mc = mc
    98  
    99  	if resLen > 0 {
   100  		// Columns
   101  		// If not cached, read them and cache them
   102  		if stmt.columns == nil {
   103  			rows.columns, err = mc.readColumns(resLen)
   104  			stmt.columns = rows.columns
   105  		} else {
   106  			rows.columns = stmt.columns
   107  			err = mc.readUntilEOF()
   108  		}
   109  	}
   110  
   111  	return rows, err
   112  }