catch sql crashes in sync service

This commit is contained in:
Kyle Spearrin 2017-03-11 12:26:10 -05:00
parent ac6e95c442
commit 82d4745da3
1 changed files with 70 additions and 70 deletions

View File

@ -73,36 +73,28 @@ namespace Bit.App.Services
return false; return false;
} }
try
{
switch(cipher.Result.Type) switch(cipher.Result.Type)
{ {
case Enums.CipherType.Folder: case Enums.CipherType.Folder:
var folderData = new FolderData(cipher.Result, _authService.UserId); var folderData = new FolderData(cipher.Result, _authService.UserId);
var existingLocalFolder = _folderRepository.GetByIdAsync(id); await _folderRepository.UpsertAsync(folderData).ConfigureAwait(false);
if(existingLocalFolder == null)
{
await _folderRepository.InsertAsync(folderData).ConfigureAwait(false);
}
else
{
await _folderRepository.UpdateAsync(folderData).ConfigureAwait(false);
}
break; break;
case Enums.CipherType.Login: case Enums.CipherType.Login:
var loginData = new LoginData(cipher.Result, _authService.UserId); var loginData = new LoginData(cipher.Result, _authService.UserId);
var existingLocalLogin = _loginRepository.GetByIdAsync(id); await _loginRepository.UpsertAsync(loginData).ConfigureAwait(false);
if(existingLocalLogin == null)
{
await _loginRepository.InsertAsync(loginData).ConfigureAwait(false);
}
else
{
await _loginRepository.UpdateAsync(loginData).ConfigureAwait(false);
}
break; break;
default: default:
SyncCompleted(false); SyncCompleted(false);
return false; return false;
} }
}
catch(SQLite.SQLiteException)
{
SyncCompleted(false);
return false;
}
SyncCompleted(true); SyncCompleted(true);
return true; return true;
@ -117,10 +109,18 @@ namespace Bit.App.Services
SyncStarted(); SyncStarted();
try
{
await _folderRepository.DeleteWithLoginUpdateAsync(id, revisionDate).ConfigureAwait(false); await _folderRepository.DeleteWithLoginUpdateAsync(id, revisionDate).ConfigureAwait(false);
SyncCompleted(true); SyncCompleted(true);
return true; return true;
} }
catch(SQLite.SQLiteException)
{
SyncCompleted(false);
return false;
}
}
public async Task<bool> SyncDeleteLoginAsync(string id) public async Task<bool> SyncDeleteLoginAsync(string id)
{ {
@ -131,10 +131,18 @@ namespace Bit.App.Services
SyncStarted(); SyncStarted();
try
{
await _loginRepository.DeleteAsync(id).ConfigureAwait(false); await _loginRepository.DeleteAsync(id).ConfigureAwait(false);
SyncCompleted(true); SyncCompleted(true);
return true; return true;
} }
catch(SQLite.SQLiteException)
{
SyncCompleted(false);
return false;
}
}
public async Task<bool> FullSyncAsync(TimeSpan syncThreshold, bool forceSync = false) public async Task<bool> FullSyncAsync(TimeSpan syncThreshold, bool forceSync = false)
{ {
@ -188,8 +196,8 @@ namespace Bit.App.Services
var logins = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Login).ToDictionary(s => s.Id); var logins = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Login).ToDictionary(s => s.Id);
var folders = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Folder).ToDictionary(f => f.Id); var folders = ciphers.Result.Data.Where(c => c.Type == Enums.CipherType.Folder).ToDictionary(f => f.Id);
var loginTask = SyncLoginsAsync(logins, true); var loginTask = SyncLoginsAsync(logins);
var folderTask = SyncFoldersAsync(folders, true); var folderTask = SyncFoldersAsync(folders);
var domainsTask = SyncDomainsAsync(domains.Result); var domainsTask = SyncDomainsAsync(domains.Result);
await Task.WhenAll(loginTask, folderTask, domainsTask).ConfigureAwait(false); await Task.WhenAll(loginTask, folderTask, domainsTask).ConfigureAwait(false);
@ -228,7 +236,7 @@ namespace Bit.App.Services
return false; return false;
} }
private async Task SyncFoldersAsync(IDictionary<string, CipherResponse> serverFolders, bool deleteMissing) private async Task SyncFoldersAsync(IDictionary<string, CipherResponse> serverFolders)
{ {
if(!_authService.IsAuthenticated) if(!_authService.IsAuthenticated)
{ {
@ -245,31 +253,25 @@ namespace Bit.App.Services
return; return;
} }
var existingLocalFolder = localFolders.ContainsKey(serverFolder.Key) ? localFolders[serverFolder.Key] : null; try
if(existingLocalFolder == null)
{ {
var data = new FolderData(serverFolder.Value, _authService.UserId); var data = new FolderData(serverFolder.Value, _authService.UserId);
await _folderRepository.InsertAsync(data).ConfigureAwait(false); await _folderRepository.UpsertAsync(data).ConfigureAwait(false);
} }
else if(existingLocalFolder.RevisionDateTime != serverFolder.Value.RevisionDate) catch(SQLite.SQLiteException) { }
{
var data = new FolderData(serverFolder.Value, _authService.UserId);
await _folderRepository.UpdateAsync(data).ConfigureAwait(false);
}
}
if(!deleteMissing)
{
return;
} }
foreach(var folder in localFolders.Where(localFolder => !serverFolders.ContainsKey(localFolder.Key))) foreach(var folder in localFolders.Where(localFolder => !serverFolders.ContainsKey(localFolder.Key)))
{
try
{ {
await _folderRepository.DeleteAsync(folder.Value.Id).ConfigureAwait(false); await _folderRepository.DeleteAsync(folder.Value.Id).ConfigureAwait(false);
} }
catch(SQLite.SQLiteException) { }
}
} }
private async Task SyncLoginsAsync(IDictionary<string, CipherResponse> serverLogins, bool deleteMissing) private async Task SyncLoginsAsync(IDictionary<string, CipherResponse> serverLogins)
{ {
if(!_authService.IsAuthenticated) if(!_authService.IsAuthenticated)
{ {
@ -286,28 +288,22 @@ namespace Bit.App.Services
return; return;
} }
var existingLocalLogin = localLogins.ContainsKey(serverLogin.Key) ? localLogins[serverLogin.Key] : null; try
if(existingLocalLogin == null)
{ {
var data = new LoginData(serverLogin.Value, _authService.UserId); var data = new LoginData(serverLogin.Value, _authService.UserId);
await _loginRepository.InsertAsync(data).ConfigureAwait(false); await _loginRepository.UpsertAsync(data).ConfigureAwait(false);
} }
else if(existingLocalLogin.RevisionDateTime != serverLogin.Value.RevisionDate) catch(SQLite.SQLiteException) { }
{
var data = new LoginData(serverLogin.Value, _authService.UserId);
await _loginRepository.UpdateAsync(data).ConfigureAwait(false);
}
}
if(!deleteMissing)
{
return;
} }
foreach(var login in localLogins.Where(localLogin => !serverLogins.ContainsKey(localLogin.Key))) foreach(var login in localLogins.Where(localLogin => !serverLogins.ContainsKey(localLogin.Key)))
{
try
{ {
await _loginRepository.DeleteAsync(login.Value.Id).ConfigureAwait(false); await _loginRepository.DeleteAsync(login.Value.Id).ConfigureAwait(false);
} }
catch(SQLite.SQLiteException) { }
}
} }
private async Task SyncDomainsAsync(DomainsResponse serverDomains) private async Task SyncDomainsAsync(DomainsResponse serverDomains)
@ -323,12 +319,16 @@ namespace Bit.App.Services
eqDomains.AddRange(serverDomains.GlobalEquivalentDomains.Select(d => d.Domains)); eqDomains.AddRange(serverDomains.GlobalEquivalentDomains.Select(d => d.Domains));
} }
try
{
await _settingsRepository.UpsertAsync(new SettingsData await _settingsRepository.UpsertAsync(new SettingsData
{ {
Id = _authService.UserId, Id = _authService.UserId,
EquivalentDomains = JsonConvert.SerializeObject(eqDomains) EquivalentDomains = JsonConvert.SerializeObject(eqDomains)
}); });
} }
catch(SQLite.SQLiteException) { }
}
private void SyncStarted() private void SyncStarted()
{ {