|
@@ -5,6 +5,7 @@ import fr.insa.clavardator.chat.Message;
|
5
|
5
|
import fr.insa.clavardator.users.CurrentUser;
|
6
|
6
|
import fr.insa.clavardator.users.User;
|
7
|
7
|
import fr.insa.clavardator.users.UserInformation;
|
|
8
|
+import fr.insa.clavardator.util.ErrorCallback;
|
8
|
9
|
import fr.insa.clavardator.util.Log;
|
9
|
10
|
import org.intellij.lang.annotations.Language;
|
10
|
11
|
import org.jetbrains.annotations.Nullable;
|
|
@@ -21,7 +22,7 @@ public class DatabaseController {
|
21
|
22
|
}
|
22
|
23
|
|
23
|
24
|
public DatabaseController(boolean test) {
|
24
|
|
- if(test) {
|
|
25
|
+ if (test) {
|
25
|
26
|
connectToTestDb();
|
26
|
27
|
} else {
|
27
|
28
|
connect();
|
|
@@ -31,20 +32,22 @@ public class DatabaseController {
|
31
|
32
|
/**
|
32
|
33
|
* Connects to the main database
|
33
|
34
|
*/
|
34
|
|
- public void connect() {
|
|
35
|
+ private void connect() {
|
35
|
36
|
connectToDatabase("clavardator");
|
36
|
37
|
}
|
37
|
38
|
|
38
|
39
|
/**
|
39
|
40
|
* Connects to the test database.
|
40
|
|
- * @implNote DO NOT USE OUTSIDE OF TESTS
|
|
41
|
+ *
|
|
42
|
+ * @implNote DO NOT USE OUTSIDE OF TESTS
|
41
|
43
|
*/
|
42
|
|
- public void connectToTestDb() {
|
|
44
|
+ private void connectToTestDb() {
|
43
|
45
|
connectToDatabase("clavardator_test");
|
44
|
46
|
}
|
45
|
47
|
|
46
|
48
|
/**
|
47
|
49
|
* Connects to the database of the given name
|
|
50
|
+ *
|
48
|
51
|
* @param dbName The database to connect to
|
49
|
52
|
*/
|
50
|
53
|
private void connectToDatabase(String dbName) {
|
|
@@ -69,127 +72,121 @@ public class DatabaseController {
|
69
|
72
|
}
|
70
|
73
|
|
71
|
74
|
/**
|
72
|
|
- * Executes a simple update statement
|
73
|
|
- *
|
74
|
|
- * @param sqlQuery The query to execute
|
75
|
|
- * @throws SQLException SQL error
|
76
|
|
- */
|
77
|
|
- private void executeUpdate(@Language("SQL") String sqlQuery) throws SQLException {
|
78
|
|
- Statement statement = connection.createStatement();
|
79
|
|
- final int rowsModified = statement.executeUpdate(sqlQuery);
|
80
|
|
- Log.v(getClass().getSimpleName(), rowsModified + " rows modified");
|
81
|
|
- statement.close();
|
82
|
|
- }
|
83
|
|
-
|
84
|
|
- /**
|
85
|
75
|
* Creates the table used to store messages
|
86
|
|
- * @throws SQLException SQL error
|
|
76
|
+ *
|
|
77
|
+ * @param callback The function to call on success
|
|
78
|
+ * @param errorCallback The function to call on error
|
87
|
79
|
*/
|
88
|
|
- private void createMessageTable() throws SQLException {
|
89
|
|
- Log.v(getClass().getSimpleName(), "Creating table message...");
|
90
|
|
- executeUpdate("CREATE TABLE IF NOT EXISTS message " +
|
|
80
|
+ private void createMessageTable(@Nullable DatabaseController.UpdateCallback callback, ErrorCallback errorCallback) {
|
|
81
|
+ @Language("SQL") String sql = "CREATE TABLE IF NOT EXISTS message " +
|
91
|
82
|
"(id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +
|
92
|
83
|
" timestamp DATETIME NOT NULL, " +
|
93
|
84
|
" sender INTEGER UNSIGNED NOT NULL, " +
|
94
|
85
|
" recipient INTEGER UNSIGNED NOT NULL, " +
|
95
|
86
|
" text TEXT, " +
|
96
|
|
- " file_path TEXT)");
|
|
87
|
+ " file_path TEXT)";
|
|
88
|
+
|
|
89
|
+ Log.v(getClass().getSimpleName(), "Creating table message...");
|
|
90
|
+ UpdateExecutor executor = new UpdateExecutor(sql, callback, errorCallback);
|
|
91
|
+ executor.start();
|
97
|
92
|
}
|
98
|
93
|
|
99
|
94
|
/**
|
100
|
95
|
* Creates the table used to store users
|
101
|
|
- * @throws SQLException SQL error
|
|
96
|
+ *
|
|
97
|
+ * @param callback The function to call on success
|
|
98
|
+ * @param errorCallback The function to call on error
|
102
|
99
|
*/
|
103
|
|
- private void createUserTable() throws SQLException {
|
104
|
|
- Log.v(getClass().getSimpleName(), "Creating table user...");
|
105
|
|
- executeUpdate("CREATE TABLE IF NOT EXISTS user " +
|
|
100
|
+ private void createUserTable(@Nullable DatabaseController.UpdateCallback callback, ErrorCallback errorCallback) {
|
|
101
|
+ @Language("SQL") String sql = "CREATE TABLE IF NOT EXISTS user " +
|
106
|
102
|
"(id INTEGER UNSIGNED PRIMARY KEY NOT NULL," +
|
107
|
|
- " username TINYTEXT NULLABLE )");
|
|
103
|
+ " username TINYTEXT NULLABLE )";
|
|
104
|
+
|
|
105
|
+ Log.v(getClass().getSimpleName(), "Creating table user...");
|
|
106
|
+ UpdateExecutor executor = new UpdateExecutor(sql, callback, errorCallback);
|
|
107
|
+ executor.start();
|
108
|
108
|
}
|
109
|
109
|
|
110
|
110
|
/**
|
111
|
111
|
* Creates all needed tables if non-existent
|
|
112
|
+ *
|
|
113
|
+ * @param callback The function to call on success
|
|
114
|
+ * @param errorCallback The function to call on error
|
112
|
115
|
*/
|
113
|
|
- public void init(@Nullable FinishCallback callback) {
|
114
|
|
- try {
|
115
|
|
- createMessageTable();
|
116
|
|
- createUserTable();
|
117
|
|
- if (callback != null) {
|
118
|
|
- callback.onFinish();
|
119
|
|
- }
|
120
|
|
- } catch (SQLException e) {
|
121
|
|
- e.printStackTrace();
|
122
|
|
- }
|
|
116
|
+ public void initTables(@Nullable DatabaseController.UpdateCallback callback, ErrorCallback errorCallback) {
|
|
117
|
+ createMessageTable(() -> createUserTable(callback, errorCallback), errorCallback);
|
123
|
118
|
}
|
124
|
119
|
|
125
|
120
|
/**
|
126
|
121
|
* Destroys the message table
|
127
|
|
- * @throws SQLException SQL error
|
|
122
|
+ *
|
|
123
|
+ * @param callback The function to call on success
|
|
124
|
+ * @param errorCallback The function to call on error
|
128
|
125
|
*/
|
129
|
|
- private void dropMessageTable() throws SQLException {
|
|
126
|
+ private void dropMessageTable(@Nullable DatabaseController.UpdateCallback callback, ErrorCallback errorCallback) {
|
|
127
|
+ @Language("SQL") String sql = "DROP TABLE IF EXISTS message";
|
130
|
128
|
Log.v(getClass().getSimpleName(), "Dropping table message...");
|
131
|
|
- executeUpdate("DROP TABLE IF EXISTS message");
|
|
129
|
+ UpdateExecutor executor = new UpdateExecutor(sql, callback, errorCallback);
|
|
130
|
+ executor.start();
|
132
|
131
|
}
|
133
|
132
|
|
134
|
133
|
/**
|
135
|
134
|
* Destroys the user table
|
136
|
|
- * @throws SQLException SQL error
|
|
135
|
+ *
|
|
136
|
+ * @param callback The function to call on success
|
|
137
|
+ * @param errorCallback The function to call on error
|
137
|
138
|
*/
|
138
|
|
- private void dropUserTable() throws SQLException {
|
|
139
|
+ private void dropUserTable(@Nullable DatabaseController.UpdateCallback callback, ErrorCallback errorCallback) {
|
|
140
|
+ @Language("SQL") String sql = "DROP TABLE IF EXISTS user";
|
139
|
141
|
Log.v(getClass().getSimpleName(), "Dropping table user...");
|
140
|
|
- executeUpdate("DROP TABLE IF EXISTS user");
|
|
142
|
+ UpdateExecutor executor = new UpdateExecutor(sql, callback, errorCallback);
|
|
143
|
+ executor.start();
|
141
|
144
|
}
|
142
|
145
|
|
143
|
146
|
/**
|
144
|
147
|
* Destroys all tables
|
|
148
|
+ *
|
|
149
|
+ * @param callback The function to call on success
|
|
150
|
+ * @param errorCallback The function to call on error
|
145
|
151
|
*/
|
146
|
|
- private void dropTables() {
|
147
|
|
- try {
|
148
|
|
- dropMessageTable();
|
149
|
|
- dropUserTable();
|
150
|
|
- } catch (SQLException e) {
|
151
|
|
- e.printStackTrace();
|
152
|
|
- }
|
|
152
|
+ private void dropTables(@Nullable DatabaseController.UpdateCallback callback, ErrorCallback errorCallback) {
|
|
153
|
+ dropMessageTable(() -> dropUserTable(callback, errorCallback), errorCallback);
|
153
|
154
|
}
|
154
|
155
|
|
155
|
156
|
/**
|
156
|
157
|
* Destroys and recreates all tables
|
|
158
|
+ *
|
|
159
|
+ * @param callback The function to call on success
|
|
160
|
+ * @param errorCallback The function to call on error
|
157
|
161
|
*/
|
158
|
|
- public void resetTables() {
|
159
|
|
- dropTables();
|
160
|
|
- init(null);
|
|
162
|
+ public void resetTables(@Nullable DatabaseController.UpdateCallback callback, ErrorCallback errorCallback) {
|
|
163
|
+ dropTables(() -> initTables(callback, errorCallback), errorCallback);
|
161
|
164
|
}
|
162
|
165
|
|
163
|
166
|
|
164
|
167
|
/**
|
165
|
168
|
* Fetches the list of users for which we already have a chat history
|
166
|
169
|
*
|
167
|
|
- * @param callback Function called when the request is done
|
|
170
|
+ * @param callback Function called when the request is done
|
|
171
|
+ * @param errorCallback The function to call on error
|
168
|
172
|
*/
|
169
|
|
- public void getAllUsers(UsersCallback callback) {
|
170
|
|
- try {
|
171
|
|
- Statement stmt = connection.createStatement();
|
172
|
|
- String sql = "SELECT * FROM user WHERE id != " + CurrentUser.getInstance().getId();
|
|
173
|
+ public void getAllUsers(UsersCallback callback, ErrorCallback errorCallback) {
|
|
174
|
+ @Language("SQL") String sql = "SELECT * FROM user WHERE id != " + CurrentUser.getInstance().getId();
|
173
|
175
|
|
174
|
|
- Log.v(getClass().getSimpleName(), "Fetching users from db... ");
|
175
|
|
- ResultSet res = stmt.executeQuery(sql);
|
|
176
|
+ Log.v(getClass().getSimpleName(), "Fetching users from db... ");
|
176
|
177
|
|
|
178
|
+ QueryExecutor executor = new QueryExecutor(sql, res -> {
|
177
|
179
|
ArrayList<User> userList = new ArrayList<>();
|
178
|
180
|
while (res.next()) {
|
179
|
181
|
int id = res.getInt("id");
|
180
|
182
|
String username = res.getString("username");
|
181
|
183
|
userList.add(new User(id, username));
|
182
|
184
|
}
|
183
|
|
- Log.v(getClass().getSimpleName(), userList.size() + " rows fetched");
|
184
|
|
- res.close();
|
185
|
|
- stmt.close();
|
|
185
|
+ Log.v(getClass().getSimpleName(), userList.size() + " users fetched");
|
186
|
186
|
|
187
|
|
- if (callback != null) {
|
188
|
|
- callback.onUsersFetched(userList);
|
189
|
|
- }
|
190
|
|
- } catch (SQLException e) {
|
191
|
|
- e.printStackTrace();
|
192
|
|
- }
|
|
187
|
+ callback.onUsersFetched(userList);
|
|
188
|
+ }, errorCallback);
|
|
189
|
+ executor.start();
|
193
|
190
|
}
|
194
|
191
|
|
195
|
192
|
|
|
@@ -197,33 +194,37 @@ public class DatabaseController {
|
197
|
194
|
* Adds a message to the database for this user.
|
198
|
195
|
* If the user does not exist, we create it.
|
199
|
196
|
*
|
200
|
|
- * @param message The message to add to the database
|
201
|
|
- * @param callback Function called when the request is done
|
|
197
|
+ * @param message The message to add to the database
|
|
198
|
+ * @param callback Function called when the request is done
|
|
199
|
+ * @param errorCallback The function to call on error
|
202
|
200
|
*/
|
203
|
|
- public void addMessage(Message message, FinishCallback callback) {
|
204
|
|
- try {
|
|
201
|
+ public void addMessage(Message message, @Nullable DatabaseController.UpdateCallback callback, ErrorCallback errorCallback) {
|
|
202
|
+ // Insert the correspondent if not already in the database
|
|
203
|
+ Log.v(getClass().getSimpleName(), "Inserting correpondent into db... ");
|
|
204
|
+ addUser(message.getCorrespondent(), () -> {
|
|
205
|
+
|
|
206
|
+ // Handle messages containing a file
|
|
207
|
+ String filePath = "NULL";
|
205
|
208
|
// TODO: Handle messages containing files:
|
206
|
209
|
// store file in file system and put the path in filePath
|
207
|
|
- String filePath = "NULL";
|
208
|
210
|
if (message instanceof FileMessage) {
|
209
|
211
|
Log.w(getClass().getSimpleName(), "Functionality not implemented: file has not been saved");
|
210
|
212
|
// filePath = ((FileMessage) message).getFileName();
|
211
|
213
|
}
|
212
|
214
|
|
213
|
|
- // Insert the new message
|
214
|
|
- Log.v(getClass().getSimpleName(), "Inserting message into db... ");
|
215
|
|
-
|
|
215
|
+ // TODO: do this in the construction of the message instead?
|
216
|
216
|
int recipientId;
|
217
|
217
|
int senderId;
|
218
|
|
- if (CurrentUser.getInstance().isLocalId(message.getRecipient().id)) {
|
219
|
|
- recipientId = CurrentUser.getInstance().getId();
|
220
|
|
- senderId = message.getSender().id;
|
221
|
|
- } else {
|
222
|
|
- senderId = CurrentUser.getInstance().getId();
|
223
|
|
- recipientId = message.getRecipient().id;
|
224
|
|
- }
|
|
218
|
+// if (CurrentUser.getInstance().isLocalId(message.getRecipient().id)) {
|
|
219
|
+// recipientId = CurrentUser.getInstance().getId();
|
|
220
|
+ senderId = message.getSender().id;
|
|
221
|
+// } else {
|
|
222
|
+// senderId = CurrentUser.getInstance().getId();
|
|
223
|
+ recipientId = message.getRecipient().id;
|
|
224
|
+// }
|
225
|
225
|
|
226
|
|
- executeUpdate("INSERT INTO message " +
|
|
226
|
+ // Insert the new message
|
|
227
|
+ @Language("SQL") String sql = "INSERT INTO message " +
|
227
|
228
|
"(timestamp, sender, recipient, text, file_path) " +
|
228
|
229
|
"VALUES (" +
|
229
|
230
|
message.getDate().getTime() + ", " +
|
|
@@ -231,73 +232,57 @@ public class DatabaseController {
|
231
|
232
|
recipientId + ", " +
|
232
|
233
|
"\"" + message.getText() + "\", " +
|
233
|
234
|
filePath +
|
234
|
|
- ")");
|
235
|
|
-
|
236
|
|
- Log.v(getClass().getSimpleName(), "Inserting correspondent into db... ");
|
237
|
|
- addUser(message.getCorrespondent());
|
238
|
|
-
|
239
|
|
-
|
240
|
|
- if (callback != null) {
|
241
|
|
- callback.onFinish();
|
242
|
|
- }
|
243
|
|
- } catch (SQLException e) {
|
244
|
|
- e.printStackTrace();
|
245
|
|
- }
|
246
|
|
- }
|
|
235
|
+ ")";
|
|
236
|
+ Log.v(getClass().getSimpleName(), "Inserting message into db... ");
|
|
237
|
+ UpdateExecutor executor = new UpdateExecutor(sql, callback, errorCallback);
|
|
238
|
+ executor.start();
|
247
|
239
|
|
248
|
|
- public void addUser(UserInformation user) {
|
249
|
|
- addUser(user, null);
|
|
240
|
+ }, errorCallback);
|
250
|
241
|
}
|
251
|
242
|
|
252
|
243
|
/**
|
253
|
244
|
* Inserts the given user if not existing
|
254
|
245
|
*
|
255
|
|
- * @param user The user information to store
|
|
246
|
+ * @param user The user information to store
|
|
247
|
+ * @param callback The function to call on success
|
|
248
|
+ * @param errorCallback The function to call on error
|
256
|
249
|
*/
|
257
|
|
- public void addUser(UserInformation user, @Nullable FinishCallback callback) {
|
258
|
|
- try {
|
259
|
|
- Log.v(getClass().getSimpleName(), "Adding user to db: " + user.id + " / " + user.getUsername());
|
260
|
|
- if (user.getUsername() != null) {
|
261
|
|
- executeUpdate("INSERT OR IGNORE INTO user " +
|
262
|
|
- "(id, username) " +
|
263
|
|
- "VALUES (" + user.id + ", \"" + user.getUsername() + "\")");
|
264
|
|
- } else {
|
265
|
|
- executeUpdate("INSERT OR IGNORE INTO user " +
|
266
|
|
- "(id) " +
|
267
|
|
- "VALUES (" + user.id + ")");
|
268
|
|
- }
|
269
|
|
-
|
270
|
|
- if (callback != null) {
|
271
|
|
- callback.onFinish();
|
272
|
|
- }
|
273
|
|
- } catch (SQLException e) {
|
274
|
|
- e.printStackTrace();
|
|
250
|
+ public void addUser(UserInformation user, @Nullable DatabaseController.UpdateCallback callback, ErrorCallback errorCallback) {
|
|
251
|
+ @Language("SQL") String sql;
|
|
252
|
+ if (user.getUsername() != null) {
|
|
253
|
+ sql = "INSERT OR IGNORE INTO user (id, username) " +
|
|
254
|
+ "VALUES (" + user.id + ", \"" + user.getUsername() + "\")";
|
|
255
|
+ } else {
|
|
256
|
+ sql = "INSERT OR IGNORE INTO user (id) " +
|
|
257
|
+ "VALUES (" + user.id + ")";
|
275
|
258
|
}
|
|
259
|
+
|
|
260
|
+ Log.v(getClass().getSimpleName(), "Adding user to db: " + user.id + " / " + user.getUsername());
|
|
261
|
+ UpdateExecutor executor = new UpdateExecutor(sql, callback, errorCallback);
|
|
262
|
+ executor.start();
|
276
|
263
|
}
|
277
|
264
|
|
278
|
265
|
/**
|
279
|
266
|
* Gets the chat history for a given time frame
|
280
|
267
|
*
|
281
|
|
- * @param user the user for which to retrieve the history
|
282
|
|
- * @param from the starting date
|
283
|
|
- * @param to the ending date
|
284
|
|
- * @param callback Function called when the request is done
|
|
268
|
+ * @param user the user for which to retrieve the history
|
|
269
|
+ * @param from the starting date
|
|
270
|
+ * @param to the ending date
|
|
271
|
+ * @param callback Function called when the request is done
|
|
272
|
+ * @param errorCallback The function to call on error
|
285
|
273
|
*/
|
286
|
|
- public void getChatHistory(UserInformation user, Date from, Date to, HistoryCallback callback) {
|
287
|
|
- try {
|
288
|
|
- Statement stmt = connection.createStatement();
|
289
|
|
- String sql =
|
290
|
|
- "SELECT timestamp, s.id AS sender_id, s.username AS sender_username, " +
|
291
|
|
- "r.id AS recipient_id, r.username AS recipient_username, text, file_path " +
|
292
|
|
- "FROM message JOIN user AS s ON sender = s.id " +
|
293
|
|
- " JOIN user AS r ON recipient = r.id " +
|
294
|
|
- "WHERE (s.id = " + user.id + " OR r.id = " + user.id + ") AND " +
|
295
|
|
- "timestamp > " + from.getTime() + " AND timestamp < " + to.getTime() + " " +
|
296
|
|
- "ORDER BY timestamp";
|
297
|
|
-
|
298
|
|
- Log.v(getClass().getSimpleName(), "Fetching chat history from db... ");
|
299
|
|
- ResultSet res = stmt.executeQuery(sql);
|
300
|
|
-
|
|
274
|
+ public void getChatHistory(UserInformation user, Date from, Date to, HistoryCallback callback, ErrorCallback errorCallback) {
|
|
275
|
+ @Language("SQL") String sql =
|
|
276
|
+ "SELECT timestamp, s.id AS sender_id, s.username AS sender_username, " +
|
|
277
|
+ "r.id AS recipient_id, r.username AS recipient_username, text, file_path " +
|
|
278
|
+ "FROM message JOIN user AS s ON sender = s.id " +
|
|
279
|
+ " JOIN user AS r ON recipient = r.id " +
|
|
280
|
+ "WHERE (s.id = " + user.id + " OR r.id = " + user.id + ") AND " +
|
|
281
|
+ "timestamp > " + from.getTime() + " AND timestamp < " + to.getTime() + " " +
|
|
282
|
+ "ORDER BY timestamp";
|
|
283
|
+
|
|
284
|
+ Log.v(getClass().getSimpleName(), "Fetching chat history from db... ");
|
|
285
|
+ QueryExecutor executor = new QueryExecutor(sql, res -> {
|
301
|
286
|
ArrayList<Message> chatHistory = new ArrayList<>();
|
302
|
287
|
while (res.next()) {
|
303
|
288
|
int sId = res.getInt("sender_id");
|
|
@@ -314,49 +299,107 @@ public class DatabaseController {
|
314
|
299
|
// chatHistory.add(new FileMessage(new UserInformation(sId, sUsername), new UserInformation(rId, rUsername), date, text, filePath));
|
315
|
300
|
}
|
316
|
301
|
}
|
317
|
|
- Log.v(getClass().getSimpleName(), chatHistory.size() + " rows fetched");
|
318
|
|
- res.close();
|
319
|
|
- stmt.close();
|
320
|
|
- if (callback != null) {
|
321
|
|
- callback.onHistoryFetched(chatHistory);
|
322
|
|
- }
|
323
|
|
- } catch (SQLException e) {
|
324
|
|
- e.printStackTrace();
|
325
|
|
- }
|
326
|
|
- }
|
|
302
|
+ Log.v(getClass().getSimpleName(), chatHistory.size() + " messages fetched");
|
|
303
|
+ callback.onHistoryFetched(chatHistory);
|
|
304
|
+ }, errorCallback);
|
327
|
305
|
|
328
|
|
- public void updateUsername(UserInformation user) {
|
329
|
|
- try {
|
330
|
|
- executeUpdate("UPDATE user SET " +
|
331
|
|
- "username = '" + user.getUsername() + "' where id = " + user.id);
|
332
|
|
- } catch (SQLException e) {
|
333
|
|
- e.printStackTrace();
|
334
|
|
- }
|
|
306
|
+ executor.start();
|
335
|
307
|
}
|
336
|
308
|
|
337
|
|
- public void getUsername(int id, UsernameCallback callback) {
|
338
|
|
- try {
|
339
|
|
- Statement statement = connection.createStatement();
|
340
|
|
- String sql = "SELECT username from user where id =" + id;
|
|
309
|
+ public void updateUsername(UserInformation user, @Nullable DatabaseController.UpdateCallback callback, ErrorCallback errorCallback) {
|
|
310
|
+ @Language("SQL") String sql = "UPDATE user SET username = '" + user.getUsername() + "' where id = " + user.id;
|
|
311
|
+ UpdateExecutor executor = new UpdateExecutor(sql, callback, errorCallback);
|
|
312
|
+ executor.start();
|
|
313
|
+ }
|
341
|
314
|
|
342
|
|
- Log.v(getClass().getSimpleName(), "Fetching users from db... ");
|
343
|
|
- ResultSet res = statement.executeQuery(sql);
|
|
315
|
+ public void getUsername(int id, UsernameCallback callback, ErrorCallback errorCallback) {
|
|
316
|
+ @Language("SQL") String sql = "SELECT username from user where id =" + id;
|
344
|
317
|
|
|
318
|
+ Log.v(getClass().getSimpleName(), "Fetching username from db... ");
|
|
319
|
+ QueryExecutor executor = new QueryExecutor(sql, res -> {
|
345
|
320
|
String username = null;
|
|
321
|
+ int nbRows = 0;
|
346
|
322
|
if (res.next()) {
|
347
|
323
|
username = res.getString("username");
|
|
324
|
+ nbRows = 1;
|
348
|
325
|
}
|
349
|
|
- Log.v(getClass().getSimpleName(), res.getFetchSize() + " rows fetched");
|
350
|
|
- res.close();
|
351
|
|
- statement.close();
|
352
|
|
- if (callback != null) {
|
353
|
|
- callback.onUsernameFetched(username);
|
|
326
|
+ Log.v(getClass().getSimpleName(), nbRows + " username fetched");
|
|
327
|
+ callback.onUsernameFetched(username);
|
|
328
|
+ }, errorCallback);
|
|
329
|
+ executor.start();
|
|
330
|
+ }
|
|
331
|
+
|
|
332
|
+ private class UpdateExecutor extends Thread {
|
|
333
|
+ private final String sqlQuery;
|
|
334
|
+ private final UpdateCallback callback;
|
|
335
|
+ private final ErrorCallback errorCallback;
|
|
336
|
+
|
|
337
|
+ /**
|
|
338
|
+ * Constructs a thread that executes an update on the database
|
|
339
|
+ *
|
|
340
|
+ * @param sqlQuery The query to execute
|
|
341
|
+ * @param callback The function to call on success
|
|
342
|
+ * @param errorCallback The function to call on error
|
|
343
|
+ */
|
|
344
|
+ public UpdateExecutor(@Language("SQL") String sqlQuery, @Nullable DatabaseController.UpdateCallback callback, ErrorCallback errorCallback) {
|
|
345
|
+ this.sqlQuery = sqlQuery;
|
|
346
|
+ this.callback = callback;
|
|
347
|
+ this.errorCallback = errorCallback;
|
|
348
|
+ }
|
|
349
|
+
|
|
350
|
+ @Override
|
|
351
|
+ public void run() {
|
|
352
|
+ try {
|
|
353
|
+ Statement statement = connection.createStatement();
|
|
354
|
+ final int rowsModified = statement.executeUpdate(sqlQuery);
|
|
355
|
+ Log.v(getClass().getSimpleName(), rowsModified + " rows modified");
|
|
356
|
+ statement.close();
|
|
357
|
+ if (callback != null) {
|
|
358
|
+ callback.onUpdateExecuted();
|
|
359
|
+ }
|
|
360
|
+ } catch (SQLException e) {
|
|
361
|
+ Log.e(this.getClass().getSimpleName(), "Error executing update: ", e);
|
|
362
|
+ errorCallback.onError(e);
|
354
|
363
|
}
|
355
|
|
- } catch (SQLException e) {
|
356
|
|
- e.printStackTrace();
|
357
|
364
|
}
|
358
|
365
|
}
|
359
|
366
|
|
|
367
|
+ private class QueryExecutor extends Thread {
|
|
368
|
+ private final String sqlQuery;
|
|
369
|
+ private final QueryCallback callback;
|
|
370
|
+ private final ErrorCallback errorCallback;
|
|
371
|
+
|
|
372
|
+ /**
|
|
373
|
+ * Constructs a thread that executes an update on the database
|
|
374
|
+ *
|
|
375
|
+ * @param sqlQuery The query to execute
|
|
376
|
+ * @param callback The function to call on success
|
|
377
|
+ * @param errorCallback The function to call on error
|
|
378
|
+ */
|
|
379
|
+ public QueryExecutor(@Language("SQL") String sqlQuery, @Nullable QueryCallback callback, ErrorCallback errorCallback) {
|
|
380
|
+ this.sqlQuery = sqlQuery;
|
|
381
|
+ this.callback = callback;
|
|
382
|
+ this.errorCallback = errorCallback;
|
|
383
|
+ }
|
|
384
|
+
|
|
385
|
+ @Override
|
|
386
|
+ public void run() {
|
|
387
|
+ try {
|
|
388
|
+ Statement statement = connection.createStatement();
|
|
389
|
+ final ResultSet resultSet = statement.executeQuery(sqlQuery);
|
|
390
|
+ if (callback != null) {
|
|
391
|
+ callback.onQueryExecuted(resultSet);
|
|
392
|
+ }
|
|
393
|
+ resultSet.close();
|
|
394
|
+ statement.close();
|
|
395
|
+ } catch (SQLException e) {
|
|
396
|
+ Log.e(this.getClass().getSimpleName(), "Error executing update: ", e);
|
|
397
|
+ errorCallback.onError(e);
|
|
398
|
+ }
|
|
399
|
+ }
|
|
400
|
+ }
|
|
401
|
+
|
|
402
|
+
|
360
|
403
|
public interface UsersCallback {
|
361
|
404
|
void onUsersFetched(ArrayList<User> users);
|
362
|
405
|
}
|
|
@@ -369,7 +412,11 @@ public class DatabaseController {
|
369
|
412
|
void onHistoryFetched(ArrayList<Message> history);
|
370
|
413
|
}
|
371
|
414
|
|
372
|
|
- public interface FinishCallback {
|
373
|
|
- void onFinish();
|
|
415
|
+ public interface UpdateCallback {
|
|
416
|
+ void onUpdateExecuted();
|
|
417
|
+ }
|
|
418
|
+
|
|
419
|
+ private interface QueryCallback {
|
|
420
|
+ void onQueryExecuted(ResultSet resultSet) throws SQLException;
|
374
|
421
|
}
|
375
|
422
|
}
|