]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/UnknownStorageIdStore.java
6e00ad7560f8763fcdfa0b8efe4a89e325ce7fe8
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / storage / UnknownStorageIdStore.java
1 package org.asamk.signal.manager.storage;
2
3 import org.whispersystems.signalservice.api.storage.StorageId;
4
5 import java.sql.Connection;
6 import java.sql.ResultSet;
7 import java.sql.SQLException;
8 import java.util.Collection;
9 import java.util.List;
10 import java.util.stream.Collectors;
11
12 public class UnknownStorageIdStore {
13
14 private static final String TABLE_STORAGE_ID = "storage_id";
15
16 public static void createSql(Connection connection) throws SQLException {
17 // When modifying the CREATE statement here, also add a migration in AccountDatabase.java
18 try (final var statement = connection.createStatement()) {
19 statement.executeUpdate("""
20 CREATE TABLE storage_id (
21 _id INTEGER PRIMARY KEY,
22 type INTEGER NOT NULL,
23 storage_id BLOB UNIQUE NOT NULL
24 ) STRICT;
25 """);
26 }
27 }
28
29 public Collection<StorageId> getUnknownStorageIds(Connection connection) throws SQLException {
30 final var sql = (
31 """
32 SELECT s.type, s.storage_id
33 FROM %s s
34 """
35 ).formatted(TABLE_STORAGE_ID);
36 try (final var statement = connection.prepareStatement(sql)) {
37 try (var result = Utils.executeQueryForStream(statement, this::getStorageIdFromResultSet)) {
38 return result.toList();
39 }
40 }
41 }
42
43 public List<StorageId> getUnknownStorageIds(
44 Connection connection, Collection<Integer> types
45 ) throws SQLException {
46 final var typesCommaSeparated = types.stream().map(String::valueOf).collect(Collectors.joining(","));
47 final var sql = (
48 """
49 SELECT s.type, s.storage_id
50 FROM %s s
51 WHERE s.type IN (%s)
52 """
53 ).formatted(TABLE_STORAGE_ID, typesCommaSeparated);
54 try (final var statement = connection.prepareStatement(sql)) {
55 try (var result = Utils.executeQueryForStream(statement, this::getStorageIdFromResultSet)) {
56 return result.toList();
57 }
58 }
59 }
60
61 public void addUnknownStorageIds(Connection connection, Collection<StorageId> storageIds) throws SQLException {
62 final var sql = (
63 """
64 INSERT OR REPLACE INTO %s (type, storage_id)
65 VALUES (?, ?)
66 """
67 ).formatted(TABLE_STORAGE_ID);
68 try (final var statement = connection.prepareStatement(sql)) {
69 for (final var storageId : storageIds) {
70 statement.setInt(1, storageId.getType());
71 statement.setBytes(2, storageId.getRaw());
72 statement.executeUpdate();
73 }
74 }
75 }
76
77 public void deleteUnknownStorageIds(Connection connection, Collection<StorageId> storageIds) throws SQLException {
78 final var sql = (
79 """
80 DELETE FROM %s
81 WHERE storage_id = ?
82 """
83 ).formatted(TABLE_STORAGE_ID);
84 try (final var statement = connection.prepareStatement(sql)) {
85 for (final var storageId : storageIds) {
86 statement.setBytes(1, storageId.getRaw());
87 statement.executeUpdate();
88 }
89 }
90 }
91
92 public void deleteAllUnknownStorageIds(Connection connection) throws SQLException {
93 final var sql = "DELETE FROM %s".formatted(TABLE_STORAGE_ID);
94 try (final var statement = connection.prepareStatement(sql)) {
95 statement.executeUpdate();
96 }
97 }
98
99 private StorageId getStorageIdFromResultSet(ResultSet resultSet) throws SQLException {
100 final var type = resultSet.getInt("type");
101 final var storageId = resultSet.getBytes("storage_id");
102 return StorageId.forType(storageId, type);
103 }
104 }