1

Тема: Восстановление записей из корзины

Нашел я все таки корзину. Ей оказалась отдельно расположенная одноименная папка. Однако мне не понятен алгоритм восстановления из нее записей. Не могли бы вы прояснить алгоритм по которому надо действовать?

2

Re: Восстановление записей из корзины

Корзина в том виде, в котором она есть сейчас - это задел на будущее. Восстановить из нее запись можно вручную, при всяких форсмажорах. В корзину скидываются файлы базы MyTetra перед их перезаписью. То есть, когда файл должен измениться, вначале его копия помещается в корзину, а потом он меняется. И еще в корзину попадают файлы удаленных записей. И при изменении дерева в корзину попадает копия файла делева mytetra.xml. Можете поэкспериментировать: поудалять, поизменять записи, и вы увидите как появляются новые файлы в корзине и удаляются старые.

Имена файлов в корзине генерируются автоматически: "TempUID_имяфайла.расширение". TempUID - это уникальный идентификатор, содержащий в начале себя время UNIX timestamp и случайную строку для избегания коллизий с вероятностью 10^-15 в секунду появления файла. Например, при удалении записи с одной картинкой, в корзине появятся файлы:

14950891894te1zbcsth_mytetra.xml - файл дерева перед удалением записи
1495089189i5ua2dsfjh_text.html - файл текста записи
1495089189cfl7z52n7l_image5288.png - картинка, используемая в записи

Если удаляемые/изменяемые данные не были зашифрованы, то вручную восстановить запись просто. Во-первых, вы их можете посмотреть чтобы понять, та ли эта запись которая нужна. Во-вторых, вы можете создать пустую запись, найти каталог этой записи (сделать видимым столбец "Имя директории" или нажать в контекстном меню "Скопировать ссылку на запись", в ссылке увидеть идентификатор и по нему найти имя директории в файле mytetra.xml). И вот в этой директории нужно подменить файлы записи (html и png), предварительно переименовав их путем удаления префикса "TempUID_". Название и прочие атрибуты удаленной записи можно найти в файле 14950891894te1zbcsth_mytetra.xml, и потом прописать их в интерфейсе MyTetra или напрямую отредактировать файл mytetra.xml.

Внимание! В момент ручной работы с базой MyTetra должна быть выключена. Или, как минимум, в момент подмены файлов записи, курсор должен стоять на другой записи (если вы только подменяете запись) плюс должна быть включена настройка "Периодическая проверка дерева записей..." если вручную меняете mytetra.xml и у вас при этом MyTetra работает.

Если удалялась зашифрованная запись, то дайствия те же самые, только посмотреть содержание файлов вы не сможете пока не поместите их в MyTetra. Понять какие файлы относятся к удаленной зашифрованной записи можно коственным путем - по времени удаления записи (соответственно по времени создания файла в корзине), по размеру файла ..._text.html (размер зашифрованного файла отличается от нешифрованного только дополнительным размером заголовка в 32 байта плюс несколько байт в хвосте для выравнивания на размер блока). При засовывании зашифрованных файлов вручную обратно в базу надо учесть, что они нормально восстановятся только в случае, если пароль не менялся.

Возможно я когда-нибудь сделаю MyTetra Crypt Tool, чтобы можно было расшифровывать файлы, зная пароль.

Ну а вообще предполагается, что когда-нибудь появится интерфейс для восстановления записей из корзины. Но как-то он оказался особенно не нужен, потому что многие настраивают резервное копирование/синхронизацию данных через системы контроля версий, и в случае проблем могут откатиться с помощью них.

3 (изменено: babaduk, 18.05.2017 14:53:01)

Re: Восстановление записей из корзины

Я примерно так себе  и представлял. У меня возникла идея, как просматривать записи из корзины с помощью несложного, как мне кажется "костыля". Его создание и алгоритм я опишу в следующем посте.

Все таки не все люди пользуются таким резервным копированием, которое выполняется настолько часто, что позволяет вытащить записи, которые были созданы и удалены совсем в короткий промежуток времени. Поэтому для меня приоритетней иметь возможность сиюминутно зайти в корзину и просмотреть что в в нее попало.

4

