Attached Files | executeInBatches.diff [^] (5,545 bytes) 2014-04-01 17:47 [Show Content] [Hide Content]diff --git a/web/org.openbravo.mobile.core/source/data/ob-dal.js b/web/org.openbravo.mobile.core/source/data/ob-dal.js
--- a/web/org.openbravo.mobile.core/source/data/ob-dal.js
+++ b/web/org.openbravo.mobile.core/source/data/ob-dal.js
@@ -594,55 +594,73 @@
}, error);
if (_.isArray(initialData)) {
- OB.Data.localDB.transaction(function (tx) {
- var props = model.getProperties ? model.getProperties() : model.prototype.properties,
- filterVal, values, _idx = 0,
- updateRecord = function (tx, model, values) {
- var deleteStatement;
- deleteStatement = model.getDeleteByIdStatement ? model.getDeleteByIdStatement() : "DELETE FROM " + model.prototype.tableName + " WHERE " + model.prototype.propertyMap.id + "=?";
- tx.executeSql(deleteStatement, [values[0]], function () {
- var insertSatement;
- insertSatement = model.getInsertStatement ? model.getInsertStatement() : model.prototype.insertStatement;
- tx.executeSql(insertSatement, values, null, error);
- }, error);
- };
+ var props = model.getProperties ? model.getProperties() : model.prototype.properties,
+ filterVal, values, increment = 1000,
+ updateRecord, executeInBatches;
- _.each(initialData, function (item) {
- var filterProps, insertStatement;
- values = [];
+ updateRecord = function (tx, model, values) {
+ var deleteStatement;
+ deleteStatement = model.getDeleteByIdStatement ? model.getDeleteByIdStatement() : "DELETE FROM " + model.prototype.tableName + " WHERE " + model.prototype.propertyMap.id + "=?";
+ tx.executeSql(deleteStatement, [values[0]], function () {
+ var insertSatement;
+ insertSatement = model.getInsertStatement ? model.getInsertStatement() : model.prototype.insertStatement;
+ tx.executeSql(insertSatement, values, null, error);
+ }, error);
+ };
- _.each(props, function (prop) {
- var propName = typeof prop === 'string' ? prop : prop.name;
- if (!propName || '_idx' === propName) {
- return;
+ executeInBatches = function (data, index) {
+ var _idx = index;
+ OB.Data.localDB.transaction(function (tx) {
+ while (_idx < data.length && _idx < index + increment) {
+ var filterProps, insertStatement, item = data[_idx],
+ i, propName, prop;
+ values = [];
+
+ for (i = 0; i < props.length; i++) {
+ prop = props[i];
+ propName = typeof prop === 'string' ? prop : prop.name;
+ if (propName && '_idx' !== propName) {
+ values.push(item[propName]);
+ }
}
- values.push(item[propName]);
- });
- if ((model.hasFilter && model.hasFilter()) || model.prototype.propertiesFilter) {
- filterVal = '';
- filterProps = model.getFilterProperties ? model.getFilterProperties() : model.prototype.propertiesFilter;
- _.each(filterProps, function (prop) {
- filterVal = filterVal + item[prop] + '###';
- });
- values.push(filterVal);
+ if ((model.hasFilter && model.hasFilter()) || model.prototype.propertiesFilter) {
+ filterVal = '';
+ filterProps = model.getFilterProperties ? model.getFilterProperties() : model.prototype.propertiesFilter;
+
+ for (i = 0; i < filterProps.length; i++) {
+ prop = filterProps[i];
+ filterVal = filterVal + item[prop] + '###';
+ }
+
+ values.push(filterVal);
+ }
+
+ values.push(_idx);
+ if (incremental) {
+ updateRecord(tx, model, values);
+ } else {
+ insertStatement = model.getInsertStatement ? model.getInsertStatement() : model.prototype.insertStatement;
+ tx.executeSql(insertStatement, values, null, error);
+ }
+ _idx++;
+
}
+ }, error, function () {
+ if (_idx < data.length) {
+ executeInBatches(data, _idx);
+ } else {
+ // transaction success, execute callback
+ if (_.isFunction(success)) {
+ success();
+ }
- values.push(_idx);
- if (incremental) {
- updateRecord(tx, model, values);
- } else {
- insertStatement = model.getInsertStatement ? model.getInsertStatement() : model.prototype.insertStatement;
- tx.executeSql(insertStatement, values, null, error);
}
- _idx++;
});
- }, error, function () {
- // transaction success, execute callback
- if (_.isFunction(success)) {
- success();
- }
- });
+ };
+
+ executeInBatches(initialData, 0);
+
} else { // no initial data
throw 'initialData must be an Array';
}
@@ -732,4 +750,4 @@
}
}
}
-});
\ No newline at end of file
+});
|