banshee r4859 - in trunk/banshee: . src/Core/Banshee.Services/Banshee.Collection.Database src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp src/Dap/Banshee.Dap/Banshee.Dap src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data



Author: gburt
Date: Fri Dec 19 17:51:52 2008
New Revision: 4859
URL: http://svn.gnome.org/viewvc/banshee?rev=4859&view=rev

Log:
2008-12-19  Gabriel Burt  <gabriel burt gmail com>

	* src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackListModel.cs:
	* src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs:
	* src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs:
	* src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs:
	* src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs:
	Fix crash that happened toward the end of syncing a DAP device, caused by
	not including in the FROM clause all the tables needed for the WHERE
	conditions of podcast-related playlists (BGO #558662)


Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
   trunk/banshee/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs
   trunk/banshee/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs
   trunk/banshee/src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs
   trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackListModel.cs

Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs	(original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.Collection.Database/DatabaseTrackListModel.cs	Fri Dec 19 17:51:52 2008
@@ -64,7 +64,7 @@
         private bool forced_sort_query;
         
         private string reload_fragment;
-        private string join_table, join_fragment, join_primary_key, join_column, condition;
+        private string join_table, join_fragment, join_primary_key, join_column, condition, condition_from;
 
         private string query_fragment;
         private string user_query;
@@ -188,8 +188,8 @@
         public string UnfilteredQuery {
             get {
                 return unfiltered_query ?? (unfiltered_query = String.Format (
-                    "FROM {0}{1} WHERE {2} {3}",
-                    From, JoinFragment,
+                    "FROM {0} WHERE {1} {2}",
+                    FromFragment,
                     String.IsNullOrEmpty (provider.Where) ? "1=1" : provider.Where,
                     ConditionFragment
                 ));
@@ -200,7 +200,12 @@
         protected string From {
             get { return from ?? provider.From; }
             set { from = value; }
-        }     
+        }
+
+        private string from_fragment;
+        public string FromFragment {
+            get { return from_fragment ?? (from_fragment = String.Format ("{0}{1}", From, JoinFragment)); }
+        }
 
         public virtual void UpdateUnfilteredAggregates ()
         {
@@ -426,11 +431,20 @@
             get { return join_column; }
             set { join_column = value; }
         }
-        
+
         public void AddCondition (string part)
         {
+            AddCondition (null, part);
+        }
+        
+        public void AddCondition (string tables, string part)
+        {
             if (!String.IsNullOrEmpty (part)) {
                 condition = condition == null ? part : String.Format ("{0} AND {1}", condition, part);
+
+                if (!String.IsNullOrEmpty (tables)) {
+                    condition_from = condition_from == null ? tables : String.Format ("{0}, {1}", condition_from, tables);
+                }
             }
         }
         
@@ -438,6 +452,25 @@
             get { return condition; }
         }
 
+        private string condition_from_fragment;
+        public string ConditionFromFragment {
+            get {
+                if (condition_from_fragment == null) {
+                    if (JoinFragment == null) {
+                        condition_from_fragment = condition_from;
+                    } else {
+                        if (condition_from == null) {
+                            condition_from = "CoreTracks";
+                        }
+
+                        condition_from_fragment = String.Format ("{0}{1}", condition_from, JoinFragment);
+                    }
+                }
+
+                return condition_from_fragment;
+            }
+        }
+
         public string ConditionFragment {
             get { return PrefixCondition ("AND"); }
         }

Modified: trunk/banshee/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs
==============================================================================
--- trunk/banshee/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs	(original)
+++ trunk/banshee/src/Dap/Banshee.Dap.Ipod/Banshee.Dap.Ipod/IpodSource.cs	Fri Dec 19 17:51:52 2008
@@ -593,8 +593,8 @@
                     if (from != null && from.Count > 0) {
                         IPod.Playlist playlist = ipod_device.TrackDatabase.CreatePlaylist (from.Name);
                         foreach (int track_id in ServiceManager.DbConnection.QueryEnumerable<int> (String.Format (
-                            "SELECT CoreTracks.TrackID FROM CoreTracks{0} WHERE {1}",
-                            from.DatabaseTrackModel.JoinFragment, from.DatabaseTrackModel.Condition)))
+                            "SELECT CoreTracks.TrackID FROM {0} WHERE {1}",
+                            from.DatabaseTrackModel.ConditionFromFragment, from.DatabaseTrackModel.Condition)))
                         {
                             playlist.AddTrack (tracks_map[track_id].IpodTrack);
                         }

