using MediaBrowser.Model.Logging; using System; using System.Data; using System.Data.Common; using System.Data.SQLite; using System.IO; using System.Threading.Tasks; namespace MediaBrowser.Server.Implementations.Sqlite { /// /// Class SqliteRepository /// public abstract class SqliteRepository : IDisposable { /// /// The db file name /// protected string DbFileName; /// /// The connection /// protected SQLiteConnection Connection; /// /// Gets the logger. /// /// The logger. protected ILogger Logger { get; private set; } /// /// Initializes a new instance of the class. /// /// The log manager. /// logger protected SqliteRepository(ILogManager logManager) { if (logManager == null) { throw new ArgumentNullException("logManager"); } Logger = logManager.GetLogger(GetType().Name); } /// /// Connects to DB. /// /// The db path. /// Task{System.Boolean}. /// dbPath protected Task ConnectToDb(string dbPath) { if (string.IsNullOrEmpty(dbPath)) { throw new ArgumentNullException("dbPath"); } DbFileName = dbPath; var connectionstr = new SQLiteConnectionStringBuilder { PageSize = 4096, CacheSize = 40960, SyncMode = SynchronizationModes.Off, DataSource = dbPath, JournalMode = SQLiteJournalModeEnum.Wal }; Connection = new SQLiteConnection(connectionstr.ConnectionString); return Connection.OpenAsync(); } /// /// Runs the queries. /// /// The queries. /// true if XXXX, false otherwise /// queries protected void RunQueries(string[] queries) { if (queries == null) { throw new ArgumentNullException("queries"); } using (var tran = Connection.BeginTransaction()) { try { using (var cmd = Connection.CreateCommand()) { foreach (var query in queries) { cmd.Transaction = tran; cmd.CommandText = query; cmd.ExecuteNonQuery(); } } tran.Commit(); } catch (Exception e) { Logger.ErrorException("Error running queries", e); tran.Rollback(); throw; } } } /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private readonly object _disposeLock = new object(); /// /// Releases unmanaged and - optionally - managed resources. /// /// true to release both managed and unmanaged resources; false to release only unmanaged resources. protected virtual void Dispose(bool dispose) { if (dispose) { try { lock (_disposeLock) { if (Connection != null) { if (Connection.IsOpen()) { Connection.Close(); } Connection.Dispose(); Connection = null; } } } catch (Exception ex) { Logger.ErrorException("Error disposing database", ex); } } } /// /// Gets a stream from a DataReader at a given ordinal /// /// The reader. /// The ordinal. /// Stream. /// reader protected static Stream GetStream(IDataReader reader, int ordinal) { if (reader == null) { throw new ArgumentNullException("reader"); } var memoryStream = new MemoryStream(); var num = 0L; var array = new byte[4096]; long bytes; do { bytes = reader.GetBytes(ordinal, num, array, 0, array.Length); memoryStream.Write(array, 0, (int)bytes); num += bytes; } while (bytes > 0L); memoryStream.Position = 0; return memoryStream; } } }