Метаобновления

Содержание...

При установке обновления приложения или плагина бывает необходимо внести изменения в структуру базы данных или удалить более не актуальные файлы. Такие разовые действия называются метаобновлениями.

Для автоматического выполнения метаобновлений очередная версия продукта должна содержать правильно оформленные PHP-файлы с требуемой логикой (для выполнения SQL-запросов, удаления лишних файлов и т. п.).

Правила оформления исходного кода файлов метаобновлений

  1. Имя файла (с расширением .php) должно представлять собой метку времени UNIX, соответствующую более позднему времени, чем время установки текущей (еще не обновленной) версии продукта. Пример правильного имени файла: 1383820487.php.
  2. Файлы с исходным кодом метаобновлений должны находиться в директории lib/updates/ либо в любой поддиректории внутри lib/updates/. Например, файлы метаобновлений каждого нового поколения продукта может быть целесообразным хранить в отдельной поддиректории: lib/updates/1/, lib/updates/2/, lib/updates/3/ и т. п.
  3. В файлах метаобновлений можно использовать любые классы фреймворка и обновляемого приложения.
  4. Файлы метаобновлений должны быть написаны так, чтобы их исходный код мог быть выполнен любое количество раз без негативных последствий. Потенциально невыполнимые операции рекомендуется обрабатывать с помощью блока try...catch, чтобы исключить возможность прерывания работы скрипта.

    Пример:

    <?php
    
    $model = new waModel();
    
    //попытка получить содержимое потенциально отсутствующего поля таблицы
    try {
        $model->query('SELECT sort FROM myapp_item WHERE 0');
    
    //в случае неудачи — если поле отсутствует — добавляем его в таблицу
    } catch (waDbException $e) {
        $sql = 'ALTER TABLE myapp_item ADD sort INT(11) NOT NULL DEFAULT 0';
        $model->exec($sql);
    }

Как происходит выполнение метаобновлений

При первом запуске продукта после установки обновления с помощью «Инсталлера» проверяется значение записи с именем update_time для данного продукта в таблице wa_app_settings. После этого в хронологическом порядке начинает по очереди выполняться исходный код файлов метаобновлений продукта, в именах которых метка времени превышает значение, полученное из базы данных. Если исходный код какого-либо файла метаобновлений не выполнится, то исходный код остальных файлов также выполнен не будет. После успешного завершения метаобновления автоматически обновляется значение update_time в базе данных с текущей меткой времени.