| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = void 0;
- var _events = require("events");
- var _dataType = require("./data-type");
- var _errors = require("./errors");
- class Request extends _events.EventEmitter {
- constructor(sqlTextOrProcedure, callback) {
- super();
- this.sqlTextOrProcedure = sqlTextOrProcedure;
- this.parameters = [];
- this.parametersByName = {};
- this.originalParameters = [];
- this.preparing = false;
- this.handle = undefined;
- this.canceled = false;
- this.paused = false;
- this.error = undefined;
- this.connection = undefined;
- this.timeout = undefined;
- this.userCallback = callback;
- this.callback = function (err, rowCount, rows) {
- if (this.preparing) {
- this.preparing = false;
- if (err) {
- this.emit('error', err);
- } else {
- this.emit('prepared');
- }
- } else {
- this.userCallback(err, rowCount, rows);
- this.emit('requestCompleted');
- }
- };
- } // TODO: `type` must be a valid TDS value type
- addParameter(name, type, value, options) {
- if (options == null) {
- options = {};
- }
- const _options = options,
- _options$output = _options.output,
- output = _options$output === void 0 ? false : _options$output,
- length = _options.length,
- precision = _options.precision,
- scale = _options.scale;
- const parameter = {
- type: type,
- name: name,
- value: value,
- output: output,
- length: length,
- precision: precision,
- scale: scale
- };
- this.parameters.push(parameter);
- this.parametersByName[name] = parameter;
- } // TODO: `type` must be a valid TDS value type
- addOutputParameter(name, type, value, options) {
- if (options == null) {
- options = {};
- }
- options.output = true;
- this.addParameter(name, type, value, options);
- }
- makeParamsParameter(parameters) {
- let paramsParameter = '';
- for (let i = 0, len = parameters.length; i < len; i++) {
- const parameter = parameters[i];
- if (paramsParameter.length > 0) {
- paramsParameter += ', ';
- }
- paramsParameter += '@' + parameter.name + ' ';
- paramsParameter += parameter.type.declaration(parameter);
- if (parameter.output) {
- paramsParameter += ' OUTPUT';
- }
- }
- return paramsParameter;
- }
- transformIntoExecuteSqlRpc() {
- if (this.validateParameters()) {
- return;
- }
- this.originalParameters = this.parameters;
- this.parameters = [];
- this.addParameter('statement', _dataType.typeByName.NVarChar, this.sqlTextOrProcedure);
- if (this.originalParameters.length) {
- this.addParameter('params', _dataType.typeByName.NVarChar, this.makeParamsParameter(this.originalParameters));
- }
- for (let i = 0, len = this.originalParameters.length; i < len; i++) {
- const parameter = this.originalParameters[i];
- this.parameters.push(parameter);
- }
- this.sqlTextOrProcedure = 'sp_executesql';
- }
- transformIntoPrepareRpc() {
- this.originalParameters = this.parameters;
- this.parameters = [];
- this.addOutputParameter('handle', _dataType.typeByName.Int, undefined);
- this.addParameter('params', _dataType.typeByName.NVarChar, this.makeParamsParameter(this.originalParameters));
- this.addParameter('stmt', _dataType.typeByName.NVarChar, this.sqlTextOrProcedure);
- this.sqlTextOrProcedure = 'sp_prepare';
- this.preparing = true;
- this.on('returnValue', (name, value) => {
- if (name === 'handle') {
- this.handle = value;
- } else {
- this.error = (0, _errors.RequestError)(`Tedious > Unexpected output parameter ${name} from sp_prepare`);
- }
- });
- }
- transformIntoUnprepareRpc() {
- this.parameters = [];
- this.addParameter('handle', _dataType.typeByName.Int, this.handle);
- this.sqlTextOrProcedure = 'sp_unprepare';
- }
- transformIntoExecuteRpc(parameters) {
- this.parameters = [];
- this.addParameter('handle', _dataType.typeByName.Int, this.handle);
- for (let i = 0, len = this.originalParameters.length; i < len; i++) {
- const parameter = this.originalParameters[i];
- parameter.value = parameters[parameter.name];
- this.parameters.push(parameter);
- }
- if (this.validateParameters()) {
- return;
- }
- this.sqlTextOrProcedure = 'sp_execute';
- }
- validateParameters() {
- for (let i = 0, len = this.parameters.length; i < len; i++) {
- const parameter = this.parameters[i];
- const value = parameter.type.validate(parameter.value);
- if (value instanceof TypeError) {
- return this.error = new _errors.RequestError('Validation failed for parameter \'' + parameter.name + '\'. ' + value.message, 'EPARAM');
- }
- parameter.value = value;
- }
- return null;
- } // Temporarily suspends the flow of data from the database.
- // No more 'row' events will be emitted until resume() is called.
- pause() {
- if (this.paused) {
- return;
- }
- this.paused = true;
- if (this.connection) {
- this.connection.pauseRequest(this);
- }
- } // Resumes the flow of data from the database.
- resume() {
- if (!this.paused) {
- return;
- }
- this.paused = false;
- if (this.connection) {
- this.connection.resumeRequest(this);
- }
- }
- cancel() {
- if (this.canceled) {
- return;
- }
- this.canceled = true;
- this.emit('cancel');
- }
- setTimeout(timeout) {
- this.timeout = timeout;
- }
- }
- var _default = Request;
- exports.default = _default;
- module.exports = Request;
|