/// <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();
        }
Esempio n. 2
0
        /// <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();
        }