1 package org
.asamk
.signal
.manager
.storage
;
3 import com
.zaxxer
.hikari
.HikariDataSource
;
5 import org
.asamk
.signal
.manager
.storage
.groups
.GroupStore
;
6 import org
.asamk
.signal
.manager
.storage
.prekeys
.PreKeyStore
;
7 import org
.asamk
.signal
.manager
.storage
.prekeys
.SignedPreKeyStore
;
8 import org
.asamk
.signal
.manager
.storage
.recipients
.RecipientStore
;
9 import org
.asamk
.signal
.manager
.storage
.sendLog
.MessageSendLogStore
;
10 import org
.asamk
.signal
.manager
.storage
.stickers
.StickerStore
;
11 import org
.slf4j
.Logger
;
12 import org
.slf4j
.LoggerFactory
;
15 import java
.sql
.Connection
;
16 import java
.sql
.SQLException
;
18 public class AccountDatabase
extends Database
{
20 private final static Logger logger
= LoggerFactory
.getLogger(AccountDatabase
.class);
21 private static final long DATABASE_VERSION
= 5;
23 private AccountDatabase(final HikariDataSource dataSource
) {
24 super(logger
, DATABASE_VERSION
, dataSource
);
27 public static AccountDatabase
init(File databaseFile
) throws SQLException
{
28 return initDatabase(databaseFile
, AccountDatabase
::new);
32 protected void createDatabase(final Connection connection
) throws SQLException
{
33 RecipientStore
.createSql(connection
);
34 MessageSendLogStore
.createSql(connection
);
35 StickerStore
.createSql(connection
);
36 PreKeyStore
.createSql(connection
);
37 SignedPreKeyStore
.createSql(connection
);
38 GroupStore
.createSql(connection
);
42 protected void upgradeDatabase(final Connection connection
, final long oldVersion
) throws SQLException
{
44 logger
.debug("Updating database: Creating recipient table");
45 try (final var statement
= connection
.createStatement()) {
46 statement
.executeUpdate("""
47 CREATE TABLE recipient (
48 _id INTEGER PRIMARY KEY AUTOINCREMENT,
52 profile_key_credential BLOB,
58 expiration_time INTEGER NOT NULL DEFAULT 0,
59 blocked BOOLEAN NOT NULL DEFAULT FALSE,
60 archived BOOLEAN NOT NULL DEFAULT FALSE,
61 profile_sharing BOOLEAN NOT NULL DEFAULT FALSE,
63 profile_last_update_timestamp INTEGER NOT NULL DEFAULT 0,
64 profile_given_name TEXT,
65 profile_family_name TEXT,
67 profile_about_emoji TEXT,
68 profile_avatar_url_path TEXT,
69 profile_mobile_coin_address BLOB,
70 profile_unidentified_access_mode TEXT,
71 profile_capabilities TEXT
77 logger
.debug("Updating database: Creating sticker table");
78 try (final var statement
= connection
.createStatement()) {
79 statement
.executeUpdate("""
80 CREATE TABLE sticker (
81 _id INTEGER PRIMARY KEY,
82 pack_id BLOB UNIQUE NOT NULL,
83 pack_key BLOB NOT NULL,
84 installed BOOLEAN NOT NULL DEFAULT FALSE
90 logger
.debug("Updating database: Creating pre key tables");
91 try (final var statement
= connection
.createStatement()) {
92 statement
.executeUpdate("""
93 CREATE TABLE signed_pre_key (
94 _id INTEGER PRIMARY KEY,
95 account_id_type INTEGER NOT NULL,
96 key_id INTEGER NOT NULL,
97 public_key BLOB NOT NULL,
98 private_key BLOB NOT NULL,
99 signature BLOB NOT NULL,
100 timestamp INTEGER DEFAULT 0,
101 UNIQUE(account_id_type, key_id)
103 CREATE TABLE pre_key (
104 _id INTEGER PRIMARY KEY,
105 account_id_type INTEGER NOT NULL,
106 key_id INTEGER NOT NULL,
107 public_key BLOB NOT NULL,
108 private_key BLOB NOT NULL,
109 UNIQUE(account_id_type, key_id)
114 if (oldVersion
< 5) {
115 logger
.debug("Updating database: Creating group tables");
116 try (final var statement
= connection
.createStatement()) {
117 statement
.executeUpdate("""
118 CREATE TABLE group_v2 (
119 _id INTEGER PRIMARY KEY,
120 group_id BLOB UNIQUE NOT NULL,
121 master_key BLOB NOT NULL,
123 distribution_id BLOB UNIQUE NOT NULL,
124 blocked BOOLEAN NOT NULL DEFAULT FALSE,
125 permission_denied BOOLEAN NOT NULL DEFAULT FALSE
127 CREATE TABLE group_v1 (
128 _id INTEGER PRIMARY KEY,
129 group_id BLOB UNIQUE NOT NULL,
130 group_id_v2 BLOB UNIQUE,
133 expiration_time INTEGER NOT NULL DEFAULT 0,
134 blocked BOOLEAN NOT NULL DEFAULT FALSE,
135 archived BOOLEAN NOT NULL DEFAULT FALSE
137 CREATE TABLE group_v1_member (
138 _id INTEGER PRIMARY KEY,
139 group_id INTEGER NOT NULL REFERENCES group_v1 (_id) ON DELETE CASCADE,
140 recipient_id INTEGER NOT NULL REFERENCES recipient (_id) ON DELETE CASCADE,
141 UNIQUE(group_id, recipient_id)