/// <summary> /// Applies the changes retrieved from the remote database. /// </summary> /// <param name="changes">The list of serialized TV show states.</param> public static void ApplyRemoteChanges(ShowInfoChangeList changes) { foreach (var change in changes.Changes) { var chg = change.Show.Split("\0".ToCharArray(), 4); var id = Database.GetShowID(chg[0], EnginesReverse[chg[1].ToInteger()], LanguagesReverse[chg[2].ToInteger()], chg[3]); if (string.IsNullOrWhiteSpace(id)) { if (change.Change == ShowInfoChange.ChangeType.AddShow || change.Change == ShowInfoChange.ChangeType.MarkEpisode || change.Change == ShowInfoChange.ChangeType.UnmarkEpisode) { Database.Execute("update tvshows set rowid = rowid + 1"); Database.Execute("insert into tvshows values (1, null, ?)", chg[0]); id = Database.GetShowID(chg[0]); Database.ShowData(id, "grabber", EnginesReverse[chg[1].ToInteger()]); Database.ShowData(id, change.Show[1] + ".id", chg[3]); Database.ShowData(id, change.Show[1] + ".lang", LanguagesReverse[chg[2].ToInteger()]); } else { continue; } } var sint = id.ToInteger() * 100000; switch (change.Change) { case ShowInfoChange.ChangeType.RemoveShow: Database.Execute("delete from tvshows where showid = ?", id); Database.Execute("delete from showdata where showid = ?", id); Database.Execute("delete from episodes where showid = ?", id); Database.Execute("delete from tracking where showid = ?", id); Database.Execute("update tvshows set rowid = rowid * -1"); var tr = Database.Connection.BeginTransaction(); var shows = Database.Query("select showid from tvshows order by rowid desc"); var i = 1; foreach (var show in shows) { Database.ExecuteOnTransaction(tr, "update tvshows set rowid = ? where showid = ?", i, show["showid"]); i++; } tr.Commit(); Database.Execute("vacuum;"); break; case ShowInfoChange.ChangeType.MarkEpisode: var tr2 = Database.Connection.BeginTransaction(); foreach (var ep in (JArray)change.Data) { if (Database.Query("select * from tracking where showid = ? and episodeid = ?", id, (int)ep + sint).Count == 0) { Database.ExecuteOnTransaction(tr2, "insert into tracking values (?, ?)", id, (int)ep + sint); } } tr2.Commit(); break; case ShowInfoChange.ChangeType.UnmarkEpisode: foreach (var ep in (JArray)change.Data) { Database.Execute("delete from tracking where showid = ? and episodeid = ?", id, (int)ep + sint); } break; case ShowInfoChange.ChangeType.ReorderList: // TODO break; } } Database.Setting("Last Sync", changes.LastSync.ToString()); Database.Execute("vacuum;"); MainWindow.Active.DataChanged(); }