106 lines
3.0 KiB
JavaScript
106 lines
3.0 KiB
JavaScript
'use strict';
|
|
|
|
const { classToInvokable } = require('./utils');
|
|
|
|
class ABSTRACT {
|
|
static toString(...args) {
|
|
return new this().toString(...args);
|
|
}
|
|
|
|
toString(...args) {
|
|
return this.toSql(...args);
|
|
}
|
|
|
|
toSql() {
|
|
throw new Error('toSql implementation missing');
|
|
}
|
|
}
|
|
|
|
class INITIALLY_DEFERRED extends ABSTRACT {
|
|
toSql() {
|
|
return 'DEFERRABLE INITIALLY DEFERRED';
|
|
}
|
|
}
|
|
|
|
class INITIALLY_IMMEDIATE extends ABSTRACT {
|
|
toSql() {
|
|
return 'DEFERRABLE INITIALLY IMMEDIATE';
|
|
}
|
|
}
|
|
|
|
class NOT extends ABSTRACT {
|
|
toSql() {
|
|
return 'NOT DEFERRABLE';
|
|
}
|
|
}
|
|
|
|
class SET_DEFERRED extends ABSTRACT {
|
|
constructor(constraints) {
|
|
super();
|
|
this.constraints = constraints;
|
|
}
|
|
|
|
toSql(queryGenerator) {
|
|
return queryGenerator.setDeferredQuery(this.constraints);
|
|
}
|
|
}
|
|
|
|
class SET_IMMEDIATE extends ABSTRACT {
|
|
constructor(constraints) {
|
|
super();
|
|
this.constraints = constraints;
|
|
}
|
|
|
|
toSql(queryGenerator) {
|
|
return queryGenerator.setImmediateQuery(this.constraints);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* A collection of properties related to deferrable constraints. It can be used to
|
|
* make foreign key constraints deferrable and to set the constraints within a
|
|
* transaction. This is only supported in PostgreSQL.
|
|
*
|
|
* The foreign keys can be configured like this. It will create a foreign key
|
|
* that will check the constraints immediately when the data was inserted.
|
|
*
|
|
* ```js
|
|
* sequelize.define('Model', {
|
|
* foreign_id: {
|
|
* type: Sequelize.INTEGER,
|
|
* references: {
|
|
* model: OtherModel,
|
|
* key: 'id',
|
|
* deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE
|
|
* }
|
|
* }
|
|
* });
|
|
* ```
|
|
*
|
|
* The constraints can be configured in a transaction like this. It will
|
|
* trigger a query once the transaction has been started and set the constraints
|
|
* to be checked at the very end of the transaction.
|
|
*
|
|
* ```js
|
|
* sequelize.transaction({
|
|
* deferrable: Sequelize.Deferrable.SET_DEFERRED
|
|
* });
|
|
* ```
|
|
*
|
|
* @property INITIALLY_DEFERRED Use when declaring a constraint. Allow and enable by default this constraint's checks to be deferred at the end of transactions.
|
|
* @property INITIALLY_IMMEDIATE Use when declaring a constraint. Allow the constraint's checks to be deferred at the end of transactions.
|
|
* @property NOT Use when declaring a constraint. Set the constraint to not deferred. This is the default in PostgreSQL and makes it impossible to dynamically defer the constraints within a transaction.
|
|
* @property SET_DEFERRED Use when declaring a transaction. Defer the deferrable checks involved in this transaction at commit.
|
|
* @property SET_IMMEDIATE Use when declaring a transaction. Execute the deferrable checks involved in this transaction immediately.
|
|
*/
|
|
|
|
const Deferrable = {
|
|
INITIALLY_DEFERRED: classToInvokable(INITIALLY_DEFERRED),
|
|
INITIALLY_IMMEDIATE: classToInvokable(INITIALLY_IMMEDIATE),
|
|
NOT: classToInvokable(NOT),
|
|
SET_DEFERRED: classToInvokable(SET_DEFERRED),
|
|
SET_IMMEDIATE: classToInvokable(SET_IMMEDIATE)
|
|
};
|
|
|
|
module.exports = Deferrable;
|