UNPKG

epic-sql

Version:
143 lines (142 loc) 6.74 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.EpicSQLManager = void 0; const connection_1 = require("./connection"); const base_schema_1 = require("./base-schema"); const operator_1 = require("./operator"); const exceptions_1 = require("./exceptions"); const sql_highlighter_1 = require("@mikro-orm/sql-highlighter"); const fs_1 = __importDefault(require("fs")); const path_1 = __importDefault(require("path")); const utils_1 = require("./utils"); class EpicSQLManager { constructor(Connection, Schemas) { this.Connection = Connection; this.Schemas = Schemas; this.TransactionID = null; this.Schemas.forEach((Schema) => { if (!(Schema.prototype instanceof base_schema_1.BaseSchema) || !Schema.prototype.hasOwnProperty("getSchemaInfo")) throw new exceptions_1.EpicSQLManagerException(`Invalid object '${Schema.name}' has been provided! Object is not a Schema.`); }); } getConnection() { return this.Connection; } query(query, params) { return __awaiter(this, void 0, void 0, function* () { // Get Connection const Connection = yield this.Connection.get(); // Logs if (this.Connection.Configuration.logs) { // Create Highligter Instance const Hightlighter = new sql_highlighter_1.SqlHighlighter(); // Log Executing Query console.log(Hightlighter.highlight(query), "Params:", params || [], "\n"); } // Execute Query return Connection.query(query, params); }); } sync(disabled = false) { return __awaiter(this, void 0, void 0, function* () { if (!disabled) yield this.Transaction(() => __awaiter(this, void 0, void 0, function* () { // Create Table If Not Exists yield this.query((yield Promise.all(this.Schemas.map((Target) => __awaiter(this, void 0, void 0, function* () { const Schema = new Target(); const Table = Schema.createTable(); const SchemaInfo = new Target().getSchemaInfo(); // Create Syncronization File const SyncDirPath = path_1.default.join(process.cwd(), `./.temp/epic-sql/schema/`); const SyncFilePath = path_1.default.join(SyncDirPath, `./${SchemaInfo.name}.json`); // Get Schema Difference const Difference = []; if (!fs_1.default.existsSync(SyncFilePath)) { fs_1.default.mkdirSync(SyncDirPath, { recursive: true }); fs_1.default.writeFileSync(SyncFilePath, JSON.stringify(SchemaInfo)); } else { const SyncFile = fs_1.default.readFileSync(SyncFilePath).toString(); Difference.push(Table.getDifference(Schema.createTable(JSON.parse(SyncFile)))); // Update Syncronization File if (Difference.length) fs_1.default.writeFileSync(SyncFilePath, JSON.stringify(SchemaInfo)); } return [ Table.create({ checkExists: true, }), Difference, ].join(""); })))) .filter((v) => v) .join("")); })); return this; }); } Transaction(callback) { return __awaiter(this, void 0, void 0, function* () { // Create a Transaction ID const Transaction = { id: utils_1.Utils.uuid(), current: false, }; // Own the Transaction if (!this.TransactionID) this.TransactionID = Transaction.id; try { // Start an SQL Transaction if (!Transaction.current && this.TransactionID === Transaction.id) { yield this.query("START TRANSACTION;"); Transaction.current = true; } // Execute Transaction const Results = yield callback(); // Commit the Transaction if (Transaction.current && this.TransactionID === Transaction.id) { yield this.query("COMMIT;"); // Remove Transaction ID this.TransactionID = null; } // Return Transaction Results return Results; } catch (error) { // Rollback the Transaction if (Transaction.current && this.TransactionID === Transaction.id) { yield this.query("ROLLBACK;").catch(() => { }); // Remove Transaction ID this.TransactionID = null; } // Throw Transaction Error throw new exceptions_1.SQLException(error.message || error); } }); } new() { const Config = this.Connection.getConfig(); return new EpicSQLManager(new connection_1.Connection(Config.type, Config.options), this.Schemas); } end() { this.Connection.end(); return this; } use(Target) { return (...Relations) => new operator_1.Operator(Target, Relations, this); } } exports.EpicSQLManager = EpicSQLManager;