При перегенерации схемы таблица не изменяется
Была xml-схема с рабочей моделью и таблицами.
Затем меня чёрт дернул поменять названия пары полей, везде в коде всё изменил/поправил на новые названия, потом поправил схему.
Перегенерирую схему вот этим вот кодом:
И вот, блин, незадача — поля во вновь создаваемой таблице остаются со старыми названиями!
Что за фигня? Я удалял все файлы модели, чистил кэш, перепроверял xml-схему — вот всё как надо! Таблица нормально дропается, но потом создаётся со старыми названиями полей. Как быть? Что делать? Куда копать?
Затем меня чёрт дернул поменять названия пары полей, везде в коде всё изменил/поправил на новые названия, потом поправил схему.
Перегенерирую схему вот этим вот кодом:
<?php
define('MODX_API_MODE', true);
require_once dirname(dirname(dirname(dirname(__FILE__)))).'/index.php';
/*******************************************************/
$package = 'ms2discount'; // Class name for generation
$suffix = 'ms2discount_'; // Suffix of tables.
$prefix = $modx->config['table_prefix']; // table prefix
// Folders for schema and model
$Model = dirname(__FILE__).'/model/';
$Schema = dirname(__FILE__).'/model/schema/';
$xml = $Schema.$package.'.mysql.schema.xml';
// Remove old files
rrmdir($Model.$package .'/mysql');
//unlink($xml);
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
$modx->error->message = null;
$modx->loadClass('transport.modPackageBuilder', '', false, true);
$manager = $modx->getManager();
$generator = $manager->getGenerator();
$generator->parseSchema($xml, $Model);
$modx->addPackage($package, $Model);
$manager->removeObjectContainer('myClassObject');
$manager->createObjectContainer('myClassObject');
print "\nDone\n";
function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object);
else unlink($dir."/".$object);
}
}
reset($objects);
rmdir($dir);
}
}
(это код из генерации схемы из minishop2, т.е. рабочий)И вот, блин, незадача — поля во вновь создаваемой таблице остаются со старыми названиями!
Что за фигня? Я удалял все файлы модели, чистил кэш, перепроверял xml-схему — вот всё как надо! Таблица нормально дропается, но потом создаётся со старыми названиями полей. Как быть? Что делать? Куда копать?
Комментарии: 9
Сейчас в другую таблицу этой же модели добавил пару новых полей — так вот при перегенерации так же создалась старая таблица. Новых полей нет. В первой таблице названия полей так же без изменений. А в .map файлах всё прописывается правильно — всё как в xml-схеме. Чего-то я не знаю(
Блин, даже в логах пусто :-(
Вась, помоги, пожалуйста. Чёт совсем у меня вариантов нету.
Вась, помоги, пожалуйста. Чёт совсем у меня вариантов нету.
Ну, проблема может быть только в схеме.
Проверь, может ты редактируешь ее не там, откуда она берется для генерации? Директория разработки на сервере не подмонтирована, или что-то такое.
Проверь, может ты редактируешь ее не там, откуда она берется для генерации? Директория разработки на сервере не подмонтирована, или что-то такое.
Но по логике, если б проблема была в схеме, то таблицы бы не создавались, а в логах были бы mysql-ошибки. Таковых не наблюдалось.
В сгенерированных map-файлах всё прописано согласно схемы, все поля, типы, индексы. А вот сами таблицы генерируются по старому.
Пути верные, сервер — простой шаред, в котором монтировать ничего нельзя, так что — нет, это тоже отпадает (к тому же до этого проблем не было).
Вот сейчас полностью снёс папку с кэшем, очистил папку модели компонента, убрал из xml-схемы всё — оставил описание одной таблицы и 2х полей и перегенерировал.
В итоге — сгенерировались xpdo-файлы этого класса, в map-ах только нужные 2 поля, в таблице — все старые 10 полей, плять. Со всеми индексами и типами.
Да откуда он вообще берёт эти старые данные? Мистики и волшебства в таких вопросах не бывает. Но вот в каком направлении копать?
В сгенерированных map-файлах всё прописано согласно схемы, все поля, типы, индексы. А вот сами таблицы генерируются по старому.
Пути верные, сервер — простой шаред, в котором монтировать ничего нельзя, так что — нет, это тоже отпадает (к тому же до этого проблем не было).
Вот сейчас полностью снёс папку с кэшем, очистил папку модели компонента, убрал из xml-схемы всё — оставил описание одной таблицы и 2х полей и перегенерировал.
В итоге — сгенерировались xpdo-файлы этого класса, в map-ах только нужные 2 поля, в таблице — все старые 10 полей, плять. Со всеми индексами и типами.
Да откуда он вообще берёт эти старые данные? Мистики и волшебства в таких вопросах не бывает. Но вот в каком направлении копать?
Ну, если это шаред, могу преположить только зверский кэш у mySql.
Дальше фантазии не хватает.
Дальше фантазии не хватает.
Здесь какое дело…
При выполнении
Затем, при выполнении
В removeObjectContainer() ничего сверхъестественного нет, чтобы повлиять на такой исход событий. Сейчас порою addPackage(). Может там какая веселуха происходит.
При выполнении
$generator->parseSchema($xml, $Model);
на выходе в методе parseSchema генерируются правильные map-файлы.Затем, при выполнении
$manager->createObjectContainer('myClassObject');
в этом методе есть вызов $xpdo->getFieldMeta(), а вот уже в нём набиваются мета-данные для создания таблицы. И вот там-то в массиве $this->map лежат старые мета-данные. Как они туда попадают — для меня ещё загадка.В removeObjectContainer() ничего сверхъестественного нет, чтобы повлиять на такой исход событий. Сейчас порою addPackage(). Может там какая веселуха происходит.
Хех, во дела…
В общем, у меня компонент был добавлен через addExtensionPackage() и из-за этого все мета-данные брались из кэша, только совершенно не понятно из какого — папка core/cache чистилась полностью.
В общем, сделал removeExtensionPackage() и теперь таблицы генерируются нормально
В общем, у меня компонент был добавлен через addExtensionPackage() и из-за этого все мета-данные брались из кэша, только совершенно не понятно из какого — папка core/cache чистилась полностью.
В общем, сделал removeExtensionPackage() и теперь таблицы генерируются нормально
Полагаю, что из memcached или apc на сервере.
Вот еще один минус шаредов — не знаешь, как настроено.
Вот еще один минус шаредов — не знаешь, как настроено.
Возможно memcached, да. Но всё-равно — больно уж это странно.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.