From e677a57bf1cedc55214b0e457778311b8f1ea5ac Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 17 Jun 2013 16:35:43 -0400 Subject: switch to flat file storage --- .../Sqlite/SQLiteUserDataRepository.cs | 289 --------------------- 1 file changed, 289 deletions(-) delete mode 100644 MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs (limited to 'MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs') diff --git a/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs b/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs deleted file mode 100644 index d378809ff..000000000 --- a/MediaBrowser.Server.Implementations/Sqlite/SQLiteUserDataRepository.cs +++ /dev/null @@ -1,289 +0,0 @@ -using System.Data.SQLite; -using MediaBrowser.Common.Configuration; -using MediaBrowser.Controller.Entities; -using MediaBrowser.Controller.Persistence; -using MediaBrowser.Model.Logging; -using MediaBrowser.Model.Serialization; -using System; -using System.Collections.Concurrent; -using System.Data; -using System.IO; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Server.Implementations.Sqlite -{ - /// - /// Class SQLiteUserDataRepository - /// - public class SQLiteUserDataRepository : SqliteRepository, IUserDataRepository - { - private readonly ConcurrentDictionary> _userData = new ConcurrentDictionary>(); - - private readonly SemaphoreSlim _writeLock = new SemaphoreSlim(1, 1); - - /// - /// The repository name - /// - public const string RepositoryName = "SQLite"; - - /// - /// Gets the name of the repository - /// - /// The name. - public string Name - { - get - { - return RepositoryName; - } - } - - private readonly IJsonSerializer _jsonSerializer; - - /// - /// The _app paths - /// - private readonly IApplicationPaths _appPaths; - - /// - /// Initializes a new instance of the class. - /// - /// The app paths. - /// The json serializer. - /// The log manager. - /// - /// jsonSerializer - /// or - /// appPaths - /// - public SQLiteUserDataRepository(IApplicationPaths appPaths, IJsonSerializer jsonSerializer, ILogManager logManager) - : base(logManager) - { - if (jsonSerializer == null) - { - throw new ArgumentNullException("jsonSerializer"); - } - if (appPaths == null) - { - throw new ArgumentNullException("appPaths"); - } - - _jsonSerializer = jsonSerializer; - _appPaths = appPaths; - } - - /// - /// Opens the connection to the database - /// - /// Task. - public async Task Initialize() - { - var dbFile = Path.Combine(_appPaths.DataPath, "userdata.db"); - - await ConnectToDb(dbFile).ConfigureAwait(false); - - string[] queries = { - - "create table if not exists userdata (key nvarchar, userId GUID, data BLOB)", - "create unique index if not exists userdataindex on userdata (key, userId)", - "create table if not exists schema_version (table_name primary key, version)", - //pragmas - "pragma temp_store = memory" - }; - - RunQueries(queries); - } - - /// - /// Saves the user data. - /// - /// The user id. - /// The key. - /// The user data. - /// The cancellation token. - /// Task. - /// userData - /// or - /// cancellationToken - /// or - /// userId - /// or - /// userDataId - public async Task SaveUserData(Guid userId, string key, UserItemData userData, CancellationToken cancellationToken) - { - if (userData == null) - { - throw new ArgumentNullException("userData"); - } - if (cancellationToken == null) - { - throw new ArgumentNullException("cancellationToken"); - } - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - if (string.IsNullOrEmpty(key)) - { - throw new ArgumentNullException("key"); - } - - cancellationToken.ThrowIfCancellationRequested(); - - try - { - await PersistUserData(userId, key, userData, cancellationToken).ConfigureAwait(false); - - var newValue = Task.FromResult(userData); - - // Once it succeeds, put it into the dictionary to make it available to everyone else - _userData.AddOrUpdate(GetInternalKey(userId, key), newValue, delegate { return newValue; }); - } - catch (Exception ex) - { - Logger.ErrorException("Error saving user data", ex); - - throw; - } - } - - /// - /// Gets the internal key. - /// - /// The user id. - /// The key. - /// System.String. - private string GetInternalKey(Guid userId, string key) - { - return userId + key; - } - - /// - /// Persists the user data. - /// - /// The user id. - /// The key. - /// The user data. - /// The cancellation token. - /// Task. - public async Task PersistUserData(Guid userId, string key, UserItemData userData, CancellationToken cancellationToken) - { - cancellationToken.ThrowIfCancellationRequested(); - - var serialized = _jsonSerializer.SerializeToBytes(userData); - - cancellationToken.ThrowIfCancellationRequested(); - - await _writeLock.WaitAsync(cancellationToken).ConfigureAwait(false); - - SQLiteTransaction transaction = null; - - try - { - transaction = Connection.BeginTransaction(); - - using (var cmd = Connection.CreateCommand()) - { - cmd.CommandText = "replace into userdata (key, userId, data) values (@1, @2, @3)"; - cmd.AddParam("@1", key); - cmd.AddParam("@2", userId); - cmd.AddParam("@3", serialized); - - cmd.Transaction = transaction; - - await cmd.ExecuteNonQueryAsync(cancellationToken); - } - - transaction.Commit(); - } - catch (OperationCanceledException) - { - if (transaction != null) - { - transaction.Rollback(); - } - - throw; - } - catch (Exception e) - { - Logger.ErrorException("Failed to save user data:", e); - - if (transaction != null) - { - transaction.Rollback(); - } - - throw; - } - finally - { - if (transaction != null) - { - transaction.Dispose(); - } - - _writeLock.Release(); - } - } - - /// - /// Gets the user data. - /// - /// The user id. - /// The key. - /// Task{UserItemData}. - /// - /// userId - /// or - /// key - /// - public Task GetUserData(Guid userId, string key) - { - if (userId == Guid.Empty) - { - throw new ArgumentNullException("userId"); - } - if (string.IsNullOrEmpty(key)) - { - throw new ArgumentNullException("key"); - } - - return _userData.GetOrAdd(GetInternalKey(userId, key), keyName => RetrieveUserData(userId, key)); - } - - /// - /// Retrieves the user data. - /// - /// The user id. - /// The key. - /// Task{UserItemData}. - private async Task RetrieveUserData(Guid userId, string key) - { - using (var cmd = Connection.CreateCommand()) - { - cmd.CommandText = "select data from userdata where key = @key and userId=@userId"; - - var idParam = cmd.Parameters.Add("@key", DbType.String); - idParam.Value = key; - - var userIdParam = cmd.Parameters.Add("@userId", DbType.Guid); - userIdParam.Value = userId; - - using (var reader = await cmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow).ConfigureAwait(false)) - { - if (reader.Read()) - { - using (var stream = GetStream(reader, 0)) - { - return _jsonSerializer.DeserializeFromStream(stream); - } - } - } - - return new UserItemData(); - } - } - } -} \ No newline at end of file -- cgit v1.2.3