--- parser3/operators.ru.txt 2007/07/06 15:15:58 1.196 +++ parser3/operators.ru.txt 2008/07/18 08:25:13 1.211 @@ -62,15 +62,20 @@ Xне сделано, видимо, не будет сделано !^use[модуль] !^try{ ... - !^throw[sql.connect;вася;болван] // был ^error[текст] + !^throw[sql.connect[;вася[;болван]]] // был ^error[текст] + !^throw[ + $.type[sql.connect] + $.source[вася] + $.comment[болван] + ] ... }{ - ^if($exception.type eq sql){ - $exception.handled(1) ^rem{флаг, что exception обработан} + ^if($exception.type eq "sql"){ + $exception.handled(1|true) ^rem{флаг, что exception обработан} .... } - ^switch($exception.type){ + ^switch[$exception.type]{ ^case[sql;mail]{ $exception.handled(1) код, обрабатывающий sql ошибку @@ -81,7 +86,7 @@ Xне сделано, видимо, не будет сделано } ^case[DEFAULT]{ код, обрабатывающий другую ошибку - ^throw[$exception] << re-throw + ^throw[$exception] << re-throw // DON'T! It's default behaviour! } } } @@ -107,8 +112,9 @@ Xне сделано, видимо, не будет сделано ClientCharset=parser-charset << charset in which parser thinks client works charset=cp1251_koi8& timeout=3& - compress=1& + compress=0& named_pipe=1& + multi_statements=1& allow execute more then one query in one parser :sql{} request autocommit=1 autocommit если выставить в 0, будет делать commit/rollback @@ -133,18 +139,20 @@ Xне сделано, видимо, не будет сделано !odbc://DSN=dsn^;UID=user^;PWD=password^;ClientCharset=parser-charset ClientCharset << charset in which parser thinks client works - !sqlite://database + !sqlite://DBfile? + ClientCharset=parser-charset& << charset in which parser thinks client works + autocommit=1 для работы connect нужно, чтобы заранее(рекомендуется в системном конфигурационном auto.p) была определена таблица #sql drivers $SQL[ - $.drivers[^table::create{protocol driver client -mysql /www/parser3/libparser3mysql.so /usr/local/lib/mysql/libmysqlclient.so -pgsql /www/parser3/libparser3pgsql.so /usr/local/pgsql/lib/libpq.so -oracle /www/parser3/libparser3oracle.so /u01/app/oracle/product/8.1.5/lib/libclntsh.so?ORACLE_HOME=/u01/app/oracle/product/8.1.5&ORA_NLS33=/u01/app/oracle/product/8.1.5/ocommon/nls/admin/data -sqlite /www/parser3/libparser3sqlite.so /usr/local/sqlite/lib/sqlite3.so -odbc c:\drives\y\parser3project\odbc\debug\parser3odbc.dll + $.drivers[^table::create{protocol driver client +mysql /www/parser3/libparser3mysql.so /usr/local/lib/mysql/libmysqlclient.so +pgsql /www/parser3/libparser3pgsql.so /usr/local/pgsql/lib/libpq.so +oracle /www/parser3/libparser3oracle.so /u01/app/oracle/product/8.1.5/lib/libclntsh.so?ORACLE_HOME=/u01/app/oracle/product/8.1.5&ORA_NLS33=/u01/app/oracle/product/8.1.5/ocommon/nls/admin/data +sqlite /www/parser3/libparser3sqlite.so /usr/local/sqlite/lib/sqlite3.so +odbc c:\drives\y\parser3project\odbc\debug\parser3odbc.dll }] ] !в таблице у oracle в столбце клиентской библиотеки @@ -308,11 +316,11 @@ odbc c:\drives\y\parser3project\odbc\ !^строка.match[шаблон][опции поиска]{замена} опции поиска+= g заменить все вхождения, а не одно - !^строка.split[разделитель][[lrhv]] + !^строка.split[разделитель][[lrhv]][[название столбца для вертикального разбиения]] l слева направо [default] r справа налево h nameless таблица с ключами 0, 1, 2, ... - v таблица из столбца piece [default] + v таблица из 1 столбца 'piece' или как передадут [default] !^строка.{l|r}split[разделитель] таблица из столбца $piece оставлен для совместимости !^строка.upper|lower[] @@ -323,6 +331,7 @@ odbc c:\drives\y\parser3project\odbc\ !^строка.left(N) !^строка.right(N) !^строка.pos[подстрока] + !^строка.pos[подстрока](позиция, с которой ищем) <0 = не найдено !^строка.replace[$таблица_подстановок_строка_на_строку] !^строка.save[[append;]путь] @@ -339,7 +348,7 @@ odbc c:\drives\y\parser3project\odbc\ в выражении логическое значение равно "не пуста?" числовое значение равно count[] - !^table::create[[nameless]]{данные} старое имя "set" + !^table::create[[nameless]]{данные}[[$.separator[^#09]]] старое имя "set" !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] клонирует таблицу reverse << сзаду на перёд (работает пока только в locate, в table::create НЕ работает) @@ -382,7 +391,7 @@ odbc c:\drives\y\parser3project\odbc\ поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой если distinct содержит true, то не будет ошибки при повторяющихся ключах если distinct содержит tables, то будет создан hash из таблиц, содержащих строки с ключом - !^таблица.columns[]+ таблица из одного столбца $column + !^таблица.columns[[название столбца]]+ таблица из одного столбца 'column' или как передадут !$отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало $adults[^man.select($man.age>=18)] ^таблица.color[цвет1;цвет2] @@ -463,6 +472,7 @@ odbc c:\drives\y\parser3project\odbc\ !значение поля expires может быть 'session', date, или число дней(0дней=session) ! если дата, она будет преобразована к формату "Sun, 25-Aug-2002 12:03:45 GMT" ! можно устанавливать bool свойства, например $.secure(true), $.httponly(true) + !$cookie:fields = hash со всеми cookies !request @@ -472,6 +482,7 @@ odbc c:\drives\y\parser3project\odbc\ !$request:document-root каталог, относительно которого считаются пути в parser, по-умолчанию = $env:DOCUMENT_ROOT можно изменить, если на hosting что-то неудобно настроено + !$request:argv = hash с параметрами коммандной строки. ключи 0, 1, ... [0 -- имя обрабатываемого файла]. X!$request:browser это hash, поля: !$type = ie/nn и !$version = номер, скажем 5.5 X$request:user @@ -690,11 +701,11 @@ odbc c:\drives\y\parser3project\odbc\ !$файл_который_был_loaded.size !^file::stat[имя файла] !$файл_который_был_stated.size !.adate !.mdate !.cdate - !^file::cgi[имя файла[;env hash +options[;1cmd[;2line[;3ar[;4g[;5s]]]]]]] + !^file::cgi[[text|binary;]имя файла[;env hash +options[;1cmd[;2line[;3ar[;4g[;5s]]]]]]] возвращённый заголовок рассыпается на $поля $status $stderr - !^file::exec[имя файла[;env hash[;1cmd[;2line[;3ar[;4g[;5s;...under win32 max 10 args]]]]]]] + !^file::exec[[text|binary;]имя файла[;env hash[;1cmd[;2line[;3ar[;4g[;5s;...under win32 max 10 args]]]]]]] options: $.stdin[текст] если текст пуст, отключается автоматическое пересовывание данных HTTP-POST !^file:move[старое имя файла;новое имя файла] @@ -768,7 +779,10 @@ odbc c:\drives\y\parser3project\odbc\ !^math:crc32[string] вычисляет crc32 строки !^math:sha1[string] - !^math:long2ip(long) + +!inet + !^inet:ntoa(long) + !^inet:aton[IP] !date !время типа time можно использовать в выражениях, подставляет @@ -793,12 +807,16 @@ odbc c:\drives\y\parser3project\odbc\ !^дата.roll[year|month|day](+-смещение) сдвигает дату !^дата.roll[TZ;Новая зона] говорит, что дата в таком-то часовом поясе: влияет на .hour & Co !^дата.sql-string[] %Y-%m-%d %H:%M:%S - where published='$дата.sql-string[]' - !^date:calendar[rus|eng;год;месяц] выдаёт неименованную таблицу + where published='^дата.sql-string[]' + !^date:calendar[rus|eng](год;месяц) выдаёт неименованную таблицу столбцы: 0..6, week, year - !^date:calendar[rus|eng;год;месяц;день] выдаёт именнованную таблицу + !^date:calendar[rus|eng](год;месяц;день) выдаёт именнованную таблицу столбцы: year, month, day, weekday - + !^date:last-day(год;месяц) вернёт последний день месяца + !^дата.last-day[] вернёт последний день месяца $дата + !^дата.gmt-string[] Fri, 23 Mar 2001 09:32:23 GMT + + xdoc(xnode) !$xdoc.search-namespaces hash, where keys=prefixes, values=urls @@ -831,9 +849,11 @@ xdoc(xnode) ::sql{...} !::create[[URI]]{} старое имя 'set' !::create[[URI]][qualifiedName] - !::create[file] can be usable: $f[^file::load[binary;http://;some http options here...]]$x[^xdoc::create[$f]] URI default = disk path to requested document для каталогов конечный / обязателен + !::create[file] can be usable: + $f[^file::load[binary;http://;some HTTP options here...]] + $x[^xdoc::create[$f]] !::load[file.xml[;опции]] !.transform[rules.xsl|xdoc][[params hash]] выдаёт dom шаблон кэшируется, кэш обновляется при изменении даты файла шаблона, @@ -893,6 +913,8 @@ xdoc(xnode) !$node.previousSibling !$node.nextSibling !$node.ownerDocument = xdoc + !$node.prefix + !$node.namespaceURI !$element_node.attributes = hash of xnodes !$element_node.tagName !$attribute_node.specified = boolean @@ -941,7 +963,8 @@ xdoc(xnode) !Introduced in DOM Level 2: !Node importNode(in Node importedNode, in boolean deep) raises(DOMException) - !NodeList getElementsByTagNameNS(in DOMString namespaceURI, in DOMString localName); + !NodeList getElementsByTagNameNS(in DOMString namespaceURI, in DOMString localName) + !boolean hasAttributes() !XPath: !^node.select[xpath/query/expression] = array of nodes, @@ -1087,8 +1110,11 @@ DATA::=string | file | hash !а также, возможно, указать опции: !$.method[GET|POST|HEAD] !$.timeout(3) << в секундах, по-умолчанию =2 + !$.cookies[ + $.имя[значение] + ] !$.headers[ - ! $поле[значение] << значение имеет формат, как $response:ЗАГОЛОВОК + ! $.поле[значение] << значение имеет формат, как $response:ЗАГОЛОВОК !] $.enctype[multipart/form-data] $.form[ @@ -1143,6 +1169,9 @@ DATA::=string | file | hash Xесли в MAIN будет определён флаг $ORIGINS(1) то вместо обычного вывода страницы будет выдан список фрагментов результата с указанием их происхождения +!если в MAIN определён $SIGPIPE(1) то в случае, если обработка была прервана пользователем, сообщение + об этом будет записано в parser3.log (раньше оно всегда писалось) + !если описание метода содержит локальную переменную result в явном виде (есть и неявная переменная) то код вывода строковых литералов не попадает в конечный байт-код,