]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/storage/AccountDatabase.java
93a145ebf6b60218906b296aa527dc1dddad9bfd
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / storage / AccountDatabase.java
1 package org.asamk.signal.manager.storage;
2
3 import com.zaxxer.hikari.HikariDataSource;
4
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;
13
14 import java.io.File;
15 import java.sql.Connection;
16 import java.sql.SQLException;
17
18 public class AccountDatabase extends Database {
19
20 private final static Logger logger = LoggerFactory.getLogger(AccountDatabase.class);
21 private static final long DATABASE_VERSION = 5;
22
23 private AccountDatabase(final HikariDataSource dataSource) {
24 super(logger, DATABASE_VERSION, dataSource);
25 }
26
27 public static AccountDatabase init(File databaseFile) throws SQLException {
28 return initDatabase(databaseFile, AccountDatabase::new);
29 }
30
31 @Override
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);
39 }
40
41 @Override
42 protected void upgradeDatabase(final Connection connection, final long oldVersion) throws SQLException {
43 if (oldVersion < 2) {
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,
49 number TEXT UNIQUE,
50 uuid BLOB UNIQUE,
51 profile_key BLOB,
52 profile_key_credential BLOB,
53
54 given_name TEXT,
55 family_name TEXT,
56 color TEXT,
57
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,
62
63 profile_last_update_timestamp INTEGER NOT NULL DEFAULT 0,
64 profile_given_name TEXT,
65 profile_family_name TEXT,
66 profile_about 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
72 );
73 """);
74 }
75 }
76 if (oldVersion < 3) {
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
85 );
86 """);
87 }
88 }
89 if (oldVersion < 4) {
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)
102 );
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)
110 );
111 """);
112 }
113 }
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,
122 group_data BLOB,
123 distribution_id BLOB UNIQUE NOT NULL,
124 blocked BOOLEAN NOT NULL DEFAULT FALSE,
125 permission_denied BOOLEAN NOT NULL DEFAULT FALSE
126 );
127 CREATE TABLE group_v1 (
128 _id INTEGER PRIMARY KEY,
129 group_id BLOB UNIQUE NOT NULL,
130 group_id_v2 BLOB UNIQUE,
131 name TEXT,
132 color TEXT,
133 expiration_time INTEGER NOT NULL DEFAULT 0,
134 blocked BOOLEAN NOT NULL DEFAULT FALSE,
135 archived BOOLEAN NOT NULL DEFAULT FALSE
136 );
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)
142 );
143 """);
144 }
145 }
146 }
147 }