public int AddToOutQueue(DbSaveableEntity saveableEntity) { var asString = saveableEntity.getJson(); var outEntity = new OutEntity() { Id = saveableEntity.Id.Value, DataBlob = asString }; var res = new OutDb().DB.InsertOrReplace(outEntity); return(res); }
public async Task <int> doServerSync(Action <string, ToastLength> makeToast) { makeToast = (string a, ToastLength b) => { }; //var recs = GetRecordsToSync(); //if (recs.Count == 0) //{ // makeToast("No unsynced records", ToastLength.Short); // return 0; //} var hasConnection = await checkConnection(); if (!hasConnection) { isRunning = 0; makeToast?.Invoke("No connection detected", ToastLength.Long); return(0); } makeToast("Connected tested", ToastLength.Short); var recs = new List <OutEntity>(); //await GetCloudEntities1("appusers"); return(recs.Count); var cloudDb = new OutDb().DB; var recIndex = recs.Count - 1; while (recIndex >= 0 && hasConnection) { var outEntity = recs[recIndex]; var ppdataset = DbSaveableEntity.fromJson <GeneralEntityDataset>( new KindItem(outEntity.DataBlob)); var saveable = new DbSaveableEntity(ppdataset) { kindName = new KindName(ppdataset.FormName) }; var saved = false; for (int i = 0; i < 4; i++) { try { await Save(saveable); //we remove this key from the database saved = true; } catch (Google.GoogleApiException gex) { //todo: mark this record as bad to prevent it blocking for life //cloudDb.InsertOrReplace(new OutEntityUnsynced().load(outEntity)); //cloudDb.Delete<OutEntity>(saveable.Id.Value); //break; } catch (System.Net.WebException wex) { //perhaps lost connection //we alllow it to spin for now } catch (Exception ex) { //unknown exception } finally { } if (saved) { try { //we delete the record from downloads db //var deleted = cloudDb.Delete<OutEntity>(saveable.Id.Value); } catch { } break; } else { //lets add a 2 second delay in case it failed the first time await Task.Delay(TimeSpan.FromMilliseconds(2000)); } } recIndex--; hasConnection = await checkConnection(); } return(0); }
async Task <int> doServerSync(Action <string, ToastLength> makeToast) { makeToast("Getting records to sync", ToastLength.Short); var recs = GetRecordsToSync(); if (recs.Count == 0) { makeToast("No unsynced records", ToastLength.Short); return(0); } makeToast("Checking internet connection", ToastLength.Short); var hasConnection = await checkConnection(); if (!hasConnection) { isRunning = 0; makeToast("No connection detected", ToastLength.Long); //if (makeToast != null) //{ // makeToast("No connection detected", ToastLength.Long); //} return(0); } makeToast("Connection checked", ToastLength.Short); var cloudDb = new OutDb().DB; var totalCount = recs.Count; var recIndex = recs.Count - 1; while (recIndex >= 0 && hasConnection) { makeToast( string.Format("Processing {0} of {1}", totalCount - recIndex, totalCount) , ToastLength.Short); var outEntity = recs[recIndex]; var ppdataset = DbSaveableEntity.fromJson <GeneralEntityDataset>(new KindItem(outEntity.DataBlob)); var saveable = new DbSaveableEntity(ppdataset) { kindName = new KindName(ppdataset.FormName) }; var saved = false; var shouldCheckConnection = false; for (int i = 0; i < 4; i++) { makeToast( string.Format("Saving {0} of {1}" + (i == 0 ? "" : " (Attempt {2} of {3})"), totalCount - recIndex, totalCount, i + 1, 4) , ToastLength.Short); try { await Save(saveable); //we remove this key from the database saved = true; } catch (Google.GoogleApiException gex) { makeToast("Not saved - Google Api Exception", ToastLength.Short); //todo: mark this record as bad to prevent it blocking for life //cloudDb.InsertOrReplace(new OutEntityUnsynced().load(outEntity)); //cloudDb.Delete<OutEntity>(saveable.Id.Value); //break; } catch (System.Net.WebException wex) { makeToast("Not saved - Web Exception", ToastLength.Short); //perhaps lost connection //we alllow it to spin for now } catch (Exception ex) { makeToast("Not saved - Other Exception", ToastLength.Short); //unknown exception } finally { } if (saved) { try { var deleted = cloudDb.Delete <OutEntity>(saveable.Id.Value); } catch { } break; } else { //lets add a 2 second delay in case it failed the first time if (i < 3) { makeToast("Not saved. Awaiting for 2 secs", ToastLength.Short); await Task.Delay(TimeSpan.FromMilliseconds(2000)); } else { //we check the connection shouldCheckConnection = true; } } } recIndex--; if (recIndex >= 0 && shouldCheckConnection) { makeToast("Checking connection", ToastLength.Short); hasConnection = await checkConnection(); } } return(0); }