| Новости | 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
)
}
}
...