You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
3.1 KiB
123 lines
3.1 KiB
'use strict';
|
|
|
|
const util = require('util');
|
|
|
|
|
|
/**
|
|
* 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 Defer constraints checks to the end of transactions.
|
|
* @property INITIALLY_IMMEDIATE Trigger the constraint checks immediately
|
|
* @property NOT Set the constraints to not deferred. This is the default in PostgreSQL and it make it impossible to dynamically defer the constraints within a transaction.
|
|
* @property SET_DEFERRED
|
|
* @property SET_IMMEDIATE
|
|
*/
|
|
const Deferrable = module.exports = {
|
|
INITIALLY_DEFERRED,
|
|
INITIALLY_IMMEDIATE,
|
|
NOT,
|
|
SET_DEFERRED,
|
|
SET_IMMEDIATE
|
|
};
|
|
|
|
function ABSTRACT() {}
|
|
|
|
ABSTRACT.prototype.toString = function() {
|
|
return this.toSql.apply(this, arguments);
|
|
};
|
|
|
|
function INITIALLY_DEFERRED() {
|
|
if (!(this instanceof INITIALLY_DEFERRED)) {
|
|
return new INITIALLY_DEFERRED();
|
|
}
|
|
}
|
|
util.inherits(INITIALLY_DEFERRED, ABSTRACT);
|
|
|
|
INITIALLY_DEFERRED.prototype.toSql = function() {
|
|
return 'DEFERRABLE INITIALLY DEFERRED';
|
|
};
|
|
|
|
function INITIALLY_IMMEDIATE() {
|
|
if (!(this instanceof INITIALLY_IMMEDIATE)) {
|
|
return new INITIALLY_IMMEDIATE();
|
|
}
|
|
}
|
|
util.inherits(INITIALLY_IMMEDIATE, ABSTRACT);
|
|
|
|
INITIALLY_IMMEDIATE.prototype.toSql = function() {
|
|
return 'DEFERRABLE INITIALLY IMMEDIATE';
|
|
};
|
|
|
|
function NOT() {
|
|
if (!(this instanceof NOT)) {
|
|
return new NOT();
|
|
}
|
|
}
|
|
util.inherits(NOT, ABSTRACT);
|
|
|
|
NOT.prototype.toSql = function() {
|
|
return 'NOT DEFERRABLE';
|
|
};
|
|
|
|
function SET_DEFERRED(constraints) {
|
|
if (!(this instanceof SET_DEFERRED)) {
|
|
return new SET_DEFERRED(constraints);
|
|
}
|
|
|
|
this.constraints = constraints;
|
|
}
|
|
util.inherits(SET_DEFERRED, ABSTRACT);
|
|
|
|
SET_DEFERRED.prototype.toSql = function(queryGenerator) {
|
|
return queryGenerator.setDeferredQuery(this.constraints);
|
|
};
|
|
|
|
function SET_IMMEDIATE(constraints) {
|
|
if (!(this instanceof SET_IMMEDIATE)) {
|
|
return new SET_IMMEDIATE(constraints);
|
|
}
|
|
|
|
this.constraints = constraints;
|
|
}
|
|
util.inherits(SET_IMMEDIATE, ABSTRACT);
|
|
|
|
SET_IMMEDIATE.prototype.toSql = function(queryGenerator) {
|
|
return queryGenerator.setImmediateQuery(this.constraints);
|
|
};
|
|
|
|
Object.keys(Deferrable).forEach(key => {
|
|
const DeferrableType = Deferrable[key];
|
|
|
|
DeferrableType.toString = function() {
|
|
const instance = new DeferrableType();
|
|
return instance.toString.apply(instance, arguments);
|
|
};
|
|
});
|
|
|