aboutsummaryrefslogtreecommitdiff
path: root/node_modules/mysql2/lib/commands/execute.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/mysql2/lib/commands/execute.js')
-rw-r--r--node_modules/mysql2/lib/commands/execute.js107
1 files changed, 107 insertions, 0 deletions
diff --git a/node_modules/mysql2/lib/commands/execute.js b/node_modules/mysql2/lib/commands/execute.js
new file mode 100644
index 0000000..8ab7304
--- /dev/null
+++ b/node_modules/mysql2/lib/commands/execute.js
@@ -0,0 +1,107 @@
+'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;