· 8 years ago · Nov 30, 2017, 03:14 PM
1package old;
2
3import old.PlayerManager.User;
4import org.bukkit.Bukkit;
5import org.bukkit.configuration.file.FileConfiguration;
6import org.bukkit.entity.Player;
7
8import java.sql.*;
9
10public class Database {
11
12 private Prison plugin;
13 private Connection connection;
14
15 public Database(Prison plugin) {
16 this.plugin = plugin;
17
18 if(!init()) {
19 plugin.getLogger().severe("----------------------------------------------------");
20 plugin.getLogger().severe("MySQL Database - Connection failed.");
21 plugin.getLogger().severe("MySQL Database - Failed to initialize connection (Check Config)");
22 plugin.getLogger().severe("Nova-Prison - Plugin is now disabled");
23 plugin.getLogger().severe("----------------------------------------------------");
24 Bukkit.getPluginManager().disablePlugin(plugin);
25 }
26
27 Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> {
28 try {
29 if (connection != null && !connection.isClosed())
30 connection.createStatement().execute("/* ping */ SELECT 1");
31 } catch (SQLException e) {
32 connection = getNewConnection();
33 }
34 }, 6000, 6000);
35
36 //Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> plugin.getUserManager().getOnlineUsers().values().forEach(this::updateUser), 12000, 12000);
37
38 Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
39 @Override
40 public void run() {
41 for(Player player : Bukkit.getOnlinePlayers())
42 updateUser(plugin.getUserManager().getUser(player.getUniqueId()));
43 }
44 }, 12000, 12000);
45 }
46
47 private void updateUser(User user) {
48
49 standardQuery("UPDATE Prison_Mining SET Level = " + user.getMiningLevel() + ", XP = " + user.getMiningXP() + ", DropChance = " + user.getMiningDropChance() + ", LootBox = " + user.getMiningLootBoxChance() + " WHERE UUID = '" + user.getPlayer().getUniqueId().toString() + "'");
50 }
51
52 /**
53 * @return - Return connection to the SQL
54 * Initialise the connection to the SQL
55 */
56 protected Connection getNewConnection() {
57 FileConfiguration cf = plugin.getConfig();
58 try {
59 Class.forName("com.mysql.jdbc.Driver");
60
61 String url = "jdbc:mysql://" + cf.getString("Database.Host") + ":" + cf.getString("Database.Port") + "/" + cf.getString("Database.Database");
62 return DriverManager.getConnection(url, cf.getString("Database.Username"), cf.getString("Database.Password"));
63 } catch (SQLException | ClassNotFoundException e) {
64 e.printStackTrace();
65 plugin.getLogger().severe("----------------------------------------------------");
66 plugin.getLogger().severe("MySQL Database - Connection failed.");
67 plugin.getLogger().severe("----------------------------------------------------");
68 return null;
69 }
70 }
71
72 public boolean init() {
73 return checkConnection();
74 }
75
76 private boolean checkConnection() {
77 try {
78 if (connection == null || connection.isClosed()) {
79 connection = getNewConnection();
80
81 if (connection == null || connection.isClosed()) {
82 return false;
83 }
84 query("CREATE TABLE IF NOT EXISTS Prison_Mining (UUID VARCHAR(36), Level INT(3), XP INT(10), DropChance DOUBLE(3,2), LootBox DOUBLE(3,2), PRIMARY KEY (UUID))");
85 }
86 } catch (SQLException e) {
87 e.printStackTrace();
88 plugin.getLogger().info("Failed to check connection");
89 return false;
90 }
91
92 return true;
93 }
94
95 private boolean query(String sql) throws SQLException {
96 return connection.createStatement().execute(sql);
97 }
98
99 public void close() {
100 plugin.getUserManager().getOnlineUsers().values().forEach(this::updateUser);
101 try {
102 if (connection != null)
103 connection.close();
104 } catch (SQLException e) {
105 e.printStackTrace();
106 plugin.getLogger().severe("----------------------------------------------------");
107 plugin.getLogger().severe("");
108 plugin.getLogger().severe("MySQL Database - Failed to close connection");
109 plugin.getLogger().severe("Nova-Prison - Players data may have been lost");
110 plugin.getLogger().severe("");
111 plugin.getLogger().severe("----------------------------------------------------");
112 }
113 }
114
115 /**
116 * Main Query
117 */
118
119 private synchronized ResultSet sqlQuery(String query, Connection connection) {
120 Statement statement = null;
121 try {
122 statement = connection.createStatement();
123 } catch ( SQLException e ) {
124 plugin.getLogger().info("Failed to perform SQL Search (sqlQuery (CreateStatement))");
125 }
126 ResultSet result = null;
127 try {
128 assert statement != null;
129 result = statement.executeQuery( query );
130 } catch ( SQLException e ) {
131 plugin.getLogger().info("Failed to perform SQL Search (sqlQuery (ExecuteQuery))");
132 e.printStackTrace();
133 }
134 return result;
135 }
136
137 /**
138 * Any query which does not return a ResultSet object. Such as : INSERT,
139 * UPDATE, CREATE TABLE...
140 *
141 */
142 public void standardQuery( String query ) {
143 standardQuery( query, connection );
144 }
145
146 /**
147 * Check whether a field/entry exists in a database.
148 * @return Whether or not a result has been found in the query.
149 */
150 public boolean existanceQuery( String query ) {
151 boolean check = false;
152 try {
153 check = sqlQuery( query, connection ).next();
154 } catch (SQLException e) {
155 e.printStackTrace();
156 plugin.getLogger().info("Failed to perform SQL Search (ExistanceQuery)");
157 }
158 return check;
159 }
160
161 /**
162 * Any query which returns a ResultSet object. Such as : SELECT Remember to
163 * close the ResultSet object after you are done with it to free up
164 * resources immediately. ----- ResultSet set =
165 * sqlQuery("SELECT * FROM sometable;"); set.doSomething(); set.close();
166 * -----
167 * @return ResultSet
168 */
169 public ResultSet sqlQuery( String query ) {
170 ResultSet res;
171 res = sqlQuery( query, connection );
172 return res;
173 }
174
175 /**
176 * Check whether the table name exists.
177 */
178
179 private synchronized int standardQuery(String query, Connection connection) {
180 Statement statement;
181 int rowsUpdated = 0;
182
183 try {
184 statement = connection.createStatement();
185
186 rowsUpdated = statement.executeUpdate( query );
187
188 statement.close();
189 } catch (SQLException e) {
190 e.printStackTrace();
191 plugin.getLogger().info("Failed to perform SQL Search (Standard Query (DoubleArgs))");
192 }
193
194 return rowsUpdated;
195 }
196
197}