mirror of https://github.com/keeweb/keeweb.git
fix #1141: opening file from storage if cache is not available
This commit is contained in:
parent
73635e2784
commit
e7d88cce58
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue