@@ -29,7 +29,7 @@ pub enum Commands {
2929 /// The ggsql query to execute
3030 query : String ,
3131
32- /// Data source connection string (duckdb://, sqlite://)
32+ /// Data source connection string (duckdb://, sqlite://, odbc:// )
3333 #[ arg( long, default_value = "duckdb://memory" ) ]
3434 reader : String ,
3535
@@ -51,7 +51,7 @@ pub enum Commands {
5151 /// Path to .sql file containing ggsql query
5252 file : PathBuf ,
5353
54- /// Data source connection string (duckdb://, sqlite://)
54+ /// Data source connection string (duckdb://, sqlite://, odbc:// )
5555 #[ arg( long, default_value = "duckdb://memory" ) ]
5656 reader : String ,
5757
@@ -184,6 +184,23 @@ fn cmd_exec(query: String, reader: String, writer: String, output: Option<PathBu
184184 eprintln ! ( "SQLite reader not compiled in. Rebuild with --features sqlite" ) ;
185185 std:: process:: exit ( 1 ) ;
186186 }
187+ } else if reader. starts_with ( "odbc://" ) {
188+ #[ cfg( feature = "odbc" ) ]
189+ {
190+ let r = match ggsql:: reader:: OdbcReader :: from_connection_string ( & reader) {
191+ Ok ( r) => r,
192+ Err ( e) => {
193+ eprintln ! ( "Failed to create reader: {}" , e) ;
194+ std:: process:: exit ( 1 ) ;
195+ }
196+ } ;
197+ exec_with_reader ( & query, & r, & writer, output, verbose) ;
198+ }
199+ #[ cfg( not( feature = "odbc" ) ) ]
200+ {
201+ eprintln ! ( "ODBC reader not compiled in. Rebuild with --features odbc" ) ;
202+ std:: process:: exit ( 1 ) ;
203+ }
187204 } else if reader. starts_with ( "postgres://" ) || reader. starts_with ( "postgresql://" ) {
188205 eprintln ! ( "PostgreSQL reader is not yet implemented" ) ;
189206 std:: process:: exit ( 1 ) ;
0 commit comments