--- parser3/operators.txt 2002/03/26 08:51:00 1.24 +++ parser3/operators.txt 2002/06/03 15:02:40 1.40 @@ -15,7 +15,7 @@ Xне сделано, видимо, не будет сделано пустая таблица не defined пустой hash не defined !eq ne lt gt le ge для сравнения строк, - !in "/dir/" для проверки[раньше ^start] + !in "/dir/" для проверки ["внутри не допустимы, если надо сравнить со сложным, пусть это будет переменная]. !is 'type' для проверки типа левого операнда, @@ -68,7 +68,6 @@ Xне сделано, видимо, не будет сделано $exception.file $exception.lineno [если не запрещены при компиляции] $exception.source = вася $exception.comment = болван - ^if($exception.type eq connect){^cache[read]} } ^case[_default]{ код, обрабатывающий другую ошибку @@ -86,7 +85,7 @@ Xне сделано, видимо, не будет сделано default as-is !^taint[[lang]][код] default "just tainted, language unknown" - !^process[строка, которая будет process-ed, как код] + !^process{строка, которая будет process-ed, как код} !^connect[protocol://строка соединения]]{код с ^sql[...]-ями} !mysql://user:pass@{host[:port]|[/unix/socket]}/database? charset=cp1251_koi8& @@ -142,17 +141,24 @@ odbc c:\drives\y\parser3project\odbc\ /**имя_поля**/'literal' !^rem{} !^cache[файл](секунд){код} + !относительное задание времени !скэшировать строку, которая получается при выполнении кода на 'секунд' секунд !если 0секунд, значит не кэшировать, а старый такой стереть - ^cache[delete] - сигнализирует вышестоящему ^cache "не кэшировать, старое забыть" - ^cache[read] - сигнализирует вышестоящему ^cache "взять скэшированное насильно, игнорируя expires",
- выдаёт bool "получилось/нет" + !^cache[файл][expires date]{код} + !абсолютное задание времени + X^cache[файл] удалить файл [не ругает, если его нет] // такое было, больше не будет, делать ^cache(0) + !^cache(секунд) + !^cache[expires date] + !сигнализирует вышестоящему ^cache "уменьши до стольких-то 'секунд'/'expires'" + !в пределе: ^cache(0) отменить кэширование + X^cache[read] + сигнализирует вышестоящему ^cache "взять скэшированное насильно, игнорируя expires",
+ выдаёт bool "получилось/нет" Xесть глобальный флажок в свойствах/командной строке "не оптимизировать" - !и есть исключение: ^untaint[html]{код} не оптимизируется безотностительно флажка + !и есть исключение: ^untaint[html]{код} не оптимизируется + Xбезотностительно флажка !у всех макросов есть локальная переменная $result, если в неё что положить, !то _это_ будет результатом макроса, а не его тело @@ -225,7 +231,7 @@ odbc c:\drives\y\parser3project\odbc\ !^имя.div(на сколько /) !^имя.mod(на сколько %) !^имя.format[формат] - !^int/double:sql{query}[[$.limit(2) $.offset(4) $.default(0)]] + !^int/double:sql{query}[[$.limit(2) $.offset(4) $.default{0}]] запрос, результат которого должен быть один столбец/одна строка !string @@ -237,7 +243,7 @@ odbc c:\drives\y\parser3project\odbc\ пример: ^if(def $form:name) не пуста? ^if($user.isAlive) истина? [автопреобразование к числу, не ноль?] - !^string::sql{query}[[$.limit(2) $.offset(4) $.default[n/a]]] + !^string::sql{query}[[$.limit(2) $.offset(4) $.default{n/a}]] результат запроса должен быть один столбец/одна строка !^имя.int[] .int(default) целочисленное значение строки. если ломается преобразование, берётся default @@ -277,7 +283,7 @@ odbc c:\drives\y\parser3project\odbc\ !^table::load[[nameless;]путь] !если не nameless, названия колонок берутся из первой строки !пустые строки, и строки в первой колонке содержащие '#', игнорируются - !^table::sql{query}[[$.limit(2) $.offset(4)]] + !^table::sql{query}[[$.limit(2) $.offset(4) todo:$.default{ ^table::create[...] }]] !^таблица.save[[nameless|append;]путь] !$таблица.поле !$таблица.fields+ из named таблицы выдаёт текущую запись как Hash @@ -303,6 +309,10 @@ odbc c:\drives\y\parser3project\odbc\ значением $hash.ключ будет hash в котором поля значений будут ключами поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой !^таблица.columns[]+ таблица из одного столбца $column + !$отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало + $adults[^man.select($man.age>=18)] + ^таблица.color[цвет1;цвет2] + !hash !в выражении @@ -321,7 +331,7 @@ odbc c:\drives\y\parser3project\odbc\ !^a.intersection[b] = пересечение значения a !^a.intersects[b] = bool - !^hash::sql{запрос}[[$.limit(2) $.offset(4)]] + !^hash::sql{запрос}[[$.limit(2) $.offset(4) todo:$.default{$.field[]...}]] получается hash(ключи=значения первая колонка ответа) of hash(ключи=названия остальных колонкок ответа) !^hash._keys[]+ таблица из одного столбца $key @@ -526,7 +536,7 @@ Xhashfile блокируется выполняется код разблокируется - chmod НЕТ И НЕ БУДЕТ, ЧТОБЫ НЕ МОГЛИ СДЕЛАТЬ executable и запустить, даже если ftp запрещает chmod. + Xchmod[...] НЕТ И НЕ БУДЕТ, ЧТОБЫ НЕ МОГЛИ СДЕЛАТЬ executable и запустить, даже если ftp запрещает chmod. !math !$math:PI @@ -545,10 +555,20 @@ Xhashfile !всё происходит в localtime, !временная зона задаётся вне parser средствами OS !^date::now[] + !^date::now(смещение в днях) выдаёт сейчас+смещение !^date::create(дней с epoch) // старое имя set - !^date::create(year;month;day[;hour[;minute[;second]]]) // старое имя set + !^date::create(year;month[;day[;hour[;minute[;second]]]]) // старое имя set + ^date::sql-create[дата в формате %Y-%m-%d %H:%M:%S] + для удобного создания по значению из базы +<<<<<<< operators.txt + формат1: %Y[-%m[-%d[ %H[:%M[:%S]]]]] + формат2: %H:%M[:%S] + !$date.year month day hour minute second weekday todo:yearday + read-only +======= !$date.year month day hour minute second weekday read-only - !^date.roll[year|month|day](+/- 1) сдвигает дату +>>>>>>> 1.34 + !^date.roll[year|month|day](+-смещение) сдвигает дату !^date.sql-string[] %Y-%m-%d %H:%M:%S where published='$дата.sql-string[]' !^date:calendar[rus|eng;год;месяц] выдаёт неименованную таблицу @@ -603,6 +623,7 @@ xdoc(xnode) !cdata-section-elements = qnames !indent = "yes" | "no" !media-type = string /> + !параметры передаются как есть, не xpath выражения !.string[output options] !.save[file.xml;output options] с шапкой @@ -763,6 +784,8 @@ xdoc(xnode) !idrss integral unshared data size !isrss integral unshared stack size +!DATA::=string | file + !MAIN это класс, загружаемый на автомате из parser3.conf, кучи auto.p и запрашиваемого документа: @@ -784,7 +807,7 @@ xdoc(xnode) !результат которого передаётся в его @post-process[data] if($data is string) ... !результат которого отдаётся пользователю - !если встречается ошибка и try не задан, её можно красиво сообщить пользователю, +!если встречается ошибка и try не задан, её можно красиво сообщить пользователю, !определив !@unhandled_exception[exception;stack] !$exception.type строка "тип проблемы" @@ -795,11 +818,22 @@ xdoc(xnode) там лежат в обратном порядке имена[name] и места вызовов[file line] операторов/методов, приведших к ошибке. - !нужно выключить русский apache: CharsetDisable on +!системные типы ошибок: + !parser.compile ^test[} компиляция (непарная скобка, ...) + !parser.runtime ^if(0). параметры (больше/меньше, чем нужно, не тех типов, ...) + !number.zerodivision ^eval(1/0) ^eval(1%0) + !number.format ^eval(abc*5) + !file.missing ^file:delete[delme] not found + !file.access ^table::load[.] no rights + !image.format ^image::measure[index.html] not gif/jpg + !sql.connect ^connect[mysql://baduser:pass@host/db]{} not found/timeout + !sql.execute ^void:sql{select bad} syntax error + !xml ^xdoc::create{} any error in xml/xslt libs + !smtp.connect not found/timeout + !smtp.execute communication error -!DATA::=string | file +!нужно выключить русский apache: CharsetDisable on ---- - если в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет +!если в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет выдан список фрагментов результата с указанием их происхождения