SHA256
Добавить временную миграцию v11 для очистки старых DM
This commit is contained in:
@@ -14,7 +14,7 @@ import java.sql.Statement;
|
|||||||
public final class SqliteDbController {
|
public final class SqliteDbController {
|
||||||
|
|
||||||
private static volatile SqliteDbController instance;
|
private static volatile SqliteDbController instance;
|
||||||
private static final int LATEST_SCHEMA_VERSION = 10;
|
private static final int LATEST_SCHEMA_VERSION = 11;
|
||||||
|
|
||||||
private final String jdbcUrl;
|
private final String jdbcUrl;
|
||||||
|
|
||||||
@@ -93,6 +93,7 @@ public final class SqliteDbController {
|
|||||||
case 8 -> migrateToV8();
|
case 8 -> migrateToV8();
|
||||||
case 9 -> migrateToV9();
|
case 9 -> migrateToV9();
|
||||||
case 10 -> migrateToV10();
|
case 10 -> migrateToV10();
|
||||||
|
case 11 -> migrateToV11();
|
||||||
default -> throw new RuntimeException("Unknown DB migration target version: " + targetVersion);
|
default -> throw new RuntimeException("Unknown DB migration target version: " + targetVersion);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -309,6 +310,25 @@ public final class SqliteDbController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void migrateToV11() {
|
||||||
|
try (Connection c = DriverManager.getConnection(jdbcUrl);
|
||||||
|
Statement st = c.createStatement()) {
|
||||||
|
c.setAutoCommit(false);
|
||||||
|
try {
|
||||||
|
clearLegacySignedMessagesForDmV11(c, st);
|
||||||
|
setSchemaVersion(c, 11);
|
||||||
|
c.commit();
|
||||||
|
} catch (Exception e) {
|
||||||
|
try { c.rollback(); } catch (Exception ignored) {}
|
||||||
|
throw new RuntimeException("DB migration to v11 failed", e);
|
||||||
|
} finally {
|
||||||
|
try { c.setAutoCommit(true); } catch (Exception ignored) {}
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new RuntimeException("DB migration to v11 failed", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static void ensureChat200StateTables(Statement st) throws SQLException {
|
private static void ensureChat200StateTables(Statement st) throws SQLException {
|
||||||
st.executeUpdate("""
|
st.executeUpdate("""
|
||||||
CREATE TABLE IF NOT EXISTS chat200_state (
|
CREATE TABLE IF NOT EXISTS chat200_state (
|
||||||
@@ -443,6 +463,21 @@ public final class SqliteDbController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Временная одноразовая миграция на переходе к SHiNE_DM v1:
|
||||||
|
* старые строки signed_messages_v2 больше не гарантированно совместимы
|
||||||
|
* с новым бинарным форматом и правилами tombstone/reencrypt.
|
||||||
|
* Позже эту миграцию нужно убрать, чтобы случайно не очищать рабочие DM.
|
||||||
|
*/
|
||||||
|
private static void clearLegacySignedMessagesForDmV11(Connection c, Statement st) throws SQLException {
|
||||||
|
if (tableExists(c, "signed_message_session_delivery")) {
|
||||||
|
st.executeUpdate("DELETE FROM signed_message_session_delivery");
|
||||||
|
}
|
||||||
|
if (tableExists(c, "signed_messages_v2")) {
|
||||||
|
st.executeUpdate("DELETE FROM signed_messages_v2");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static void dropDmFileTables(Statement st) throws SQLException {
|
private static void dropDmFileTables(Statement st) throws SQLException {
|
||||||
st.executeUpdate("DROP INDEX IF EXISTS idx_dm_message_file_links_login");
|
st.executeUpdate("DROP INDEX IF EXISTS idx_dm_message_file_links_login");
|
||||||
st.executeUpdate("DROP INDEX IF EXISTS idx_dm_message_file_links_message");
|
st.executeUpdate("DROP INDEX IF EXISTS idx_dm_message_file_links_message");
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# Убрать временную очистку `signed_messages_v2` в миграции БД v11
|
||||||
|
|
||||||
|
## Зачем это нужно
|
||||||
|
|
||||||
|
При переходе на новый DM-протокол `SHiNE_DM v1` была добавлена временная миграция БД `v11`, которая при первом старте на старой базе полностью очищает:
|
||||||
|
|
||||||
|
- `signed_messages_v2`
|
||||||
|
- `signed_message_session_delivery`
|
||||||
|
|
||||||
|
Это сделано как защитный reset, потому что старые DM-строки и backlog могли быть несовместимы с новым форматом, новой логикой tombstone и новым клиентским E2EE-разбором.
|
||||||
|
|
||||||
|
## Что именно потом сделать
|
||||||
|
|
||||||
|
- удалить временную миграцию `migrateToV11()` из [SqliteDbController.java](/home/ai/work/SHiNE/SHiNE-server-sha256/SHiNE-server/shine-server-db/src/main/java/shine/db/SqliteDbController.java);
|
||||||
|
- удалить helper `clearLegacySignedMessagesForDmV11(...)`;
|
||||||
|
- поднять версию схемы дальше обычным образом уже без destructive-cleanup;
|
||||||
|
- при необходимости заменить это на нормальную точечную миграцию старых DM-записей или совсем убрать поддержку старой истории.
|
||||||
|
|
||||||
|
## Что уже есть в коде
|
||||||
|
|
||||||
|
- `LATEST_SCHEMA_VERSION = 11`;
|
||||||
|
- при миграции в `v11` выполняется полная очистка DM-таблиц;
|
||||||
|
- в коде прямо оставлен комментарий, что это временная мера.
|
||||||
|
|
||||||
|
## Откуда продолжать
|
||||||
|
|
||||||
|
Продолжать от коммита, в котором была добавлена миграция `v11` для очистки DM-таблиц после перехода на `SHiNE_DM v1`.
|
||||||
|
|
||||||
|
## Какие документы потом обновить
|
||||||
|
|
||||||
|
- `Dev_Docs/Personal_Messages/Протокол_DM_v1.md`, если изменится стратегия миграции старой истории;
|
||||||
|
- `Dev_Docs/Personal_Messages/Формат_DM_v1.md`, если появится отдельное правило совместимости/конвертации;
|
||||||
|
- при необходимости `Dev_Docs/API/12_Direct_Messages_Push_Calls_API.md`, если затронется поведение backlog/доставки.
|
||||||
+2
-2
@@ -1,2 +1,2 @@
|
|||||||
client.version=1.2.298
|
client.version=1.2.299
|
||||||
server.version=1.2.278
|
server.version=1.2.279
|
||||||
|
|||||||
Reference in New Issue
Block a user