Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Никита Козин 26.06.2005 13:13
Пока сделал с хэшами, работает. (Что удивительно :))@uninstallModule[module_id][classes] $module_id(^module_id.int(0)) ^if($module_id){ $classes[^hash::create[]] ^rem{ *** Удаляем информацию о модуле из базы данных *** } ^MAIN:pSQL.void{ DELETE FROM engine_modules WHERE module_id = $module_id } ^rem{ *** Смотрим: какие классы использовал модуль... *** } $classes.all[^MAIN:pSQL.table{ SELECT module_id, class_name FROM engine_classes }] $classes[ ^rem{ *** Хэши всех классов всех модулей (ключи: class_name/module_id)*** } $.names[^classes.all.hash[class_name][$.distinct[tables]]] $.ids[^classes.all.hash[module_id][$.distinct[tables]]] ^rem{ *** Пустой таблица. Сюда будем добавлять имя класса, подлежащего удалению *** } $.delete[^table::create[$classes.all;$.limit(0)]] ] ^classes.ids.[$module_id].menu{ ^if( ^classes.names.[$classes.ids.[$module_id].class_name].count[] == 1 && $classes.names.[$classes.ids.[$module_id].class_name].module_id == $module_id ){ ^classes.delete.append{$module_id $classes.ids.[$module_id].class_name} } } ^rem{ *** Удаляем ни кем не используемые классы *** } ^classes.delete.menu{ ^file:delete[/classes/$classes.delete.class_name] } ^rem{ *** Удаляем всю информацию об этих же классах из базы *** } ^MAIN:pSQL.void{ DELETE FROM engine_classes WHERE class_name IN (^classes.delete.menu{$classes.delete.class_name}[,]) } ^rem{ *** Все, удаление успешно завершено *** } $result(1) }{ ^rem{ *** Не был передан id модуля (или было передано не число) *** } $result(0) } # end @uninstallModule[]Пробовал написать один запрос к базе с LEFT JOIN, и дальше, так же, в menu по выбранным записям удалить неиспользуемые файлы классов и сами выбранные строки из базы. Но запутался еще больше :(
+-----------+------------+ | module_id | class_name | +-----------+------------+ | 1 | lib.p | | 1 | dtf.p | | 2 | lib.p | | 3 | lib.p | | 3 | dtf.p | | 3 | scroller.p | +-----------+------------+Из нее нужно выбрать только те записи, которые есть у заданного модуля, но которые больше ни где не дублируются. Т.е. если $module_id(3), значит в выборку должна попасть только последняя запись (scroller.p)
$module_id(3) $classes.delete[^MAIN:pSQL.table{ SELECT engine_classes_2.module_id, engine_classes_2.class_name FROM engine_classes AS engine_classes_2 ^MAIN:pSQL.left_join[FROM;engine_classes]{ engine_classes.class_name = engine_classes_2.class_name } WHERE engine_classes_2.module_id = $module_id }]ПостСкриптум
... ^rem{ *** Добавляем информацию о модуле в базу данных *** } ^MAIN:pSQL.void{ INSERT INTO engine_modules ( name, title, description ) VALUES ( '$module_info.name', '$module_info.title', '$module_info.description' ) } $module_info.module_id(^MAIN:pSQL.last_insert_id[engine_modules]) ^rem{ *** Устанавливаем классы *** } ^module_info.classes.menu{ ^MAIN:pSQL.void{ INSERT INTO engine_classes ( class_name, module_id ) VALUES ( '$module_info.classes.name', $module_info.module_id ) } } ...