123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- 'use strict';
- const Command = require('./command.js');
- const Query = require('./query.js');
- const Packets = require('../packets/index.js');
- const getBinaryParser = require('../parsers/binary_parser.js');
- class Execute extends Command {
- constructor(options, callback) {
- super();
- this.statement = options.statement;
- this.sql = options.sql;
- this.values = options.values;
- this.onResult = callback;
- this.parameters = options.values;
- this.insertId = 0;
- this._rows = [];
- this._fields = [];
- this._result = [];
- this._fieldCount = 0;
- this._rowParser = null;
- this._executeOptions = options;
- this._resultIndex = 0;
- this._localStream = null;
- this._unpipeStream = function() {};
- this._streamFactory = options.infileStreamFactory;
- this._connection = null;
- }
- buildParserFromFields(fields, connection) {
- return getBinaryParser(fields, this.options, connection.config);
- }
- start(packet, connection) {
- this._connection = connection;
- this.options = Object.assign({}, connection.config, this._executeOptions);
- const executePacket = new Packets.Execute(
- this.statement.id,
- this.parameters,
- connection.config.charsetNumber,
- connection.config.timezone
- );
- //For reasons why this try-catch is here, please see
- // https://github.com/sidorares/node-mysql2/pull/689
- //For additional discussion, see
- // 1. https://github.com/sidorares/node-mysql2/issues/493
- // 2. https://github.com/sidorares/node-mysql2/issues/187
- // 3. https://github.com/sidorares/node-mysql2/issues/480
- try {
- connection.writePacket(executePacket.toPacket(1));
- } catch (error) {
- this.onResult(error);
- }
- return Execute.prototype.resultsetHeader;
- }
- readField(packet, connection) {
- let fields;
- // disabling for now, but would be great to find reliable way to parse fields only once
- // fields reported by prepare can be empty at all or just incorrect - see #169
- //
- // perfomance optimisation: if we already have this field parsed in statement header, use one from header
- // const field = this.statement.columns.length == this._fieldCount ?
- // this.statement.columns[this._receivedFieldsCount] : new Packets.ColumnDefinition(packet);
- const field = new Packets.ColumnDefinition(
- packet,
- connection.clientEncoding
- );
- this._receivedFieldsCount++;
- this._fields[this._resultIndex].push(field);
- if (this._receivedFieldsCount === this._fieldCount) {
- fields = this._fields[this._resultIndex];
- this.emit('fields', fields, this._resultIndex);
- return Execute.prototype.fieldsEOF;
- }
- return Execute.prototype.readField;
- }
- fieldsEOF(packet, connection) {
- // check EOF
- if (!packet.isEOF()) {
- return connection.protocolError('Expected EOF packet');
- }
- this._rowParser = this.buildParserFromFields(
- this._fields[this._resultIndex],
- connection
- );
- return Execute.prototype.row;
- }
- }
- Execute.prototype.done = Query.prototype.done;
- Execute.prototype.doneInsert = Query.prototype.doneInsert;
- Execute.prototype.resultsetHeader = Query.prototype.resultsetHeader;
- Execute.prototype._findOrCreateReadStream =
- Query.prototype._findOrCreateReadStream;
- Execute.prototype._streamLocalInfile = Query.prototype._streamLocalInfile;
- Execute.prototype.row = Query.prototype.row;
- Execute.prototype.stream = Query.prototype.stream;
- module.exports = Execute;
|