connection-manager.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. "use strict";
  2. var __defProp = Object.defineProperty;
  3. var __getOwnPropSymbols = Object.getOwnPropertySymbols;
  4. var __hasOwnProp = Object.prototype.hasOwnProperty;
  5. var __propIsEnum = Object.prototype.propertyIsEnumerable;
  6. var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  7. var __spreadValues = (a, b) => {
  8. for (var prop in b || (b = {}))
  9. if (__hasOwnProp.call(b, prop))
  10. __defNormalProp(a, prop, b[prop]);
  11. if (__getOwnPropSymbols)
  12. for (var prop of __getOwnPropSymbols(b)) {
  13. if (__propIsEnum.call(b, prop))
  14. __defNormalProp(a, prop, b[prop]);
  15. }
  16. return a;
  17. };
  18. const AbstractConnectionManager = require("../abstract/connection-manager");
  19. const SequelizeErrors = require("../../errors");
  20. const { logger } = require("../../utils/logger");
  21. const DataTypes = require("../../data-types").mysql;
  22. const momentTz = require("moment-timezone");
  23. const debug = logger.debugContext("connection:mysql");
  24. const parserStore = require("../parserStore")("mysql");
  25. const { promisify } = require("util");
  26. class ConnectionManager extends AbstractConnectionManager {
  27. constructor(dialect, sequelize) {
  28. sequelize.config.port = sequelize.config.port || 3306;
  29. super(dialect, sequelize);
  30. this.lib = this._loadDialectModule("mysql2");
  31. this.refreshTypeParser(DataTypes);
  32. }
  33. _refreshTypeParser(dataType) {
  34. parserStore.refresh(dataType);
  35. }
  36. _clearTypeParser() {
  37. parserStore.clear();
  38. }
  39. static _typecast(field, next) {
  40. if (parserStore.get(field.type)) {
  41. return parserStore.get(field.type)(field, this.sequelize.options, next);
  42. }
  43. return next();
  44. }
  45. async connect(config) {
  46. const connectionConfig = __spreadValues({
  47. host: config.host,
  48. port: config.port,
  49. user: config.username,
  50. flags: "-FOUND_ROWS",
  51. password: config.password,
  52. database: config.database,
  53. timezone: this.sequelize.options.timezone,
  54. typeCast: ConnectionManager._typecast.bind(this),
  55. bigNumberStrings: false,
  56. supportBigNumbers: true
  57. }, config.dialectOptions);
  58. try {
  59. const connection = await new Promise((resolve, reject) => {
  60. const connection2 = this.lib.createConnection(connectionConfig);
  61. const errorHandler = (e) => {
  62. connection2.removeListener("connect", connectHandler);
  63. connection2.removeListener("error", connectHandler);
  64. reject(e);
  65. };
  66. const connectHandler = () => {
  67. connection2.removeListener("error", errorHandler);
  68. resolve(connection2);
  69. };
  70. connection2.on("error", errorHandler);
  71. connection2.once("connect", connectHandler);
  72. });
  73. debug("connection acquired");
  74. connection.on("error", (error) => {
  75. switch (error.code) {
  76. case "ESOCKET":
  77. case "ECONNRESET":
  78. case "EPIPE":
  79. case "PROTOCOL_CONNECTION_LOST":
  80. this.pool.destroy(connection);
  81. }
  82. });
  83. if (!this.sequelize.config.keepDefaultTimezone) {
  84. let tzOffset = this.sequelize.options.timezone;
  85. tzOffset = /\//.test(tzOffset) ? momentTz.tz(tzOffset).format("Z") : tzOffset;
  86. await promisify((cb) => connection.query(`SET time_zone = '${tzOffset}'`, cb))();
  87. }
  88. return connection;
  89. } catch (err) {
  90. switch (err.code) {
  91. case "ECONNREFUSED":
  92. throw new SequelizeErrors.ConnectionRefusedError(err);
  93. case "ER_ACCESS_DENIED_ERROR":
  94. throw new SequelizeErrors.AccessDeniedError(err);
  95. case "ENOTFOUND":
  96. throw new SequelizeErrors.HostNotFoundError(err);
  97. case "EHOSTUNREACH":
  98. throw new SequelizeErrors.HostNotReachableError(err);
  99. case "EINVAL":
  100. throw new SequelizeErrors.InvalidConnectionError(err);
  101. default:
  102. throw new SequelizeErrors.ConnectionError(err);
  103. }
  104. }
  105. }
  106. async disconnect(connection) {
  107. if (connection._closing) {
  108. debug("connection tried to disconnect but was already at CLOSED state");
  109. return;
  110. }
  111. return await promisify((callback) => connection.end(callback))();
  112. }
  113. validate(connection) {
  114. return connection && !connection._fatalError && !connection._protocolError && !connection._closing && !connection.stream.destroyed;
  115. }
  116. }
  117. module.exports = ConnectionManager;
  118. module.exports.ConnectionManager = ConnectionManager;
  119. module.exports.default = ConnectionManager;
  120. //# sourceMappingURL=connection-manager.js.map