diff --git a/Emby.Server.Implementations/Data/SqliteFileOrganizationRepository.cs b/Emby.Server.Implementations/Data/SqliteFileOrganizationRepository.cs index efc0ee2ed0..2d1aabf5fe 100644 --- a/Emby.Server.Implementations/Data/SqliteFileOrganizationRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteFileOrganizationRepository.cs @@ -59,28 +59,34 @@ namespace Emby.Server.Implementations.Data using (var connection = CreateConnection()) { - connection.RunInTransaction(db => + using (WriteLock.Write()) { - var paramList = new List(); - var commandText = "replace into FileOrganizerResults (ResultId, OriginalPath, TargetPath, FileLength, OrganizationDate, Status, OrganizationType, StatusMessage, ExtractedName, ExtractedYear, ExtractedSeasonNumber, ExtractedEpisodeNumber, ExtractedEndingEpisodeNumber, DuplicatePaths) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + connection.RunInTransaction(db => + { + var commandText = "replace into FileOrganizerResults (ResultId, OriginalPath, TargetPath, FileLength, OrganizationDate, Status, OrganizationType, StatusMessage, ExtractedName, ExtractedYear, ExtractedSeasonNumber, ExtractedEpisodeNumber, ExtractedEndingEpisodeNumber, DuplicatePaths) values (@ResultId, @OriginalPath, @TargetPath, @FileLength, @OrganizationDate, @Status, @OrganizationType, @StatusMessage, @ExtractedName, @ExtractedYear, @ExtractedSeasonNumber, @ExtractedEpisodeNumber, @ExtractedEndingEpisodeNumber, @DuplicatePaths)"; - paramList.Add(result.Id.ToGuidParamValue()); - paramList.Add(result.OriginalPath); - paramList.Add(result.TargetPath); - paramList.Add(result.FileSize); - paramList.Add(result.Date.ToDateTimeParamValue()); - paramList.Add(result.Status.ToString()); - paramList.Add(result.Type.ToString()); - paramList.Add(result.StatusMessage); - paramList.Add(result.ExtractedName); - paramList.Add(result.ExtractedSeasonNumber); - paramList.Add(result.ExtractedEpisodeNumber); - paramList.Add(result.ExtractedEndingEpisodeNumber); - paramList.Add(string.Join("|", result.DuplicatePaths.ToArray())); + using (var statement = db.PrepareStatement(commandText)) + { + statement.TryBind("@ResultId", result.Id.ToGuidParamValue()); + statement.TryBind("@OriginalPath", result.OriginalPath); + statement.TryBind("@TargetPath", result.TargetPath); + statement.TryBind("@FileLength", result.FileSize); + statement.TryBind("@OrganizationDate", result.Date.ToDateTimeParamValue()); + statement.TryBind("@Status", result.Status.ToString()); + statement.TryBind("@OrganizationType", result.Type.ToString()); + statement.TryBind("@StatusMessage", result.StatusMessage); + statement.TryBind("@ExtractedName", result.ExtractedName); + statement.TryBind("@ExtractedYear", result.ExtractedYear); + statement.TryBind("@ExtractedSeasonNumber", result.ExtractedSeasonNumber); + statement.TryBind("@ExtractedEpisodeNumber", result.ExtractedEpisodeNumber); + statement.TryBind("@ExtractedEndingEpisodeNumber", result.ExtractedEndingEpisodeNumber); + statement.TryBind("@DuplicatePaths", string.Join("|", result.DuplicatePaths.ToArray())); - db.Execute(commandText, paramList.ToArray()); - }); + statement.MoveNext(); + } + }); + } } } @@ -93,15 +99,17 @@ namespace Emby.Server.Implementations.Data using (var connection = CreateConnection()) { - connection.RunInTransaction(db => + using (WriteLock.Write()) { - var paramList = new List(); - var commandText = "delete from FileOrganizerResults where ResultId = ?"; - - paramList.Add(id.ToGuidParamValue()); - - db.Execute(commandText, paramList.ToArray()); - }); + connection.RunInTransaction(db => + { + using (var statement = db.PrepareStatement("delete from FileOrganizerResults where ResultId = @ResultId")) + { + statement.TryBind("@ResultId", id.ToGuidParamValue()); + statement.MoveNext(); + } + }); + } } } @@ -109,12 +117,15 @@ namespace Emby.Server.Implementations.Data { using (var connection = CreateConnection()) { - connection.RunInTransaction(db => + using (WriteLock.Write()) { - var commandText = "delete from FileOrganizerResults"; + connection.RunInTransaction(db => + { + var commandText = "delete from FileOrganizerResults"; - db.Execute(commandText); - }); + db.Execute(commandText); + }); + } } } @@ -127,34 +138,45 @@ namespace Emby.Server.Implementations.Data using (var connection = CreateConnection(true)) { - var commandText = "SELECT ResultId, OriginalPath, TargetPath, FileLength, OrganizationDate, Status, OrganizationType, StatusMessage, ExtractedName, ExtractedYear, ExtractedSeasonNumber, ExtractedEpisodeNumber, ExtractedEndingEpisodeNumber, DuplicatePaths from FileOrganizerResults"; - - if (query.StartIndex.HasValue && query.StartIndex.Value > 0) + using (WriteLock.Read()) { - commandText += string.Format(" WHERE ResultId NOT IN (SELECT ResultId FROM FileOrganizerResults ORDER BY OrganizationDate desc LIMIT {0})", - query.StartIndex.Value.ToString(_usCulture)); + var commandText = "SELECT ResultId, OriginalPath, TargetPath, FileLength, OrganizationDate, Status, OrganizationType, StatusMessage, ExtractedName, ExtractedYear, ExtractedSeasonNumber, ExtractedEpisodeNumber, ExtractedEndingEpisodeNumber, DuplicatePaths from FileOrganizerResults"; + + if (query.StartIndex.HasValue && query.StartIndex.Value > 0) + { + commandText += string.Format(" WHERE ResultId NOT IN (SELECT ResultId FROM FileOrganizerResults ORDER BY OrganizationDate desc LIMIT {0})", + query.StartIndex.Value.ToString(_usCulture)); + } + + commandText += " ORDER BY OrganizationDate desc"; + + if (query.Limit.HasValue) + { + commandText += " LIMIT " + query.Limit.Value.ToString(_usCulture); + } + + var list = new List(); + + using (var statement = connection.PrepareStatement(commandText)) + { + foreach (var row in statement.ExecuteQuery()) + { + list.Add(GetResult(row)); + } + } + + int count; + using (var statement = connection.PrepareStatement("select count (ResultId) from FileOrganizerResults")) + { + count = statement.ExecuteQuery().SelectScalarInt().First(); + } + + return new QueryResult() + { + Items = list.ToArray(), + TotalRecordCount = count + }; } - - commandText += " ORDER BY OrganizationDate desc"; - - if (query.Limit.HasValue) - { - commandText += " LIMIT " + query.Limit.Value.ToString(_usCulture); - } - - var list = new List(); - var count = connection.Query("select count (ResultId) from FileOrganizerResults").SelectScalarInt().First(); - - foreach (var row in connection.Query(commandText)) - { - list.Add(GetResult(row)); - } - - return new QueryResult() - { - Items = list.ToArray(), - TotalRecordCount = count - }; } } @@ -167,16 +189,21 @@ namespace Emby.Server.Implementations.Data using (var connection = CreateConnection(true)) { - var paramList = new List(); - - paramList.Add(id.ToGuidParamValue()); - - foreach (var row in connection.Query("select ResultId, OriginalPath, TargetPath, FileLength, OrganizationDate, Status, OrganizationType, StatusMessage, ExtractedName, ExtractedYear, ExtractedSeasonNumber, ExtractedEpisodeNumber, ExtractedEndingEpisodeNumber, DuplicatePaths from FileOrganizerResults where ResultId=?", paramList.ToArray())) + using (WriteLock.Read()) { - return GetResult(row); - } + using (var statement = connection.PrepareStatement("select ResultId, OriginalPath, TargetPath, FileLength, OrganizationDate, Status, OrganizationType, StatusMessage, ExtractedName, ExtractedYear, ExtractedSeasonNumber, ExtractedEpisodeNumber, ExtractedEndingEpisodeNumber, DuplicatePaths from FileOrganizerResults where ResultId=@ResultId")) + { + statement.TryBind("@ResultId", id.ToGuidParamValue()); + statement.MoveNext(); - return null; + foreach (var row in statement.ExecuteQuery()) + { + return GetResult(row); + } + } + + return null; + } } } diff --git a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs index 9f7cce13b5..feeb212f16 100644 --- a/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs +++ b/Emby.Server.Implementations/Data/SqliteUserDataRepository.cs @@ -159,8 +159,8 @@ namespace Emby.Server.Implementations.Data { using (var statement = db.PrepareStatement("replace into userdata (key, userId, rating,played,playCount,isFavorite,playbackPositionTicks,lastPlayedDate,AudioStreamIndex,SubtitleStreamIndex) values (@key, @userId, @rating,@played,@playCount,@isFavorite,@playbackPositionTicks,@lastPlayedDate,@AudioStreamIndex,@SubtitleStreamIndex)")) { - statement.TryBind("@UserId", userId.ToGuidParamValue()); - statement.TryBind("@Key", key); + statement.TryBind("@userId", userId.ToGuidParamValue()); + statement.TryBind("@key", key); if (userData.Rating.HasValue) { diff --git a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs index c930f2563f..d75b31f6ae 100644 --- a/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs +++ b/MediaBrowser.Controller/Entities/Audio/MusicGenre.cs @@ -31,6 +31,15 @@ namespace MediaBrowser.Controller.Entities.Audio get { return true; } } + [IgnoreDataMember] + public override bool SupportsAncestors + { + get + { + return false; + } + } + /// /// Returns the folder containing the item. /// If the item is a folder, it returns the folder itself diff --git a/MediaBrowser.Controller/Entities/GameGenre.cs b/MediaBrowser.Controller/Entities/GameGenre.cs index d62d3c8fd7..22a8675c5e 100644 --- a/MediaBrowser.Controller/Entities/GameGenre.cs +++ b/MediaBrowser.Controller/Entities/GameGenre.cs @@ -37,6 +37,15 @@ namespace MediaBrowser.Controller.Entities } } + [IgnoreDataMember] + public override bool SupportsAncestors + { + get + { + return false; + } + } + /// /// Gets a value indicating whether this instance is owned item. /// diff --git a/MediaBrowser.Controller/Entities/Genre.cs b/MediaBrowser.Controller/Entities/Genre.cs index 731391bc4c..da4ee352fa 100644 --- a/MediaBrowser.Controller/Entities/Genre.cs +++ b/MediaBrowser.Controller/Entities/Genre.cs @@ -40,6 +40,15 @@ namespace MediaBrowser.Controller.Entities } } + [IgnoreDataMember] + public override bool SupportsAncestors + { + get + { + return false; + } + } + public override bool IsSaveLocalMetadataEnabled() { return true; diff --git a/MediaBrowser.Controller/Entities/Studio.cs b/MediaBrowser.Controller/Entities/Studio.cs index 508eb1514d..ec623eedac 100644 --- a/MediaBrowser.Controller/Entities/Studio.cs +++ b/MediaBrowser.Controller/Entities/Studio.cs @@ -39,6 +39,15 @@ namespace MediaBrowser.Controller.Entities } } + [IgnoreDataMember] + public override bool SupportsAncestors + { + get + { + return false; + } + } + public override bool CanDelete() { return false; diff --git a/MediaBrowser.Controller/Entities/Year.cs b/MediaBrowser.Controller/Entities/Year.cs index ab904cbd83..75fb694353 100644 --- a/MediaBrowser.Controller/Entities/Year.cs +++ b/MediaBrowser.Controller/Entities/Year.cs @@ -33,6 +33,15 @@ namespace MediaBrowser.Controller.Entities } } + [IgnoreDataMember] + public override bool SupportsAncestors + { + get + { + return false; + } + } + public override bool CanDelete() { return false; diff --git a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj index 485bbf3a97..13d67ace5a 100644 --- a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj +++ b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj @@ -88,15 +88,16 @@ ..\packages\SQLitePCLRaw.core.1.1.1-pre20161109081005\lib\net45\SQLitePCLRaw.core.dll True + + ..\packages\SQLitePCLRaw.provider.sqlite3.net45.1.1.1-pre20161109081005\lib\net45\SQLitePCLRaw.provider.sqlite3.dll + True + ..\ThirdParty\MediaBrowser.IsoMounting.Linux\MediaBrowser.IsoMounting.Linux.dll - - ..\ThirdParty\SQLitePCLRaw.provider.sqlite3.net45\System.Data.SQLite.dll - @@ -222,6 +223,10 @@ PreserveNewest + + Designer + PreserveNewest + PreserveNewest Designer diff --git a/MediaBrowser.Server.Mono/Program.cs b/MediaBrowser.Server.Mono/Program.cs index 39a537e1e3..88951c0f6e 100644 --- a/MediaBrowser.Server.Mono/Program.cs +++ b/MediaBrowser.Server.Mono/Program.cs @@ -35,9 +35,11 @@ namespace MediaBrowser.Server.Mono public static void Main(string[] args) { - SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_sqlite3()); - var applicationPath = Assembly.GetEntryAssembly().Location; + var appFolderPath = Path.GetDirectoryName(applicationPath); + + TryCopySqliteConfigFile(appFolderPath); + SetSqliteProvider(); var options = new StartupOptions(Environment.GetCommandLineArgs()); @@ -68,6 +70,25 @@ namespace MediaBrowser.Server.Mono } } + private static void TryCopySqliteConfigFile(string appFolderPath) + { + try + { + File.Copy(Path.Combine(appFolderPath, "System.Data.SQLite.dll.config"), + Path.Combine(appFolderPath, "SQLitePCLRaw.provider.sqlite3.dll.config"), + true); + } + catch + { + + } + } + + private static void SetSqliteProvider() + { + SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_sqlite3()); + } + private static ServerApplicationPaths CreateApplicationPaths(string applicationPath, string programDataPath) { if (string.IsNullOrEmpty(programDataPath)) diff --git a/MediaBrowser.Server.Mono/packages.config b/MediaBrowser.Server.Mono/packages.config index 6e3fe428c1..e82ef0ed04 100644 --- a/MediaBrowser.Server.Mono/packages.config +++ b/MediaBrowser.Server.Mono/packages.config @@ -6,4 +6,5 @@ + \ No newline at end of file