44
55public class Program
66{
7+ private static readonly HashSet < string > _databases = [ "mysql" , "postgresql" , "sqlite" ] ;
8+ private static readonly HashSet < string > _types = [ "reads" , "writes" ] ;
9+
710 public static async Task Main ( string [ ] args )
811 {
9- using var loggerFactory = LoggerFactory . Create ( builder =>
10- {
11- builder
12- . AddConsole ( )
13- . SetMinimumLevel ( LogLevel . Information ) ;
14- } ) ;
12+ var rootCommand = new RootCommand ( "Run benchmarks" ) ;
13+
14+ var databaseOption = GetDatabaseOption ( ) ;
15+ rootCommand . AddOption ( databaseOption ) ;
16+
17+ var typeOption = GetTypeOption ( ) ;
18+ rootCommand . AddOption ( typeOption ) ;
1519
16- var rootCommand = new RootCommand ( "Run database benchmarks" ) ;
17- var databaseOption = new Option < string > (
20+ rootCommand . SetHandler ( CommandHandler , databaseOption , typeOption ) ;
21+ await rootCommand . InvokeAsync ( args ) ;
22+ }
23+
24+ private static Option < string > GetDatabaseOption ( )
25+ {
26+ var option = new Option < string > (
1827 "--database" ,
1928 "Database to benchmark (mysql, postgresql, or sqlite)" )
2029 {
2130 IsRequired = true
2231 } ;
23- databaseOption . AddValidator ( result =>
32+ option . AddValidator ( result =>
2433 {
25- var value = result . GetValueForOption ( databaseOption ) ;
26- if ( value != null && value != "mysql" && value != "postgresql" && value != "sqlite" )
27- {
28- result . ErrorMessage = $ "Invalid database: { value } . Must be one of: mysql, postgresql, sqlite";
29- }
34+ var value = result . GetValueForOption ( option ) ;
35+ if ( value != null && ! _databases . Contains ( value ) )
36+ result . ErrorMessage = $ "Invalid database: { value } . Must be one of: { string . Join ( ", " , _databases ) } ";
3037 } ) ;
31- rootCommand . AddOption ( databaseOption ) ;
38+ return option ;
39+ }
3240
33- rootCommand . SetHandler ( async ( database ) =>
41+ private static Option < string > GetTypeOption ( )
42+ {
43+ var option = new Option < string > (
44+ "--type" ,
45+ $ "Type of benchmark to run ({ string . Join ( ", " , _types ) } )")
3446 {
35- switch ( database )
36- {
37- case "mysql" :
38- var mysqlRunner = new MysqlRunner (
39- Config . GetMysqlConnectionString ( ) ,
40- loggerFactory . CreateLogger < MysqlRunner > ( ) ) ;
41- await mysqlRunner . RunAsync ( ) ;
42- break ;
43- case "postgresql" :
44- var postgresqlRunner = new PostgresqlRunner (
45- Config . GetPostgresConnectionString ( ) ,
46- loggerFactory . CreateLogger < PostgresqlRunner > ( ) ) ;
47- await postgresqlRunner . RunAsync ( ) ;
48- break ;
49- case "sqlite" :
50- var sqliteRunner = new SqliteRunner (
51- Config . GetSqliteConnectionString ( ) ,
52- loggerFactory . CreateLogger < SqliteRunner > ( ) ) ;
53- await sqliteRunner . RunAsync ( ) ;
54- break ;
55- default :
56- throw new ArgumentException ( $ "Invalid database: { database } ") ;
57- }
58- } , databaseOption ) ;
47+ IsRequired = true
48+ } ;
49+ option . AddValidator ( result =>
50+ {
51+ var value = result . GetValueForOption ( option ) ;
52+ if ( value != null && ! _types . Contains ( value ) )
53+ result . ErrorMessage = $ "Invalid type: { value } . Must be one of: { string . Join ( ", " , _types ) } ";
54+ } ) ;
55+ return option ;
56+ }
57+ private static async Task CommandHandler ( string database , string type )
58+ {
59+ using var loggerFactory = LoggerFactory . Create ( builder =>
60+ builder
61+ . AddConsole ( )
62+ . SetMinimumLevel ( LogLevel . Information ) ) ;
5963
60- await rootCommand . InvokeAsync ( args ) ;
64+ var mysqlRunner = new MysqlRunner (
65+ Config . GetMysqlConnectionString ( ) ,
66+ loggerFactory . CreateLogger < MysqlRunner > ( ) ) ;
67+ var postgresqlRunner = new PostgresqlRunner (
68+ Config . GetPostgresConnectionString ( ) ,
69+ loggerFactory . CreateLogger < PostgresqlRunner > ( ) ) ;
70+ var sqliteRunner = new SqliteRunner (
71+ Config . GetSqliteConnectionString ( ) ,
72+ loggerFactory . CreateLogger < SqliteRunner > ( ) ) ;
73+
74+ switch ( database , type )
75+ {
76+ case ( "mysql" , "read" ) :
77+ await mysqlRunner . RunReadsAsync ( ) ;
78+ break ;
79+ case ( "mysql" , "write" ) :
80+ await mysqlRunner . RunWritesAsync ( ) ;
81+ break ;
82+ case ( "postgresql" , "read" ) :
83+ await postgresqlRunner . RunReadsAsync ( ) ;
84+ break ;
85+ case ( "postgresql" , "write" ) :
86+ await postgresqlRunner . RunWritesAsync ( ) ;
87+ break ;
88+ case ( "sqlite" , "read" ) :
89+ await sqliteRunner . RunReadsAsync ( ) ;
90+ break ;
91+ case ( "sqlite" , "write" ) :
92+ await sqliteRunner . RunWritesAsync ( ) ;
93+ break ;
94+ default :
95+ throw new ArgumentException ( $ "Invalid database - { database } , type - { type } ") ;
96+ }
6197 }
6298}
0 commit comments