55import com .tencent .supersonic .headless .api .pojo .enums .FieldType ;
66import com .tencent .supersonic .headless .core .pojo .ConnectInfo ;
77import lombok .extern .slf4j .Slf4j ;
8+ import org .apache .commons .lang3 .StringUtils ;
89
9- import java .sql .Connection ;
10- import java .sql .DatabaseMetaData ;
11- import java .sql .DriverManager ;
12- import java .sql .ResultSet ;
13- import java .sql .SQLException ;
10+ import java .sql .*;
1411import java .util .ArrayList ;
1512import java .util .List ;
13+ import java .util .Properties ;
1614
1715@ Slf4j
1816public abstract class BaseDbAdaptor implements DbAdaptor {
1917
2018 @ Override
2119 public List <String > getCatalogs (ConnectInfo connectInfo ) throws SQLException {
22- // Apart from supporting multiple catalog types of data sources, other types will return an
23- // empty set by default.
24- return List .of ();
20+ List <String > catalogs = Lists .newArrayList ();
21+ try (Connection con = getConnection (connectInfo );
22+ Statement st = con .createStatement ();
23+ ResultSet rs = st .executeQuery ("SHOW CATALOGS" )) {
24+ while (rs .next ()) {
25+ catalogs .add (rs .getString (1 ));
26+ }
27+ }
28+ return catalogs ;
2529 }
2630
2731 public List <String > getDBs (ConnectInfo connectionInfo , String catalog ) throws SQLException {
@@ -32,38 +36,49 @@ public List<String> getDBs(ConnectInfo connectionInfo, String catalog) throws SQ
3236
3337 protected List <String > getDBs (ConnectInfo connectionInfo ) throws SQLException {
3438 List <String > dbs = Lists .newArrayList ();
35- DatabaseMetaData metaData = getDatabaseMetaData (connectionInfo );
3639 try {
37- ResultSet schemaSet = metaData .getSchemas ();
38- while (schemaSet .next ()) {
39- String db = schemaSet .getString ("TABLE_SCHEM" );
40- dbs .add (db );
40+ try (ResultSet schemaSet = getDatabaseMetaData (connectionInfo ).getSchemas ()) {
41+ while (schemaSet .next ()) {
42+ String db = schemaSet .getString ("TABLE_SCHEM" );
43+ dbs .add (db );
44+ }
4145 }
4246 } catch (Exception e ) {
43- log .info ("get meta schemas failed, try to get catalogs" );
47+ log .warn ("get meta schemas failed" , e );
48+ log .warn ("get meta schemas failed, try to get catalogs" );
4449 }
4550 try {
46- ResultSet catalogSet = metaData .getCatalogs ();
47- while (catalogSet .next ()) {
48- String db = catalogSet .getString ("TABLE_CAT" );
49- dbs .add (db );
51+ try (ResultSet catalogSet = getDatabaseMetaData (connectionInfo ).getCatalogs ()) {
52+ while (catalogSet .next ()) {
53+ String db = catalogSet .getString ("TABLE_CAT" );
54+ dbs .add (db );
55+ }
5056 }
5157 } catch (Exception e ) {
52- log .info ("get meta catalogs failed, try to get schemas" );
58+ log .warn ("get meta catalogs failed" , e );
59+ log .warn ("get meta catalogs failed, try to get schemas" );
5360 }
5461 return dbs ;
5562 }
5663
57- public List <String > getTables (ConnectInfo connectionInfo , String schemaName )
64+ @ Override
65+ public List <String > getTables (ConnectInfo connectInfo , String catalog , String schemaName )
66+ throws SQLException {
67+ // Except for special types implemented separately, the generic logic catalog does not take
68+ // effect.
69+ return getTables (connectInfo , schemaName );
70+ }
71+
72+ protected List <String > getTables (ConnectInfo connectionInfo , String schemaName )
5873 throws SQLException {
5974 List <String > tablesAndViews = new ArrayList <>();
60- DatabaseMetaData metaData = getDatabaseMetaData (connectionInfo );
6175
6276 try {
63- ResultSet resultSet = getResultSet (schemaName , metaData );
64- while (resultSet .next ()) {
65- String name = resultSet .getString ("TABLE_NAME" );
66- tablesAndViews .add (name );
77+ try (ResultSet resultSet = getResultSet (schemaName , getDatabaseMetaData (connectionInfo ))) {
78+ while (resultSet .next ()) {
79+ String name = resultSet .getString ("TABLE_NAME" );
80+ tablesAndViews .add (name );
81+ }
6782 }
6883 } catch (SQLException e ) {
6984 log .error ("Failed to get tables and views" , e );
@@ -76,27 +91,34 @@ protected ResultSet getResultSet(String schemaName, DatabaseMetaData metaData)
7691 return metaData .getTables (schemaName , schemaName , null , new String [] {"TABLE" , "VIEW" });
7792 }
7893
79- public List <DBColumn > getColumns (ConnectInfo connectInfo , String schemaName , String tableName )
94+
95+
96+ public List <DBColumn > getColumns (ConnectInfo connectInfo , String catalog , String schemaName , String tableName )
8097 throws SQLException {
81- List <DBColumn > dbColumns = Lists .newArrayList ();
82- DatabaseMetaData metaData = getDatabaseMetaData (connectInfo );
83- ResultSet columns = metaData .getColumns (schemaName , schemaName , tableName , null );
84- while (columns .next ()) {
85- String columnName = columns .getString ("COLUMN_NAME" );
86- String dataType = columns .getString ("TYPE_NAME" );
87- String remarks = columns .getString ("REMARKS" );
88- FieldType fieldType = classifyColumnType (dataType );
89- dbColumns .add (new DBColumn (columnName , dataType , remarks , fieldType ));
98+ List <DBColumn > dbColumns = new ArrayList <>();
99+ // 确保连接会自动关闭
100+ try (ResultSet columns = getDatabaseMetaData (connectInfo ).getColumns (catalog , schemaName , tableName , null )) {
101+ while (columns .next ()) {
102+ String columnName = columns .getString ("COLUMN_NAME" );
103+ String dataType = columns .getString ("TYPE_NAME" );
104+ String remarks = columns .getString ("REMARKS" );
105+ FieldType fieldType = classifyColumnType (dataType );
106+ dbColumns .add (new DBColumn (columnName , dataType , remarks , fieldType ));
107+ }
90108 }
91109 return dbColumns ;
92110 }
93111
94112 protected DatabaseMetaData getDatabaseMetaData (ConnectInfo connectionInfo ) throws SQLException {
95- Connection connection = DriverManager .getConnection (connectionInfo .getUrl (),
96- connectionInfo .getUserName (), connectionInfo .getPassword ());
113+ Connection connection = getConnection (connectionInfo );
97114 return connection .getMetaData ();
98115 }
99116
117+ public Connection getConnection (ConnectInfo connectionInfo ) throws SQLException {
118+ final Properties properties = getProperties (connectionInfo );
119+ return DriverManager .getConnection (connectionInfo .getUrl (), properties );
120+ }
121+
100122 public FieldType classifyColumnType (String typeName ) {
101123 switch (typeName .toUpperCase ()) {
102124 case "INT" :
@@ -118,4 +140,24 @@ public FieldType classifyColumnType(String typeName) {
118140 }
119141 }
120142
143+ public Properties getProperties (ConnectInfo connectionInfo ) {
144+ final Properties properties = new Properties ();
145+ String url = connectionInfo .getUrl ().toLowerCase ();
146+
147+ // 设置通用属性
148+ properties .setProperty ("user" , connectionInfo .getUserName ());
149+
150+ // 针对 Presto 和 Trino ssl=false 的情况,不需要设置密码
151+ if (url .startsWith ("jdbc:presto" ) || url .startsWith ("jdbc:trino" )) {
152+ // 检查是否需要处理 SSL
153+ if (!url .contains ("ssl=false" )) {
154+ properties .setProperty ("password" , connectionInfo .getPassword ());
155+ }
156+ } else {
157+ // 针对其他数据库类型
158+ properties .setProperty ("password" , connectionInfo .getPassword ());
159+ }
160+
161+ return properties ;
162+ }
121163}
0 commit comments