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