コード例 #1
0
        private void MigrateLegacyIfNeeded()
        {
            if (DatabaseConfigurationClient.Client.Get <int> ("Podcast", "Version", 0) == 0)
            {
                if (ServiceManager.DbConnection.TableExists("Podcasts") &&
                    ServiceManager.DbConnection.Query <int> ("select count(*) from podcastsyndications") == 0)
                {
                    Hyena.Log.Information("Migrating Podcast Feeds and Items");
                    ServiceManager.DbConnection.Execute(@"
                        INSERT INTO PodcastSyndications (FeedID, Title, Url, Link,
                            Description, ImageUrl, LastBuildDate, AutoDownload, IsSubscribed)
                            SELECT
                                PodcastFeedID,
                                Title,
                                FeedUrl,
                                Link,
                                Description,
                                Image,
                                strftime(""%s"", LastUpdated),
                                SyncPreference,
                                1
                            FROM PodcastFeeds
                    ");

                    ServiceManager.DbConnection.Execute(@"
                        INSERT INTO PodcastItems (ItemID, FeedID, Title, Link, PubDate,
                            Description, Author, Active, Guid)
                            SELECT
                                PodcastID,
                                PodcastFeedID,
                                Title,
                                Link,
                                strftime(""%s"", PubDate),
                                Description,
                                Author,
                                Active,
                                Url
                            FROM Podcasts
                    ");

                    // Note: downloaded*3 is because the value was 0 or 1, but is now 0 or 3 (FeedDownloadStatus.None/Downloaded)
                    ServiceManager.DbConnection.Execute(@"
                        INSERT INTO PodcastEnclosures (ItemID, LocalPath, Url, MimeType, FileSize, DownloadStatus)
                            SELECT
                                PodcastID,
                                LocalPath,
                                Url,
                                MimeType,
                                Length,
                                Downloaded*3
                            FROM Podcasts
                    ");

                    // Finally, move podcast items from the Music Library to the Podcast source
                    int moved = 0;
                    foreach (FeedEnclosure enclosure in FeedEnclosure.Provider.FetchAllMatching("LocalPath IS NOT NULL AND LocalPath != ''"))
                    {
                        SafeUri uri      = new SafeUri(enclosure.LocalPath);
                        int     track_id = DatabaseTrackInfo.GetTrackIdForUri(uri, ServiceManager.SourceManager.MusicLibrary.DbId);

                        if (track_id > 0)
                        {
                            PodcastTrackInfo pi = new PodcastTrackInfo(DatabaseTrackInfo.Provider.FetchSingle(track_id));
                            pi.Item = enclosure.Item;
                            pi.Track.PrimarySourceId = source.DbId;
                            pi.SyncWithFeedItem();
                            pi.Track.Save(false);
                            moved++;
                        }
                    }

                    if (moved > 0)
                    {
                        ServiceManager.SourceManager.MusicLibrary.Reload();
                        source.Reload();
                    }

                    Hyena.Log.Information("Done Migrating Podcast Feeds and Items");
                }
                DatabaseConfigurationClient.Client.Set <int> ("Podcast", "Version", 1);
            }

            if (DatabaseConfigurationClient.Client.Get <int> ("Podcast", "Version", 0) < 3)
            {
                // We were using the Link as the fallback if the actual Guid was missing, but that was a poor choice
                // since it is not always unique.  We now use the title and pubdate combined.
                ServiceManager.DbConnection.Execute("UPDATE PodcastItems SET Guid = NULL");
                foreach (FeedItem item in FeedItem.Provider.FetchAll())
                {
                    item.Guid = null;
                    if (item.Feed == null || FeedItem.Exists(item.Feed.DbId, item.Guid))
                    {
                        item.Delete(false);
                    }
                    else
                    {
                        item.Save();
                    }
                }

                DatabaseConfigurationClient.Client.Set <int> ("Podcast", "Version", 3);
            }

            // Intentionally skpping 4 here because this needs to get run again for anybody who ran it
            // before it was fixed, but only once if you never ran it
            if (DatabaseConfigurationClient.Client.Get <int> ("Podcast", "Version", 0) < 5)
            {
                ReplaceNewlines("CoreTracks", "Title");
                ReplaceNewlines("CoreTracks", "TitleLowered");
                ReplaceNewlines("PodcastItems", "Title");
                ReplaceNewlines("PodcastItems", "Description");
                DatabaseConfigurationClient.Client.Set <int> ("Podcast", "Version", 5);
            }

            // Initialize the new StrippedDescription field
            if (DatabaseConfigurationClient.Client.Get <int> ("Podcast", "Version", 0) < 6)
            {
                foreach (FeedItem item in FeedItem.Provider.FetchAll())
                {
                    item.UpdateStrippedDescription();
                    item.Save();
                }
                DatabaseConfigurationClient.Client.Set <int> ("Podcast", "Version", 6);
            }
        }