schema-less user data

This commit is contained in:
Luke Pulverenti 2013-05-09 16:29:50 -04:00
parent 45dcb05ffd
commit f233f9c4e5

View file

@ -18,7 +18,7 @@ namespace MediaBrowser.Server.Implementations.Sqlite
public class SQLiteUserDataRepository : SqliteRepository, IUserDataRepository public class SQLiteUserDataRepository : SqliteRepository, IUserDataRepository
{ {
private readonly ConcurrentDictionary<string, Task<UserItemData>> _userData = new ConcurrentDictionary<string, Task<UserItemData>>(); private readonly ConcurrentDictionary<string, Task<UserItemData>> _userData = new ConcurrentDictionary<string, Task<UserItemData>>();
/// <summary> /// <summary>
/// The repository name /// The repository name
/// </summary> /// </summary>
@ -47,7 +47,7 @@ namespace MediaBrowser.Server.Implementations.Sqlite
return false; return false;
} }
} }
private readonly IJsonSerializer _jsonSerializer; private readonly IJsonSerializer _jsonSerializer;
/// <summary> /// <summary>
@ -94,9 +94,8 @@ namespace MediaBrowser.Server.Implementations.Sqlite
string[] queries = { string[] queries = {
"create table if not exists useritemdata (key nvarchar, userId GUID, Rating float null, PlaybackPositionTicks bigint, PlayCount int, IsFavorite bit, Played bit, LastPlayedDate bigint null)", "create table if not exists userdata (key nvarchar, userId GUID, data BLOB)",
"create unique index if not exists useritemdataindex on useritemdata (key, userId)", "create unique index if not exists userdataindex on userdata (key, userId)",
"create table if not exists schema_version (table_name primary key, version)", "create table if not exists schema_version (table_name primary key, version)",
//pragmas //pragmas
"pragma temp_store = memory" "pragma temp_store = memory"
@ -181,26 +180,16 @@ namespace MediaBrowser.Server.Implementations.Sqlite
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
var serialized = _jsonSerializer.SerializeToBytes(userData);
cancellationToken.ThrowIfCancellationRequested();
using (var cmd = connection.CreateCommand()) using (var cmd = connection.CreateCommand())
{ {
cmd.CommandText = "replace into useritemdata (key, userId, Rating,PlaybackPositionTicks,PlayCount,IsFavorite,Played,LastPlayedDate) values (@1, @2, @3, @4, @5, @6, @7, @8)"; cmd.CommandText = "replace into userdata (key, userId, data) values (@1, @2, @3)";
cmd.AddParam("@1", key); cmd.AddParam("@1", key);
cmd.AddParam("@2", userId); cmd.AddParam("@2", userId);
cmd.AddParam("@3", serialized);
cmd.AddParam("@3", userData.Rating);
cmd.AddParam("@4", userData.PlaybackPositionTicks);
cmd.AddParam("@5", userData.PlayCount);
cmd.AddParam("@6", userData.IsFavorite);
cmd.AddParam("@7", userData.Played);
if (userData.LastPlayedDate.HasValue)
{
cmd.AddParam("@8", userData.LastPlayedDate.Value.Ticks);
}
else
{
cmd.AddParam("@8", null);
}
using (var tran = connection.BeginTransaction()) using (var tran = connection.BeginTransaction())
{ {
@ -246,7 +235,7 @@ namespace MediaBrowser.Server.Implementations.Sqlite
{ {
throw new ArgumentNullException("key"); throw new ArgumentNullException("key");
} }
return _userData.GetOrAdd(GetInternalKey(userId, key), keyName => RetrieveUserData(userId, key)); return _userData.GetOrAdd(GetInternalKey(userId, key), keyName => RetrieveUserData(userId, key));
} }
@ -260,7 +249,7 @@ namespace MediaBrowser.Server.Implementations.Sqlite
{ {
using (var cmd = connection.CreateCommand()) using (var cmd = connection.CreateCommand())
{ {
cmd.CommandText = "select Rating,PlaybackPositionTicks,PlayCount,IsFavorite,Played,LastPlayedDate from useritemdata where key = @key and userId=@userId"; cmd.CommandText = "select data from userdata where key = @key and userId=@userId";
var idParam = cmd.Parameters.Add("@key", DbType.String); var idParam = cmd.Parameters.Add("@key", DbType.String);
idParam.Value = key; idParam.Value = key;
@ -268,30 +257,19 @@ namespace MediaBrowser.Server.Implementations.Sqlite
var userIdParam = cmd.Parameters.Add("@userId", DbType.Guid); var userIdParam = cmd.Parameters.Add("@userId", DbType.Guid);
userIdParam.Value = userId; userIdParam.Value = userId;
var userdata = new UserItemData();
using (var reader = await cmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow).ConfigureAwait(false)) using (var reader = await cmd.ExecuteReaderAsync(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow).ConfigureAwait(false))
{ {
if (reader.Read()) if (reader.Read())
{ {
if (!reader.IsDBNull(0)) using (var stream = GetStream(reader, 0))
{ {
userdata.Rating = reader.GetDouble(0); return _jsonSerializer.DeserializeFromStream<UserItemData>(stream);
}
userdata.PlaybackPositionTicks = reader.GetInt64(1);
userdata.PlayCount = reader.GetInt32(2);
userdata.IsFavorite = reader.GetBoolean(3);
userdata.Played = reader.GetBoolean(4);
if (!reader.IsDBNull(5))
{
userdata.LastPlayedDate = new DateTime(reader.GetInt64(5));
} }
} }
} }
return userdata; return new UserItemData();
} }
} }
} }
} }