fix #1141: opening file from storage if cache is not available

This commit is contained in:
antelle 2019-09-15 07:44:04 +02:00
parent 73635e2784
commit e7d88cce58
2 changed files with 75 additions and 46 deletions

View File

@ -435,12 +435,15 @@ const AppModel = Backbone.Model.extend({
openFile(params, callback) { openFile(params, callback) {
const logger = new Logger('open', params.name); const logger = new Logger('open', params.name);
logger.info('File open request'); logger.info('File open request');
const fileInfo = params.id const fileInfo = params.id
? this.fileInfos.get(params.id) ? this.fileInfos.get(params.id)
: this.fileInfos.getMatch(params.storage, params.name, params.path); : this.fileInfos.getMatch(params.storage, params.name, params.path);
if (!params.opts && fileInfo && fileInfo.get('opts')) { if (!params.opts && fileInfo && fileInfo.get('opts')) {
params.opts = fileInfo.get('opts'); params.opts = fileInfo.get('opts');
} }
if (fileInfo && fileInfo.get('modified')) { if (fileInfo && fileInfo.get('modified')) {
logger.info('Open file from cache because it is modified'); logger.info('Open file from cache because it is modified');
this.openFileFromCache( this.openFileFromCache(
@ -468,57 +471,23 @@ const AppModel = Backbone.Model.extend({
fileInfo.get('storage') !== 'file' fileInfo.get('storage') !== 'file'
) { ) {
logger.info('Open file from cache because it is latest'); logger.info('Open file from cache because it is latest');
this.openFileFromCache(params, callback, fileInfo); this.openFileFromCache(
} else if (!fileInfo || !fileInfo.get('openDate') || params.storage === 'file') { params,
logger.info('Open file from storage', params.storage); (err, file) => {
const storage = Storage[params.storage];
const storageLoad = () => {
logger.info('Load from storage');
storage.load(params.path, params.opts, (err, data, stat) => {
if (err) { if (err) {
if (fileInfo && fileInfo.get('openDate')) {
logger.info('Open file from cache because of storage load error', err);
this.openFileFromCache(params, callback, fileInfo);
} else {
logger.info('Storage load error', err);
callback(err);
}
} else {
logger.info('Open file from content loaded from storage');
params.fileData = data;
params.rev = (stat && stat.rev) || null;
const needSaveToCache = storage.name !== 'file';
this.openFileWithData(params, callback, fileInfo, data, needSaveToCache);
}
});
};
const cacheRev = (fileInfo && fileInfo.get('rev')) || null;
if (cacheRev && storage.stat) {
logger.info('Stat file');
storage.stat(params.path, params.opts, (err, stat) => {
if (
fileInfo &&
storage.name !== 'file' &&
(err || (stat && stat.rev === cacheRev))
) {
logger.info( logger.info(
'Open file from cache because ' + (err ? 'stat error' : 'it is latest'), 'Error loading file from cache, trying to open from storage',
err err
); );
this.openFileFromCache(params, callback, fileInfo); this.openFileFromStorage(params, callback, fileInfo, logger, true);
} else if (stat) {
logger.info(
'Open file from storage (' + stat.rev + ', local ' + cacheRev + ')'
);
storageLoad();
} else { } else {
logger.info('Stat error', err); callback(err, file);
callback(err);
} }
}); },
} else { fileInfo
storageLoad(); );
} } else if (!fileInfo || !fileInfo.get('openDate') || params.storage === 'file') {
this.openFileFromStorage(params, callback, fileInfo, logger);
} else { } else {
logger.info('Open file from cache, will sync after load', params.storage); logger.info('Open file from cache, will sync after load', params.storage);
this.openFileFromCache( this.openFileFromCache(
@ -527,8 +496,14 @@ const AppModel = Backbone.Model.extend({
if (!err && file) { if (!err && file) {
logger.info('Sync just opened file'); logger.info('Sync just opened file');
_.defer(() => this.syncFile(file)); _.defer(() => this.syncFile(file));
callback(err);
} else {
logger.info(
'Error loading file from cache, trying to open from storage',
err
);
this.openFileFromStorage(params, callback, fileInfo, logger, true);
} }
callback(err);
}, },
fileInfo fileInfo
); );
@ -549,6 +524,59 @@ const AppModel = Backbone.Model.extend({
}); });
}, },
openFileFromStorage(params, callback, fileInfo, logger, noCache) {
logger.info('Open file from storage', params.storage);
const storage = Storage[params.storage];
const storageLoad = () => {
logger.info('Load from storage');
storage.load(params.path, params.opts, (err, data, stat) => {
if (err) {
if (fileInfo && fileInfo.get('openDate')) {
logger.info('Open file from cache because of storage load error', err);
this.openFileFromCache(params, callback, fileInfo);
} else {
logger.info('Storage load error', err);
callback(err);
}
} else {
logger.info('Open file from content loaded from storage');
params.fileData = data;
params.rev = (stat && stat.rev) || null;
const needSaveToCache = storage.name !== 'file';
this.openFileWithData(params, callback, fileInfo, data, needSaveToCache);
}
});
};
const cacheRev = (fileInfo && fileInfo.get('rev')) || null;
if (cacheRev && storage.stat) {
logger.info('Stat file');
storage.stat(params.path, params.opts, (err, stat) => {
if (
!noCache &&
fileInfo &&
storage.name !== 'file' &&
(err || (stat && stat.rev === cacheRev))
) {
logger.info(
'Open file from cache because ' + (err ? 'stat error' : 'it is latest'),
err
);
this.openFileFromCache(params, callback, fileInfo);
} else if (stat) {
logger.info(
'Open file from storage (' + stat.rev + ', local ' + cacheRev + ')'
);
storageLoad();
} else {
logger.info('Stat error', err);
callback(err);
}
});
} else {
storageLoad();
}
},
openFileWithData(params, callback, fileInfo, data, updateCacheOnSuccess) { openFileWithData(params, callback, fileInfo, data, updateCacheOnSuccess) {
const logger = new Logger('open', params.name); const logger = new Logger('open', params.name);
let needLoadKeyFile = false; let needLoadKeyFile = false;

View File

@ -14,6 +14,7 @@ Release notes
`-` fix multi-line fields display in history `-` fix multi-line fields display in history
`-` fix #554: checking active window id during auto-type `-` fix #554: checking active window id during auto-type
`-` fix plugin gallery layout on mobile `-` fix plugin gallery layout on mobile
`-` fix #1141: opening file from storage if cache is not available
##### v1.10.0 (2019-09-09) ##### v1.10.0 (2019-09-09)
`+` macOS Dark theme `+` macOS Dark theme