· 6 years ago · Sep 10, 2019, 12:00 AM
1package info.nickgs.machines.database.DAO;
2
3import info.nickgs.machines.MachinesPlugin;
4import info.nickgs.machines.constants.DropType;
5import info.nickgs.machines.handlers.MachineHandler;
6import info.nickgs.machines.objects.machines.DropMachine;
7import info.nickgs.machines.objects.machines.GuiMachine;
8import info.nickgs.machines.objects.models.PlacedMachine;
9import info.nickgs.machines.utils.StringUtils;
10import org.bukkit.Bukkit;
11import org.bukkit.Location;
12
13import java.sql.*;
14import java.text.DecimalFormat;
15import java.util.HashMap;
16
17public class MachineDAO {
18
19 public static void setupTable() {
20 try {
21 Statement stmt = MachinesPlugin.getConnectionFactory().getConnection().createStatement();
22 String sql = "CREATE TABLE IF NOT EXISTS machine " +
23 "(id INTEGER PRIMARY KEY AUTOINCREMENT," +
24 " config_id VARCHAR NOT NULL, " +
25 " x INT NOT NULL, " +
26 " y INT NOT NULL, " +
27 " z INT NOT NULL, " +
28 " world VARCHAR NOT NULL, " +
29 " type VARCHAR NOT NULL," +
30 " owner VARCHAR NOT NULL, " +
31 " stack INT NOT NULL, " +
32 " max_stack INT NOT NULL, " +
33 " speed_level INT NOT NULL, " +
34 " capacity_level INT NOT NULL, " +
35 " stored_drops UNSIGNED BIGINT NOT NULL, " +
36 " stored_fuel INT NOT NULL);";
37 stmt.executeUpdate(sql);
38 stmt.close();
39 } catch (SQLException e) {
40 e.printStackTrace();
41 }
42 }
43
44 public static int insertMachine(PlacedMachine placedMachine) {
45 try {
46 String sql = "INSERT INTO machine (config_id, x, y, z, world, type, owner, stack, max_stack, speed_level, capacity_level, stored_drops, stored_fuel) " +
47 "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
48 PreparedStatement stmt = MachinesPlugin.getConnectionFactory().getConnection().prepareStatement(sql);
49 stmt.setString(1, placedMachine.getModel().getInternalId());
50 stmt.setInt(2, placedMachine.getPosition().getBlockX());
51 stmt.setInt(3, placedMachine.getPosition().getBlockY());
52 stmt.setInt(4, placedMachine.getPosition().getBlockZ());
53 stmt.setString(5, placedMachine.getPosition().getWorld().getName());
54 stmt.setString(6, placedMachine.getModel().getDropType().name());
55 stmt.setString(7, placedMachine.getOwner());
56 stmt.setInt(8, placedMachine.getStack());
57 stmt.setInt(9, placedMachine.getMaxStack());
58 stmt.setInt(10, placedMachine.getSpeedLevel());
59 stmt.setInt(11, placedMachine.getCapacityLevel());
60 stmt.setLong(12, placedMachine.getStoredDrops());
61 stmt.setInt(13, placedMachine.getStoredFuel());
62
63 stmt.executeUpdate();
64
65 stmt.getGeneratedKeys().next();
66 stmt.close();
67 return stmt.getGeneratedKeys().getInt("last_insert_rowid()");
68 } catch (SQLException e) {
69 e.printStackTrace();
70 }
71 return -1;
72 }
73
74 public static void removeMachine(Integer machineId) {
75 try {
76 String sql = "DELETE FROM machine WHERE id=?;";
77 PreparedStatement stmt = MachinesPlugin.getConnectionFactory().getConnection().prepareStatement(sql);
78 stmt.setInt(1, machineId);
79
80 stmt.executeUpdate();
81
82 stmt.close();
83 } catch (SQLException e) {
84 e.printStackTrace();
85 }
86 }
87
88 public static void updateMachine(PlacedMachine placedMachine) {
89 try {
90 String sql = "UPDATE machine SET speed_level = ?, capacity_level = ?, stored_drops = ?, stored_fuel = ?, stack = ? WHERE id=?;";
91 PreparedStatement stmt = MachinesPlugin.getConnectionFactory().getConnection().prepareStatement(sql);
92 stmt.setInt(1, placedMachine.getSpeedLevel());
93 stmt.setInt(2, placedMachine.getCapacityLevel());
94 stmt.setLong(3, placedMachine.getStoredDrops());
95 stmt.setInt(4, placedMachine.getStoredFuel());
96 stmt.setInt(5, placedMachine.getStack());
97 stmt.setInt(6, placedMachine.getDbId());
98
99 stmt.executeUpdate();
100
101 stmt.close();
102 } catch (SQLException e) {
103 e.printStackTrace();
104 }
105 }
106
107 public static HashMap<Integer, PlacedMachine> getMachines() {
108 HashMap<Integer, PlacedMachine> machines = new HashMap<>();
109 try {
110 Connection connection = MachinesPlugin.getConnectionFactory().getConnection();
111
112 Statement stmt = connection.createStatement();
113 ResultSet resultSet = stmt.executeQuery("SELECT Count(*) AS count FROM machine;");
114 resultSet.next();
115 Bukkit.broadcastMessage(StringUtils.convertColors("&6[Machines] &aReiniciando carregamento das máquinas..."));
116 Bukkit.broadcastMessage(StringUtils.convertColors("&6[Machines] &a0.0%"));
117 int total = resultSet.getInt("count");
118 for(int i = 0; i < (total / 50000) + 1; i ++) {
119 machines.putAll(getMachinesInRange(i * 50000, (i+1) * 50000));
120 Bukkit.broadcastMessage(StringUtils.convertColors("&6[Machines] &a" + (((i + 1) / (((total / 50000) + 1) * 1.0))*100) + "%"));
121 }
122 Bukkit.broadcastMessage(StringUtils.convertColors("&6[Machines] &aCarregamento terminado! (" + machines.size() + " máquinas carregadas)"));
123 } catch (SQLException e) {
124 e.printStackTrace();
125 }
126 return machines;
127 }
128
129 private static HashMap<Integer, PlacedMachine> getMachinesInRange(int start, int end) {
130 HashMap<Integer, PlacedMachine> machines = new HashMap<>();
131 try {
132 Connection connection = MachinesPlugin.getConnectionFactory().getConnection();
133
134 PreparedStatement stmt = connection.prepareStatement("SELECT * FROM machine LIMIT ?, ?;");
135 stmt.setInt(1, start);
136 stmt.setInt(2, end);
137
138 ResultSet resultSet = stmt.executeQuery();
139 while(resultSet.next()) {
140 DropType dropType = DropType.getByName(resultSet.getString("type"));
141
142 PlacedMachine placedMachine = dropType == DropType.WORLD ?
143 new DropMachine(MachinesPlugin.getMachineHandler().getModelById(resultSet.getString("config_id")),
144 new Location(Bukkit.getWorld(resultSet.getString("world")), resultSet.getInt("x"), resultSet.getInt("y"), resultSet.getInt("z")),
145 resultSet.getString("owner")) :
146 new GuiMachine(MachinesPlugin.getMachineHandler().getModelById(resultSet.getString("config_id")),
147 new Location(Bukkit.getWorld(resultSet.getString("world")), resultSet.getInt("x"), resultSet.getInt("y"), resultSet.getInt("z")),
148 resultSet.getString("owner"));
149 placedMachine.setDbId(resultSet.getInt("id"));
150 placedMachine.setCapacityLevel(resultSet.getInt("capacity_level"));
151 placedMachine.setSpeedLevel(resultSet.getInt("speed_level"));
152 placedMachine.setStoredFuel(resultSet.getInt("stored_fuel"));
153 placedMachine.setStoredDrops(resultSet.getLong("stored_drops"));
154 placedMachine.setStack(resultSet.getInt("stack"));
155 placedMachine.setMaxStack(resultSet.getInt("max_stack"));
156 placedMachine.removeChangedFlag();
157 machines.put(placedMachine.getDbId(), placedMachine);
158 }
159 } catch (SQLException e) {
160 e.printStackTrace();
161 }
162 return machines;
163 }
164
165 public static HashMap<String, Integer> getMachinesCount() {
166 HashMap<String, Integer> machineCount = new HashMap<>();
167 try {
168 Connection connection = MachinesPlugin.getConnectionFactory().getConnection();
169
170 PreparedStatement stmt = connection.prepareStatement("SELECT config_id, SUM(stack) as occurrences FROM machine GROUP BY config_id;");
171
172 ResultSet resultSet = stmt.executeQuery();
173 while(resultSet.next()) {
174 machineCount.put(resultSet.getString("config_id"), resultSet.getInt("occurrences"));
175 }
176 } catch (SQLException e) {
177 e.printStackTrace();
178 }
179 return machineCount;
180 }
181}