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