@adonisjs/lucid
Version:
SQL ORM built on top of Active Record pattern
247 lines (246 loc) • 7.82 kB
JavaScript
"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.QueryClient = void 0;
const utils_1 = require("@poppinss/utils");
const Dialects_1 = require("../Dialects");
const QueryBuilder_1 = require("../Orm/QueryBuilder");
const TransactionClient_1 = require("../TransactionClient");
const Raw_1 = require("../Database/StaticBuilder/Raw");
const Raw_2 = require("../Database/QueryBuilder/Raw");
const Insert_1 = require("../Database/QueryBuilder/Insert");
const Reference_1 = require("../Database/StaticBuilder/Reference");
const Database_1 = require("../Database/QueryBuilder/Database");
/**
* Query client exposes the API to fetch instance of different query builders
* to perform queries on a selecte connection.
*/
class QueryClient {
constructor(mode, connection, emitter) {
Object.defineProperty(this, "mode", {
enumerable: true,
configurable: true,
writable: true,
value: mode
});
Object.defineProperty(this, "connection", {
enumerable: true,
configurable: true,
writable: true,
value: connection
});
Object.defineProperty(this, "emitter", {
enumerable: true,
configurable: true,
writable: true,
value: emitter
});
/**
* Not a transaction client
*/
Object.defineProperty(this, "isTransaction", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
/**
* The dialect in use
*/
Object.defineProperty(this, "dialect", {
enumerable: true,
configurable: true,
writable: true,
value: new Dialects_1.dialects[this.connection.dialectName](this)
});
/**
* The profiler to be used for profiling queries
*/
Object.defineProperty(this, "profiler", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
/**
* Name of the connection in use
*/
Object.defineProperty(this, "connectionName", {
enumerable: true,
configurable: true,
writable: true,
value: this.connection.name
});
/**
* Is debugging enabled
*/
Object.defineProperty(this, "debug", {
enumerable: true,
configurable: true,
writable: true,
value: !!this.connection.config.debug
});
}
/**
* Returns schema instance for the write client
*/
get schema() {
return this.getWriteClient().schema;
}
/**
* Returns the read client. The readClient is optional, since we can get
* an instance of [[QueryClient]] with a sticky write client.
*/
getReadClient() {
if (this.mode === 'read' || this.mode === 'dual') {
return this.connection.readClient;
}
return this.connection.client;
}
/**
* Returns the write client
*/
getWriteClient() {
if (this.mode === 'write' || this.mode === 'dual') {
return this.connection.client;
}
throw new utils_1.Exception('Write client is not available for query client instantiated in read mode', 500, 'E_RUNTIME_EXCEPTION');
}
/**
* Truncate table
*/
async truncate(table, cascade = false) {
await this.dialect.truncate(table, cascade);
}
/**
* Get information for a table columns
*/
async columnsInfo(table, column) {
const result = await this.getWriteClient()
.table(table)
.columnInfo(column ? column : undefined);
return result;
}
/**
* Returns an array of table names
*/
async getAllTables(schemas) {
return this.dialect.getAllTables(schemas);
}
/**
* Returns an instance of a transaction. Each transaction will
* query and hold a single connection for all queries.
*/
async transaction(callback, options) {
const trx = await this.getWriteClient().transaction(options);
const transaction = new TransactionClient_1.TransactionClient(trx, this.dialect, this.connectionName, this.debug, this.emitter);
/**
* Always make sure to pass the profiler and emitter down to the transaction
* client as well
*/
transaction.profiler = this.profiler?.create('trx:begin', { state: 'begin' });
/**
* Self managed transaction
*/
if (typeof callback === 'function') {
try {
const response = await callback(transaction);
!transaction.isCompleted && (await transaction.commit());
return response;
}
catch (error) {
await transaction.rollback();
throw error;
}
}
return transaction;
}
/**
* Returns the knex query builder instance. The query builder is always
* created from the `write` client, so before executing the query, you
* may want to decide which client to use.
*/
knexQuery() {
return this.connection.client.queryBuilder();
}
/**
* Returns the knex raw query builder instance. The query builder is always
* created from the `write` client, so before executing the query, you
* may want to decide which client to use.
*/
knexRawQuery(sql, bindings) {
return bindings ? this.connection.client.raw(sql, bindings) : this.connection.client.raw(sql);
}
/**
* Returns a query builder instance for a given model.
*/
modelQuery(model) {
return new QueryBuilder_1.ModelQueryBuilder(this.knexQuery(), model, this);
}
/**
* Returns instance of a query builder for selecting, updating
* or deleting rows
*/
query() {
return new Database_1.DatabaseQueryBuilder(this.knexQuery(), this);
}
/**
* Returns instance of a query builder for inserting rows
*/
insertQuery() {
return new Insert_1.InsertQueryBuilder(this.getWriteClient().queryBuilder(), this);
}
/**
* Returns instance of raw query builder
*/
rawQuery(sql, bindings) {
return new Raw_2.RawQueryBuilder(this.connection.client.raw(sql, bindings), this);
}
/**
* Returns an instance of raw builder. This raw builder queries
* cannot be executed. Use `rawQuery`, if you want to execute
* queries raw queries.
*/
raw(sql, bindings) {
return new Raw_1.RawBuilder(sql, bindings);
}
/**
* Returns reference builder.
*/
ref(reference) {
return new Reference_1.ReferenceBuilder(reference, this.getReadClient().client);
}
/**
* Returns instance of a query builder and selects the table
*/
from(table) {
return this.query().from(table);
}
/**
* Returns instance of a query builder and selects the table
* for an insert query
*/
table(table) {
return this.insertQuery().table(table);
}
/**
* Get advisory lock on the selected connection
*/
getAdvisoryLock(key, timeout) {
return this.dialect.getAdvisoryLock(key, timeout);
}
/**
* Release advisory lock
*/
releaseAdvisoryLock(key) {
return this.dialect.releaseAdvisoryLock(key);
}
}
exports.QueryClient = QueryClient;