var osb = lf.schema.create('offline', 2);
+var osb2; // initialized in offline UI only
// Leaving here as an example. Note this had no impact
// on load speed for large offline block lists.
addColumn('value', lf.Type.OBJECT).
addPrimaryKey(['id']);
-osb.createTable('OfflineXact').
- addColumn('seq', lf.Type.INTEGER).
- addColumn('value', lf.Type.OBJECT).
- addPrimaryKey(['seq'], true);
+// Limit the creation of the offline transaction and blocks tables to
+// the offline interface for speed. Lovefield prevents creation of tables
+// after the database has been initialized, which is why we can't simply
+// add new tables to the exsting database. This is kind of hacky.
+if (window.location.pathname.match(/\/staff\/offline-interface/)) {
+ console.debug('initializing secondary offline database');
+
+ osb2 = lf.schema.create('offline_data', 2);
+
+ osb2.createTable('OfflineXact').
+ addColumn('seq', lf.Type.INTEGER).
+ addColumn('value', lf.Type.OBJECT).
+ addPrimaryKey(['seq'], true);
+
+ osb2.createTable('OfflineBlocks').
+ addColumn('barcode', lf.Type.STRING).
+ addColumn('reason', lf.Type.STRING).
+ addPrimaryKey(['barcode']);
+}
-osb.createTable('OfflineBlocks').
- addColumn('barcode', lf.Type.STRING).
- addColumn('reason', lf.Type.STRING).
- addPrimaryKey(['barcode']);
/**
* Core Service - egLovefield
function connectOrGo() {
- if (lf.offlineDB) { // offline DB connected
+ if (lf.offlineCacheDb) { // offline DB connected
return $q.when();
}
//console.debug('attempting offline DB connection');
try {
- osb.connect().then(
- function(db) {
- console.debug('successfully connected to offline DB');
+ service.connectToDatabases().then(
+ function() {
service.connectPromise = null;
- lf.offlineDB = db;
deferred.resolve();
},
- function(err) {
- // assumes that a single connection failure means
- // a connection will never succeed.
+ function() {
service.cannotConnect = true;
- console.error('Cannot connect to offline DB: ' + err);
+ deferred.reject();
}
);
} catch (e) {
return service.connectPromise;
}
+ service.connectToDatabases = function(db) {
+
+ var promises = [
+
+ osb.connect().then(
+ function(db) {
+ console.debug('successfully connected to main offline DB');
+ lf.offlineCacheDb = db;
+ },
+ function(err) {
+ console.error('Cannot connect to main offline DB: ' + err);
+ }
+ )
+ ];
+
+ if (osb2) {
+ // Connect to the secondary offline database in the offline UI.
+ var p2 = osb2.connect().then(
+ function(db2) {
+ console.debug('successfully connected to 2ndry offline DB');
+ lf.offlineDataDB = db2;
+ },
+ function(err) {
+ console.error('Cannot connect to 2ndry offline DB: ' + err);
+ }
+ )
+
+ promises.push(p2);
+ }
+
+ return $q.all(promises);
+ }
+
service.isCacheGood = function (type) {
return connectOrGo().then(function() {
- var cacheDate = lf.offlineDB.getSchema().table('CacheDate');
+ var cacheDate = lf.offlineCacheDb.getSchema().table('CacheDate');
- return lf.offlineDB.
+ return lf.offlineCacheDb.
select(cacheDate.cachedate).
from(cacheDate).
where(cacheDate.type.eq(type)).
service.destroyPendingOfflineXacts = function () {
return connectOrGo().then(function() {
- var table = lf.offlineDB.getSchema().table('OfflineXact');
- return lf.offlineDB.
+ var table = lf.offlineDataDB.getSchema().table('OfflineXact');
+ return lf.offlineDataDB.
delete().
from(table).
exec();
service.havePendingOfflineXacts = function () {
return connectOrGo().then(function() {
- var table = lf.offlineDB.getSchema().table('OfflineXact');
- return lf.offlineDB.
+ var table = lf.offlineDataDB.getSchema().table('OfflineXact');
+ return lf.offlineDataDB.
select(table.reason).
from(table).
exec().
service.retrievePendingOfflineXacts = function () {
return connectOrGo().then(function() {
- var table = lf.offlineDB.getSchema().table('OfflineXact');
- return lf.offlineDB.
+ var table = lf.offlineDataDB.getSchema().table('OfflineXact');
+ return lf.offlineDataDB.
select(table.value).
from(table).
exec().
service.destroyOfflineBlocks = function () {
return connectOrGo().then(function() {
- var table = lf.offlineDB.getSchema().table('OfflineBlocks');
+ var table = lf.offlineDataDB.getSchema().table('OfflineBlocks');
return $q.when(
- lf.offlineDB.
+ lf.offlineDataDB.
delete().
from(table).
exec()
service.addOfflineBlock = function (barcode, reason) {
return connectOrGo().then(function() {
- var table = lf.offlineDB.getSchema().table('OfflineBlocks');
+ var table = lf.offlineDataDB.getSchema().table('OfflineBlocks');
return $q.when(
- lf.offlineDB.
+ lf.offlineDataDB.
insertOrReplace().
into(table).
values([ table.createRow({ barcode : barcode, reason : reason }) ]).
return connectOrGo().then(function() {
var rows = [];
- var table = lf.offlineDB.getSchema().table('OfflineBlocks');
+ var table = lf.offlineDataDB.getSchema().table('OfflineBlocks');
console.debug('compiling offline block rows');
lines.forEach(function(line) {
})
console.debug('inserting ' + rows.length + ' offline block rows');
- return lf.offlineDB.
+ return lf.offlineDataDB.
insertOrReplace().
into(table).
values(rows).
// Returns a promise with true for blocked, false for not blocked
service.testOfflineBlock = function (barcode) {
return connectOrGo().then(function() {
- var table = lf.offlineDB.getSchema().table('OfflineBlocks');
- return lf.offlineDB.
+ var table = lf.offlineDataDB.getSchema().table('OfflineBlocks');
+ return lf.offlineDataDB.
select(table.reason).
from(table).
where(table.barcode.eq(barcode)).
service.addOfflineXact = function (obj) {
return connectOrGo().then(function() {
- var table = lf.offlineDB.getSchema().table('OfflineXact');
+ var table = lf.offlineDataDB.getSchema().table('OfflineXact');
return $q.when(
- lf.offlineDB.
+ lf.offlineDataDB.
insertOrReplace().
into(table).
values([ table.createRow({ value : obj }) ]).
if (lf.isOffline) return $q.when();
return connectOrGo().then(function() {
- var table = lf.offlineDB.getSchema().table('StatCat');
+ var table = lf.offlineCacheDb.getSchema().table('StatCat');
var rlist = [];
angular.forEach(statcats, function (val) {
value : egCore.idl.toHash(val)
}));
});
- return lf.offlineDB.
+ return lf.offlineCacheDb.
insertOrReplace().
into(table).
values(rlist).
service.getStatCatsCache = function () {
return connectOrGo().then(function() {
- var table = lf.offlineDB.getSchema().table('StatCat');
+ var table = lf.offlineCacheDb.getSchema().table('StatCat');
var result = [];
- return lf.offlineDB.
+ return lf.offlineCacheDb.
select(table.value).
from(table).
exec().then(function(list) {
return connectOrGo().then(function() {
- var table = lf.offlineDB.getSchema().table('Setting');
+ var table = lf.offlineCacheDb.getSchema().table('Setting');
var rlist = [];
angular.forEach(settings, function (val, key) {
);
});
- return lf.offlineDB.
+ return lf.offlineCacheDb.
insertOrReplace().
into(table).
values(rlist).
service.getSettingsCache = function (settings) {
return connectOrGo().then(function() {
- var table = lf.offlineDB.getSchema().table('Setting');
+ var table = lf.offlineCacheDb.getSchema().table('Setting');
var search_pred = table.name.isNotNull();
if (settings && settings.length) {
search_pred = table.name.in(settings);
}
- return lf.offlineDB.
+ return lf.offlineCacheDb.
select(table.name, table.value).
from(table).
where(search_pred).
service.isCacheGood(type).then(function(good) {
if (!good) {
- var object = lf.offlineDB.getSchema().table('Object');
- var cacheDate = lf.offlineDB.getSchema().table('CacheDate');
+ var object = lf.offlineCacheDb.getSchema().table('Object');
+ var cacheDate = lf.offlineCacheDb.getSchema().table('CacheDate');
var pkey = egCore.idl.classes[type].pkey;
angular.forEach(list, function(item) {
id : '' + item[pkey](),
object : egCore.idl.toHash(item)
});
- lf.offlineDB.insertOrReplace().into(object).values([row]).exec();
+ lf.offlineCacheDb.insertOrReplace().into(object).values([row]).exec();
});
var row = cacheDate.createRow({
});
console.log('egLovefield saving ' + type + ' list');
- lf.offlineDB.insertOrReplace().into(cacheDate).values([row]).exec();
+ lf.offlineCacheDb.insertOrReplace().into(cacheDate).values([row]).exec();
}
})
});
service.getListFromOfflineCache = function(type) {
return connectOrGo().then(function() {
- var object = lf.offlineDB.getSchema().table('Object');
+ var object = lf.offlineCacheDb.getSchema().table('Object');
- return lf.offlineDB.
+ return lf.offlineCacheDb.
select(object.object).
from(object).
where(object.type.eq(type)).
}
});
- egCore.env.absorbTree(top, type, true)
+ if (top) {
+ egCore.env.absorbTree(top, type, true);
+ }
return $q.when(true)
});
}