aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations/Persistence/SqliteFileOrganizationRepository.cs
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2014-01-21 01:10:58 -0500
committerLuke Pulverenti <luke.pulverenti@gmail.com>2014-01-21 01:10:58 -0500
commit123528327974d9291f5868bb87a0d63437fa1ae5 (patch)
treec201611062191638b47c0a60ed655acce20d1871 /MediaBrowser.Server.Implementations/Persistence/SqliteFileOrganizationRepository.cs
parent92c76de2ba01608e37a3f7ba311d2711b2230dc8 (diff)
#680 - added auto organize page
Diffstat (limited to 'MediaBrowser.Server.Implementations/Persistence/SqliteFileOrganizationRepository.cs')
-rw-r--r--MediaBrowser.Server.Implementations/Persistence/SqliteFileOrganizationRepository.cs259
1 files changed, 256 insertions, 3 deletions
diff --git a/MediaBrowser.Server.Implementations/Persistence/SqliteFileOrganizationRepository.cs b/MediaBrowser.Server.Implementations/Persistence/SqliteFileOrganizationRepository.cs
index e397cc280..75de13194 100644
--- a/MediaBrowser.Server.Implementations/Persistence/SqliteFileOrganizationRepository.cs
+++ b/MediaBrowser.Server.Implementations/Persistence/SqliteFileOrganizationRepository.cs
@@ -4,7 +4,9 @@ using MediaBrowser.Model.FileOrganization;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Querying;
using System;
+using System.Collections.Generic;
using System.Data;
+using System.Globalization;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
@@ -21,6 +23,11 @@ namespace MediaBrowser.Server.Implementations.Persistence
private SqliteShrinkMemoryTimer _shrinkMemoryTimer;
private readonly IServerApplicationPaths _appPaths;
+ private readonly CultureInfo _usCulture = new CultureInfo("en-US");
+
+ private IDbCommand _saveResultCommand;
+ private IDbCommand _deleteResultCommand;
+
public SqliteFileOrganizationRepository(ILogManager logManager, IServerApplicationPaths appPaths)
{
_appPaths = appPaths;
@@ -40,6 +47,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
string[] queries = {
+ "create table if not exists organizationresults (ResultId GUID PRIMARY KEY, OriginalPath TEXT, TargetPath TEXT, OrganizationDate datetime, Status TEXT, OrganizationType TEXT, StatusMessage TEXT, ExtractedName TEXT, ExtractedYear int null)",
+ "create index if not exists idx_organizationresults on organizationresults(ResultId)",
+
//pragmas
"pragma temp_store = memory",
@@ -55,16 +65,259 @@ namespace MediaBrowser.Server.Implementations.Persistence
private void PrepareStatements()
{
+ _saveResultCommand = _connection.CreateCommand();
+ _saveResultCommand.CommandText = "replace into organizationresults (ResultId, OriginalPath, TargetPath, OrganizationDate, Status, OrganizationType, StatusMessage, ExtractedName, ExtractedYear) values (@ResultId, @OriginalPath, @TargetPath, @OrganizationDate, @Status, @OrganizationType, @StatusMessage, @ExtractedName, @ExtractedYear)";
+
+ _saveResultCommand.Parameters.Add(_saveResultCommand, "@ResultId");
+ _saveResultCommand.Parameters.Add(_saveResultCommand, "@OriginalPath");
+ _saveResultCommand.Parameters.Add(_saveResultCommand, "@TargetPath");
+ _saveResultCommand.Parameters.Add(_saveResultCommand, "@OrganizationDate");
+ _saveResultCommand.Parameters.Add(_saveResultCommand, "@Status");
+ _saveResultCommand.Parameters.Add(_saveResultCommand, "@OrganizationType");
+ _saveResultCommand.Parameters.Add(_saveResultCommand, "@StatusMessage");
+ _saveResultCommand.Parameters.Add(_saveResultCommand, "@ExtractedName");
+ _saveResultCommand.Parameters.Add(_saveResultCommand, "@ExtractedYear");
+
+ _deleteResultCommand = _connection.CreateCommand();
+ _deleteResultCommand.CommandText = "delete from organizationresults where ResultId = @ResultId";
+
+ _deleteResultCommand.Parameters.Add(_saveResultCommand, "@ResultId");
}
- public Task SaveResult(FileOrganizationResult result, CancellationToken cancellationToken)
+ public async Task SaveResult(FileOrganizationResult result, CancellationToken cancellationToken)
{
- return Task.FromResult(true);
+ if (result == null)
+ {
+ throw new ArgumentNullException("result");
+ }
+
+ cancellationToken.ThrowIfCancellationRequested();
+
+ await _writeLock.WaitAsync(cancellationToken).ConfigureAwait(false);
+
+ IDbTransaction transaction = null;
+
+ try
+ {
+ transaction = _connection.BeginTransaction();
+
+ _saveResultCommand.GetParameter(0).Value = new Guid(result.Id);
+ _saveResultCommand.GetParameter(1).Value = result.OriginalPath;
+ _saveResultCommand.GetParameter(2).Value = result.TargetPath;
+ _saveResultCommand.GetParameter(3).Value = result.Date;
+ _saveResultCommand.GetParameter(4).Value = result.Status.ToString();
+ _saveResultCommand.GetParameter(5).Value = result.Type.ToString();
+ _saveResultCommand.GetParameter(6).Value = result.StatusMessage;
+ _saveResultCommand.GetParameter(7).Value = result.ExtractedName;
+ _saveResultCommand.GetParameter(8).Value = result.ExtractedYear;
+
+ _saveResultCommand.Transaction = transaction;
+
+ _saveResultCommand.ExecuteNonQuery();
+
+ transaction.Commit();
+ }
+ catch (OperationCanceledException)
+ {
+ if (transaction != null)
+ {
+ transaction.Rollback();
+ }
+
+ throw;
+ }
+ catch (Exception e)
+ {
+ _logger.ErrorException("Failed to save FileOrganizationResult:", e);
+
+ if (transaction != null)
+ {
+ transaction.Rollback();
+ }
+
+ throw;
+ }
+ finally
+ {
+ if (transaction != null)
+ {
+ transaction.Dispose();
+ }
+
+ _writeLock.Release();
+ }
+ }
+
+ public async Task Delete(string id)
+ {
+ if (string.IsNullOrEmpty(id))
+ {
+ throw new ArgumentNullException("id");
+ }
+
+ await _writeLock.WaitAsync().ConfigureAwait(false);
+
+ IDbTransaction transaction = null;
+
+ try
+ {
+ transaction = _connection.BeginTransaction();
+
+ _deleteResultCommand.GetParameter(0).Value = new Guid(id);
+
+ _deleteResultCommand.Transaction = transaction;
+
+ _deleteResultCommand.ExecuteNonQuery();
+
+ transaction.Commit();
+ }
+ catch (OperationCanceledException)
+ {
+ if (transaction != null)
+ {
+ transaction.Rollback();
+ }
+
+ throw;
+ }
+ catch (Exception e)
+ {
+ _logger.ErrorException("Failed to save FileOrganizationResult:", e);
+
+ if (transaction != null)
+ {
+ transaction.Rollback();
+ }
+
+ throw;
+ }
+ finally
+ {
+ if (transaction != null)
+ {
+ transaction.Dispose();
+ }
+
+ _writeLock.Release();
+ }
}
public QueryResult<FileOrganizationResult> GetResults(FileOrganizationResultQuery query)
{
- return new QueryResult<FileOrganizationResult>();
+ if (query == null)
+ {
+ throw new ArgumentNullException("query");
+ }
+
+ using (var cmd = _connection.CreateCommand())
+ {
+ cmd.CommandText = "SELECT ResultId, OriginalPath, TargetPath, OrganizationDate, Status, OrganizationType, StatusMessage, ExtractedName, ExtractedYear from organizationresults";
+
+ if (query.StartIndex.HasValue && query.StartIndex.Value > 0)
+ {
+ cmd.CommandText += string.Format(" WHERE ResultId NOT IN (SELECT ResultId FROM organizationresults ORDER BY OrganizationDate desc LIMIT {0})",
+ query.StartIndex.Value.ToString(_usCulture));
+ }
+
+ cmd.CommandText += " ORDER BY OrganizationDate desc";
+
+ if (query.Limit.HasValue)
+ {
+ cmd.CommandText += " LIMIT " + query.Limit.Value.ToString(_usCulture);
+ }
+
+ cmd.CommandText += "; select count (ResultId) from organizationresults";
+
+ var list = new List<FileOrganizationResult>();
+ var count = 0;
+
+ using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
+ {
+ while (reader.Read())
+ {
+ list.Add(GetResult(reader));
+ }
+
+ if (reader.NextResult() && reader.Read())
+ {
+ count = reader.GetInt32(0);
+ }
+ }
+
+ return new QueryResult<FileOrganizationResult>()
+ {
+ Items = list.ToArray(),
+ TotalRecordCount = count
+ };
+ }
+ }
+
+ public FileOrganizationResult GetResult(string id)
+ {
+ if (string.IsNullOrEmpty(id))
+ {
+ throw new ArgumentNullException("id");
+ }
+
+ var guid = new Guid(id);
+
+ using (var cmd = _connection.CreateCommand())
+ {
+ cmd.CommandText = "select ResultId, OriginalPath, TargetPath, OrganizationDate, Status, OrganizationType, StatusMessage, ExtractedName, ExtractedYear from organizationresults where ResultId=@Id";
+
+ cmd.Parameters.Add(cmd, "@Id", DbType.Guid).Value = guid;
+
+ using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow))
+ {
+ if (reader.Read())
+ {
+ return GetResult(reader);
+ }
+ }
+ }
+
+ return null;
+ }
+
+ public FileOrganizationResult GetResult(IDataReader reader)
+ {
+ var result = new FileOrganizationResult
+ {
+ Id = reader.GetGuid(0).ToString("N")
+ };
+
+ if (!reader.IsDBNull(1))
+ {
+ result.OriginalPath = reader.GetString(1);
+ }
+
+ if (!reader.IsDBNull(2))
+ {
+ result.TargetPath = reader.GetString(2);
+ }
+
+ result.Date = reader.GetDateTime(3).ToUniversalTime();
+ result.Status = (FileSortingStatus)Enum.Parse(typeof(FileSortingStatus), reader.GetString(4), true);
+ result.Type = (FileOrganizerType)Enum.Parse(typeof(FileOrganizerType), reader.GetString(5), true);
+
+ if (!reader.IsDBNull(6))
+ {
+ result.StatusMessage = reader.GetString(6);
+ }
+
+ result.OriginalFileName = Path.GetFileName(result.OriginalPath);
+
+ if (!reader.IsDBNull(7))
+ {
+ result.ExtractedName = reader.GetString(7);
+ }
+
+ if (!reader.IsDBNull(8))
+ {
+ result.ExtractedYear = reader.GetInt32(8);
+ }
+
+ return result;
}
/// <summary>