SqliteExtensions.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.SQLite;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using MediaBrowser.Controller.Entities;
  9. using MediaBrowser.Model.Entities;
  10. using MediaBrowser.Model.Logging;
  11. namespace MediaBrowser.Server.Implementations.Persistence
  12. {
  13. /// <summary>
  14. /// Class SQLiteExtensions
  15. /// </summary>
  16. public static class SqliteExtensions
  17. {
  18. /// <summary>
  19. /// Connects to db.
  20. /// </summary>
  21. /// <param name="dbPath">The db path.</param>
  22. /// <param name="logger">The logger.</param>
  23. /// <returns>Task{IDbConnection}.</returns>
  24. /// <exception cref="System.ArgumentNullException">dbPath</exception>
  25. public static async Task<IDbConnection> ConnectToDb(string dbPath, int? cacheSize, ILogger logger)
  26. {
  27. if (string.IsNullOrEmpty(dbPath))
  28. {
  29. throw new ArgumentNullException("dbPath");
  30. }
  31. logger.Info("Sqlite {0} opening {1}", SQLiteConnection.SQLiteVersion, dbPath);
  32. var connectionstr = new SQLiteConnectionStringBuilder
  33. {
  34. PageSize = 4096,
  35. CacheSize = cacheSize ?? 2000,
  36. SyncMode = SynchronizationModes.Normal,
  37. DataSource = dbPath,
  38. JournalMode = SQLiteJournalModeEnum.Wal
  39. };
  40. var connection = new SQLiteConnection(connectionstr.ConnectionString);
  41. await connection.OpenAsync().ConfigureAwait(false);
  42. return connection;
  43. }
  44. public static void BindFunction(this SQLiteConnection connection, SQLiteFunction function)
  45. {
  46. var attributes = function.GetType().GetCustomAttributes(typeof(SQLiteFunctionAttribute), true).Cast<SQLiteFunctionAttribute>().ToArray();
  47. if (attributes.Length == 0)
  48. {
  49. throw new InvalidOperationException("SQLiteFunction doesn't have SQLiteFunctionAttribute");
  50. }
  51. connection.BindFunction(attributes[0], function);
  52. }
  53. }
  54. }