--- parser3/operators.txt 2003/04/03 10:18:24 1.109.2.1.2.3 +++ parser3/operators.txt 2003/11/10 09:28:14 1.138 @@ -86,21 +86,23 @@ Xне сделано, видимо, не будет сделано удобно сделать после выставления 401 ошибки ^return[результат] + - отваливает из выполнения метода, выдавая нестандартный результат - ^break[] + - обрывает цикл - ^continue[] + - обрывает итерацию цикла + X^break[] + - обрывает цикл + X^continue[] + - обрывает итерацию цикла !^untaint[[as-is|file-spec|http-header|mail-header|uri|table|sql|js|xml|html|optimized-html]]{код} default as-is !^taint[[lang]][код] default "just tainted, language unknown" - !^process[[$caller.CLASS|$object|$КЛАСС:CLASS]]{строка, которая будет process-ed, как код} - !^process..[путь] + !^process[[$caller.CLASS|$object|$КЛАСС:CLASS]]{строка, которая будет process-ed, как код}[во что переименовать @main] + !^process..[путь][во что переименовать @main] по умолчанию, методы компилируются в $self [в случае оператора, $self=$MAIN:CLASS] !^connect[protocol://строка соединения]]{код с ^sql[...]-ями} !mysql://user:pass@{host[:port]|[/unix/socket]}/database? charset=cp1251_koi8& timeout=3& compress=1& - named_pipe=1 + named_pipe=1& + autocommit=1 + autocommit если выставить в 0, будет делать commit/rollback !pgsql://user:pass@{host[:port]|[local]}/database? client_encoding=win,[to-find-out]& @@ -272,6 +274,7 @@ odbc c:\drives\y\parser3project\odbc\ s singleline = $ считается концом всего текста m multiline = $ считается концом строки[\n], не концом всего текста g найти все вхождения, а не одно + ' создавать столбцы prematch, match, postmatch !^строка.match[шаблон][опции поиска]{замена} опции поиска+= g заменить все вхождения, а не одно @@ -302,13 +305,16 @@ odbc c:\drives\y\parser3project\odbc\ логическое значение равно "не пуста?" числовое значение равно count[] !^table::create[[nameless]]{данные} старое имя "set" - !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur]]] + !^table::create[table][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] клонирует таблицу + reverse << сзаду на перёд (работает пока только в locate, в table::create НЕ работает) !^table::load[[nameless;]путь[;опции]] !если не nameless, названия колонок берутся из первой строки !пустые строки, и строки в первой колонке содержащие '#', игнорируются + !$.separator[^#09] + !$.encloser["] по-умолчанию, нет. !^table::sql{query}[[$.limit(2) $.offset(4) todo:$.default{ ^table::create[...] }]] - !^таблица.save[[nameless|append;]путь] + !^таблица.save[[nameless|append;]путь[;опции, см. load]] !$таблица.поле !$таблица.fields из named таблицы выдаёт текущую запись как Hash !^таблица.menu{тело}[разделитель] @@ -327,11 +333,15 @@ odbc c:\drives\y\parser3project\odbc\ !^таблица.join[таблица][$.limit(1) $.offset(5) $.offset[cur]] - добавляет записи из таблицы. таблицы должны иметь одинаковую структуру. !^таблица.flip[] выдаёт транспонированную, надо куда-то сложить, потом пользовать - !^таблица.locate[поле;значение] передвигает текущую строку, если найдёт. выдаёт bool - !^таблица.locate(логическое выражение) передвигает текущую строку, если найдёт. выдаёт bool - !^таблица.hash{[поле]|{код}|(выражение)}[[поле значений|table поля значений]][[$.distinct(1)]] + !^таблица.locate[поле;значение][[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] + передвигает текущую строку, если найдёт. выдаёт bool + !^таблица.locate(логическое выражение)[[$.limit(1) $.offset(5) $.offset[cur] $.reverse(1)]] + передвигает текущую строку, если найдёт. выдаёт bool + !^таблица.hash{[поле]|{код}|(выражение)}[[поле значений|table поля значений]][[$.distinct(1) $.distinct[tables]]] значением $hash.ключ будет hash в котором поля значений будут ключами поля значений могут быть не указаны, тогда ими будут все столбцы, включая ключевой + если distinct содержит true, то не будет ошибки при повторяющихся ключах + если distinct содержит tables, то будет создан hash из таблиц, содержащих строки с ключом !^таблица.columns[]+ таблица из одного столбца $column !$отобранное[^таблица.select(выражение)] = таблица из тех же столбцов и строк, у которых условие совпало $adults[^man.select($man.age>=18)] @@ -346,7 +356,7 @@ odbc c:\drives\y\parser3project\odbc\ !_default - специальный ключ, если задан, то при обращении по ключу, которому нет соответствия, выдаётся _default значение !$hash.fields выдает $hash. чтобы класс hash был чуть больше похож на класс table - !^hash::create[[!copy_from_hash|Xcopy_from_hashfile]] + !^hash::create[[!copy_from_hash|copy_from_hashfile]] создаёт новый hash, копию старого !^hash.add[слагаемое] перезаписывает одноимённые @@ -364,6 +374,28 @@ odbc c:\drives\y\parser3project\odbc\ !^foreach[key;value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] !^delete[ключ] удалить ключ +!hashfile + !^hashfile::open[filename] + !^hashfile.clear[] забыть всё + !.ключ[значение] положить значение + !.ключ[$.value[значение] $.expires ЗНАЧЕНИЕ} + положить значение до expires + значение поля expires может быть date, или число дней(0дней=не вечно) + !.ключ достать + !^delete[ключ] удалить ключ + !^delete[] удалить файлы, содержащие данные + !^hash[] + преобразовать в обычный hash + попутно стирает устаревшие пары + !^foreach[key|value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] + + пример: + $uids[^hashfile::assign[/db/uids]] + + $random[23847387taduigh345XGHWElxjgdjg] + $uids.$random[$.value[$uid] $.expires(60*30)] + $uid[$persistent.logins.$random] + !form [берётся первый элемент из одноимённых из GET, потом первый из POST] !$form:поле = string/file @@ -388,6 +420,9 @@ odbc c:\drives\y\parser3project\odbc\ !$request:query !$request:body unprocessed POST request body !$request:uri + !$request:document-root + каталог, относительно которого считаются пути в parser, по-умолчанию = $env:DOCUMENT_ROOT + можно изменить, если на hosting что-то неудобно настроено X!$request:browser это hash, поля: !$type = ie/nn и !$version = номер, скажем 5.5 X$request:user @@ -419,36 +454,6 @@ odbc c:\drives\y\parser3project\odbc\ ПРЕДУПРЕЖДЕНИЕ: класс form получает свои поля после обработки всех auto класса MAIN поэтому необходимо задать $request/response:charset в одном из них. не после. -Xhashfile - !^hashfile::open[$DB_HOME;filename] - !^hashfile.clear[] - забыть всё - !.ключ[значение] положить значение навечно - !.ключ[$.value[значение] $.expires(секунд)} положить значение на expires секунд - !.ключ достать - !^cache[ключ](секунд){код} - !суть то же, что и "положить+достать", но за один раз и компактнее - !если 0секунд, значит не кэшировать, а старый такой стереть - !внутри {кода} может быть вызван ^delete[] - !^delete[[ключ]] удалить ключ - !буде вызван без параметра изнутри cache, отменяет кэширование блока: - !блок не будет скэширован, его старое значение будет стёрто - !^hash[] - преобразовать в обычный hash - !^foreach[key|value]{тело}[[разделитель]|{разделитель который выполняется перед непустым очередным не первым телом}] - - - примеры: - $uids[^hashfile::assign[/db/uids]] - $code:clear[/db/cache]] - $code[^hashfile::assign[/db/cache]] - - $random[23847387taduigh345XGHWElxjgdjg] - $uids.$random[$.value[$uid] $.expires(60*30)] - $uid[$persistent.logins.$random] - - ^code.cache[заголовки новостей](35){....} - !mail !$mail.received=MESSAGE: .from @@ -477,6 +482,10 @@ Xhashfile $.message#[MESSAGE] (message, message2, ...) !^mail:send[ + $.options[-odd] + unix: строка, которая будет добавлена к команде запуска sendmail + -odd означает "быстро поставь в очередь без проверки email" + win32: игнорируется $.charset[кодировка заголовка и текстовых блоков] $.any-header-field $.text[string] @@ -599,7 +608,8 @@ Xhashfile если указана ширина_символа, то monospaced, если 0, то ширина_символа = ширине gif !^картинка.text(x;y)[текст_надписи] AS_IS !^картинка.length[текст_надписи] AS_IS - !^картинка.gif[] -- кодирует в FILE с content-type=image/gif + !^картинка.gif[возможно, имя файла] -- кодирует в FILE с content-type=image/gif + имя файла будет использовано при $response:download !^картинка.arc(center x;center y;width;height;start in degrees;end in degrees;color) !^картинка.sector(center x;center y;width;height;start in degrees;end in degrees;color) !^картинка.circle(center x;center y;r;color) @@ -651,7 +661,7 @@ Xhashfile !/some/page.html: ^file:fullpath[a.gif] => /some/a.gif -math +!math !$math:PI !^math:round floor ceiling !^math:trunc frac @@ -661,7 +671,18 @@ math !^math:degrees radians !^math:pow sqrt !^math:random(ширина диапазона) - ^math:GUID {C2C0983C-E26E-4169-BD07-77ECE9405BA5} + !^math:uuid[] + 22C0983C-E26E-4169-BD07-77ECE9405BA5 + win32: пользуется cryptapi + unix: пользуется /dev/urandom, + если нет, /dev/random, + если нет, rand + [на solaris /dev/random можно добавить] + !^math:uid64[] + BA39BAB6340BE370 + !^math:md5[string] + выдает digest строки, длиной 16 байт в виде строки, + где байты digest выданы в hex виде, впритык, в нижнем регистре !^math:crypt[password;salt] salt prefix $apr1$ вызывает встроенный MD5 алгоритм, если нет тела salt, оно создаётся случайным @@ -683,9 +704,13 @@ math для удобного создания по значению из базы формат1: %Y[-%m[-%d[ %H[:%M[:%S]]]]] формат2: %H:%M[:%S] - !$date.year month day hour minute second weekday yearday(0...) daylightsaving + !^date::unix-timestamp() + !^date.unix-timestamp[] + !$date.year month day hour minute second weekday yearday(0...) daylightsaving TZ read-only + TZ="" << локальная зона !^date.roll[year|month|day](+-смещение) сдвигает дату + !^date.roll[TZ;Новая зона] говорит, что дата в таком-то часовом поясе: влияет на .hour&co !^date.sql-string[] %Y-%m-%d %H:%M:%S where published='$дата.sql-string[]' !^date:calendar[rus|eng;год;месяц] выдаёт неименованную таблицу @@ -914,20 +939,21 @@ xdoc(xnode) !$status:memory hash !used - Return the number of bytes in the heap. Excludes collector private - data structures. Includes empty blocks and fragmentation loss. Includes some pages that were allocated but never written. !free - Return a lower bound on the number of free bytes in the heap. - !since_compact + !ever_allocated_since_compact Return the number of bytes allocated since the last collection. - !process - Return the total number of bytes allocated in this process. + !ever_allocated_since_start + Return the total number of bytes [EVER(c)PAF] allocated in this process. Never decreases. +console + $console:timeout + !$console:line + read/write строку !DATA::=string | file @@ -972,7 +998,12 @@ xdoc(xnode) !по-умолчанию, получение http status != 200 >> создает http.status ошибку, !это можно отключить, передав !$.any-status(1) - !file::load в дополнительные поля записывает ПОЛЕ:значение (имена полей ответа заглавными буквами) + !$.charset[кодировка удалённых докуметов по-умолчанию] << если сервер вернёт content-type:charset=ОНА_ПЕРЕБИВАЕТ + !file::load в дополнительные поля записывает + !ПОЛЕ:значение (имена полей ответа заглавными буквами) + !tables << хеш их ПОЛЕ->table с единственным столбцом "value". + в таких таблицах можно брать повторяющиеся заголовки. например, несколько set-cookies + todo:сделать отдельный cookies !системные типы ошибок: !parser.compile ^test[} компиляция (непарная скобка, ...)