diff --git a/src/OhioBox.Storage.MySql.Tests/Bootstrap/Bootstrapper.cs b/src/OhioBox.Storage.MySql.Tests/Bootstrap/Bootstrapper.cs index 7ca3195..0e76216 100644 --- a/src/OhioBox.Storage.MySql.Tests/Bootstrap/Bootstrapper.cs +++ b/src/OhioBox.Storage.MySql.Tests/Bootstrap/Bootstrapper.cs @@ -1,28 +1,24 @@ using System.Configuration; using System.Reflection; -using OhioBox.Storage.MySql.Bootstrap; using OhioBox.Storage.MySql.Moranbernate; namespace OhioBox.Storage.MySql.Tests.Bootstrap { - public static class Bootstrapper - { - private static ISqlConnectionFactory _factory; + public static class Bootstrapper + { + private static ISqlConnectionFactory _factory; - public static ISqlConnectionFactory Init() - { - if (_factory != null) return _factory; + public static ISqlConnectionFactory Init() + { + if (_factory != null) return _factory; - MoranbernateInitializer.Initialize(typeof(Bootstrapper).GetTypeInfo().Assembly); + MoranbernateInitializer.Initialize(typeof(Bootstrapper).GetTypeInfo().Assembly); var connectionString = ConfigurationManager.ConnectionStrings["MySql"].ConnectionString; - - var factory = new SqlConnectionFactory(new DefaultMetricsReporter()); - factory.Add(connectionString, MoranbernateInitializer.GetMappedTypes()); - _factory = factory; + _factory = new SqlConnectionFactory(connectionString); - return _factory; - } - } + return _factory; + } + } } \ No newline at end of file diff --git a/src/OhioBox.Storage.MySql/Bootstrap/MoranbernateBootstrap.cs b/src/OhioBox.Storage.MySql/Bootstrap/MoranbernateBootstrap.cs deleted file mode 100644 index e1ff43c..0000000 --- a/src/OhioBox.Storage.MySql/Bootstrap/MoranbernateBootstrap.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Reflection; -using OhioBox.Storage.MySql.Moranbernate; - -namespace OhioBox.Storage.MySql.Bootstrap -{ - public static class MoranbernateBootstrap - { - public static Registration[] GetRegistrationCandidates(Type perfLoggerType = null) where TMetricsReporter : IMetricsReporter - { - perfLoggerType = perfLoggerType ?? typeof(DefaultPerfLogger<>); - - var perfLoggerInterfaceType = typeof(IPerfLogger<>); - if (!perfLoggerInterfaceType.GetTypeInfo().IsAssignableFrom(perfLoggerType)) - throw new StorageRegistrationException(perfLoggerInterfaceType, perfLoggerType); - - return new[] - { - new Registration(typeof(IAggregatedQueryRunner<>), typeof(AggregatedQueryRunner<>)), - new Registration(perfLoggerInterfaceType, perfLoggerType), - new Registration(typeof(IMetricsReporter), typeof(TMetricsReporter)) - }; - } - } - - public class StorageRegistrationException : Exception - { - public StorageRegistrationException(Type @interface, Type type) : - base($"Unable to create registrations. {type.Name} does not implement {@interface.Name}") - {} - } -} \ No newline at end of file diff --git a/src/OhioBox.Storage.MySql/Bootstrap/Registration.cs b/src/OhioBox.Storage.MySql/Bootstrap/Registration.cs deleted file mode 100644 index ba38e66..0000000 --- a/src/OhioBox.Storage.MySql/Bootstrap/Registration.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace OhioBox.Storage.MySql.Bootstrap -{ - public class Registration - { - public Type Interface { get; } - public Type Implementor { get; } - - public Registration(Type interfaceType, Type implementor) - { - Interface = interfaceType; - Implementor = implementor; - } - } -} \ No newline at end of file diff --git a/src/OhioBox.Storage.MySql/ClassHasNotBeenRegisteredException.cs b/src/OhioBox.Storage.MySql/ClassHasNotBeenRegisteredException.cs deleted file mode 100644 index b10867b..0000000 --- a/src/OhioBox.Storage.MySql/ClassHasNotBeenRegisteredException.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace OhioBox.Storage.MySql -{ - internal class ClassHasNotBeenRegisteredException : Exception - { - private const string MessageFormat = "No sql connection provider was found for type [{0}], class was not registered using Moranbernate."; - - internal ClassHasNotBeenRegisteredException(Type type) - : base(string.Format(MessageFormat, type.Name)) - { - } - } -} \ No newline at end of file diff --git a/src/OhioBox.Storage.MySql/DictionaryExtentions.cs b/src/OhioBox.Storage.MySql/DictionaryExtentions.cs deleted file mode 100644 index 08a0e29..0000000 --- a/src/OhioBox.Storage.MySql/DictionaryExtentions.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Collections.Generic; - -namespace OhioBox.Storage.MySql -{ - internal static class DictionaryExtentions - { - internal static TValue GetItemOrDefault(this IDictionary target, TKey key, TValue @default = default(TValue)) - { - return target.TryGetValue(key, out var value) ? value : @default; - } - } -} \ No newline at end of file diff --git a/src/OhioBox.Storage.MySql/Moranbernate/IPerfLogger.cs b/src/OhioBox.Storage.MySql/IPerfLogger.cs similarity index 79% rename from src/OhioBox.Storage.MySql/Moranbernate/IPerfLogger.cs rename to src/OhioBox.Storage.MySql/IPerfLogger.cs index a182c70..e0a9dba 100644 --- a/src/OhioBox.Storage.MySql/Moranbernate/IPerfLogger.cs +++ b/src/OhioBox.Storage.MySql/IPerfLogger.cs @@ -1,6 +1,6 @@ using System; -namespace OhioBox.Storage.MySql.Moranbernate +namespace OhioBox.Storage.MySql { public interface IPerfLogger { diff --git a/src/OhioBox.Storage.MySql/ISqlConnectionFactory.cs b/src/OhioBox.Storage.MySql/ISqlConnectionFactory.cs index a3895a7..2a5f15f 100644 --- a/src/OhioBox.Storage.MySql/ISqlConnectionFactory.cs +++ b/src/OhioBox.Storage.MySql/ISqlConnectionFactory.cs @@ -7,10 +7,5 @@ namespace OhioBox.Storage.MySql public interface ISqlConnectionFactory { IDbConnection GetConnection(); - ISqlConnectionProvider GetConnectionProvider(); - IEnumerable Providers { get; } - IList> GetTypeFullNameAndAonnectionString(); - - void Add(string connectionString, IEnumerable types); } } \ No newline at end of file diff --git a/src/OhioBox.Storage.MySql/Moranbernate/AggregatedQueryRunner.cs b/src/OhioBox.Storage.MySql/Moranbernate/AggregatedQueryRunner.cs index cd4cc33..55ed5a4 100644 --- a/src/OhioBox.Storage.MySql/Moranbernate/AggregatedQueryRunner.cs +++ b/src/OhioBox.Storage.MySql/Moranbernate/AggregatedQueryRunner.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using OhioBox.Moranbernate.Querying; +using OhioBox.Storage.MySql.Bootstrap; namespace OhioBox.Storage.MySql.Moranbernate @@ -12,22 +13,31 @@ public interface IAggregatedQueryRunner IEnumerable> QueryAggregated(Action> query = null); } - internal class AggregatedQueryRunner : IAggregatedQueryRunner + public class AggregatedQueryRunner : IAggregatedQueryRunner where T : class, new() { - private readonly ISqlConnectionProvider _connectionProvider; + private readonly ISqlConnectionFactory _connectionFactory; private readonly IPerfLogger _perfLogger; private readonly IMetricsReporter _metricsReporter; private readonly string _space = $"Storage.Moranbernate.{typeof(T).Name}"; public AggregatedQueryRunner(ISqlConnectionFactory connectionFactory, - IPerfLogger perfLogger, - IMetricsReporter metricsReporter) + IPerfLogger perfLogger = null, + IMetricsReporter metricsReporter = null) { - _perfLogger = perfLogger; - _metricsReporter = metricsReporter; - _connectionProvider = connectionFactory.GetConnectionProvider(); + _connectionFactory = connectionFactory; + _perfLogger = perfLogger ?? new DefaultPerfLogger(); + _metricsReporter = metricsReporter ?? new DefaultMetricsReporter(); + } + + public AggregatedQueryRunner(string connectionString, + IPerfLogger perfLogger = null, + IMetricsReporter metricsReporter = null) + { + _perfLogger = perfLogger ?? new DefaultPerfLogger(); + _metricsReporter = metricsReporter ?? new DefaultMetricsReporter(); + _connectionFactory = new SqlConnectionFactory(connectionString, _metricsReporter); } public IEnumerable> QueryAggregated(Action> query = null) @@ -35,7 +45,7 @@ public IEnumerable> QueryAggregated(Action> quer try { using (_metricsReporter.Report($"{_space}.Aggregate")) - using (var connection = _connectionProvider.GetOpenConnection()) + using (var connection = _connectionFactory.GetConnection()) { return connection .QueryAggregated(q => diff --git a/src/OhioBox.Storage.MySql/Moranbernate/MoranbernateStorage.cs b/src/OhioBox.Storage.MySql/Moranbernate/MoranbernateStorage.cs index 98b1493..a3888f4 100644 --- a/src/OhioBox.Storage.MySql/Moranbernate/MoranbernateStorage.cs +++ b/src/OhioBox.Storage.MySql/Moranbernate/MoranbernateStorage.cs @@ -6,42 +6,46 @@ using System.Linq.Expressions; using OhioBox.Moranbernate.Querying; using OhioBox.Moranbernate.Utils; +using OhioBox.Storage.MySql.Bootstrap; namespace OhioBox.Storage.MySql.Moranbernate { public class MoranbernateStorage : IStorage where T : class, new() { - private readonly ISqlConnectionProvider _connectionProvider; + private readonly ISqlConnectionFactory _connectionFactory; private readonly IPerfLogger _perfLogger; private readonly IMetricsReporter _metricsReporter; private readonly string _space = $"Storage.Moranbernate.{typeof(T).Name}"; private const int QueryRuntimeThreshold = 1000; - public MoranbernateStorage(ISqlConnectionFactory connectionFactory, - IPerfLogger perfLogger, - IMetricsReporter metricsReporter) + IPerfLogger perfLogger = null, + IMetricsReporter metricsReporter = null) { - _perfLogger = perfLogger; - _metricsReporter = metricsReporter; - _connectionProvider = connectionFactory.GetConnectionProvider(); + _connectionFactory = connectionFactory; + _perfLogger = perfLogger ?? new DefaultPerfLogger(); + _metricsReporter = metricsReporter ?? new DefaultMetricsReporter(); } - public QueryResults RunQuery(Func, IQueryable> queryOverQueryable) + public MoranbernateStorage(string connectionString, + IPerfLogger perfLogger = null, + IMetricsReporter metricsReporter = null) { - throw new NotImplementedException(); + _perfLogger = perfLogger ?? new DefaultPerfLogger(); + _metricsReporter = metricsReporter ?? new DefaultMetricsReporter(); + _connectionFactory = new SqlConnectionFactory(connectionString, _metricsReporter); } public int Count(Action> queryManipulator) { using (_metricsReporter.Report($"{_space}.Count")) - using (var conn = _connectionProvider.GetOpenConnection()) + using (var conn = _connectionFactory.GetConnection()) { - var count = conn.Count(restrictable => { - if (queryManipulator != null) - queryManipulator(new MoranbernateRestrictions(restrictable)); + var count = conn.Count(restrictable => + { + queryManipulator?.Invoke(new MoranbernateRestrictions(restrictable)); }); return Convert.ToInt32(count); } @@ -52,7 +56,7 @@ public void Delete(IList ts) if (ts.Count == 0) return; using (_metricsReporter.Report($"{_space}.Delete")) - using (var conn = _connectionProvider.GetOpenConnection()) + using (var conn = _connectionFactory.GetConnection()) { foreach (var t in ts) conn.Delete(t); @@ -62,7 +66,7 @@ public void Delete(IList ts) public T GetById(object t) { using (_metricsReporter.Report($"{_space}.GetByid")) - using (var conn = _connectionProvider.GetOpenConnection()) + using (var conn = _connectionFactory.GetConnection()) { return conn.GetById(t); } @@ -82,7 +86,7 @@ public IList Query(Action> queryManipulator) public void Add(T t) { using (_metricsReporter.Report($"{_space}.Add")) - using (var conn = _connectionProvider.GetOpenConnection()) + using (var conn = _connectionFactory.GetConnection()) { conn.Insert(t); } @@ -91,7 +95,7 @@ public void Add(T t) public void Update(T t) { using (_metricsReporter.Report($"{_space}.Update")) - using (var conn = _connectionProvider.GetOpenConnection()) + using (var conn = _connectionFactory.GetConnection()) { conn.Update(t); } @@ -100,7 +104,7 @@ public void Update(T t) public void Delete(T t) { using (_metricsReporter.Report($"{_space}.Delete")) - using (var conn = _connectionProvider.GetOpenConnection()) + using (var conn = _connectionFactory.GetConnection()) { conn.Delete(t); } @@ -109,7 +113,7 @@ public void Delete(T t) public void Save(T t) { using (_metricsReporter.Report($"{_space}.Save")) - using (var conn = _connectionProvider.GetOpenConnection()) + using (var conn = _connectionFactory.GetConnection()) { conn.Upsert(t); } @@ -165,7 +169,7 @@ private TR ExecuteQuery(Func action, s var rows = 0; try { - using (var conn = _connectionProvider.GetOpenConnection()) + using (var conn = _connectionFactory.GetConnection()) { var result = action(conn); rows = result.rows; @@ -190,7 +194,7 @@ private void LogSlowQuery(long elapsedMilliseconds, int rowsReturned, string mes public void Add(IList ts) { using (_metricsReporter.Report($"{_space}.BulkInsert")) - using (var conn = _connectionProvider.GetOpenConnection()) + using (var conn = _connectionFactory.GetConnection()) { conn.BulkInsert(ts); } @@ -199,7 +203,7 @@ public void Add(IList ts) public void Save(IList ts) { using (_metricsReporter.Report($"{_space}.BulkUpsert")) - using (var conn = _connectionProvider.GetOpenConnection()) + using (var conn = _connectionFactory.GetConnection()) { conn.BulkUpsert(ts); } diff --git a/src/OhioBox.Storage.MySql/SqlConnectionFactory.cs b/src/OhioBox.Storage.MySql/SqlConnectionFactory.cs index abd3849..5f9969f 100644 --- a/src/OhioBox.Storage.MySql/SqlConnectionFactory.cs +++ b/src/OhioBox.Storage.MySql/SqlConnectionFactory.cs @@ -1,63 +1,44 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; +using System.Data; +using System.Text.RegularExpressions; +using MySql.Data.MySqlClient; +using OhioBox.Storage.MySql.Bootstrap; namespace OhioBox.Storage.MySql { public class SqlConnectionFactory : ISqlConnectionFactory { + private readonly string _connectionString; private readonly IMetricsReporter _metricsReporter; - private readonly Dictionary _typeToConnection = new Dictionary(); - private readonly List _providers = new List(); + private readonly string _schema; - public IEnumerable Providers => _providers; - - public SqlConnectionFactory(IMetricsReporter metricsReporter) + public SqlConnectionFactory(string connectionString, IMetricsReporter metricsReporter = null) { - _metricsReporter = metricsReporter; + _connectionString = connectionString; + _schema = ParseSchema(connectionString); + _metricsReporter = metricsReporter ?? new DefaultMetricsReporter(); } - public IList> GetTypeFullNameAndAonnectionString() - { - return _typeToConnection.Select(connectionProvider => new KeyValuePair(connectionProvider.Key.FullName, connectionProvider.Value.ProvideConnection().ConnectionString)).ToList(); - } - - public void Add(string connectionString, IEnumerable types) + public IDbConnection GetConnection() { - var provider = new SqlConnectionProvider(connectionString, _metricsReporter); - - _providers.Add(provider); - - foreach (var type in types) + using (_metricsReporter.Report($"Storage.OpenConnection.{_schema}")) { - _typeToConnection.Add(type, provider); + var sqlConnection = new MySqlConnection(_connectionString); + sqlConnection.Open(); + return sqlConnection; } } - public IDbConnection GetConnection() - { - var provider = InnerGetConnectionProvider(); - - var connection = provider.ProvideConnection(); - - return connection; - } - - public ISqlConnectionProvider GetConnectionProvider() + private static string ParseSchema(string connectionString) { - return InnerGetConnectionProvider(); + try + { + return Regex.Match(connectionString, "Database=(.+?);").Groups[1].Value; + } + catch + { + return "MaorWroteABadRegex"; + } } - private ISqlConnectionProvider InnerGetConnectionProvider() - { - var type = typeof(T); - var provider = _typeToConnection.GetItemOrDefault(type); - - if (provider == null) - throw new ClassHasNotBeenRegisteredException(type); - - return provider; - } } } diff --git a/src/OhioBox.Storage.MySql/SqlConnectionProvider.cs b/src/OhioBox.Storage.MySql/SqlConnectionProvider.cs deleted file mode 100644 index a4215bb..0000000 --- a/src/OhioBox.Storage.MySql/SqlConnectionProvider.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Data; -using System.Text.RegularExpressions; -using MySql.Data.MySqlClient; - -namespace OhioBox.Storage.MySql -{ - public interface ISqlConnectionProvider - { - IDbConnection ProvideConnection(); - } - - public class SqlConnectionProvider : ISqlConnectionProvider - { - private readonly string _connectionString; - private readonly IMetricsReporter _metricsReporter; - private readonly string _schema; - - public SqlConnectionProvider(string connectionString, IMetricsReporter metricsReporter) - { - if (string.IsNullOrEmpty(connectionString)) throw new ArgumentNullException(nameof(connectionString)); - - _connectionString = connectionString; - _metricsReporter = metricsReporter; - _schema = ParseSchema(_connectionString); - } - - public IDbConnection ProvideConnection() - { - using (_metricsReporter.Report($"Storage.OpenConnection.{_schema}")) - { - var sqlConnection = new MySqlConnection(_connectionString); - sqlConnection.Open(); - return sqlConnection; - } - } - - private static string ParseSchema(string connectionString) - { - try - { - return Regex.Match(connectionString, "Database=(.+?);").Groups[1].Value; - } - catch - { - return "MaorWroteABadRegex"; - } - } - } -} \ No newline at end of file diff --git a/src/OhioBox.Storage.MySql/SqlConnectionProviderExtension.cs b/src/OhioBox.Storage.MySql/SqlConnectionProviderExtension.cs deleted file mode 100644 index ccb913e..0000000 --- a/src/OhioBox.Storage.MySql/SqlConnectionProviderExtension.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Data; - -namespace OhioBox.Storage.MySql -{ - public static class SqlConnectionProviderExtension - { - public static IDbConnection GetOpenConnection(this ISqlConnectionProvider provider) - { - var connection = provider.ProvideConnection(); - return connection; - } - } -} \ No newline at end of file