69 lines
2.6 KiB
C#
69 lines
2.6 KiB
C#
|
using System.Collections.Concurrent;
|
|||
|
using System.Data;
|
|||
|
using MesETL.Shared.Helper;
|
|||
|
using Microsoft.Extensions.Configuration;
|
|||
|
using Microsoft.Extensions.Hosting;
|
|||
|
|
|||
|
var host = Host.CreateApplicationBuilder(args);
|
|||
|
host.Configuration.AddCommandLine(args, new Dictionary<string, string>
|
|||
|
{
|
|||
|
{ "-s", "ConnectionString" },
|
|||
|
{ "--ConnectionString", "ConnectionString" },
|
|||
|
{ "-B", "Databases" },
|
|||
|
{ "--Databases", "Databases" },
|
|||
|
{ "-a", "All" }
|
|||
|
});
|
|||
|
host.Build();
|
|||
|
var connStr = host.Configuration.GetValue<string>("ConnectionString") ?? throw new ApplicationException("没有配置数据库连接字符串");
|
|||
|
var databases = host.Configuration.GetValue<string>("Databases")?.Split(',').ToList() ?? throw new ApplicationException("没有配置数据库");
|
|||
|
var all = host.Configuration.GetValue<bool>("All");
|
|||
|
|
|||
|
if (args.Length > 1 && args[0] == "count")
|
|||
|
{
|
|||
|
var result =await CountDatabasesAsync(connStr, databases);
|
|||
|
if (all)
|
|||
|
{
|
|||
|
foreach (var (k, v) in result)
|
|||
|
{
|
|||
|
Console.WriteLine(k + ":");
|
|||
|
Console.WriteLine(v.Select(pair => new { TABLE_NAME = pair.Key, COUNT = pair.Value }).ToMarkdownTable());
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
var allCount = result.Aggregate(new Dictionary<string, long>(), (dict, pair) =>
|
|||
|
{
|
|||
|
foreach (var (k, v) in pair.Value)
|
|||
|
{
|
|||
|
dict.AddOrUpdate(k, v, (key, num) => num + v);
|
|||
|
}
|
|||
|
return dict;
|
|||
|
});
|
|||
|
Console.WriteLine(allCount.Select(pair => new { TABLE_NAME = pair.Key, COUNT = pair.Value }).ToMarkdownTable());
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
async Task<IDictionary<string, IDictionary<string,long>>> CountDatabasesAsync(string connStr, IList<string> dbNames, CancellationToken cancellationToken = default)
|
|||
|
{
|
|||
|
var result = new ConcurrentDictionary<string, IDictionary<string,long>>();
|
|||
|
var tables = await DatabaseHelper.QueryTableAsync(connStr,
|
|||
|
$"""
|
|||
|
SELECT TABLE_NAME FROM information_schema.`TABLES` WHERE TABLE_SCHEMA = '{dbNames[0]}';
|
|||
|
""");
|
|||
|
|
|||
|
await Parallel.ForEachAsync(dbNames, async (dbName, ct) =>
|
|||
|
{
|
|||
|
await Parallel.ForEachAsync(tables.Tables[0].Rows.Cast<DataRow>(), async (row, ct) =>
|
|||
|
{
|
|||
|
var tableName = row[0].ToString()!;
|
|||
|
var count = (long)(await DatabaseHelper.QueryScalarAsync(connStr,
|
|||
|
$"SELECT COUNT(1) FROM `{dbName}`.`{tableName}`;", ct))!;
|
|||
|
result.AddOrUpdate(dbName, new ConcurrentDictionary<string, long>(), (db, dict) =>
|
|||
|
{
|
|||
|
dict.AddOrUpdate(tableName, count, (table, num) => num + count);
|
|||
|
return dict;
|
|||
|
});
|
|||
|
});
|
|||
|
});
|
|||
|
return result;
|
|||
|
}
|