diff options
author | crupest <crupest@outlook.com> | 2024-11-11 01:12:29 +0800 |
---|---|---|
committer | Yuqian Yang <crupest@crupest.life> | 2024-12-19 21:42:01 +0800 |
commit | f9aa02ec1a4c24e80a206857d4f68198bb027bb4 (patch) | |
tree | 5994f0a62733b13f9f330e3515260ae20dc4a0bd /dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/DbConnectionFactory.cs | |
parent | 7b4d49e4bbdff6ddf1f8f7e937130e700024d5e9 (diff) | |
download | crupest-f9aa02ec1a4c24e80a206857d4f68198bb027bb4.tar.gz crupest-f9aa02ec1a4c24e80a206857d4f68198bb027bb4.tar.bz2 crupest-f9aa02ec1a4c24e80a206857d4f68198bb027bb4.zip |
HALF WORK: 2024.12.19
Re-organize file structure.
Diffstat (limited to 'dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/DbConnectionFactory.cs')
-rw-r--r-- | dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/DbConnectionFactory.cs | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/DbConnectionFactory.cs b/dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/DbConnectionFactory.cs new file mode 100644 index 0000000..701622c --- /dev/null +++ b/dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/DbConnectionFactory.cs @@ -0,0 +1,75 @@ +using System.Data; +using Microsoft.Data.Sqlite; +using Microsoft.Extensions.Options; + +namespace CrupestApi.Commons.Crud; + +public interface IDbConnectionFactory +{ + IDbConnection Get(string? name = null); + bool ShouldDisposeConnection { get; } +} + +public class SqliteConnectionFactory : IDbConnectionFactory +{ + private readonly IOptionsMonitor<CrupestApiConfig> _apiConfigMonitor; + + public SqliteConnectionFactory(IOptionsMonitor<CrupestApiConfig> apiConfigMonitor) + { + _apiConfigMonitor = apiConfigMonitor; + } + + public IDbConnection Get(string? name = null) + { + var connectionString = new SqliteConnectionStringBuilder() + { + DataSource = Path.Combine(_apiConfigMonitor.CurrentValue.DataDir, $"{name ?? "crupest-api"}.db"), + Mode = SqliteOpenMode.ReadWriteCreate + }.ToString(); + + var connection = new SqliteConnection(connectionString); + connection.Open(); + return connection; + } + + public bool ShouldDisposeConnection => true; +} + +public class SqliteMemoryConnectionFactory : IDbConnectionFactory, IDisposable +{ + private readonly Dictionary<string, IDbConnection> _connections = new(); + + public IDbConnection Get(string? name = null) + { + name = name ?? "crupest-api"; + + if (_connections.TryGetValue(name, out var connection)) + { + return connection; + } + else + { + var connectionString = new SqliteConnectionStringBuilder() + { + DataSource = ":memory:", + Mode = SqliteOpenMode.ReadWriteCreate + }.ToString(); + + connection = new SqliteConnection(connectionString); + _connections.Add(name, connection); + connection.Open(); + return connection; + } + } + + public bool ShouldDisposeConnection => false; + + + public void Dispose() + { + foreach (var connection in _connections.Values) + { + connection.Dispose(); + } + } +} |