Full DB backup: export all data to a file and restore it (swap DB on next launch)

This commit is contained in:
4aiman 2026-09-21 13:03:32 +03:00
commit 682bee6e9a
6 changed files with 205 additions and 1 deletions

View file

@ -0,0 +1,42 @@
# Сессия 2026-09-21 (2) - экспорт/импорт всей БД (резервная копия)
## Контекст
Смена сборки debug<->release стирает данные (разные подписи -> переустановка). Решили:
НЕ делать внутриприложенческую авто-установку APK, а сделать полный бэкап/восстановление БД.
Записано в память: `project_no_self_install`. Секретов в базе нет.
## Сделано
- Rust (`lib.rs`):
- `db_and_root(app)` - резолв пути `baldav.db` + app-root (как в rebuild_roads).
- `export_db(filename)` - `VACUUM INTO` чистой копии в `app-root/export_db.tmp` (консистентно
при живом соединении, сжимает ~на треть), команда `exportdb:<filename>` в gps_command.txt.
- `import_db()` - валидирует `picked_import.db` (`PRAGMA quick_check`=='ok' + есть хоть одна
таблица из gps_sessions/products/profile), копирует в `pending_restore.db`, удаляет picked.
- `restart_app()` - команда `restartapp`.
- Все три в generate_handler.
- Kotlin (`MainActivity.kt`):
- `pendingDbFile` + `saveDbLauncher` (CreateDocument octet-stream, СТРИМ файла, не в память -
файл десятки МБ).
- Ветка `exportdb:` -> SAF-сохранение `export_db.tmp`.
- Ветка `restartapp` -> relaunch (getLaunchIntentForPackage + FLAG_ACTIVITY_NEW_TASK) +
`Runtime.exit(0)`.
- `onCreate` (сразу после appDataDir, ДО открытия БД): если есть `pending_restore.db` -
скопировать на `baldav.db`, удалить journal/wal/shm и pending. Тот же паттерн, что копия сида.
- JS (`main.js`): в Настройках блок «Резервная копия всех данных» с кнопками Экспорт/Импорт.
Экспорт -> `export_db`. Импорт -> confirm (заменит всё) -> `pickLocalFile` -> `import_db` ->
confirm перезапуска -> `restart_app`. Импорт только на Android.
## Проверка
- JS синтаксис ок. Автономный тест `VACUUM INTO` на десктоп-БД: 53МБ -> 36МБ, quick_check ok,
сессии на месте (валидная сжатая копия). Ядро экспорта подтверждено.
- SAF-сохранение, своп при onCreate и рестарт - только на устройстве (Kotlin), десктоп не
воспроизводит. Проверка на телефоне: экспорт -> файл-бэкап валиден; импорт другого бэкапа ->
данные заменились после рестарта. (Сборка bump до 0.1.465.)
## Замечания
- Сжатие gzip не делал: VACUUM INTO уже компактит; flate2 в зависимостях нет. Добавлю, если
нужно меньше.
- Схема-совместимость: миграции в db.js идемпотентны (ALTER ... IF NOT EXISTS), старый бэкап
подтянется вверх, новый в старое приложение - лишние колонки безвредны.
## На роутере всё ещё 0.1.464 (build 464). Новый бэкап-билд (465) на роутер не выкатывал.