diff --git a/src/ShardingCore/ShardingCoreExtension.cs b/src/ShardingCore/ShardingCoreExtension.cs index 101a28a7..a76e8ca9 100644 --- a/src/ShardingCore/ShardingCoreExtension.cs +++ b/src/ShardingCore/ShardingCoreExtension.cs @@ -230,7 +230,7 @@ namespace ShardingCore services.TryAddSingleton(); services.TryAddSingleton(); - services.TryAddSingleton(); + services.TryAddSingleton(); services.TryAddShardingJob(); return services; diff --git a/src/ShardingCore/TableExists/GuessTableEnsureManager.cs b/src/ShardingCore/TableExists/GuessTableEnsureManager.cs new file mode 100644 index 00000000..a46a7540 --- /dev/null +++ b/src/ShardingCore/TableExists/GuessTableEnsureManager.cs @@ -0,0 +1,55 @@ +using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions; +using ShardingCore.TableExists.Abstractions; +using System; +using System.Collections.Generic; +using System.Data.Common; + +namespace ShardingCore.TableExists +{ + public class GuessTableEnsureManager : AbstractTableEnsureManager + { + private readonly MySqlTableEnsureManager _tem_mysql; + private readonly SqliteTableEnsureManager _tem_sqlite; + private readonly PostgreSqlTableEnsureManager _tem_pgsql; + private readonly SqlServerTableEnsureManager _tem_mssql; + + public GuessTableEnsureManager(IRouteTailFactory routeTailFactory) : base(routeTailFactory) + { + _tem_mysql = new MySqlTableEnsureManager(routeTailFactory); + _tem_sqlite = new SqliteTableEnsureManager(routeTailFactory); + _tem_pgsql = new PostgreSqlTableEnsureManager(routeTailFactory); + _tem_mssql = new SqlServerTableEnsureManager(routeTailFactory); + } + + public override ISet DoGetExistTables(DbConnection connection, string dataSourceName) + { + ISet result = new HashSet(StringComparer.OrdinalIgnoreCase); + var dbctypename = connection.GetType().FullName; + switch (dbctypename) + { + case "Npgsql.NpgsqlConnection": + result = _tem_pgsql.DoGetExistTables(connection, dataSourceName); + break; + + case "System.Data.Sqlite.SqliteConnection": + case "Microsoft.Data.Sqlite.SqliteConnection": + result = _tem_sqlite.DoGetExistTables(connection, dataSourceName); + break; + + case "MySqlConnector.MySqlConnection": + case "MySql.Data.MySqlClient.MySqlConnection": + result = _tem_mysql.DoGetExistTables(connection, dataSourceName); + break; + + case "Microsoft.Data.SqlClient.SqlConnection": + case "System.Data.SqlClient.SqlConnection": + result = _tem_mssql.DoGetExistTables(connection, dataSourceName); + break; + + default: + break; + } + return result; + } + } +} \ No newline at end of file diff --git a/src/ShardingCore/TableExists/PostgreSqlTableEnsureManager.cs b/src/ShardingCore/TableExists/PostgreSqlTableEnsureManager.cs new file mode 100644 index 00000000..c3f803e3 --- /dev/null +++ b/src/ShardingCore/TableExists/PostgreSqlTableEnsureManager.cs @@ -0,0 +1,31 @@ +using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions; +using ShardingCore.TableExists.Abstractions; +using System; +using System.Collections.Generic; +using System.Data.Common; + +namespace ShardingCore.TableExists +{ + public class PostgreSqlTableEnsureManager : AbstractTableEnsureManager + { + public PostgreSqlTableEnsureManager(IRouteTailFactory routeTailFactory) : base(routeTailFactory) + { + } + + private const string Tables = "Tables"; + private const string TABLE_NAME = "TABLE_NAME"; + + public override ISet DoGetExistTables(DbConnection connection, string dataSourceName) + { + ISet result = new HashSet(StringComparer.OrdinalIgnoreCase); + using (var dataTable = connection.GetSchema(Tables)) + { + for (int i = 0; i < dataTable.Rows.Count; i++) + { + result.Add(dataTable.Rows[i][TABLE_NAME].ToString()); + } + } + return result; + } + } +} \ No newline at end of file diff --git a/src/ShardingCore/TableExists/SqliteTableEnsureManager.cs b/src/ShardingCore/TableExists/SqliteTableEnsureManager.cs new file mode 100644 index 00000000..71969b59 --- /dev/null +++ b/src/ShardingCore/TableExists/SqliteTableEnsureManager.cs @@ -0,0 +1,33 @@ +using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions; +using ShardingCore.TableExists.Abstractions; +using System; +using System.Collections.Generic; +using System.Data.Common; + +namespace ShardingCore.TableExists +{ + public class SqliteTableEnsureManager : AbstractTableEnsureManager + { + public SqliteTableEnsureManager(IRouteTailFactory routeTailFactory) : base(routeTailFactory) + { + } + + public override ISet DoGetExistTables(DbConnection connection, string dataSourceName) + { + ISet result = new HashSet(StringComparer.OrdinalIgnoreCase); + using (var query = connection.CreateCommand()) + { + query.CommandText = "SELECT tbl_name FROM sqlite_master;"; + using (var reader = query.ExecuteReader()) + { + while (reader.Read()) + { + var str = (string)reader["tbl_name"]; + result.Add(str); + } + } + } + return result; + } + } +} \ No newline at end of file