Modified: trunk/banshee/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs
==============================================================================
--- trunk/banshee/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs	(original)
+++ trunk/banshee/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs	Fri Dec 19 17:51:52 2008
@@ -228,8 +228,8 @@
                     if (from != null && from.Count > 0) {
                         MTP.Playlist playlist = new MTP.Playlist (mtp_device, from.Name);
                         foreach (int track_id in ServiceManager.DbConnection.QueryEnumerable<int> (String.Format (
-                            "SELECT CoreTracks.ExternalID FROM CoreTracks{0} WHERE {1}",
-                            from.DatabaseTrackModel.JoinFragment, from.DatabaseTrackModel.Condition)))
+                            "SELECT CoreTracks.ExternalID FROM {0} WHERE {1}",
+                            from.DatabaseTrackModel.ConditionFromFragment, from.DatabaseTrackModel.Condition)))
                         {
                             playlist.AddTrack (track_id);
                         }

Modified: trunk/banshee/src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs
==============================================================================
--- trunk/banshee/src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs	(original)
+++ trunk/banshee/src/Dap/Banshee.Dap/Banshee.Dap/DapLibrarySync.cs	Fri Dec 19 17:51:52 2008
@@ -219,9 +219,9 @@
                         ServiceManager.DbConnection.Execute (
                             String.Format (
                                 @"INSERT INTO CorePlaylistEntries (PlaylistID, TrackID)
-                                    SELECT ?, TrackID FROM CoreTracks WHERE PrimarySourceID = ? AND MetadataHash IN (
-                                        SELECT MetadataHash FROM CoreTracks{0} WHERE {1})",
-                                from.DatabaseTrackModel.JoinFragment, from.DatabaseTrackModel.Condition),
+                                    SELECT ?, TrackID FROM CoreTracks WHERE PrimarySourceID = ? AND MetadataHash IN 
+                                        (SELECT MetadataHash FROM {0} WHERE {1})",
+                                from.DatabaseTrackModel.ConditionFromFragment, from.DatabaseTrackModel.Condition),
                             to.DbId, sync.Dap.DbId
                         );
                         to.UpdateCounts ();

Modified: trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackListModel.cs
==============================================================================
--- trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackListModel.cs	(original)
+++ trunk/banshee/src/Extensions/Banshee.Podcasting/Banshee.Podcasting.Data/PodcastTrackListModel.cs	Fri Dec 19 17:51:52 2008
@@ -59,10 +59,11 @@
         public PodcastTrackListModel (BansheeDbConnection conn, IDatabaseTrackModelProvider provider, DatabaseSource source) : base (conn, provider, source)
         {
             From = String.Format ("{0}, {1}, {2}, {3}", provider.From, Feed.Provider.TableName, FeedItem.Provider.TableName, FeedEnclosure.Provider.TableName);
-            int podcast_dbid = (source as PodcastSource ?? source.Parent as PodcastSource).DbId;
-            AddCondition (String.Format (
+
+            int podcast_library_dbid = (source as PodcastSource ?? source.Parent as PodcastSource).DbId;
+            AddCondition (From, String.Format (
                 "CoreTracks.PrimarySourceID = {3} AND {0}.FeedID = {1}.FeedID AND CoreTracks.ExternalID = {1}.ItemID AND {1}.ItemID = {2}.ItemID",
-                Feed.Provider.TableName, FeedItem.Provider.TableName, FeedEnclosure.Provider.TableName, podcast_dbid
+                Feed.Provider.TableName, FeedItem.Provider.TableName, FeedEnclosure.Provider.TableName, podcast_library_dbid
             ));
         }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]