1 package org
.asamk
.signal
.manager
.storage
;
3 import org
.whispersystems
.signalservice
.api
.storage
.StorageId
;
5 import java
.sql
.Connection
;
6 import java
.sql
.ResultSet
;
7 import java
.sql
.SQLException
;
8 import java
.util
.Collection
;
11 import java
.util
.stream
.Collectors
;
13 public class UnknownStorageIdStore
{
15 private static final String TABLE_STORAGE_ID
= "storage_id";
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
30 public Set
<StorageId
> getUnknownStorageIds(Connection connection
) throws SQLException
{
33 SELECT s.type, s.storage_id
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());
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(","));
50 SELECT s.type, s.storage_id
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();
62 public void addUnknownStorageIds(Connection connection
, Collection
<StorageId
> storageIds
) throws SQLException
{
65 INSERT OR REPLACE INTO %s (type, storage_id)
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();
78 public void deleteUnknownStorageIds(Connection connection
, Collection
<StorageId
> storageIds
) throws SQLException
{
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();
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();
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
);