156 lines
3.8 KiB
JavaScript
156 lines
3.8 KiB
JavaScript
|
|
'use strict';
|
||
|
|
|
||
|
|
var 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 constaints 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
|
||
|
|
* });
|
||
|
|
* ```
|
||
|
|
*
|
||
|
|
* @return {object}
|
||
|
|
*/
|
||
|
|
var Deferrable = module.exports = {
|
||
|
|
INITIALLY_DEFERRED: INITIALLY_DEFERRED,
|
||
|
|
INITIALLY_IMMEDIATE: INITIALLY_IMMEDIATE,
|
||
|
|
NOT: NOT,
|
||
|
|
SET_DEFERRED: SET_DEFERRED,
|
||
|
|
SET_IMMEDIATE: SET_IMMEDIATE
|
||
|
|
};
|
||
|
|
|
||
|
|
function ABSTRACT () {}
|
||
|
|
|
||
|
|
ABSTRACT.prototype.toString = function () {
|
||
|
|
return this.toSql.apply(this, arguments);
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* A property that will defer constraints checks to the end of transactions.
|
||
|
|
*
|
||
|
|
* @property INITIALLY_DEFERRED
|
||
|
|
*/
|
||
|
|
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';
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* A property that will trigger the constraint checks immediately
|
||
|
|
*
|
||
|
|
* @property INITIALLY_IMMEDIATE
|
||
|
|
*/
|
||
|
|
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';
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* A property that will 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 NOT
|
||
|
|
*/
|
||
|
|
function NOT () {
|
||
|
|
if (!(this instanceof NOT)) {
|
||
|
|
return new NOT();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
util.inherits(NOT, ABSTRACT);
|
||
|
|
|
||
|
|
NOT.prototype.toSql = function () {
|
||
|
|
return 'NOT DEFERRABLE';
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* A property that will trigger an additional query at the beginning of a
|
||
|
|
* transaction which sets the constraints to deferred.
|
||
|
|
*
|
||
|
|
* @param {Array} constraints An array of constraint names. Will defer all constraints by default.
|
||
|
|
* @property SET_DEFERRED
|
||
|
|
*/
|
||
|
|
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);
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
/**
|
||
|
|
* A property that will trigger an additional query at the beginning of a
|
||
|
|
* transaction which sets the constraints to immediately.
|
||
|
|
*
|
||
|
|
* @param {Array} constraints An array of constraint names. Will defer all constraints by default.
|
||
|
|
* @property SET_IMMEDIATE
|
||
|
|
*/
|
||
|
|
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(function (key) {
|
||
|
|
var DeferrableType = Deferrable[key];
|
||
|
|
|
||
|
|
DeferrableType.toString = function () {
|
||
|
|
var instance = new DeferrableType();
|
||
|
|
return instance.toString.apply(instance, arguments);
|
||
|
|
};
|
||
|
|
});
|