rpcrequest-payload.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _writableTrackingBuffer = _interopRequireDefault(require("./tracking-buffer/writable-tracking-buffer"));
  7. var _allHeaders = require("./all-headers");
  8. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  9. // const OPTION = {
  10. // WITH_RECOMPILE: 0x01,
  11. // NO_METADATA: 0x02,
  12. // REUSE_METADATA: 0x04
  13. // };
  14. const STATUS = {
  15. BY_REF_VALUE: 0x01,
  16. DEFAULT_VALUE: 0x02
  17. };
  18. /*
  19. s2.2.6.5
  20. */
  21. class RpcRequestPayload {
  22. constructor(request, txnDescriptor, options) {
  23. this.request = request;
  24. this.procedure = this.request.sqlTextOrProcedure;
  25. this.options = options;
  26. this.txnDescriptor = txnDescriptor;
  27. }
  28. getData(cb) {
  29. const buffer = new _writableTrackingBuffer.default(500);
  30. if (this.options.tdsVersion >= '7_2') {
  31. const outstandingRequestCount = 1;
  32. (0, _allHeaders.writeToTrackingBuffer)(buffer, this.txnDescriptor, outstandingRequestCount);
  33. }
  34. if (typeof this.procedure === 'string') {
  35. buffer.writeUsVarchar(this.procedure);
  36. } else {
  37. buffer.writeUShort(0xFFFF);
  38. buffer.writeUShort(this.procedure);
  39. }
  40. const optionFlags = 0;
  41. buffer.writeUInt16LE(optionFlags);
  42. const parameters = this.request.parameters;
  43. const writeNext = i => {
  44. if (i >= parameters.length) {
  45. cb(buffer.data);
  46. return;
  47. }
  48. this._writeParameterData(parameters[i], buffer, () => {
  49. setImmediate(() => {
  50. writeNext(i + 1);
  51. });
  52. });
  53. };
  54. writeNext(0);
  55. }
  56. toString(indent = '') {
  57. return indent + ('RPC Request - ' + this.procedure);
  58. }
  59. _writeParameterData(parameter, buffer, cb) {
  60. buffer.writeBVarchar('@' + parameter.name);
  61. let statusFlags = 0;
  62. if (parameter.output) {
  63. statusFlags |= STATUS.BY_REF_VALUE;
  64. }
  65. buffer.writeUInt8(statusFlags);
  66. const param = {
  67. value: parameter.value
  68. };
  69. const type = parameter.type;
  70. if ((type.id & 0x30) === 0x20) {
  71. if (parameter.length) {
  72. param.length = parameter.length;
  73. } else if (type.resolveLength) {
  74. param.length = type.resolveLength(parameter);
  75. }
  76. }
  77. if (parameter.precision) {
  78. param.precision = parameter.precision;
  79. } else if (type.resolvePrecision) {
  80. param.precision = type.resolvePrecision(parameter);
  81. }
  82. if (parameter.scale) {
  83. param.scale = parameter.scale;
  84. } else if (type.resolveScale) {
  85. param.scale = type.resolveScale(parameter);
  86. }
  87. type.writeTypeInfo(buffer, param, this.options);
  88. type.writeParameterData(buffer, param, this.options, () => {
  89. cb();
  90. });
  91. }
  92. }
  93. var _default = RpcRequestPayload;
  94. exports.default = _default;
  95. module.exports = RpcRequestPayload;