transaction.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.Transaction = exports.isolationLevelByValue = exports.ISOLATION_LEVEL = exports.OPERATION_TYPE = 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. /*
  10. s2.2.6.8
  11. */
  12. const OPERATION_TYPE = {
  13. TM_GET_DTC_ADDRESS: 0x00,
  14. TM_PROPAGATE_XACT: 0x01,
  15. TM_BEGIN_XACT: 0x05,
  16. TM_PROMOTE_XACT: 0x06,
  17. TM_COMMIT_XACT: 0x07,
  18. TM_ROLLBACK_XACT: 0x08,
  19. TM_SAVE_XACT: 0x09
  20. };
  21. exports.OPERATION_TYPE = OPERATION_TYPE;
  22. const ISOLATION_LEVEL = {
  23. NO_CHANGE: 0x00,
  24. READ_UNCOMMITTED: 0x01,
  25. READ_COMMITTED: 0x02,
  26. REPEATABLE_READ: 0x03,
  27. SERIALIZABLE: 0x04,
  28. SNAPSHOT: 0x05
  29. };
  30. exports.ISOLATION_LEVEL = ISOLATION_LEVEL;
  31. const isolationLevelByValue = {};
  32. exports.isolationLevelByValue = isolationLevelByValue;
  33. for (const name in ISOLATION_LEVEL) {
  34. const value = ISOLATION_LEVEL[name];
  35. isolationLevelByValue[value] = name;
  36. }
  37. class Transaction {
  38. constructor(name, isolationLevel = ISOLATION_LEVEL.NO_CHANGE) {
  39. this.name = name;
  40. this.isolationLevel = isolationLevel;
  41. this.outstandingRequestCount = 1;
  42. }
  43. beginPayload(txnDescriptor) {
  44. const buffer = new _writableTrackingBuffer.default(100, 'ucs2');
  45. (0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount);
  46. buffer.writeUShort(OPERATION_TYPE.TM_BEGIN_XACT);
  47. buffer.writeUInt8(this.isolationLevel);
  48. buffer.writeUInt8(this.name.length * 2);
  49. buffer.writeString(this.name, 'ucs2');
  50. return {
  51. getData: cb => {
  52. cb(buffer.data);
  53. },
  54. toString: () => {
  55. return 'Begin Transaction: name=' + this.name + ', isolationLevel=' + isolationLevelByValue[this.isolationLevel];
  56. }
  57. };
  58. }
  59. commitPayload(txnDescriptor) {
  60. const buffer = new _writableTrackingBuffer.default(100, 'ascii');
  61. (0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount);
  62. buffer.writeUShort(OPERATION_TYPE.TM_COMMIT_XACT);
  63. buffer.writeUInt8(this.name.length * 2);
  64. buffer.writeString(this.name, 'ucs2'); // No fBeginXact flag, so no new transaction is started.
  65. buffer.writeUInt8(0);
  66. return {
  67. getData: cb => {
  68. cb(buffer.data);
  69. },
  70. data: buffer.data,
  71. toString: () => {
  72. return 'Commit Transaction: name=' + this.name;
  73. }
  74. };
  75. }
  76. rollbackPayload(txnDescriptor) {
  77. const buffer = new _writableTrackingBuffer.default(100, 'ascii');
  78. (0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount);
  79. buffer.writeUShort(OPERATION_TYPE.TM_ROLLBACK_XACT);
  80. buffer.writeUInt8(this.name.length * 2);
  81. buffer.writeString(this.name, 'ucs2'); // No fBeginXact flag, so no new transaction is started.
  82. buffer.writeUInt8(0);
  83. return {
  84. getData: cb => {
  85. cb(buffer.data);
  86. },
  87. toString: () => {
  88. return 'Rollback Transaction: name=' + this.name;
  89. }
  90. };
  91. }
  92. savePayload(txnDescriptor) {
  93. const buffer = new _writableTrackingBuffer.default(100, 'ascii');
  94. (0, _allHeaders.writeToTrackingBuffer)(buffer, txnDescriptor, this.outstandingRequestCount);
  95. buffer.writeUShort(OPERATION_TYPE.TM_SAVE_XACT);
  96. buffer.writeUInt8(this.name.length * 2);
  97. buffer.writeString(this.name, 'ucs2');
  98. return {
  99. getData: cb => {
  100. cb(buffer.data);
  101. },
  102. toString: () => {
  103. return 'Save Transaction: name=' + this.name;
  104. }
  105. };
  106. }
  107. isolationLevelToTSQL() {
  108. switch (this.isolationLevel) {
  109. case ISOLATION_LEVEL.READ_UNCOMMITTED:
  110. return 'READ UNCOMMITTED';
  111. case ISOLATION_LEVEL.READ_COMMITTED:
  112. return 'READ COMMITTED';
  113. case ISOLATION_LEVEL.REPEATABLE_READ:
  114. return 'REPEATABLE READ';
  115. case ISOLATION_LEVEL.SERIALIZABLE:
  116. return 'SERIALIZABLE';
  117. case ISOLATION_LEVEL.SNAPSHOT:
  118. return 'SNAPSHOT';
  119. }
  120. return '';
  121. }
  122. }
  123. exports.Transaction = Transaction;