using System.Collections.Concurrent; using System.Data; using MesETL.Shared.Helper; namespace Mesdb.Cli; public static class BatchDbExtensions { public static async Task>> CountDatabasesAsync(string connStr, IList dbNames, CancellationToken cancellationToken = default) { var result = new ConcurrentDictionary>(); 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(), 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(), (db, dict) => { dict.AddOrUpdate(tableName, count, (table, num) => num + count); return dict; }); }); }); return result; } public static async Task AnalyzeAllAsync(string connStr, IList dbNames) { 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(), async (row, ct) => { var tableName = row[0].ToString()!; var result = (await DatabaseHelper.QueryTableAsync(connStr, $"ANALYZE TABLE `{dbName}`.`{tableName}`;", ct)); Console.WriteLine(string.Join('\t', result.Tables[0].Rows[0].ItemArray.Select(x => x.ToString()))); }); }); } }