| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 | '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.timeout = options.timeout;    this.queryTimeout = null;    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);    this._setTimeout();    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 = new (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._setTimeout = Query.prototype._setTimeout;Execute.prototype._handleTimeoutError = Query.prototype._handleTimeoutError;Execute.prototype.row = Query.prototype.row;Execute.prototype.stream = Query.prototype.stream;module.exports = Execute;
 |