Как стать автором
Обновить

Комментарии 5

Спасибо за статью! Не пользуюсь SQLite, но про внутренности БД всегда интересно читать)

Пример заголовока файла в HEX-редакторе

Что-то как-то баланс не сошёлся. Если учитывать, что

Число страниц в базе. Умноженное на размер страницы должно совпадать с размером файла на диске.

то страницы нумеруются с единицы. Если всего в БД 77 страниц, а из них свободных 74, то занятых - вероятно, три, причём одна из них - та, что самая первая. Но если первая свободная страница - номер 6, то занятых получается как минимум первые пять.

Где, в чём ошибка? что приводит к такому несоответствию?

Akina, спасибо, что заметили. Надо было уточнить, что это номер первой корневой страницы и разумеется она может быть не первой. Я могу предположить, что это первая свободная страница, которая освободилась при удалении данных. В данном случае: у таблицы одна корневая свободная страница №6, куча листьев, прикрепленных к ней, начиная с №2 (итого 74), sqlite_master на 1-ой странице, одна обычная таблица на №76 (один лист) и для её индекса по первичному ключу на №77. Последние два номера можно получить из sqlite_master.

P.S. Промахнулся и возможности перенести нет.

Так, я правильно понимаю, что если у меня, предположим айфон, в котором сафари хранит всю историю в history.db, и я например ее салучайно потер из гуя приложения, т.е техничкси транкейтнул таблицу, то выгрузив history.db файл наружу (представим, что у меня джейлбрейк) и прогнав по нему вашей утилитой, он теоретически может ресторнуть транкейтнутые филды?

Все зависит от того, какие настройки SQLite были использованы. Вроде как для iOS 13+ по умолчанию secure_delete включён (не fast) и потому восстановление данных будет невозможно. Проверить не могу, т.к. нет Apple устройств.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории