package org.poopki.duckdns.user_db.DB; import org.poopki.duckdns.user_db.*; import org.poopki.duckdns.user_db.Array.AccountArray; import org.poopki.duckdns.user_db.Array.FarmArray; import org.poopki.duckdns.user_db.Array.NationArray; import org.poopki.duckdns.user_db.Array.SquadArray; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.UUID; public class DBUpdate { private final String DB_DRIVER_CLASS = "org.mariadb.jdbc.Driver"; private final String DB_URL = "jdbc:mariadb://192.168.0.4:3307/mc_dev"; private final String DB_USERNAME = "mc_dev"; private final String DB_PASSWORD = "!Rkdalsrn1027"; private UserInfoArray m_InfoArrayInstance; private AccountArray m_AccountArray; private SquadArray m_SquadArray; private FarmArray m_FarmArray; private NationArray m_NationArray; UUID ZERO_UUID = new UUID(0,0); static int MAX_FARM_NUM = 13; public DBUpdate(UserInfoArray UIA, FarmArray FA, NationArray NA, SquadArray SA ,AccountArray AA){ m_InfoArrayInstance = UIA; m_AccountArray = AA; m_FarmArray = FA; m_NationArray = NA; m_SquadArray = SA; } public void InitDB() throws SQLException { // 플러그인 초기 사용 시 테이블 생성 Connection conn = null; Statement stmt; try { Class.forName("org.mariadb.jdbc.Driver"); conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); System.out.println("Connection success"); stmt = conn.createStatement(); StringBuilder sb = new StringBuilder(); String sql = sb.append("create table if not exists TechTree(") .append("UUID varchar(36) PRIMARY KEY") .append(")").toString(); stmt.execute(sql); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block System.err.println("에러 내용 :" + e.getMessage()); System.out.println("DB Connection fail"); } finally { if( conn != null && !conn.isClosed()){ conn.close(); } } } public void LoadDB() throws SQLException { //서버 초기 구동 시 DB 로드 Connection conn = null; Statement stmt; try { Class.forName("org.mariadb.jdbc.Driver"); conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); System.out.println("Connection success"); stmt = conn.createStatement(); String sql = "SELECT * FROM UserInfo"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ m_InfoArrayInstance.putUserInfo(UUID.fromString(rs.getString(1)), rs.getString(2), UUID.fromString(rs.getString(3)), UUID.fromString(rs.getString(4)), UUID.fromString(rs.getString(5)), new UUID(0,0)); m_AccountArray.putAccountInfo(UUID.fromString(rs.getString(1)),Integer.parseInt(rs.getString(6))); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block System.err.println("에러 내용 :" + e.getMessage()); System.out.println("DB Connection fail"); }finally{ if(conn != null && !conn.isClosed()){ conn.close(); } } try { Class.forName("org.mariadb.jdbc.Driver"); conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); System.out.println("Connection success"); stmt = conn.createStatement(); String sql = "SELECT * FROM Farm"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ List m_MemberList = new ArrayList<>(); for(int index = 4; index m_MemberList = new ArrayList<>(); for(int index = 4; index m_MemberList = new ArrayList<>(); for(int index = 4; index<11; index++){ if(rs.getString(index) != null){ m_MemberList.add(index-4,UUID.fromString(rs.getString(index))); } } m_SquadArray.PutGroup(UUID.fromString(rs.getString(1)), rs.getString(2), m_MemberList); m_AccountArray.putAccountInfo(UUID.fromString(rs.getString(1)),Integer.parseInt(rs.getString(3))); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block System.err.println("에러 내용 :" + e.getMessage()); System.out.println("DB Connection fail"); }finally{ if(conn != null && !conn.isClosed()){ conn.close(); } } } public void UpdateDB() throws SQLException { // 서버 종료시 DB 업데이트 Connection conn = null; PreparedStatement pstmt; // Update UserINFO try{ Class.forName("org.mariadb.jdbc.Driver"); conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); for (UUID key : m_InfoArrayInstance.getKeySet()) { String sql = "REPLACE INTO UserInfo VALUES (?,?,?,?,?,?)"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, String.valueOf(key.toString())); pstmt.setString(2, String.valueOf(m_InfoArrayInstance.getUserName(key))); pstmt.setString(3, String.valueOf(m_InfoArrayInstance.getUserGroupUUID(key, "Nation"))); pstmt.setString(4, String.valueOf(m_InfoArrayInstance.getUserGroupUUID(key, "Squad"))); pstmt.setString(5, String.valueOf(m_InfoArrayInstance.getUserGroupUUID(key, "Farm"))); pstmt.setString(6, String.valueOf(m_AccountArray.getAccountInfo(key))); int cnt = pstmt.executeUpdate(); if( cnt == 0 ){ System.out.println("[DB] 유저 데이터 입력 실패"); } else{ System.out.println("[DB] 유저 데이터 입력 성공"); } } } catch(ClassNotFoundException e){ e.printStackTrace(); } catch(SQLException e){ System.err.println("에러 내용 :" + e.getMessage()); System.out.println("DB Connection fail"); } finally { if( conn != null && !conn.isClosed()){ conn.close(); } } UpdateFarmInfo(); UpdateNationInfo(); UpdateSquadInfo(); try{ Class.forName("org.mariadb.jdbc.Driver"); conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); for (UUID key: m_NationArray.m_DeleteQueue){ String sql = "DELETE FROM TechTree WHERE UUID=?"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, String.valueOf(key.toString())); int cnt = pstmt.executeUpdate(); m_NationArray.m_DeleteQueue.remove(key); } } catch(ClassNotFoundException e){ e.printStackTrace(); } catch(SQLException e){ System.err.println("에러 내용 :" + e.getMessage()); System.out.println("DB Connection fail"); } finally { if( conn != null && !conn.isClosed()){ conn.close(); } } try{ Class.forName("org.mariadb.jdbc.Driver"); conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); for (UUID key : m_NationArray.getKeySet()) { String sql = "REPLACE INTO TechTree VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; pstmt = conn.prepareStatement(sql); int index = 2; pstmt.setString(1, String.valueOf(key.toString())); for (String Name : m_NationArray.m_NationArray.get(key).m_TechStat.keySet()){ pstmt.setString(index, String.valueOf(m_NationArray.m_NationArray.get(key).GetTechTree(Name))); index++; } int cnt = pstmt.executeUpdate(); if( cnt == 0 ){ System.out.println("[DB] 국가 데이터 입력 실패"); } else{ System.out.println("[DB] 국가 데이터 입력 성공"); } } } catch(ClassNotFoundException e){ e.printStackTrace(); } catch(SQLException e){ System.err.println("에러 내용 :" + e.getMessage()); System.out.println("DB Connection fail"); } finally { if( conn != null && !conn.isClosed()){ conn.close(); } } } public void UpdateFarmInfo(){ try{ Class.forName("org.mariadb.jdbc.Driver"); Connection conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); for (UUID key: m_FarmArray.m_DeleteQueue){ String sql = "DELETE FROM Farm WHERE Farm_UUID=?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, String.valueOf(key.toString())); int cnt = pstmt.executeUpdate(); m_FarmArray.m_DeleteQueue.remove(key); } if( conn != null && !conn.isClosed()){ conn.close(); } } catch(ClassNotFoundException e){ e.printStackTrace(); } catch(SQLException e){ System.err.println("에러 내용 :" + e.getMessage()); System.out.println("DB Connection fail"); } try{ Class.forName("org.mariadb.jdbc.Driver"); Connection conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); for (UUID key : m_FarmArray.getKeySet()) { String sql = "REPLACE INTO Farm SET "; String sql_A = "FARM_UUID='"+String.valueOf(key.toString())+"', NAME='"+String.valueOf(m_FarmArray.GetGroupName(key))+"', Account='"+String.valueOf(m_AccountArray.getAccountInfo(key))+"',"; String sql_B = ""; int index=1; for (UUID MemUUID : m_FarmArray.GetGroupMembersUUID(key)){ sql_B = sql_B + "MEMBER"+String.valueOf(index)+"_UUID='"+String.valueOf(MemUUID.toString())+"',"; index++; } sql_B = sql_B.substring(0,sql_B.length()-1); sql = sql+sql_A+sql_B; PreparedStatement pstmt = conn.prepareStatement(sql); int cnt = pstmt.executeUpdate(); if( cnt == 0 ){ System.out.println("[DB] 분대 데이터 입력 실패"); } else{ System.out.println("[DB] 분대 데이터 입력 성공"); } } if( conn != null && !conn.isClosed()){ conn.close(); } } catch(ClassNotFoundException e){ e.printStackTrace(); } catch(SQLException e){ System.err.println("에러 내용 :" + e.getMessage()); System.out.println("DB Connection fail"); } } public void UpdateNationInfo(){ try{ Class.forName("org.mariadb.jdbc.Driver"); Connection conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); for (UUID key: m_NationArray.m_DeleteQueue){ String sql = "DELETE FROM Nation WHERE Nation_UUID=?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, String.valueOf(key.toString())); int cnt = pstmt.executeUpdate(); m_NationArray.m_DeleteQueue.remove(key); } if( conn != null && !conn.isClosed()){ conn.close(); } } catch(ClassNotFoundException e){ e.printStackTrace(); } catch(SQLException e){ System.err.println("에러 내용 :" + e.getMessage()); System.out.println("DB Connection fail"); } try{ Class.forName("org.mariadb.jdbc.Driver"); Connection conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); for (UUID key : m_NationArray.getKeySet()) { String sql = "REPLACE INTO Nation SET "; String sql_A = "NATION_UUID='"+String.valueOf(key.toString())+"', NAME='"+String.valueOf(m_NationArray.GetGroupName(key))+"', Account='"+String.valueOf(m_AccountArray.getAccountInfo(key))+"',"; String sql_B = ""; int index=1; for (UUID MemUUID : m_NationArray.GetGroupMembersUUID(key)){ sql_B = sql_B + "MEMBER"+String.valueOf(index)+"_UUID='"+String.valueOf(MemUUID.toString())+"',"; index++; } sql_B = sql_B.substring(0,sql_B.length()-1); sql = sql+sql_A+sql_B; PreparedStatement pstmt = conn.prepareStatement(sql); int cnt = pstmt.executeUpdate(); if( cnt == 0 ){ System.out.println("[DB] 분대 데이터 입력 실패"); } else{ System.out.println("[DB] 분대 데이터 입력 성공"); } } if( conn != null && !conn.isClosed()){ conn.close(); } } catch(ClassNotFoundException e){ e.printStackTrace(); } catch(SQLException e){ System.err.println("에러 내용 :" + e.getMessage()); System.out.println("DB Connection fail"); } } public void UpdateSquadInfo(){ try{ Class.forName("org.mariadb.jdbc.Driver"); Connection conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); for (UUID key: m_SquadArray.m_DeleteQueue){ String sql = "DELETE FROM Squad WHERE Squad_UUID=?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, String.valueOf(key.toString())); int cnt = pstmt.executeUpdate(); m_SquadArray.m_DeleteQueue.remove(key); } if( conn != null && !conn.isClosed()){ conn.close(); } } catch(ClassNotFoundException e){ e.printStackTrace(); } catch(SQLException e){ System.err.println("에러 내용 :" + e.getMessage()); System.out.println("DB Connection fail"); } try{ Class.forName("org.mariadb.jdbc.Driver"); Connection conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); for (UUID key : m_SquadArray.getKeySet()) { String sql = "REPLACE INTO Squad SET "; String sql_A = "Squad_UUID='"+String.valueOf(key.toString())+"', NAME='"+String.valueOf(m_SquadArray.GetGroupName(key))+"', Account='"+String.valueOf(m_AccountArray.getAccountInfo(key))+"',"; String sql_B = ""; int index=1; for (UUID MemUUID : m_SquadArray.GetGroupMembersUUID(key)){ sql_B = sql_B + "MEMBER"+String.valueOf(index)+"_UUID='"+String.valueOf(MemUUID.toString())+"',"; index++; } sql_B = sql_B.substring(0,sql_B.length()-1); sql = sql+sql_A+sql_B; PreparedStatement pstmt = conn.prepareStatement(sql); int cnt = pstmt.executeUpdate(); if( cnt == 0 ){ System.out.println("[DB] 분대 데이터 입력 실패"); } else{ System.out.println("[DB] 분대 데이터 입력 성공"); } } if( conn != null && !conn.isClosed()){ conn.close(); } } catch(ClassNotFoundException e){ e.printStackTrace(); } catch(SQLException e){ System.err.println("에러 내용 :" + e.getMessage()); System.out.println("DB Connection fail"); } } }