From faada9dcdbb295e1b272050d110b806139753b53ca9309d1ce0017e44114ebaa Mon Sep 17 00:00:00 2001 From: AidarKC Date: Tue, 7 Jul 2026 20:26:16 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=BD=D1=83=D1=8E?= =?UTF-8?q?=20=D0=BC=D0=B8=D0=B3=D1=80=D0=B0=D1=86=D0=B8=D1=8E=20v11=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=BA=D0=B8?= =?UTF-8?q?=20=D1=81=D1=82=D0=B0=D1=80=D1=8B=D1=85=20DM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/shine/db/SqliteDbController.java | 37 ++++++++++++++++++- ...брать_временную_очистку_signed_messages.md | 33 +++++++++++++++++ VERSION.properties | 4 +- 3 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 TODO/near/2026-07-07_дм_v11_убрать_временную_очистку_signed_messages.md diff --git a/SHiNE-server/shine-server-db/src/main/java/shine/db/SqliteDbController.java b/SHiNE-server/shine-server-db/src/main/java/shine/db/SqliteDbController.java index 112fa1e..6f39a7b 100644 --- a/SHiNE-server/shine-server-db/src/main/java/shine/db/SqliteDbController.java +++ b/SHiNE-server/shine-server-db/src/main/java/shine/db/SqliteDbController.java @@ -14,7 +14,7 @@ import java.sql.Statement; public final class SqliteDbController { 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; @@ -93,6 +93,7 @@ public final class SqliteDbController { case 8 -> migrateToV8(); case 9 -> migrateToV9(); case 10 -> migrateToV10(); + case 11 -> migrateToV11(); 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 { st.executeUpdate(""" 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 { st.executeUpdate("DROP INDEX IF EXISTS idx_dm_message_file_links_login"); st.executeUpdate("DROP INDEX IF EXISTS idx_dm_message_file_links_message"); diff --git a/TODO/near/2026-07-07_дм_v11_убрать_временную_очистку_signed_messages.md b/TODO/near/2026-07-07_дм_v11_убрать_временную_очистку_signed_messages.md new file mode 100644 index 0000000..54a734c --- /dev/null +++ b/TODO/near/2026-07-07_дм_v11_убрать_временную_очистку_signed_messages.md @@ -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/доставки. diff --git a/VERSION.properties b/VERSION.properties index ec86dbb..9e2c655 100644 --- a/VERSION.properties +++ b/VERSION.properties @@ -1,2 +1,2 @@ -client.version=1.2.298 -server.version=1.2.278 +client.version=1.2.299 +server.version=1.2.279