173 lines
5.8 KiB
JavaScript
173 lines
5.8 KiB
JavaScript
/*
|
|
Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights
|
|
reserved.
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; version 2 of
|
|
the License.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
|
02110-1301 USA
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
var userContext = require("./UserContext.js"),
|
|
udebug = unified_debug.getLogger("Batch.js"),
|
|
transaction = require('./Transaction.js');
|
|
|
|
function Batch(session) {
|
|
this.session = session;
|
|
this.operationContexts = [];
|
|
}
|
|
|
|
|
|
exports.Batch = Batch;
|
|
|
|
exports.Batch.prototype.getSession = function() {
|
|
return this.session;
|
|
};
|
|
|
|
|
|
exports.Batch.prototype.clearError = new Error('Batch was cleared.');
|
|
|
|
exports.Batch.prototype.clear = function() {
|
|
var batch = this;
|
|
// clear all operations from the batch
|
|
// if any pending operations, synchronously call each callback with an error
|
|
// the transaction state is unchanged
|
|
if(udebug.is_detail()) if(udebug.is_debug()) udebug.log('Batch.clear with operationContexts.length ' + this.operationContexts.length);
|
|
// for each context, extract the operation and clear it
|
|
this.operationContexts.forEach(function(context) {
|
|
// first, mark the context as cleared so if getTableHandler returns during a user callback,
|
|
// we won't continue to create the operation
|
|
context.clear = true;
|
|
// now call the user callback with an error
|
|
switch (context.returned_parameter_count) {
|
|
case 1:
|
|
context.applyCallback(batch.clearError);
|
|
break;
|
|
case 2:
|
|
context.applyCallback(batch.clearError, null);
|
|
break;
|
|
default:
|
|
throw new Error(
|
|
'Fatal internal exception: wrong parameter count ' + context.returned_parameter_count +
|
|
' for Batch.clearBatch');
|
|
}
|
|
});
|
|
// now clear the operations in this batch
|
|
batch.operationContexts = [];
|
|
};
|
|
|
|
|
|
exports.Batch.prototype.find = function() {
|
|
var context, promise;
|
|
context = new userContext.UserContext(arguments, 3, 2, this.session, this.session.sessionFactory, false);
|
|
// delegate to context's find function for execution
|
|
promise = context.find();
|
|
this.operationContexts.push(context);
|
|
return promise;
|
|
};
|
|
|
|
|
|
exports.Batch.prototype.load = function() {
|
|
var context, promise;
|
|
context = new userContext.UserContext(arguments, 2, 1, this.session, this.session.sessionFactory, false);
|
|
// delegate to context's load function for execution
|
|
promise = context.load();
|
|
this.operationContexts.push(context);
|
|
return promise;
|
|
};
|
|
|
|
|
|
exports.Batch.prototype.persist = function(tableIndicator) {
|
|
var context, promise;
|
|
if (typeof(tableIndicator) === 'object') {
|
|
// persist(domainObject, callback)
|
|
context = new userContext.UserContext(arguments, 2, 1, this.session, this.session.sessionFactory, false);
|
|
} else {
|
|
// persist(tableNameOrConstructor, values, callback)
|
|
context = new userContext.UserContext(arguments, 3, 1, this.session, this.session.sessionFactory, false);
|
|
}
|
|
// delegate to context's persist function for execution
|
|
promise = context.persist();
|
|
this.operationContexts.push(context);
|
|
return promise;
|
|
};
|
|
|
|
|
|
exports.Batch.prototype.remove = function(tableIndicator) {
|
|
var context, promise;
|
|
if (typeof(tableIndicator) === 'object') {
|
|
// remove(domainObject, callback)
|
|
context = new userContext.UserContext(arguments, 2, 1, this.session, this.session.sessionFactory, false);
|
|
} else {
|
|
// remove(tableNameOrConstructor, keys, callback)
|
|
context = new userContext.UserContext(arguments, 3, 1, this.session, this.session.sessionFactory, false);
|
|
}
|
|
// delegate to context's remove function for execution
|
|
promise = context.remove();
|
|
this.operationContexts.push(context);
|
|
return promise;
|
|
};
|
|
|
|
|
|
exports.Batch.prototype.update = function(tableIndicator) {
|
|
var context, promise;
|
|
if (typeof(tableIndicator) === 'object') {
|
|
// update(domainObject, callback)
|
|
context = new userContext.UserContext(arguments, 2, 1, this.session, this.session.sessionFactory, false);
|
|
} else {
|
|
// update(tableNameOrConstructor, keys, values, callback)
|
|
context = new userContext.UserContext(arguments, 4, 1, this.session, this.session.sessionFactory, false);
|
|
}
|
|
// delegate to context's update function for execution
|
|
promise = context.update();
|
|
this.operationContexts.push(context);
|
|
return promise;
|
|
};
|
|
|
|
|
|
exports.Batch.prototype.save = function(tableIndicator) {
|
|
var context, promise;
|
|
if (typeof(tableIndicator) === 'object') {
|
|
// save(domainObject, callback)
|
|
context = new userContext.UserContext(arguments, 2, 1, this.session, this.session.sessionFactory, false);
|
|
} else {
|
|
// save(tableNameOrConstructor, values, callback)
|
|
context = new userContext.UserContext(arguments, 3, 1, this.session, this.session.sessionFactory, false);
|
|
}
|
|
// delegate to context's save function for execution
|
|
promise = context.save();
|
|
this.operationContexts.push(context);
|
|
return promise;
|
|
};
|
|
|
|
|
|
exports.Batch.prototype.execute = function() {
|
|
var context = new userContext.UserContext(arguments, 1, 1, this.session, this.session.sessionFactory, true);
|
|
var promise = context.executeBatch(this.operationContexts);
|
|
// clear the operations that have just been executed
|
|
this.operationContexts = [];
|
|
return promise;
|
|
};
|
|
|
|
exports.Batch.prototype.isBatch = function() {
|
|
this.assertOpen();
|
|
return true;
|
|
};
|
|
|
|
exports.Batch.prototype.getOperationCount = function() {
|
|
return this.operationContexts.length;
|
|
};
|
|
|