diff --git a/src/main/java/egovframework/com/mtdata/database/vo/DatabaseInfoVO.java b/src/main/java/egovframework/com/mtdata/database/vo/DatabaseInfoVO.java index 2e5bb8a..c4bb863 100644 --- a/src/main/java/egovframework/com/mtdata/database/vo/DatabaseInfoVO.java +++ b/src/main/java/egovframework/com/mtdata/database/vo/DatabaseInfoVO.java @@ -39,6 +39,9 @@ public class DatabaseInfoVO { /** 데이터베이스 접속PORT */ private Integer dbConnPort; + /** 데이터베이스 접속 데이터베이스 명 */ + private String dbConnDatabase; + /** 데이터베이스 접속 계정 */ private String dbConnUser; diff --git a/src/main/java/egovframework/com/mtdata/schema/service/impl/PostgreSQLSchemaViewerImpl.java b/src/main/java/egovframework/com/mtdata/schema/service/impl/PostgreSQLSchemaViewerImpl.java index 974e4d1..adb85d1 100644 --- a/src/main/java/egovframework/com/mtdata/schema/service/impl/PostgreSQLSchemaViewerImpl.java +++ b/src/main/java/egovframework/com/mtdata/schema/service/impl/PostgreSQLSchemaViewerImpl.java @@ -2,6 +2,14 @@ package egovframework.com.mtdata.schema.service.impl; import javax.annotation.Resource; +import egovframework.com.mtdata.comtsrcdata.service.ComtsrcdataService; +import egovframework.com.mtdata.comtsrcdata.vo.ComtColVO; +import egovframework.com.mtdata.comtsrcdata.vo.ComtExtrtVO; +import egovframework.com.mtdata.comtsrcdata.vo.ComtTableVO; +import egovframework.com.mtdata.comtsrcdata.vo.ComtsrcdataVO; +import egovframework.com.mtdata.database.vo.ColumnInfoVO; +import egovframework.com.mtdata.database.vo.TableInfoVO; +import org.json.simple.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; @@ -10,23 +18,210 @@ import egovframework.com.mtdata.database.service.DatabaseService; import egovframework.com.mtdata.database.vo.DatabaseInfoVO; import egovframework.com.mtdata.schema.service.DatabaseSchemaViewer; +import java.sql.*; +import java.util.HashMap; +import java.util.Map; + @Service("postgreSchemViewer") public class PostgreSQLSchemaViewerImpl implements DatabaseSchemaViewer { private static final Logger log = LoggerFactory.getLogger(PostgreSQLSchemaViewerImpl.class); - // private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; + private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; @Resource(name = "DatabaseService") private DatabaseService dbService; + @Resource(name = "ComtsrcdataService") + private ComtsrcdataService comtsrcdataService; + private String url; private String user; private String password; - private int sysDataId; - private int sysId; + private int dbConnId; + + static { + try { + Class.forName(JDBC_DRIVER); + } catch (ClassNotFoundException e) { + log.error("JDBC Driver loading error", e); + } + } @Override public void viewSchema(DatabaseInfoVO dbInfoVO) { + url = "jdbc:postgresql://" + dbInfoVO.getDbConnIp() + ":" + dbInfoVO.getDbConnPort() +"/"+ dbInfoVO.getDbConnDatabase(); + user = dbInfoVO.getDbConnUser(); + password = dbInfoVO.getDbConnPw(); + dbConnId = dbInfoVO.getDbConnId(); + try (Connection conn = DriverManager.getConnection(url, user, password)) { + processDatabases(conn, dbInfoVO); + } catch (Exception e) { + log.error("Error while connecting to the database: ", e); + } + } + + // 기관정보 스키마 + private void processDatabases(Connection conn, DatabaseInfoVO dbConnInfoVO) { + String selectDbSql = "SELECT SCHEMA_NAME AS Database FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema', 'pg_catalog') AND schema_name not like 'pg_toast%' and schema_name not like 'pg_temp%'"; + try (Statement stmt = conn.createStatement(); ResultSet databases = stmt.executeQuery(selectDbSql)) { + + // 스키마 + while (databases.next()) { + String dbNm = databases.getString("Database"); + log.info("dbName : {}", dbNm); + + DatabaseInfoVO dbVo = new DatabaseInfoVO(); + dbVo.setDbConnId(dbConnId); + dbVo.setDbNm(dbNm); + + if (dbService == null) { + log.error("dbService is null"); + } + int insertDbList = dbService.insertDbInfo(dbVo); + + if (insertDbList > 0) { + dbVo.setSysId(dbConnInfoVO.getSysId()); + tableProcess(conn, dbVo); + + log.info("Database info successfully inserted for: {}", dbNm); + } else { + log.warn("No database info was inserted for: {}", dbNm); + } + } + } catch (Exception e) { + log.error("Error processing databases", e); + } + } + + + // 기관정보 테이블+컬럼 + private void tableProcess(Connection conn, DatabaseInfoVO dbVo) throws SQLException { +// String selectTableSql = "SELECT TABLE_NAME AS `TableName` FROM information_schema.tables WHERE table_schema="+dbNm+"and table_type=`BASE TABLE`"; + DatabaseMetaData metaData = conn.getMetaData(); + try (ResultSet tables = metaData.getTables(null, dbVo.getDbNm(), null, new String[]{"TABLE"})){ + + int checkSysId = dbVo.getSysId(); + log.info("comtExInfo insert success : ", checkSysId); + + // 테이블 + while (tables.next()) { + String tbNm = tables.getString("TABLE_NAME"); + + TableInfoVO tbVo = new TableInfoVO(); + tbVo.setDbLinkId(dbVo.getDbLinkId()); + tbVo.setTableNm(tbNm); + log.info("TableName :", tbNm); + int insertTbCnt = dbService.insertDbTblInfo(tbVo); + comtsrcProcess(conn, dbVo, tbVo); + + if (insertTbCnt > 0) { + log.info("TABLE info successfully inserted for: {}", tbNm); + ResultSet columns = metaData.getColumns(null, dbVo.getDbNm(), tbNm, "%"); + ResultSet pk = metaData.getPrimaryKeys(null, dbVo.getDbNm(), tbNm); + + // 컬럼 + while (columns.next()) { + String columnName = columns.getString(4); + String columnType = columns.getString(6); + boolean nullable = columns.getInt(11) == 0 ? false : true;; + + ColumnInfoVO colVo = new ColumnInfoVO(); + colVo.setTableId(tbVo.getTableId()); + colVo.setColumnNm(columnName); + colVo.setColumnType(columnType); + colVo.setNullable(nullable); + colVo.setPkey(false); + colVo.setFkey(false); +// if(pk==columnName){ +// colVo.setIsPkey(false); +// }else{ +// colVo.setIsPkey(false); +// } + + dbService.insertTblColInfo(colVo); + System.out.println("\tColumn: " + columnName+ " (" + columnType + ")"); + } + + } else { + log.warn("No TABLE info was inserted for: {}", tbNm); + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + + // 원천데이터 처리 + private void comtsrcProcess(Connection conn, DatabaseInfoVO dbVo, TableInfoVO tbVo) throws SQLException { + try { + // [ comtextrtblinfo ] 원천데이터 추출 정보 저장 + ComtExtrtVO comExVo = new ComtExtrtVO(); + comExVo.setSysId(dbVo.getSysId()); + int extCnt = comtsrcdataService.insertComtExtrtInfo(comExVo); + + if (extCnt > 0) { + String dbNm = dbVo.getDbNm(); + String tbNm = tbVo.getTableNm(); + + // [ comtsrcdatameta_new ] 원천테이블의 테이블 정보 저장 + ComtTableVO comtTableVo = new ComtTableVO(); + comtTableVo.setExtrId(comExVo.getExtrId()); + comtTableVo.setSrcDataTblNm(tbNm); + int insertTbCnt = comtsrcdataService.insertComtTabledataInfo(comtTableVo); + + if (insertTbCnt > 0) { + String selectTableSql = "SELECT * FROM "+dbNm+"."+tbNm; + Statement stmt = conn.createStatement(); + ResultSet datas = stmt.executeQuery(selectTableSql); + ResultSetMetaData rsmd = datas.getMetaData(); + int colCnt = rsmd.getColumnCount(); + JSONObject obj = new JSONObject(); + int insertDataCnt = 0; + int insertColCnt = 0; + + // [ comtsrcdatacol_new ] 원천테이블의 컬럼 정보 저장 + for (int i=0; i 0){ + while (datas.next()){ + Map dataVlMap = new HashMap<>(); + for (int i=0; i 0){ + log.info("all data insert SUCCESS!!!!!!"); + }else{ + log.warn("No DATA was inserted for: {}", tbNm); + } + } + }else{ + log.warn("No COLUMN info was inserted for: {}", tbNm); + } + + }else{ + log.warn("No Table info was inserted for: {}", tbNm); + } + } + + } catch (Exception e) { + e.printStackTrace(); + } } } diff --git a/src/main/resources/egovframework/sqlmap/mtdata/mappers/database/DatabaseConnect_SQL.xml b/src/main/resources/egovframework/sqlmap/mtdata/mappers/database/DatabaseConnect_SQL.xml index d624b6a..c73f632 100644 --- a/src/main/resources/egovframework/sqlmap/mtdata/mappers/database/DatabaseConnect_SQL.xml +++ b/src/main/resources/egovframework/sqlmap/mtdata/mappers/database/DatabaseConnect_SQL.xml @@ -37,6 +37,7 @@ DB_CONN_PW, DB_CONN_PORT, DB_CONN_IP, + DB_CONN_DATABASE, REGISTER_ID) VALUES (#{sysId}, @@ -45,6 +46,7 @@ #{dbConnPw}, #{dbConnPort}, #{dbConnIp}, + #{dbConnDatabase}, #{registerId}) @@ -57,6 +59,7 @@ DB_CONN_PW , DB_CONN_PORT , DB_CONN_IP , + DB_CONN_DATABASE, DB_TYPE , REGIST_DATE FROM INST_DB_CONN_INFO