--- parser3/operators.ru.txt 2004/02/26 14:44:46 1.152
+++ parser3/operators.ru.txt 2006/12/01 18:02:22 1.184
@@ -50,11 +50,14 @@ Xне сделано, видимо, не будет сделано
%left '-' '+'
%left '*' '/' '%' '\\'
%left NEG /* negation: unary - */
+ !литералы
+ true
+ false
!^if(условие){когда да}{когда нет}
!^switch[значение]{^case[вариант1[;вариант2...]]{действие}^case[DEFAULT]{действие по умолчанию}}
- !^while(условие){тело}
+ !^while(условие){тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
!^for[i](0;4){тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
!^use[модуль]
!^try{
@@ -86,9 +89,9 @@ Xне сделано, видимо, не будет сделано
удобно сделать после выставления 401 ошибки
^return[результат] + - отваливает из выполнения метода,
выдавая нестандартный результат
- X^break[] + - обрывает цикл
- X^continue[] + - обрывает итерацию цикла
- !^untaint[[as-is|file-spec|http-header|mail-header|uri|table|sql|js|xml|html|optimized-html]]{код}
+ !^break[] + - обрывает цикл
+ !^continue[] + - обрывает итерацию цикла
+ !^untaint[[as-is|file-spec|http-header|mail-header|uri|sql|js|xml|html|optimized-html]]{код}
default as-is
!^taint[[lang]][код]
default "just tainted, language unknown"
@@ -101,6 +104,7 @@ Xне сделано, видимо, не будет сделано
по умолчанию, методы компилируются в $self [в случае оператора, $self=$MAIN:CLASS]
!^connect[protocol://строка соединения]]{код с ^sql[...]-ями}
!mysql://user:pass@{host[:port]|[/unix/socket]}/database?
+ ClientCharset=parser-charset << charset in which parser thinks client works
charset=cp1251_koi8&
timeout=3&
compress=1&
@@ -109,8 +113,9 @@ Xне сделано, видимо, не будет сделано
autocommit если выставить в 0, будет делать commit/rollback
!pgsql://user:pass@{host[:port]|[local]}/database?
- client_encoding=win,[to-find-out]&
- datestyle=ISO,SQL,Postgres,European,NonEuropean=US,German,DEFAULT=ISO
+ client_encoding=win,[to-find-out]
+ &datestyle=ISO,SQL,Postgres,European,NonEuropean=US,German,DEFAULT=ISO
+ &ClientCharset=parser-charset << charset in which parser thinks client works
!oracle://user:pass@service?
NLS_LANG=RUSSIAN_AMERICA.CL8MSWIN1251&
@@ -125,7 +130,8 @@ Xне сделано, видимо, не будет сделано
ORA_ENCRYPT_LOGIN=TRUE
ClientCharset=parser-charset << charset in which parser thinks client works
- !odbc://DSN=dsn^;UID=user^;PWD=password
+ !odbc://DSN=dsn^;UID=user^;PWD=password^;ClientCharset=parser-charset
+ ClientCharset << charset in which parser thinks client works
для работы connect нужно, чтобы заранее(рекомендуется в системном parser3)
была определена таблица
@@ -168,9 +174,11 @@ odbc c:\drives\y\parser3project\odbc\
!^cache[expires date]
!сигнализирует вышестоящему ^cache "уменьши до стольких-то 'секунд'/'expires'"
!в пределе: ^cache(0) отменить кэширование
+ !^cache[] выдаёт текущую expires date
X^cache[read]
сигнализирует вышестоящему ^cache "взять скэшированное насильно, игнорируя expires",
выдаёт bool "получилось/нет"
+ !^sleep(seconds)
Xесть глобальный флажок в свойствах/командной строке "не оптимизировать"
@@ -239,11 +247,18 @@ odbc c:\drives\y\parser3project\odbc\
0
!^имя.pos[...]
-1
+ !^void.left(n)
+ ничего не выдаёт
+ !^void.right(n)
+ ничего не выдаёт
+ !^void.mid(p[;n])
+ ничего не выдаёт
!^имя.int[] (default)
0 или default
!^имя.double[] (default)
0 или default
- !^void:sql{запрос без результата}
+ !^void:sql{запрос без результата}{$.bind[см. table::sql]}
+
!int,double
!^имя.int[] целочисленное значение
@@ -254,7 +269,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} $.bind[см. table::sql]]]
запрос, результат которого должен быть один столбец/одна строка
!string
@@ -266,7 +281,7 @@ odbc c:\drives\y\parser3project\odbc\
пример:
^if(def $form:name) не пуста?
^if($user.isAlive) истина? [автопреобразование к числу, не ноль?]
- !^string::sql{query}[[$.limit(1) $.offset(4) $.default{n/a}]]
+ !^string::sql{query}[[$.limit(1) $.offset(4) $.default{n/a} $.bind[см. table::sql]]]
результат запроса должен быть один столбец/одна строка
!^имя.int[] .int(default) целочисленное значение строки.
если ломается преобразование, берётся default
@@ -305,6 +320,11 @@ odbc c:\drives\y\parser3project\odbc\
!^строка.normalize[] выдает другую строку, в которой фрагменты на одном языке объединены
полезно делать перед сложными match операциями, если вы знаете, что входная строка
состоит из большого числа фрагментов
+ !^string.trim[start|both|end[;chars]] выкидывает charset из начала/конца/и начала и конца
+ default 'chars' -- whitespace chars
+ !^string.append[string]
+ !^string.base64[] encode
+ !^string:base64[encoded] decode
!table
в выражении
@@ -319,7 +339,11 @@ odbc c:\drives\y\parser3project\odbc\
!пустые строки, и строки в первой колонке содержащие '#', игнорируются
!$.separator[^#09]
!$.encloser["] по-умолчанию, нет.
- !^table::sql{query}[[$.limit(2) $.offset(4) todo:$.default{ ^table::create[...] }]]
+ !^table::sql{query}[[$.limit(2) $.offset(4) $.bind[hash] todo:$.default{ ^table::create[...] }]]
+ bind привязывает переменные в запросе к их значениям
+ пока реализован только для oracle
+ в запросе надо написать ":имя"
+ в параметре bind передать hash, из которого возьмётся(или куда запишется) значение
!^таблица.save[[nameless|append;]путь[;опции, см. load]]
!$таблица.поле
!$таблица.fields из named таблицы выдаёт текущую запись как Hash
@@ -375,7 +399,7 @@ odbc c:\drives\y\parser3project\odbc\
!^hash::sql{запрос}[[$.distinct(1) $.limit(2) $.offset(4) todo:$.default{$.field[]...}]]
получается hash(ключи=значения первая колонка ответа)
of hash(ключи=названия остальных колонкок ответа)
- !^hash._keys[]+ таблица из одного столбца $key
+ !^hash._keys[[название колонки с ключами]]+ таблица из одного столбца $key или как передадут
!^hash._count[]
!^foreach[key;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
!^delete[ключ] удалить ключ
@@ -396,11 +420,11 @@ odbc c:\drives\y\parser3project\odbc\
!^foreach[key|value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}]
пример:
- $uids[^hashfile::open[/db/uids]]
-
- $random[23847387taduigh345XGHWElxjgdjg]
- $uids.$random[$.value[$uid] $.expires(1)]
- $uid[$persistent.logins.$random]
+ $sessions[^hashfile::open[/db/sessions]]
+
+ $sid[^math:uuid[]]
+ $sessions.$sid[$.value[$uid] $.expires(1)]
+ $uid[$sessions.$sid]
!form
[берётся первый элемент из одноимённых из GET, потом первый из POST]
@@ -414,6 +438,7 @@ odbc c:\drives\y\parser3project\odbc\
!env
!$env:переменная
+ !$env:PARSER было то же самое, что показывается при запуске parser.cgi
!cookie
!$cookie:имя считать старое или свежезаданное
@@ -446,6 +471,7 @@ odbc c:\drives\y\parser3project\odbc\
! $attribute[zzz] field: abc; {attribute=zzz}<<часть
!значение поля или атрибута может быть string или date
! если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT"
+ !$response:headers накопленные поля
!$response:body[DATA] замещает стандартный ответ
!$response:download[DATA] замещает стандартный ответ,
выставляет флаг, заставляющий browser предложить download
@@ -536,7 +562,7 @@ odbc c:\drives\y\parser3project\odbc\
!это старый формат, поддерживается для обратной совместимости
!если имя части начинается со слова text, то это текстовый блок.
!если имя части начинается со слова attach, то это вложение, формат задания::
- !$attach[$.format[!uue|Xbase64] $.value[DATA] $.file-name[user-file-name]]
+ !$attach[$.format[!uue|!base64] $.value[DATA] $.file-name[user-file-name]]
!важно: при multipart не указывать content-type
^mail:send[
# по-умолчанию, совпадает с source encoding.
@@ -629,6 +655,8 @@ odbc c:\drives\y\parser3project\odbc\
определяющее прожорливость выделялки цветов из палитры [default=150]
меньше - точнее приближает цвета, но они быстро кончаются
больше - неточно приближает цвет, но бОльшей части хватит
+ !^картинка.pixel(x;y)[(color)]
+ узнать или задать цвет пиксела
!file
!$файл_из_post.name
@@ -639,6 +667,7 @@ odbc c:\drives\y\parser3project\odbc\
!^file:find[имя файла][{когда не нашли}]
!^file:list[путь[;шаблон]] = table с колонкой name
!^file::load[text|binary;!big.zip[;!domain_press_release_2001_03_01.zip][;опции]]
+ !^file::create[text;имя;^untaint[xml]{data}]
!$файл_который_был_loaded.size
!^file::stat[имя файла]
!$файл_который_был_stated.size !.adate !.mdate !.cdate
@@ -653,6 +682,8 @@ odbc c:\drives\y\parser3project\odbc\
можно переименовывать и двигать каталоги[win32: но не через границу дисков]
каталоги для dest создаются с правами 775
каталог старого файла стирается, если после move он остаётся пуст
+ !^file:copy[имя файла;имя копии файла]
+ можно копировать только файлы
!^file:lock[имя файла]{код}
файл при необходимости создаётся
блокируется
@@ -665,7 +696,27 @@ odbc c:\drives\y\parser3project\odbc\
!^file:justname[/a/some.tar.gz]=some.tar
!^file:justext[/a/some.tar.gz]=gz
!/some/page.html: ^file:fullpath[a.gif] => /some/a.gif
-
+ !^file.sql-string[] внутри ^connect даст правильно escaped строку, которую можно в запрос отдать
+ X^file::sql[[имя_файла_для_download]]{}
+ !^file::sql{}[[
+ $.name[имя_файла_для_download]
+ $.content-type[пользовательский content-type]
+ ]]
+ результат запроса должен быть "одна строка".
+ колонки:
+ первая колонка - данные
+ если есть вторая - это имя файла
+ если есть третья - это content-type
+ !^file.base64[] encode
+ !^file::base64[encoded string] decode
+ !^file:crc32[имя файла]
+ вычисляет crc32 файла с указанным именем
+ !^file.crc32[]
+ вычисляет crc32 объекта
+ !^file.md5[]
+ !^file:md5[имя файла]
+ выдает digest файла, длиной 16 байт в виде строки,
+ где байты digest выданы в hex виде, впритык, в нижнем регистре
!math
!$math:PI
@@ -694,6 +745,8 @@ odbc c:\drives\y\parser3project\odbc\
если нет тела salt, оно создаётся случайным
$1$ вызывает MD5 алгоритм функции OS 'crypt', если поддерживается [заведомо нет на solaris].
другие salt читайте документацию по функции OS 'crypt'.
+ !^math:crc32[string]
+ вычисляет crc32 строки
!date
!время типа time можно использовать в выражениях, подставляет
@@ -725,6 +778,8 @@ odbc c:\drives\y\parser3project\odbc\
столбцы: year, month, day, weekday
xdoc(xnode)
+ !$xdoc.search-namespaces hash, where keys=prefixes, values=urls
+
DOM1 attributes:
!readonly attribute DocumentType doctype
Xreadonly attribute DOMImplementation implementation
@@ -966,7 +1021,14 @@ console
!$console:line
read/write строку
-!DATA::=string | file
+DATA::=string | file | hash
+
+!hash вида
+[
+ $.file[имя файла на диске]
+ $.name[имя файла для пользователя]
+ $.mdate[date]
+]
!MAIN
это класс, загружаемый на автомате из parser3.conf,
@@ -998,18 +1060,28 @@ console
операторов/методов, приведших к ошибке.
!при загрузке файла (file::load, table::load, xdoc::load) можно указать такое имя файла:
- !http://domain/document?params
+ !http://domain/document[?params<> создает http.status ошибку,
!это можно отключить, передав
!$.any-status(1)
!$.charset[кодировка удалённых докуметов по-умолчанию] << если сервер вернёт content-type:charset=ОНА_ПЕРЕБИВАЕТ
+ !$.user[пользователь]
+ !$.password[пароль]
!file::load в дополнительные поля записывает
!ПОЛЕ:значение (имена полей ответа заглавными буквами)
!tables << хеш их ПОЛЕ->table с единственным столбцом "value".
@@ -1045,5 +1117,12 @@ console
!нужно выключить русский apache: CharsetDisable on
-!если в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет
+Xесли в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет
выдан список фрагментов результата с указанием их происхождения
+
+!если описание метода содержит локальную переменную result в явном виде
+ (есть и неявная переменная)
+ то код вывода строковых литералов не попадает в конечный байт-код,
+ а непробельные символы считаются синтаксической ошибкой
+ для вывода чего бы то ни было надо пользоваться этой переменной
+