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
;
10 import java
.util
.stream
.Collectors
;
12 public class UnknownStorageIdStore
{
14 private static final String TABLE_STORAGE_ID
= "storage_id";
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
29 public Collection
<StorageId
> getUnknownStorageIds(Connection connection
) throws SQLException
{
32 SELECT s.type, s.storage_id
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();
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(","));
49 SELECT s.type, s.storage_id
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();
61 public void addUnknownStorageIds(Connection connection
, Collection
<StorageId
> storageIds
) throws SQLException
{
64 INSERT OR REPLACE INTO %s (type, storage_id)
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();
77 public void deleteUnknownStorageIds(Connection connection
, Collection
<StorageId
> storageIds
) throws SQLException
{
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();
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();
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
);