connection-manager.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. "use strict";
  2. const fs = require("fs");
  3. const path = require("path");
  4. const AbstractConnectionManager = require("../abstract/connection-manager");
  5. const { logger } = require("../../utils/logger");
  6. const debug = logger.debugContext("connection:sqlite");
  7. const dataTypes = require("../../data-types").sqlite;
  8. const sequelizeErrors = require("../../errors");
  9. const parserStore = require("../parserStore")("sqlite");
  10. const { promisify } = require("util");
  11. class ConnectionManager extends AbstractConnectionManager {
  12. constructor(dialect, sequelize) {
  13. super(dialect, sequelize);
  14. if (this.sequelize.options.host === "localhost") {
  15. delete this.sequelize.options.host;
  16. }
  17. this.connections = {};
  18. this.lib = this._loadDialectModule("sqlite3");
  19. this.refreshTypeParser(dataTypes);
  20. }
  21. async _onProcessExit() {
  22. await Promise.all(Object.getOwnPropertyNames(this.connections).map((connection) => promisify((callback) => this.connections[connection].close(callback))()));
  23. return super._onProcessExit.call(this);
  24. }
  25. _refreshTypeParser(dataType) {
  26. parserStore.refresh(dataType);
  27. }
  28. _clearTypeParser() {
  29. parserStore.clear();
  30. }
  31. async getConnection(options) {
  32. options = options || {};
  33. options.uuid = options.uuid || "default";
  34. if (!!this.sequelize.options.storage !== null && this.sequelize.options.storage !== void 0) {
  35. options.storage = this.sequelize.options.storage;
  36. } else {
  37. options.storage = this.sequelize.options.host || ":memory:";
  38. }
  39. options.inMemory = options.storage === ":memory:" ? 1 : 0;
  40. const dialectOptions = this.sequelize.options.dialectOptions;
  41. const defaultReadWriteMode = this.lib.OPEN_READWRITE | this.lib.OPEN_CREATE;
  42. options.readWriteMode = dialectOptions && dialectOptions.mode || defaultReadWriteMode;
  43. if (this.connections[options.inMemory || options.uuid]) {
  44. return this.connections[options.inMemory || options.uuid];
  45. }
  46. if (!options.inMemory && (options.readWriteMode & this.lib.OPEN_CREATE) !== 0) {
  47. fs.mkdirSync(path.dirname(options.storage), { recursive: true });
  48. }
  49. const connection = await new Promise((resolve, reject) => {
  50. this.connections[options.inMemory || options.uuid] = new this.lib.Database(options.storage, options.readWriteMode, (err) => {
  51. if (err)
  52. return reject(new sequelizeErrors.ConnectionError(err));
  53. debug(`connection acquired ${options.uuid}`);
  54. resolve(this.connections[options.inMemory || options.uuid]);
  55. });
  56. });
  57. if (this.sequelize.config.password) {
  58. connection.run(`PRAGMA KEY=${this.sequelize.escape(this.sequelize.config.password)}`);
  59. }
  60. if (this.sequelize.options.foreignKeys !== false) {
  61. connection.run("PRAGMA FOREIGN_KEYS=ON");
  62. }
  63. return connection;
  64. }
  65. releaseConnection(connection, force) {
  66. if (connection.filename === ":memory:" && force !== true)
  67. return;
  68. if (connection.uuid) {
  69. connection.close();
  70. debug(`connection released ${connection.uuid}`);
  71. delete this.connections[connection.uuid];
  72. }
  73. }
  74. }
  75. module.exports = ConnectionManager;
  76. module.exports.ConnectionManager = ConnectionManager;
  77. module.exports.default = ConnectionManager;
  78. //# sourceMappingURL=connection-manager.js.map