parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Ответ

Никита Козин 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
}]
ПостСкриптум
На счет last_insert_id в menu — конечно этому предшествует добавление в эту даблицу :), но я все равно исправил следующим образом:
...
^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
		)
	}
}
...