Merge pull request #192 from maikebing/main

实现 PostgreSQL、Sqlite、以及 根据 DbConnection的类型自动猜测TableEnsureManager
This commit is contained in:
xuejmnet 2022-09-28 17:03:29 +08:00 committed by GitHub
commit c528a4a83c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 120 additions and 1 deletions

View File

@ -230,7 +230,7 @@ namespace ShardingCore
services.TryAddSingleton<IShardingReadWriteManager, ShardingReadWriteManager>();
services.TryAddSingleton<IShardingComparer, CSharpLanguageShardingComparer>();
services.TryAddSingleton<ITableEnsureManager, EmptyTableEnsureManager>();
services.TryAddSingleton<ITableEnsureManager, GuessTableEnsureManager>();
services.TryAddShardingJob();
return services;

View File

@ -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<string> DoGetExistTables(DbConnection connection, string dataSourceName)
{
ISet<string> result = new HashSet<string>(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;
}
}
}

View File

@ -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<string> DoGetExistTables(DbConnection connection, string dataSourceName)
{
ISet<string> result = new HashSet<string>(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;
}
}
}

View File

@ -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<string> DoGetExistTables(DbConnection connection, string dataSourceName)
{
ISet<string> result = new HashSet<string>(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;
}
}
}