baldav/docs/session-logs/2026-09-21_db-backup.md

4.7 KiB
Raw Blame History

Сессия 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), старый бэкап подтянется вверх, новый в старое приложение - лишние колонки безвредны.

Проверка на теле + фиксы

  • Экспорт сперва падал: vacuum: unable to open database: /data/user/.... Причина - я взял корень как app_data_dir().parent().parent() (на Android app_data_dir САМ = корень -> ../.. уводит в непишемый /data/user). ЭТО УЖЕ ЧИНИЛИ функцией native_root(). Исправил на native_root() (как save-команды/rebuild_roads), убрал data_dir-дубли. Записано в память reference_android_native_root. Подтверждено на теле: корень /data/user/0/dev.baldav.app писабелен, там baldav.db + точки + командные файлы -> native_root резолвится туда.
  • Экспорт + импорт (восстановление) пользователь проверил на теле - работают.
  • Авто-рестарт после импорта не срабатывал: startActivity()+exit(0) - гонка (процесс умирает до подъёма активити). Исправлено: relaunch через AlarmManager+PendingIntent ПОСЛЕ смерти процесса (ProcessPhoenix-паттерн) + finishAffinity.

На роутере всё ещё 0.1.464 (build 464). Бэкап-билды на роутер не выкатывал.