Re: Восстановление записей из корзины

Мое решение, которое реализует функционал корзины.

1. Введем понятие "Режим корзины" - это такой режим работы приложения MyTetra, в котором работа происходит с удаленными записями. Вместо них при открытии приложения, в корневой папке находятся 2 ветки с названиями "корзина" и "восстановление".

В ветке "корзина" находятся все записи, которые были удалены. Ветка "Восстановление" изначально пуста. Пользователь должен самостоятельно найти среди удаленных записей те, которые следует восстановить и переместить их в ветку "восстановление". После перемещения этих записей следует произвести экспорт ветки "восстановление" в отдельную папку. Затем следует выйти из программы и сменить "Режим корзины" на "Нормальный". Загрузить программу в "Нормальном режиме" и произвести импорт отобранных для восстановления записей.

2. Для перевода программы в "Режим корзины" следует:
  - Заранее создать папку к примеру "Архивные копии". Единоразово.
  - В эту папку произвести архивирование следующих файлов:
      mytetra.xml (файл основной базы данных)
      conf.ini (из каталога программы)
    Там будет склад файлов к примеру 18052017204023archive.zip
    Перед каждым переводом программы в "Режим корзины" будет создаваться новый архив и добавляться в эту папку. Это действие будет производится автоматически, скриптом.

3.  Перед переводом программы в "Режим корзины" рядом с папкой "trash" создается папка "trash_export" (в случае если папка уже существовала, она очищается). В этой папке создаются подпапки "data" "trash". В папке "data" создаются все нужные файлы для работы полноценной базы данных. Для каждой удаленной записи из корзины создаются соответствующие папки в подпапке "base". Данные берутся из файлов *_mytetra.xml и аккумулируются в одном новом файле mytetra.xml.

4. Файл "conf.ini" переименовывается в "conf.ini.tmp". Вместо него создается новый файл, в котором прописаны пути к базе данных "trash_export".

5. Запускается программа. В ней пользователь производит необходимые манипуляции и выгружает восстанавливаемые записи в отдельную папку.

6. После выхода из программы пользователь запускает скрипт перевода программы в "Основной режим". Производится переименование "conf.ini" в "conf.ini.exp.tmp" и файла "conf.ini.tmp" в "conf.ini".

7. Запускается программа и в ней пользователь производит импорт отобранных записей и распределяет их по своим местам.

5

Re: Восстановление записей из корзины

Я мог бы попробовать реализовать эту идею. Однако сразу скажу что я не программист. У меня есть определенные знания в следующих сферах, в каждой понемногу:
  - могу написать простой bat файл
  - как ни странно я раньше неплохо разбирался в регулярных выражениях. И сейчас вспомнить их думаю не составит труда.
  - есть кое какие навыки программирования на уровне написать несложный скетч для arduino.
  - Когда учился разбирался в бейсике и паскале. Даже ходил на кружок ассемблера целый месяц. Почти все забыл сейчас.

Для меня в этой реализации будет по силам произвести операции по переименовыванию файлов, созданию архивов и другие похожие операции путем создания bat файла. Но будет довольно сложно работать с xml файлом, производить запись в него новых строк и т.д. Я даже не представляю в какой среде это легче всего сделать и с чего начать. Если бы кто помог, или хотя бы направил в нужную сторону я бы попытался это сделать. Чисто из спортивного интереса. Проветрить свои нейронные сети так сказать.

6

Re: Восстановление записей из корзины

babaduk пишет:

Я мог бы попробовать реализовать эту идею.

Это будет сложно даже для меня как для автора программы. Работа большая. Лучше придумайте какие-нибудь консольные программы-помогаторы на PHP, с помощью которых можно выполнять действия с базой MyTetra. Попробуйте все что вы написали реализовать в виде PHP-скрипта: запускаете, он лезет в корзину, находит файлы, составляет список, показывает его пользователю, спрашивает что восстановить, и восстанавливает, создавая через DOM в mytetra.xml нужные ветки, создавая каталоги восстанавливаемых записей, помещая туда файлы восстанавливаетмых записей, правильно их переименовывая.

Вот это будет действительно нужная вещь, и вам будет более реалистично ее сделать.