parser

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

 

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

Unhandled exception 0xC0000005 at 0x00404993 - вторая попытка

Дмитрий 09.05.2010 16:39

Пытался воссоздать ошибку - http://www.parser.ru/forum/?id=72572

Суть в том, что я брал из базы кучу дубликатов записей (get_options), а потом отсеивал нужные мне записи уже средствами парсера (get_event_options), формируя новую табличку.
У меня пример был более сложный, тут он упрощён, так что может показаться слегка надуманным.
@get_options[h_params]
$h_params[^hash::create[$h_params]]
$result[^oSql.table{
	SELECT 
		option_id,
		option_name,
		option_value,
		option_event_id
	FROM 
		events_options
	^if(def $h_params.where){
		WHERE $h_params.where
	}
}]

@get_event_options[i_event_id][locals]
$t_options[^get_options[
	$.where[
		... куча условий, которые плодили дубликаты...
	]
	$.order_by[option_event_id DESC, option_id ASC]
]]
$result[^table::create{option_name	option_value}]
^t_options.menu{
	^if($t_options.option_event_id == ^i_event_id.int(0) || ($t_options.option_event_id == 0 && !^result.locate($result.option_name eq $t_options.option_name))){
		^result.append{$t_options.option_name	$t_options.option_value}
	}
}
В итоге у меня формировалась примерно такая табличка
option_name	option_value
title_comment	Задать вопрос
title_comment_text	Вопрос
title_comment_name	Ваше имя
title_comment_city	Город
comments_description
Понятно, что значение параметра comments_description отсутствовало, но почему то не создавался tab с пустым значением. Из-за этого парсер падал.
Если взять и принудительно добавить tab в эту строку, то всё прекрасно работало.
@page[]
$t_options[^get_event_options[$t_event.event_id]]
$h_options[^t_options.hash[option_name][option_value][$.type[string]]]
^comments[$h_options]

@comments[h_options]
^if(def $h_options.comments_description){
	$h_options.[comments_description]
}