113 lines
3.2 KiB
JavaScript
113 lines
3.2 KiB
JavaScript
|
var util = require('util');
|
||
|
|
||
|
var Packets = require('../packets/index.js');
|
||
|
var Command = require('./command.js');
|
||
|
var CloseStatement = require('./close_statement.js')
|
||
|
var Execute = require('./execute.js')
|
||
|
|
||
|
function Prepare(options, callback)
|
||
|
{
|
||
|
Command.call(this);
|
||
|
this.query = options.sql;
|
||
|
this.onResult = callback;
|
||
|
|
||
|
this.id = 0;
|
||
|
this.fieldCount = 0;
|
||
|
this.parameterCount = 0;
|
||
|
this.fields = [];
|
||
|
this.parameterDefinitions = [];
|
||
|
this.options = options;
|
||
|
}
|
||
|
util.inherits(Prepare, Command);
|
||
|
|
||
|
Prepare.prototype.start = function(packet, connection) {
|
||
|
connection.writePacket(new Packets.PrepareStatement(this.query).toPacket(1));
|
||
|
return Prepare.prototype.prepareHeader;
|
||
|
};
|
||
|
|
||
|
function PreparedStatementInfo(query, id, columns, parameters, connection) {
|
||
|
this.query = query;
|
||
|
this.id = id;
|
||
|
this.columns = columns;
|
||
|
this.parameters = parameters;
|
||
|
this.rowParser = null;
|
||
|
this._connection = connection
|
||
|
}
|
||
|
|
||
|
PreparedStatementInfo.prototype.close = function() {
|
||
|
return this._connection.addCommand(new CloseStatement(this.id));
|
||
|
};
|
||
|
|
||
|
PreparedStatementInfo.prototype.execute = function(parameters, callback) {
|
||
|
if (typeof parameters == 'function') {
|
||
|
callback = parameters;
|
||
|
parameters = [];
|
||
|
}
|
||
|
return this._connection.addCommand(new Execute({ statement: this, values: parameters}, callback));
|
||
|
};
|
||
|
|
||
|
Prepare.prototype.prepareHeader = function(packet, connection) {
|
||
|
var header = new Packets.PreparedStatementHeader(packet);
|
||
|
this.id = header.id;
|
||
|
this.fieldCount = header.fieldCount;
|
||
|
this.parameterCount = header.parameterCount;
|
||
|
if (this.parameterCount > 0)
|
||
|
return Prepare.prototype.readParameter;
|
||
|
else if (this.fieldCount > 0)
|
||
|
return Prepare.prototype.readField;
|
||
|
else
|
||
|
return this.prepareDone(connection);
|
||
|
};
|
||
|
|
||
|
Prepare.prototype.readParameter = function(packet) {
|
||
|
var def = new Packets.ColumnDefinition(packet);
|
||
|
this.parameterDefinitions.push(def);
|
||
|
if (this.parameterDefinitions.length == this.parameterCount)
|
||
|
return Prepare.prototype.parametersEOF;
|
||
|
return this.readParameter;
|
||
|
};
|
||
|
|
||
|
Prepare.prototype.readField = function(packet, connection) {
|
||
|
var def = new Packets.ColumnDefinition(packet);
|
||
|
this.fields.push(def);
|
||
|
if (this.fields.length == this.fieldCount)
|
||
|
return Prepare.prototype.fieldsEOF;
|
||
|
return Prepare.prototype.readField;
|
||
|
};
|
||
|
|
||
|
Prepare.prototype.parametersEOF = function(packet, connection) {
|
||
|
if (!packet.isEOF())
|
||
|
return connection.protocolError("Expected EOF packet after parameters");
|
||
|
if (this.fieldCount > 0)
|
||
|
return Prepare.prototype.readField;
|
||
|
else
|
||
|
return this.prepareDone(connection);
|
||
|
};
|
||
|
|
||
|
Prepare.prototype.fieldsEOF = function(packet, connection) {
|
||
|
if (!packet.isEOF())
|
||
|
return connection.protocolError("Expected EOF packet after fields");
|
||
|
return this.prepareDone(connection);
|
||
|
};
|
||
|
|
||
|
Prepare.prototype.prepareDone = function(connection)
|
||
|
{
|
||
|
var self = this;
|
||
|
if (this.onResult)
|
||
|
process.nextTick(function() {
|
||
|
self.onResult(
|
||
|
null,
|
||
|
new PreparedStatementInfo(
|
||
|
self.query,
|
||
|
self.id,
|
||
|
self.fields,
|
||
|
self.parameterDefinitions,
|
||
|
connection
|
||
|
)
|
||
|
);
|
||
|
});
|
||
|
return null;
|
||
|
};
|
||
|
|
||
|
module.exports = Prepare;
|