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;
};