API Reference Source

lib/dialects/snowflake/connection-manager.js

  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").snowflake;
  22. const debug = logger.debugContext("connection:snowflake");
  23. const parserStore = require("../parserStore")("snowflake");
  24. class ConnectionManager extends AbstractConnectionManager {
  25. constructor(dialect, sequelize) {
  26. sequelize.config.port = sequelize.config.port || 3306;
  27. super(dialect, sequelize);
  28. this.lib = this._loadDialectModule("snowflake-sdk");
  29. this.refreshTypeParser(DataTypes);
  30. }
  31. _refreshTypeParser(dataType) {
  32. parserStore.refresh(dataType);
  33. }
  34. _clearTypeParser() {
  35. parserStore.clear();
  36. }
  37. static _typecast(field, next) {
  38. if (parserStore.get(field.type)) {
  39. return parserStore.get(field.type)(field, this.sequelize.options, next);
  40. }
  41. return next();
  42. }
  43. async connect(config) {
  44. const connectionConfig = __spreadValues({
  45. account: config.host,
  46. username: config.username,
  47. password: config.password,
  48. database: config.database,
  49. warehouse: config.warehouse,
  50. role: config.role
  51. }, config.dialectOptions);
  52. try {
  53. const connection = await new Promise((resolve, reject) => {
  54. this.lib.createConnection(connectionConfig).connect((err, conn) => {
  55. if (err) {
  56. console.log(err);
  57. reject(err);
  58. } else {
  59. resolve(conn);
  60. }
  61. });
  62. });
  63. debug("connection acquired");
  64. if (!this.sequelize.config.keepDefaultTimezone) {
  65. const tzOffset = this.sequelize.options.timezone === "+00:00" ? "Etc/UTC" : this.sequelize.options.timezone;
  66. const isNamedTzOffset = /\//.test(tzOffset);
  67. if (isNamedTzOffset) {
  68. await new Promise((resolve, reject) => {
  69. connection.execute({
  70. sqlText: `ALTER SESSION SET timezone = '${tzOffset}'`,
  71. complete(err) {
  72. if (err) {
  73. console.log(err);
  74. reject(err);
  75. } else {
  76. resolve();
  77. }
  78. }
  79. });
  80. });
  81. } else {
  82. throw Error("only support time zone name for snowflake!");
  83. }
  84. }
  85. return connection;
  86. } catch (err) {
  87. switch (err.code) {
  88. case "ECONNREFUSED":
  89. throw new SequelizeErrors.ConnectionRefusedError(err);
  90. case "ER_ACCESS_DENIED_ERROR":
  91. throw new SequelizeErrors.AccessDeniedError(err);
  92. case "ENOTFOUND":
  93. throw new SequelizeErrors.HostNotFoundError(err);
  94. case "EHOSTUNREACH":
  95. throw new SequelizeErrors.HostNotReachableError(err);
  96. case "EINVAL":
  97. throw new SequelizeErrors.InvalidConnectionError(err);
  98. default:
  99. throw new SequelizeErrors.ConnectionError(err);
  100. }
  101. }
  102. }
  103. async disconnect(connection) {
  104. if (!connection.isUp()) {
  105. debug("connection tried to disconnect but was already at CLOSED state");
  106. return;
  107. }
  108. return new Promise((resolve, reject) => {
  109. connection.destroy((err) => {
  110. if (err) {
  111. console.error(`Unable to disconnect: ${err.message}`);
  112. reject(err);
  113. } else {
  114. console.log(`Disconnected connection with id: ${connection.getId()}`);
  115. resolve(connection.getId());
  116. }
  117. });
  118. });
  119. }
  120. validate(connection) {
  121. return connection.isUp();
  122. }
  123. }
  124. module.exports = ConnectionManager;
  125. module.exports.ConnectionManager = ConnectionManager;
  126. module.exports.default = ConnectionManager;
  127. //# sourceMappingURL=connection-manager.js.map