epic-sql
Version:
A Simple But Powerful SQL ORM!!!
143 lines (142 loc) • 6.74 kB
JavaScript
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;
;