public static void Migrate() { try { #if WINDOWS_PHONE FoodJournalDB db = new FoodJournalDB(false); #else FoodJournalDB db = new FoodJournalDB(true); #endif if (!db.DatabaseExists()) { return; } if (db.Table <FoodItemDO>().Count() == 0 && db.Table <EntryDO>().Count() == 0) { #if !WINDOWS_PHONE db.Close(); #endif Logging.SessionLog.RecordMilestone("Deleting Legacy FoodItem DB", ""); db.DeleteDatabase(); return; } #if !WINDOWS_PHONE if (System.IO.File.Exists(DatabaseFilePath)) { db.Close(); System.IO.File.Copy(DatabaseFilePath, DatabaseFilePath.Replace(".db3", ".bak")); db = new FoodJournalDB(true); } #endif DateTime start = DateTime.Now; int ExceptionCount = 0; Dictionary <int, int> itemmap = new Dictionary <int, int>(); Logging.SessionLog.RecordTraceValue("Database migration - item count", db.Table <FoodItemDO>().Count().ToString()); Logging.SessionLog.RecordTraceValue("Database migration - selection count", db.Table <EntryDO>().Count().ToString()); var AllItems = db.Table <FoodItemDO>().ToList(); var AllSelections = db.Table <EntryDO>().ToList(); List <FoodItemDO> ToDeleteItems = new List <FoodItemDO>(); List <EntryDO> ToDeleteSelections = new List <EntryDO>(); Dictionary <int, String> items = new Dictionary <int, string>(); List <DateTime> savedates = new List <DateTime>(); foreach (FoodItemDO item in AllItems) { try { items.Add(item.Id, item.TextDB); var NewItem = new FoodJournal.Model.FoodItem(item.TextDB, false); NewItem.Culture = item.Culture; NewItem.DescriptionDB = item.DescriptionDB; NewItem.LastAmountDB = item.LastAmountDB; NewItem.NutritionDB = item.NutritionDB; NewItem.ServingSizesDB = item.ServingSizesDB; NewItem.SourceID = item.SourceID; Cache.MergeItem(NewItem); ToDeleteItems.Add(item); } catch (Exception ex) { ExceptionCount++; LittleWatson.ReportException(ex); } } foreach (EntryDO entry in AllSelections) { try { var entryDate = DateTime.Parse(entry.Date); var NewSelection = new FoodJournal.Model.Entry(entryDate, entry.Period, items[entry.FoodItemId]); NewSelection.AmountScaleDB = entry.AmountScaleDB; NewSelection.AmountSelectedDB = entry.AmountSelectedDB; Cache.AddEntry(NewSelection); ToDeleteSelections.Add(entry); if (!savedates.Contains(entryDate)) { savedates.Add(entryDate); } } catch (Exception ex) { ExceptionCount++; LittleWatson.ReportException(ex); } } foreach (Period period in PeriodList.All) { foreach (DateTime date in savedates) { FoodJournalNoSQL.StartSaveDay(date, period); } } int i = 120; while (i-- > 0 && FoodJournalNoSQL.IsSaving()) { System.Threading.Thread.Sleep(500); } if (i == 0) { SessionLog.RecordMilestone("Upgrade failed in 1 minute", AllSelections.Count.ToString()); throw new Exception("Upgrade failed in 1 minute"); } foreach (EntryDO Selection in ToDeleteSelections) { try { #if WINDOWS_PHONE db.Table <EntryDO>().DeleteOnSubmit(Selection); db.SubmitChanges(); #else db.Delete <EntryDO>(Selection.Id); #endif } catch (Exception ex) { db = new FoodJournalDB(false); ExceptionCount++; LittleWatson.ReportException(ex); } } foreach (FoodItemDO Item in ToDeleteItems) { try { #if WINDOWS_PHONE db.Table <FoodItemDO>().DeleteOnSubmit(Item); db.SubmitChanges(); #else db.Delete <FoodItemDO>(Item.Id); #endif } catch (Exception ex) { db = new FoodJournalDB(false); ExceptionCount++; LittleWatson.ReportException(ex); } } Logging.SessionLog.RecordMilestone("Database migration - exception count", ExceptionCount.ToString()); Logging.SessionLog.RecordMilestone("Database migration - duration", string.Format("{0} s", DateTime.Now.Subtract(start).TotalSeconds)); } catch (Exception ex) { LittleWatson.ReportException(ex); } }
public static void Reset() { me = new FoodJournalDB(); }