--- parser3/operators.ru.txt 2002/03/27 15:30:33 1.28
+++ parser3/operators.ru.txt 2002/06/14 12:45:15 1.46
@@ -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,9 +536,9 @@ Xhashfile
блокируется
выполняется код
разблокируется
- chmod НЕТ И НЕ БУДЕТ, ЧТОБЫ НЕ МОГЛИ СДЕЛАТЬ executable и запустить, даже если ftp запрещает chmod.
+ Xchmod[...] НЕТ И НЕ БУДЕТ, ЧТОБЫ НЕ МОГЛИ СДЕЛАТЬ executable и запустить, даже если ftp запрещает chmod.
-!math
+math
!$math:PI
!^math:round floor ceiling
!^math:trunc frac
@@ -538,6 +548,8 @@ Xhashfile
!^math:degrees radians
!^math:pow sqrt
!^math:random(ширина диапазона)
+ ^math:{C2C0983C-E26E-4169-BD07-77ECE9405BA5}
+
!date
!время типа time можно использовать в выражениях, подставляет
@@ -545,9 +557,15 @@ Xhashfile
!всё происходит в localtime,
!временная зона задаётся вне parser средствами OS
!^date::now[]
+ !^date::now(смещение в днях) выдаёт сейчас+смещение
!^date::create(дней с epoch) // старое имя set
- !^date::create(year;month;day[;hour[;minute[;second]]]) // старое имя set
- !$date.year month day hour minute second weekday read-only
+ !^date::create(year;month[;day[;hour[;minute[;second]]]]) // старое имя set
+ !^date::create[дата в формате %Y-%m-%d %H:%M:%S]
+ для удобного создания по значению из базы
+ формат1: %Y[-%m[-%d[ %H[:%M[:%S]]]]]
+ формат2: %H:%M[:%S]
+ !$date.year month day hour minute second weekday todo:yearday
+ read-only
!^date.roll[year|month|day](+-смещение) сдвигает дату
!^date.sql-string[] %Y-%m-%d %H:%M:%S
where published='$дата.sql-string[]'
@@ -603,6 +621,7 @@ xdoc(xnode)
!cdata-section-elements = qnames
!indent = "yes" | "no"
!media-type = string />
+ !параметры передаются как есть, не xpath выражения
!.string[output options]
!.save[file.xml;output options] с шапкой
@@ -643,10 +662,15 @@ xdoc(xnode)
true if the attribute received its value explicitly in the XML document,
or if a value was assigned programatically with the setValue function.
false if the attribute value came from the default value declared in the document's DTD.
+ !$attribute_node.name
+ !$attribute_node.value
$text_node/cdata_node/comment_node.substringData
!$pi_node.target = target of this processing instruction
XML defines this as being the first token following the markup
that begins the processing instruction.
+ !$pi_node.data = The content of this processing instruction
+ This is from the first non white space character after the target
+ to the character immediately preceding the ?>.
document_node.
readonly attribute DocumentType doctype
readonly attribute DOMImplementation implementation
@@ -673,7 +697,7 @@ xdoc(xnode)
!void removeAttribute(in DOMString name) raises(DOMException)
!Attr getAttributeNode(in DOMString name)
!Attr setAttributeNode(in Attr newAttr) raises(DOMException)
- !/*Attr*/ removeAttributeNode(in Attr oldAttr) raises(DOMException)
+ !Attr removeAttributeNode(in Attr oldAttr) raises(DOMException)
!NodeList getElementsByTagName(in DOMString name)
!void normalize()
@@ -770,14 +794,11 @@ xdoc(xnode)
кучи auto.p и запрашиваемого документа:
!parser3.conf
cgi:
- 1. или полный путь из переменной окружения HTTP_PARSER_ROOT_CONFIG
- или configure sysconfdir|windows directory
- 2. или полный путь из переменной окружения HTTP_PARSER_SITE_CONFIG
+ 1. или полный путь из переменной окружения CGI_PARSER_SITE_CONFIG
или рядом с бинарником parser'а
isapi: windows directory
apache module:
- 1) ParserRootConfig [httpd.conf only]
- 2) ParserSiteConfig [can be in .htaccess]
+ 1) ParserConfig [can be in .htaccess]
!auto.p вниз от DOCUMENT_ROOT/ по дереву до каталога с обрабатываемым файлом включительно
класс собирается из всех этих файлов, последующие становятся родителями предыдущих
имя последнего загруженного MAIN, имён у предыдущих нет
@@ -802,11 +823,12 @@ xdoc(xnode)
!parser.runtime ^if(0). параметры (больше/меньше, чем нужно, не тех типов, ...)
!number.zerodivision ^eval(1/0) ^eval(1%0)
!number.format ^eval(abc*5)
+ !file.lock shared/exclusive lock error
!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 ^connect[mysql://okuser:pass@host/db]{^void:sql{select bad}} syntax error
+ !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