UNPKG

@adonisjs/lucid

Version:

SQL ORM built on top of Active Record pattern

192 lines (191 loc) 5.43 kB
"use strict"; /* * @adonisjs/lucid * * (c) Harminder Virk <virk@adonisjs.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.Schema = void 0; const utils_1 = require("@poppinss/utils"); const QueryReporter_1 = require("../QueryReporter"); const utils_2 = require("../utils"); /** * Exposes the API to define table schema using deferred database * calls. */ class Schema { constructor(db, file, dryRun = false) { Object.defineProperty(this, "db", { enumerable: true, configurable: true, writable: true, value: db }); Object.defineProperty(this, "file", { enumerable: true, configurable: true, writable: true, value: file }); Object.defineProperty(this, "dryRun", { enumerable: true, configurable: true, writable: true, value: dryRun }); /** * All calls to `schema` and `defer` are tracked to be * executed later */ Object.defineProperty(this, "trackedCalls", { enumerable: true, configurable: true, writable: true, value: [] }); /** * The state of the schema. It cannot be re-executed after completion */ Object.defineProperty(this, "state", { enumerable: true, configurable: true, writable: true, value: 'pending' }); /** * Control whether to debug the query or not. The initial * value is inherited from the query client */ Object.defineProperty(this, "debug", { enumerable: true, configurable: true, writable: true, value: this.db.debug }); } /** * Returns the schema to build database tables */ get schema() { const schema = this.db.schema; this.trackedCalls.push(schema); return schema; } /** * Returns schema queries sql without executing them */ getQueries() { return this.trackedCalls .filter((schema) => typeof schema['toQuery'] === 'function') .map((schema) => schema.toQuery()); } /** * Returns reporter instance */ getReporter() { return new QueryReporter_1.QueryReporter(this.db, this.debug, {}); } /** * Returns the log data */ getQueryData(sql) { return { connection: this.db.connectionName, inTransaction: this.db.isTransaction, ddl: true, ...sql, method: (0, utils_2.getDDLMethod)(sql.sql), }; } /** * Executes schema queries and defer calls in sequence */ async executeQueries() { for (let trackedCall of this.trackedCalls) { if (typeof trackedCall === 'function') { await trackedCall(this.db); } else { const reporter = this.getReporter(); try { trackedCall['once']('query', (sql) => reporter.begin(this.getQueryData(sql))); await trackedCall; reporter.end(); } catch (error) { reporter.end(error); throw error; } } } } /** * Returns raw query for `now` */ now(precision) { return precision ? this.db.knexRawQuery(`CURRENT_TIMESTAMP(${precision})`) : this.db.knexRawQuery('CURRENT_TIMESTAMP'); } /** * Instance of raw knex query builder */ raw(query, bindings) { return this.db.knexRawQuery(query, bindings); } /** * Wrapping database calls inside defer ensures that they run * in the right order and also they won't be executed when * schema is invoked to return the SQL queries */ defer(cb) { this.trackedCalls.push(cb); } /** * Invokes schema `up` method. Returns an array of queries * when `dryRun` is set to true */ async execUp() { if (this.state === 'completed') { throw new utils_1.Exception('Cannot execute a given schema twice'); } await this.up(); this.state = 'completed'; if (this.dryRun) { return this.getQueries(); } await this.executeQueries(); return true; } /** * Invokes schema `down` method. Returns an array of queries * when `dryRun` is set to true */ async execDown() { if (this.state === 'completed') { throw new utils_1.Exception('Cannot execute a given schema twice'); } await this.down(); this.state = 'completed'; if (this.dryRun) { return this.getQueries(); } await this.executeQueries(); return true; } async up() { } async down() { } } exports.Schema = Schema; /** * Enable/disable transactions for this schema */ Object.defineProperty(Schema, "disableTransactions", { enumerable: true, configurable: true, writable: true, value: false });