· 5 years ago · Feb 02, 2020, 01:50 AM
1
2import com.zaxxer.hikari.HikariConfig;
3import com.zaxxer.hikari.HikariDataSource;
4import fr.epicminions.Main;
5import fr.epicminions.minion.Minion;
6import fr.epicminions.utils.User;
7import fr.epicminions.utils.Utils;
8import org.bukkit.Bukkit;
9import org.bukkit.ChatColor;
10import org.bukkit.scheduler.BukkitRunnable;
11
12import java.io.Console;
13import java.sql.*;
14import java.util.HashMap;
15import java.util.Map;
16import java.util.UUID;
17
18public class MySQLdatabase {
19
20 private Map<UUID,String> cache = new HashMap<>();
21 private HikariDataSource hikari;
22 private Main main;
23 public boolean mysqlDisconnected = false;
24
25 public MySQLdatabase(Main main) {
26 this.main = main;
27 }
28
29 public MySQLdatabase setup(){
30 try {
31 HikariConfig config = new HikariConfig();
32 config.setJdbcUrl("jdbc:mysql://"+Utils.colorize((String) Utils.gfc("config", "ip"))+":"+Utils.gfc("config", "root")+"/"+Utils.colorize((String) Utils.gfc("config", "database")));
33 config.setUsername(Utils.colorize((String) Utils.gfc("config", "user")));
34 config.setPassword(Utils.colorize((String) Utils.gfc("config", "password")));
35 config.addDataSourceProperty("cachePrepStmts", "true");
36 config.addDataSourceProperty("prepStmtCachSize", "250");
37 config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
38 config.setDriverClassName("com.mysql.jdbc.Driver");
39 hikari = new HikariDataSource(config);
40 Bukkit.getConsoleSender().sendMessage(ChatColor.GREEN + "MySQL Connect: " + "It's OK ! EpicMinion will use MySQL");
41 } catch (Exception e) {
42 Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "MySQL Connect Error: " + "Connection to database has failed !");
43 e.printStackTrace();
44 }
45 createTable();
46 return this;
47 }
48
49 /**
50 * Create table database
51 */
52 public void createTable(){
53 try(Connection connection = hikari.getConnection();
54 Statement statement = connection.createStatement()){
55 statement.executeUpdate("CREATE TABLE IF NOT EXISTS Minions(UUID varchar(36), minion varchar(36),PRIMARY KEY(UUID))");
56 } catch (SQLException e) {
57 e.printStackTrace();
58 }
59 }
60
61 //register
62 private final String INSERT = "INSERT INTO Minions(uuid,minion) VALUES(?,?) ON DUPLICATE KEY UPDATE uuid=?";
63
64 //set
65 private final String UPDATE = "UPDATE Minions SET minion=? WHERE uuid=?";
66
67 //get
68 private final String SELECT = "SELECT Minions.minion FROM Minions WHERE uuid=?";
69
70
71 public Connection startConnection(){
72 Connection connection = null;
73 if(mysqlDisconnected){
74 return connection;
75 }
76 try {
77 connection = hikari.getConnection();
78 if(connection == null) {
79 mysqlDisconnected = true;
80 return connection;
81 }
82 return connection;
83
84 } catch(SQLException e) {
85 Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "Error: MySQL disconnected. ");
86 mysqlDisconnected = true;
87 e.printStackTrace();
88 }
89 return null;
90 }
91
92
93 public void saveInAsync(UUID uuid) {
94 try(Connection connection = startConnection(); PreparedStatement preparedStatement = connection.prepareStatement(SELECT)) {
95 preparedStatement.setString(1,uuid.toString());
96 ResultSet resultSet = preparedStatement.executeQuery();
97 if(resultSet.next()) {
98 String minion = resultSet.getString("minion");
99 if(!minion.equalsIgnoreCase("null")) {
100 cache.put(uuid, minion);
101 }
102 }
103 resultSet.close();
104 } catch(SQLException e) {
105 e.printStackTrace();
106 }
107 }
108
109 /**
110 *
111 */
112 public void setMinionBack(UUID uuid) {
113 User user = User.getUser(uuid);
114 if(!cache.containsKey(uuid)) return;
115 String minionName = cache.get(uuid);
116 Minion minion = main.getMinions().get(minionName);
117 minion.spawn(user);
118 }
119
120
121 /**
122 * Sauvegarder dans la base de donnée
123 * @param uuid
124 */
125 public void saveOutAsync(UUID uuid) {
126 try(Connection connection = startConnection(); PreparedStatement preparedStatement = connection.prepareStatement(SELECT)) {
127 preparedStatement.setString(1, uuid.toString());
128
129 ResultSet resultSet = preparedStatement.executeQuery();
130 if (resultSet.next()) {
131 PreparedStatement updateStat = connection.prepareStatement(UPDATE);
132
133 if (User.getUsers().containsKey(uuid) && User.getUsers().get(uuid).getMinion() != null) {
134 String minion = User.getUser(uuid).getMinion().getName();
135 if (minion.equalsIgnoreCase(cache.get(uuid))) {
136 preparedStatement.close();
137 resultSet.close();
138 return;
139 }
140 updateStat.setString(1, minion);
141 updateStat.setString(2, uuid.toString());
142 updateStat.execute();
143 updateStat.close();
144 } else {
145 if (cache.containsKey(uuid)) {
146 updateStat.setString(1, "null");
147 updateStat.setString(2, uuid.toString());
148 updateStat.execute();
149 updateStat.close();
150 }
151 }
152 } else {
153 if (User.getUsers().containsKey(uuid) && User.getUsers().get(uuid).getMinion() != null) {
154 String minion = User.getUser(uuid).getMinion().getName();
155 PreparedStatement insertStat = connection.prepareStatement(INSERT);
156 insertStat.setString(1, uuid.toString());
157 insertStat.setString(2, minion);
158 insertStat.setString(3, uuid.toString());
159 insertStat.execute();
160 insertStat.close();
161 }
162 }
163 cache.remove(uuid);
164 resultSet.close();
165 } catch (SQLException e) {
166 e.printStackTrace();
167 }
168 }
169}