· 6 years ago · Jul 04, 2019, 10:20 PM
1package io.github.sasuke.clans.clans.data;
2
3import io.github.sasuke.clans.clans.util.concurrency.AsyncTask;
4import org.bukkit.Bukkit;
5
6import java.sql.Connection;
7import java.sql.PreparedStatement;
8import java.sql.ResultSet;
9import java.util.*;
10import java.util.concurrent.ConcurrentHashMap;
11
12import static io.github.sasuke.clans.clans.util.serializers.Serializations.*;
13
14public class ClanStorage {
15
16
17 private Connection connection;
18 private Map<Clan, OperationType> prepared;
19
20 public ClanStorage(Connection connection) {
21 this.connection = connection;
22 this.prepared = new ConcurrentHashMap<>();
23 }
24
25
26 public void createClansTable() {
27 String query = "CREATE TABLE IF NOT EXISTS katon_clans " +
28 "(" +
29 "uniqueId VARCHAR(64) NOT NULL, " +
30 "name VARCHAR(16) NOT NULL, " +
31 "members LONGTEXT NOT NULL, " +
32 "relations LONGTEXT NOT NULL" +
33 ")";
34
35 try {
36 connection.prepareStatement(query).executeUpdate();
37 Bukkit.getConsoleSender().sendMessage("§aTabela de Clans Criadas.");
38 }catch (Exception e){
39 e.printStackTrace();
40 }
41 }
42
43 private void createClan(Clan clan) {
44 String query = "insert into katon_clans " +
45 "(uniqueId , name , tag , members , relations) " +
46 "VALUES (? , ? , ? , ? , ?)";
47
48 try (PreparedStatement statement = connection.prepareStatement(query)) {
49
50 statement.setString(1, clan.getUniqueId().toString());
51 statement.setString(2, clan.getName());
52 statement.setString(3, clan.getTag());
53 statement.setString(4, toJson(clan.getMembers()));
54 statement.setString(5, toJson(clan.getRelations()));
55
56 statement.executeUpdate();
57 } catch (Exception e) {
58 e.printStackTrace();
59 }
60 }
61
62 private void updateClan(Clan clan) {
63 String query = "UPDATE katon_clans SET name = ? , tag = ? , members = ? , relations = ? " +
64 "WHERE uniqueId = ?";
65
66 try (PreparedStatement statement = connection.prepareStatement(query)) {
67
68 statement.setString(1, clan.getName());
69 statement.setString(2, clan.getTag());
70 statement.setString(3, toJson(clan.getMembers()));
71 statement.setString(4, toJson(clan.getRelations()));
72 statement.setString(5, clan.getUniqueId().toString());
73
74 } catch (Exception e) {
75 e.printStackTrace();
76 }
77 }
78
79 private void deleteClan(Clan clan) {
80
81 String query = "DELETE * FROM katon_clans WHERE uniqueId = ?";
82
83 try (PreparedStatement statement = connection.prepareStatement(query)) {
84
85 statement.setString(1, clan.getUniqueId().toString());
86 statement.executeUpdate();
87
88
89 } catch (Exception e) {
90 e.printStackTrace();
91 }
92 }
93
94 public void executeOne(Clan clan) {
95 AsyncTask.execute(() -> processOperation(clan));
96 }
97
98 public void executeAll() {
99 AsyncTask.execute(() -> {
100
101 Set<Clan> clans = prepared.keySet();
102 clans.forEach(this::processOperation);
103
104 });
105 }
106
107 public ClanRegistry loadAll(){
108
109 ClanRegistry clanRegistry = new ClanRegistry();
110
111 String query = "SELECT * FROM katon_clans";
112
113 try(PreparedStatement statement = connection.prepareStatement(query)){
114
115 ResultSet resultSet = statement.executeQuery();
116 while(resultSet.next()){
117
118 Clan clan = new Clan(resultSet);
119 clanRegistry.add(clan);
120
121 }
122
123 }catch (Exception e){
124 e.printStackTrace();
125 }
126
127 return clanRegistry;
128 }
129
130 public Clan getClan(UUID uniqueId){
131 try {
132 return AsyncTask.getAsync(() -> searchClan(uniqueId));
133 }catch (Exception e){
134 return null;
135 }
136 }
137
138 private Clan searchClan(UUID uniqueId){
139 String query = "SELECT * FROM katon_clans WHERE uniqueId = ?";
140 try (PreparedStatement statement = connection.prepareStatement(query)) {
141
142 ResultSet resultSet = statement.executeQuery();
143 return new Clan(resultSet);
144 } catch (Exception e) {
145 return null;
146 }
147 }
148
149 public void processOperation(Clan clan) {
150 OperationType preparedOperation = this.getPreparedOperation(clan);
151
152 switch (preparedOperation) {
153 case CREATE:
154 createClan(clan);
155 case UPDATE:
156 updateClan(clan);
157 case DELETE:
158 deleteClan(clan);
159 case NONE:
160 default:
161 break;
162 }
163
164 if (prepared.containsKey(clan)) {
165 prepared.remove(clan);
166 }
167
168 }
169
170 public OperationType getPreparedOperation(Clan clan) {
171 return prepared.getOrDefault(clan, OperationType.NONE);
172 }
173
174 public void prepareOperation(Clan clan, OperationType operationType) {
175 this.prepared.put(clan, operationType);
176 }
177
178 public Map<Clan, OperationType> getPreparedMap() {
179 return prepared;
180 }
181
182 public enum OperationType {
183
184 CREATE, DELETE, UPDATE, NONE;
185
186 }
187}