diff options
| author | Luke <luke.pulverenti@gmail.com> | 2016-12-11 01:47:54 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-12-11 01:47:54 -0500 |
| commit | 446b2e29d086a44548b585ea9c66d0ab4c1675eb (patch) | |
| tree | 4a594ff21204a6cd4df05d3550f869d47eaa8a77 /Emby.Server.Implementations/Data/BaseSqliteRepository.cs | |
| parent | 56ba0c5b5d0ecc6b3dc695af8efeb12465ac44d3 (diff) | |
| parent | a8d9a3440d0143aa7cf564f21aff2eadc4b88e6a (diff) | |
Merge pull request #2336 from MediaBrowser/dev
Dev
Diffstat (limited to 'Emby.Server.Implementations/Data/BaseSqliteRepository.cs')
| -rw-r--r-- | Emby.Server.Implementations/Data/BaseSqliteRepository.cs | 70 |
1 files changed, 58 insertions, 12 deletions
diff --git a/Emby.Server.Implementations/Data/BaseSqliteRepository.cs b/Emby.Server.Implementations/Data/BaseSqliteRepository.cs index f132c9765..8f2bb2cea 100644 --- a/Emby.Server.Implementations/Data/BaseSqliteRepository.cs +++ b/Emby.Server.Implementations/Data/BaseSqliteRepository.cs @@ -20,27 +20,34 @@ namespace Emby.Server.Implementations.Data { Logger = logger; - WriteLock = AllowLockRecursion ? - new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion) : - new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion); + WriteLock = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion); } - protected virtual bool AllowLockRecursion + protected TransactionMode TransactionMode { - get { return false; } + get { return TransactionMode.Immediate; } } - protected TransactionMode TransactionMode + protected TransactionMode ReadTransactionMode { - get { return TransactionMode.Immediate; } + get { return TransactionMode.Deferred; } } + internal static int ThreadSafeMode { get; set; } + static BaseSqliteRepository() { SQLite3.EnableSharedCache = false; int rc = raw.sqlite3_config(raw.SQLITE_CONFIG_MEMSTATUS, 0); //CheckOk(rc); + + rc = raw.sqlite3_config(raw.SQLITE_CONFIG_MULTITHREAD, 1); + //CheckOk(rc); + + rc = raw.sqlite3_enable_shared_cache(1); + + ThreadSafeMode = raw.sqlite3_threadsafe(); } private static bool _versionLogged; @@ -61,16 +68,19 @@ namespace Emby.Server.Implementations.Data if (isReadOnly) { //Logger.Info("Opening read connection"); + //connectionFlags = ConnectionFlags.ReadOnly; + connectionFlags = ConnectionFlags.Create; + connectionFlags |= ConnectionFlags.ReadWrite; } else { //Logger.Info("Opening write connection"); + connectionFlags = ConnectionFlags.Create; + connectionFlags |= ConnectionFlags.ReadWrite; } - connectionFlags = ConnectionFlags.Create; - connectionFlags |= ConnectionFlags.ReadWrite; - connectionFlags |= ConnectionFlags.SharedCached; - //connectionFlags |= ConnectionFlags.NoMutex; + //connectionFlags |= ConnectionFlags.SharedCached; + connectionFlags |= ConnectionFlags.NoMutex; var db = SQLite3.Open(DbFilePath, connectionFlags, null); @@ -114,7 +124,8 @@ namespace Emby.Server.Implementations.Data db.ExecuteAll(string.Join(";", queries.ToArray())); } } - else*/ if (queries.Count > 0) + else*/ + if (queries.Count > 0) { db.ExecuteAll(string.Join(";", queries.ToArray())); } @@ -122,6 +133,26 @@ namespace Emby.Server.Implementations.Data return db; } + public IStatement PrepareStatement(IDatabaseConnection connection, string sql) + { + return connection.PrepareStatement(sql); + } + + public IStatement PrepareStatementSafe(IDatabaseConnection connection, string sql) + { + return connection.PrepareStatement(sql); + } + + public List<IStatement> PrepareAll(IDatabaseConnection connection, string sql) + { + return connection.PrepareAll(sql).ToList(); + } + + public List<IStatement> PrepareAllSafe(IDatabaseConnection connection, string sql) + { + return connection.PrepareAll(sql).ToList(); + } + protected void RunDefaultInitialization(IDatabaseConnection db) { var queries = new List<string> @@ -288,12 +319,27 @@ namespace Emby.Server.Implementations.Data } } + public class DummyToken : IDisposable + { + public void Dispose() + { + } + } + public static IDisposable Read(this ReaderWriterLockSlim obj) { + //if (BaseSqliteRepository.ThreadSafeMode > 0) + //{ + // return new DummyToken(); + //} return new ReadLockToken(obj); } public static IDisposable Write(this ReaderWriterLockSlim obj) { + //if (BaseSqliteRepository.ThreadSafeMode > 0) + //{ + // return new DummyToken(); + //} return new WriteLockToken(obj); } } |
