SharingRepository.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. using MediaBrowser.Common.Configuration;
  2. using MediaBrowser.Model.Logging;
  3. using MediaBrowser.Model.Social;
  4. using MediaBrowser.Server.Implementations.Persistence;
  5. using System;
  6. using System.Data;
  7. using System.IO;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. namespace MediaBrowser.Server.Implementations.Social
  11. {
  12. public class SharingRepository : BaseSqliteRepository
  13. {
  14. public SharingRepository(ILogManager logManager, IApplicationPaths appPaths, IDbConnector dbConnector)
  15. : base(logManager, dbConnector)
  16. {
  17. DbFilePath = Path.Combine(appPaths.DataPath, "shares.db");
  18. }
  19. /// <summary>
  20. /// Opens the connection to the database
  21. /// </summary>
  22. /// <returns>Task.</returns>
  23. public async Task Initialize()
  24. {
  25. using (var connection = await CreateConnection().ConfigureAwait(false))
  26. {
  27. string[] queries = {
  28. "create table if not exists Shares (Id GUID, ItemId TEXT, UserId TEXT, ExpirationDate DateTime, PRIMARY KEY (Id))",
  29. "create index if not exists idx_Shares on Shares(Id)",
  30. //pragmas
  31. "pragma temp_store = memory",
  32. "pragma shrink_memory"
  33. };
  34. connection.RunQueries(queries, Logger);
  35. }
  36. }
  37. public async Task CreateShare(SocialShareInfo info)
  38. {
  39. if (info == null)
  40. {
  41. throw new ArgumentNullException("info");
  42. }
  43. if (string.IsNullOrWhiteSpace(info.Id))
  44. {
  45. throw new ArgumentNullException("info.Id");
  46. }
  47. var cancellationToken = CancellationToken.None;
  48. cancellationToken.ThrowIfCancellationRequested();
  49. using (var connection = await CreateConnection().ConfigureAwait(false))
  50. {
  51. using (var saveShareCommand = connection.CreateCommand())
  52. {
  53. saveShareCommand.CommandText = "replace into Shares (Id, ItemId, UserId, ExpirationDate) values (@Id, @ItemId, @UserId, @ExpirationDate)";
  54. saveShareCommand.Parameters.Add(saveShareCommand, "@Id");
  55. saveShareCommand.Parameters.Add(saveShareCommand, "@ItemId");
  56. saveShareCommand.Parameters.Add(saveShareCommand, "@UserId");
  57. saveShareCommand.Parameters.Add(saveShareCommand, "@ExpirationDate");
  58. IDbTransaction transaction = null;
  59. try
  60. {
  61. transaction = connection.BeginTransaction();
  62. saveShareCommand.GetParameter(0).Value = new Guid(info.Id);
  63. saveShareCommand.GetParameter(1).Value = info.ItemId;
  64. saveShareCommand.GetParameter(2).Value = info.UserId;
  65. saveShareCommand.GetParameter(3).Value = info.ExpirationDate;
  66. saveShareCommand.Transaction = transaction;
  67. saveShareCommand.ExecuteNonQuery();
  68. transaction.Commit();
  69. }
  70. catch (OperationCanceledException)
  71. {
  72. if (transaction != null)
  73. {
  74. transaction.Rollback();
  75. }
  76. throw;
  77. }
  78. catch (Exception e)
  79. {
  80. Logger.ErrorException("Failed to save share:", e);
  81. if (transaction != null)
  82. {
  83. transaction.Rollback();
  84. }
  85. throw;
  86. }
  87. finally
  88. {
  89. if (transaction != null)
  90. {
  91. transaction.Dispose();
  92. }
  93. }
  94. }
  95. }
  96. }
  97. public SocialShareInfo GetShareInfo(string id)
  98. {
  99. if (string.IsNullOrWhiteSpace(id))
  100. {
  101. throw new ArgumentNullException("id");
  102. }
  103. using (var connection = CreateConnection(true).Result)
  104. {
  105. var cmd = connection.CreateCommand();
  106. cmd.CommandText = "select Id, ItemId, UserId, ExpirationDate from Shares where id = @id";
  107. cmd.Parameters.Add(cmd, "@id", DbType.Guid).Value = new Guid(id);
  108. using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow))
  109. {
  110. if (reader.Read())
  111. {
  112. return GetSocialShareInfo(reader);
  113. }
  114. }
  115. return null;
  116. }
  117. }
  118. private SocialShareInfo GetSocialShareInfo(IDataReader reader)
  119. {
  120. var info = new SocialShareInfo();
  121. info.Id = reader.GetGuid(0).ToString("N");
  122. info.ItemId = reader.GetString(1);
  123. info.UserId = reader.GetString(2);
  124. info.ExpirationDate = reader.GetDateTime(3).ToUniversalTime();
  125. return info;
  126. }
  127. public async Task DeleteShare(string id)
  128. {
  129. }
  130. }
  131. }