Annotation of win32/dist/other/ru/_test.html, revision 1.1
1.1 ! misha 1: #<!--
! 2: ###########################################################################
! 3: @main[]
! 4: <h1>Parser 3.x test page</h1>
! 5: <p>Если вы видите эту страницу, значит вы установили парсер и пытаетесь его протестировать :)</p>
! 6: <p>Чтобы увидеть полные пути к конфигурационным файлам и DOCUMENT_ROOT - закоментируйте метод postprocess[]</p>
! 7: <p>Если что-либо выделено красным цветом, значит или что-то настроено неверно или автоматическое определение невозможно
! 8: (это относится к поиску файлов библиотек и кодовых таблиц при заданных относительных путях).</p>
! 9: <hr />
! 10:
! 11: ^try{
! 12: $status_rusage_begin[$status:rusage]
! 13: $status_memory_begin[$status:memory]
! 14: }{
! 15: $exception.handled(1)
! 16: }
! 17:
! 18: <h2>Глобальные переменные, заданые в конфигурационном auto.p</h2>
! 19:
! 20: <h3>^$CHARSETS:</h3>
! 21: ^if($CHARSETS && $CHARSETS is "hash"){
! 22: <table cellpadding="5" cellspacing="0" border="1">
! 23: ^CHARSETS.foreach[sKey;sValue]{
! 24: <tr>
! 25: <td>$sKey</td>
! 26: <td>$sValue (^check_system_file[$sValue])</td>
! 27: </tr>
! 28: }
! 29: </table>
! 30: }{
! 31: ^error[Не определен хеш с кодовыми таблицами (^$CHARSETS).]
! 32: <br />Возможно у вас не обрабатывается конфигурационный auto.p (тот что по умолчанию должен находится рядом с исполняемым файлом).
! 33: <br />Чтобы убедиться в том, что он обрабатывается, добавьте инструкцию
! 34: ^^throw[^;check auto.p execution] в его метод @^;auto[] и перезагрузите страницу.
! 35: Появление ошибки после её перезагрузки будет свидетельствовать о том, что он обрабатывается.
! 36: }
! 37:
! 38: <h3>^$SQL:</h3>
! 39: ^if($SQL && $SQL.drivers && $SQL.drivers is "table"){
! 40: ^try{
! 41: <table cellpadding="5" cellspacing="0" border="1">
! 42: <tr>
! 43: <th>protocol</th>
! 44: <th>parser driver</th>
! 45: <th>sql client library</th>
! 46: </tr>
! 47: ^SQL.drivers.menu{
! 48: <tr>
! 49: <td>$SQL.drivers.protocol</td>
! 50: <td>^if(def $SQL.drivers.driver){$SQL.drivers.driver (^check_system_file[$SQL.drivers.driver])^if(!^check_p3_sql_lib_name[$SQL.drivers.driver;parser3]){<br />^error[уверены, что указан верный файл?]}}{<br />}</td>
! 51: <td>^if(def $SQL.drivers.client){$SQL.drivers.client (^check_system_file[$SQL.drivers.client])}{<br />}</td>
! 52: </tr>
! 53: }
! 54: </table>
! 55: }{
! 56: $exception.handled(1)
! 57: ^error[Неверная структура таблицы ^$SQL.drivers]
! 58: <br />Возможно Вы редактировали конфигурационный файл и у Вас символы табуляции заменились пробелами.
! 59: <br />Содержимое таблицы:
! 60: ^printTable[$SQL.drivers]
! 61: }
! 62: }{
! 63: ^error[Не определена таблица с драйверами (^$SQL.drivers)]
! 64: <br />Возможно у вас не обрабатывается конфигурационный auto.p
! 65: }
! 66:
! 67: <p>
! 68: ^info[DOCUMENT_ROOT]: ^if(^trim[$env:DOCUMENT_ROOT;/] eq $script_dir){совпадает с директорией тестового скрипта}{^error[^if(!def $env:DOCUMENT_ROOT){не определен}{«^;кривой»^; или скрипт находится не в корне веб пространства}]}^if(def $env:DOCUMENT_ROOT){ ($env:DOCUMENT_ROOT)}<br />
! 69: ^info[Путь к скрипту]: $script_dir<br />
! 70: ^info[^$response:charset]: ^if(def $response:charset){$response:charset}{^error[Не задан. Вы работаете в UTF8?]}<br />
! 71: ^info[^$request:charset]: ^if(def $request:charset){$request:charset}{^error[Не задан. Вы работаете в UTF8?]}<br />
! 72: ^info[^$request:uri]: $request:uri<br />
! 73: ^info[^$request:query]: $request:query^if(def $request:query){ (для получения параметров пользователя используйте ^$form)}<br />
! 74: ^info[^$SQL.connect-string]: ^if(def ${SQL.connect-string}){определена}{^info[не определена]}<br />
! 75: ^info[^$MAIL.SMTP]: ^if(def $MAIL.SMTP){определена}{не определена}<br />
! 76: ^info[^$CLASS_PATH]:
! 77: ^if($CLASS_PATH is "table"){
! 78: <br />
! 79: ^try{
! 80: <table cellpadding="5" cellspacing="0" border="1">
! 81: ^CLASS_PATH.menu{
! 82: <tr>
! 83: <td>$CLASS_PATH.path</td>
! 84: <td>^check_dir[$CLASS_PATH.path]</td>
! 85: </tr>
! 86: }
! 87: </table>
! 88: }{
! 89: $exception.handled(1)
! 90: ^error[Неверная структура переменной ^$CLASS_PATH.]<br />В этой переменной должна быть строка или именованая таблица со столбцом path.<br />
! 91: }
! 92: }{
! 93: ^if(def $CLASS_PATH){$CLASS_PATH &mdash^; ^check_dir[$CLASS_PATH]}{^info[не определен]}<br />
! 94: }
! 95: </p>
! 96:
! 97:
! 98:
! 99: <h2>Демонстрация работы парсера</h2>
! 100:
! 101: <h3>Демонстрация работы с cookie (класс <a href="http://www.parser.ru/docs/lang/cookieclass.htm">^$cookie</a>)</h3>
! 102: <p>
! 103: Чтение ^$cookie:test: ^if(def $cookie:test){$cookie:test}{не определена}<br />
! 104: Запись в cookie значения ABC ^$cookie:test[ABC]$cookie:test[ABC] (нажмите Reload для проверки)<br />
! 105: </p>
! 106:
! 107:
! 108:
! 109: <h3>Демонстрация работы математических операторов (класс <a href="http://www.parser.ru/docs/lang/mathclass.htm">^$math</a>)</h3>
! 110: <p>
! 111: $math_string[СтРоКа]
! 112: $math_salt[^$apr1^$]
! 113:
! 114: $iNum1(^math:random(9)+1)
! 115: $iNum2(^math:random(9)+1)
! 116: ^^eval($iNum1+$iNum2): ^eval($iNum1+$iNum2)<br />
! 117: ^^math:random(1000): ^math:random(1000)<br />
! 118: ^^math:log(1000): ^try_exec{^math:log(1000)}<br />
! 119: ^^math:log10(1000): ^try_exec{^math:log10(1000)}<br />
! 120: ^^math:uuid[]: ^try_exec{^math:uuid[]}<br />
! 121: ^^math:uid64[]: ^try_exec{^math:uid64[]}<br />
! 122: ^^math:md5[$math_string]: ^try_exec{^math:md5[$math_string]}<br />
! 123: ^^math:crypt[$math_string;$math_salt]: ^try_exec{^math:crypt[$math_string;$math_salt]}<br />
! 124: ^^math:crc32[$math_string]: ^try_exec{^math:crc32[$math_string]}<br />
! 125: </p>
! 126:
! 127:
! 128:
! 129: <h3>Работа со строками (класс <a href="http://www.parser.ru/docs/lang/stringclass.htm">^$string</a>)</h3>
! 130: <p>
! 131: $upper[ББ]
! 132: $lower[бб]
! 133: $mixed[Бб]
! 134: Задание ^$str[АбвГде]$str[АбвГде]<br />
! 135: Длина строки ^^str.length[]: ^str.length[]<br />
! 136: Строка в верхнем регистре ^^str.upper[]: ^str.upper[]^if(^mixed.upper[] ne $upper){ [^error[некорректное преобразование к верхнему регистру]]}<br />
! 137: Строка в нижнем регистре ^^str.lower[]: ^str.lower[]^if(^mixed.lower[] ne $lower){ [^error[некорректное преобразование к нижнему регистру]]}<br />
! 138: Первые 2 символа строки ^^str.left(2): ^str.left(2)<br />
! 139: Последние 3 символа строки ^^str.right(3): ^str.right(3)<br />
! 140: 2-4 символы строки ^^str.mid(1^;3): ^str.mid(1;3)<br />
! 141: Поиск символа 'б' в строке ^^str.pos[б]: ^str.pos[б]<br />
! 142: Поиск символа 'б' в строке начиная со 2 позиции ^^str.pos[б](2): ^try_exec{^str.pos[б](2)}<br />
! 143: Поиск символа 'X' в строке ^^str.pos[X]: ^str.pos[X]<br />
! 144: Замена комбинации символов 'вГ' на XX с помощью ^^str.match[вГ][]{XX}: ^str.match[вГ][]{XX}<br />
! 145: $repl[^table::create{a b
! 146: в Y
! 147: Г Z}]
! 148: Замена комбинации символов 'в' на 'Y', 'Г' на 'Z' с помощью ^^str.replace[^$repl]: ^str.replace[$repl]<br />
! 149: ^^str.trim[both;е]: ^try_exec{^str.trim[both;е]}<br />
! 150: ^^str.trim[start;е]: ^try_exec{^str.trim[start;е]}<br />
! 151: ^^str.trim[end;е]: ^try_exec{^str.trim[end;е]}<br />
! 152: ^^str.trim[left;е]: ^try_exec{^str.trim[left;е]}<br />
! 153: ^^str.trim[right;е]: ^try_exec{^str.trim[right;е]}<br />
! 154: ^^str.base64[]: ^try_exec{$sBase64[^str.base64[]]$sBase64}<br />
! 155: ^if(def $sBase64){
! 156: # ^^string:base64[$sBase64]: ^try_exec{^string:base64[$sBase64]}
! 157: }
! 158: ^^str.js-escape[]: ^try_exec{$sEscaped[^str.js-escape[]]$sEscaped}<br />
! 159: ^if(def $sEscaped){
! 160: ^^str:js-unescape[$sEscaped]: ^try_exec{^string:js-unescape[$sEscaped]}<br />
! 161: }
! 162: </p>
! 163:
! 164:
! 165: <h3>Работа с классом <a href="http://www.parser.ru/docs/lang/inetclass.htm">^$inet</a></h3>
! 166: ^^inet:aton[10.0.0.2]: ^try_exec{^inet:aton[10.0.0.2]}<br />
! 167: ^^inet:aton[192.168.1.5]: ^try_exec{^inet:aton[192.168.1.5]}<br />
! 168: ^^inet:ntoa(167772162): ^try_exec{^inet:ntoa(167772162)}<br />
! 169: ^^inet:ntoa(3232235781): ^try_exec{^inet:ntoa(3232235781)}<br />
! 170:
! 171:
! 172: <h3><a name="forms">Чтение</a> значений из формы (класс <a href="http://www.parser.ru/docs/lang/formclass.htm">^$form</a>)</h3>
! 173: <p>
! 174: ^$form:a: ^if(def $form:a){$form:a}{не определено}<br />
! 175: Safe преобразование ^$form:a в целое число: ^^form:a.int(1): ^form:a.int(1)<br />
! 176: ^if($form:tables.b){
! 177: ^form:tables.b.menu{
! 178: ^form:tables.b.line[] значение ^$form:b: $form:tables.b.field
! 179: }[<br />]
! 180: }{
! 181: ^$form:b не определено
! 182: }
! 183: <br />
! 184: ^$form:qtail: ^if(def $form:qtail){$form:qtail}{не определено}<br />
! 185: ^if(!def $form:a){
! 186: <a href="?a=321&b=^taint[uri][А]&b=^taint[uri][Б]&b=^taint[uri][ВГД]?ABC#forms">идем сюда чтобы проверить чтение значений формы</a>
! 187: }
! 188: </p>
! 189:
! 190: <h3>Задание и вывод значений у объекта-хэша (класс <a href="http://www.parser.ru/docs/lang/hashclass.htm">^$hash</a>)</h3>
! 191: <p>
! 192: <pre>
! 193: ^$hash1[
! 194:  ^;  ^;^$.a[1]
! 195:  ^;  ^;^$.b[2]
! 196:  ^;  ^;^$.c[3]
! 197: ]
! 198: ^^hash1.foreach[key;value]{
! 199:  ^; ^;^$key=^$value
! 200: }[<^;br />^;]
! 201: </pre>
! 202: $hash1[
! 203: $.a[1]
! 204: $.b[2]
! 205: $.c[3]
! 206: ]
! 207: ^hash1.foreach[key;value]{
! 208: $key=$value
! 209: }[<br />]
! 210:
! 211: <br /><br />
! 212: Проверка наличия в хеше элементов с ключём 'a' (^^hash1.contains[a]):
! 213: ^try_exec{^if(^hash1.contains[a]){содержит элемент с ключем 'a'}{^error[не содержит элемент с ключем 'a']}}
! 214: </p>
! 215:
! 216:
! 217: <h3>Задание и вывод значений у объекта-таблицы (класс <a href="http://www.parser.ru/docs/lang/tableclass.htm">^$table</a>)</h3>
! 218: <pre>^$tbl1[^^table::create{name col1 col2
! 219: Вася 3 5
! 220: Дима 4 14}]</pre>
! 221: $tbl1[^table::create{name col1 col2
! 222: Вася 3 5
! 223: Дима 4 14}]
! 224: Количество строк таблицы ^$tbl1: ^tbl1.count[]<br />
! 225: $col[^tbl1.columns[]]
! 226: Количество столбцов таблицы ^$tbl1: ^col.count[]<br />
! 227: Вывод названий столбцов таблицы:<br />
! 228: ^printTable[$col]
! 229:
! 230: <p>
! 231: Вывод значений таблицы ^$tbl1:<br />
! 232: ^printTable[$tbl1]
! 233: </p>
! 234:
! 235: <pre>^$tbl2[^^table::create{name col1 col2
! 236: Вова 3 44}]</pre>
! 237: $tbl2[^table::create{name col1 col2
! 238: Вова 3 44}]
! 239: Количество строк таблицы ^$tbl2: ^tbl2.count[]<br />
! 240:
! 241:
! 242: <p>
! 243: join таблицы ^$tbl1 к таблице ^$tbl2 [^^tbl2.join[^$tbl1]]<br />
! 244: ^tbl2.join[$tbl1]
! 245: Количество строк таблицы ^$tbl2 ^^tbl2.count[]: ^tbl2.count[]<br />
! 246: Вывод полученой таблицы:<br />
! 247: ^printTable[$tbl2]
! 248: </p>
! 249:
! 250: <p>select и вывод строк таблицы у которых значения в столбце col1 равны 3: ^^tbl2.select(^$tbl2.col1 == 3)<br />
! 251: ^printTable[^tbl2.select($tbl2.col1 == 3)]
! 252: </p>
! 253:
! 254:
! 255: <p>Получение из таблицы - хеша таблиц, где в качестве ключа выступает значение col1: ^$hData[^^tbl2.hash[col1][^$.distinct[tables]]]<br />
! 256: ^try{
! 257: $hData[^tbl2.hash[col1][$.distinct[tables]]]
! 258: <p>Вывод полученного хеша таблиц:
! 259: <table cellpadding="2" cellspacing="0" border="1" width="35%">
! 260: <tr align="center">
! 261: <th>Ключ</th>
! 262: <th>Значение</th>
! 263: </tr>
! 264: ^hData.foreach[sKey;tValue]{
! 265: <tr>
! 266: <td>$sKey</td>
! 267: <td>^printTable[$tValue;100%]</td>
! 268: </tr>
! 269: }
! 270: </table>
! 271: </p>
! 272: }{
! 273: $exception.handled(1)
! 274: ^error[Используется версия парсера до 3.0.8, которая не имеет данного метода]
! 275: }
! 276: </p>
! 277:
! 278:
! 279: <p>Получение из таблицы - хеша строк, где в качестве ключа выступает значение столбца col2, а в качестве значения &mdash^; name: ^$hData[^^tbl2.hash[col2^;name][^$.type[string]]]<br />
! 280: ^try{
! 281: $hData[^tbl2.hash[col2;name][$.type[string]]]
! 282: <p>Вывод полученного хеша строк:
! 283: <table cellpadding="2" cellspacing="0" border="1">
! 284: <tr align="center">
! 285: <th>Ключ</th>
! 286: <th>Значение</th>
! 287: </tr>
! 288: ^hData.foreach[sKey;sValue]{
! 289: <tr>
! 290: <td>$sKey</td>
! 291: <td>$sValue</td>
! 292: </tr>
! 293: }
! 294: </table>
! 295: </p>
! 296: }{
! 297: $exception.handled(1)
! 298: ^error[Используется версия парсера до 3.2.2, которая не имеет данного метода]
! 299: }
! 300: </p>
! 301:
! 302:
! 303: <h3>Работа с датами (класс <a href="http://www.parser.ru/docs/lang/dateclass.htm">^$date</a>)</h3>
! 304: <p>
! 305: ^$now[^^date::now[]]<br />
! 306: $now[^date::now[]]
! 307: ^$now.day/^$now.month/^$now.year ^${now.hour}:^${now.minute}:^$now.second: $now.day/$now.month/$now.year ${now.hour}:${now.minute}:$now.second<br />
! 308: ^$now.week: ^try_exec{$now.week}<br />
! 309: ^$now.weekyear: ^try_exec{$now.weekyear}<br />
! 310: Вывод сегодняшней даты в sql формате ^^now.sql-string[]: ^now.sql-string[]<br />
! 311: Вывод сегодняшней даты в виде UNIX timestamp ^^now.unix-timestamp[]: ^try_exec{^now.unix-timestamp[]}<br />
! 312: Вывод сегодняшней даты в виде строки в формате GMT ^^now.gmt-string[]: ^try_exec{^now.gmt-string[]}<br />
! 313: Номер последнего дня текущего месяца ^^now.last-day[]: ^try_exec{^now.last-day[]}<br />
! 314: ^now.roll[day](-5)
! 315: Сдвиг даты на 5 дней назад ^^now.roll[day](-5): ^printDate[$now]<br />
! 316: ^now.roll[day](30)
! 317: Сдвиг полученой даты на 30 дней вперед ^^now.roll[day](30): ^printDate[$now]<br />
! 318: </p>
! 319:
! 320:
! 321:
! 322:
! 323: <h3>Работа с файлами (класс <a href="http://www.parser.ru/docs/lang/fileclass.htm">^$file</a>)</h3>
! 324: <p>
! 325: $save_table_name[_test.cfg]
! 326: $fname[$save_table_name]
! 327: Запись таблицы ^$tbl1 в файл $save_table_name (^^tbl1.save[$fname]):
! 328: $no_file(0)
! 329: ^try{
! 330: ^tbl1.save[$fname]
! 331: ^info[файл успешно создан]
! 332: }{
! 333: ^if($exception.type eq "file.access"){
! 334: $exception.handled(1)
! 335: $no_file(1)
! 336: ^error[нет доступа для записи файла]
! 337: }
! 338: }
! 339: <br />
! 340: ^^file:dirname[/$save_table_name]: ^try_exec{^file:dirname[/$save_table_name]}<br />
! 341: ^^file:basename[/$save_table_name]: ^try_exec{^file:basename[/$save_table_name]}<br />
! 342: ^^file:justname[/$save_table_name]: ^try_exec{^file:justname[/$save_table_name]}<br />
! 343: ^^file:justext[/$save_table_name]: ^try_exec{^file:justext[/$save_table_name]}<br />
! 344:
! 345: </p>
! 346: ^if(!$no_file){
! 347: <p>Получение параметров сохраненного файла ^$fstat[^^file::stat[$fname]]:<br />
! 348: $fstat[^file::stat[$fname]]
! 349: Размер файла, байт [^$fstat.size]: $fstat.size<br />
! 350: cdate: $fstat.cdate.day/$fstat.cdate.month/$fstat.cdate.year<br />
! 351: adate: ^printDate[$fstat.adate]<br />
! 352: mdate: ^printDate[$fstat.mdate]<br />
! 353: </p>
! 354:
! 355: <p>
! 356: Загрузка данных в таблицу ^$tbl3 из файла $save_table_name и вывод (^$tbl3[^^table::load[$fname]]):<br />
! 357: ^if(-f $fname){
! 358: $tbl3[^table::load[$fname]]
! 359: ^printTable[$tbl3]
! 360: }
! 361: </p>
! 362:
! 363:
! 364: <p>Копирование файла (^^file:copy[$fname^;_copy.cfg]):
! 365: ^try_exec{
! 366: ^file:copy[$fname;_copy.cfg]^info[выполнено]
! 367: ^try{
! 368: ^file:delete[_copy.cfg]
! 369: }{
! 370: $exception.handled(1)
! 371: }
! 372: }
! 373: </p>
! 374:
! 375: <p>Удаление файла (^^file:delete[$fname]):
! 376: ^try{
! 377: ^file:delete[$fname]
! 378: ^info[выполнено]
! 379: }{
! 380: $exception.handled(1)
! 381: ^error[ошибка удаления файла]
! 382: }
! 383: </p>
! 384: }
! 385:
! 386:
! 387: <h3>Работа с классом <a href="http://www.parser.ru/docs/lang/hashfileclass.htm">^$hashfile</a></h3>
! 388: $hashfile_name[_test]
! 389: <p>Создаем объект: ^$hf [^$hf[^^hashfile::open[$hashfile_name]]]:
! 390: ^try{
! 391: $hf[^hashfile::open[$hashfile_name]]
! 392: ^info[объект успешно создан]<br />
! 393:
! 394: $expires(3)
! 395: $hash1[^hf.hash[]]
! 396: Количество записей: ^hash1._count[]<br />
! 397:
! 398: ^try{
! 399: $key[^math:uuid[]]
! 400: }{
! 401: $exception.handled(1)
! 402: $key[^math:random(999999999)]
! 403: }
! 404: Добавление новой записи ($key) на $expires дня:
! 405: $value[^math:random(999999999)]
! 406: <pre>
! 407: ^$hf.[$key][
! 408:  ^;  ^;^$.value[$value]
! 409:  ^;  ^;^$.expires($expires)
! 410: ]
! 411: </pre>
! 412: $hf.[$key][
! 413: $.value[$value]
! 414: $.expires($expires)
! 415: ]
! 416:
! 417: Очистка hashfile от устаревших записей (^^hf.cleanup[]):
! 418: ^try_exec{^hf.cleanup[]^info[выполнено]}<br /><br />
! 419:
! 420: $limit(5)
! 421: Вывод содержимого (максимум $limit записей):<br />
! 422: $cnt(0)
! 423: ^hf.foreach[k;v]{^if($cnt < $limit){
! 424: $k=^v.format[%d]<br />
! 425: ^cnt.inc(1)
! 426: }}
! 427: <br />
! 428:
! 429: Закрытие файлов и снятие блокировок (^^hf.release[]):
! 430: ^try_exec{^hf.release[]^info[выполнено]}<br />
! 431: }{
! 432: $exception.handled(1)
! 433: ^if($exception.type eq "file.access"){
! 434: ^error[нет доступа для записи файла]
! 435: }{
! 436: ^error[невозможно создать объект]
! 437: }
! 438: }
! 439: </p>
! 440:
! 441:
! 442: <h3>Работа с переменными окружения (класс <a href="http://www.parser.ru/docs/lang/envclass.htm">^$env</a>)</h3>
! 443: $env_table[^table::create{name description
! 444: SERVER_NAME DNS имя сервера
! 445: QUERY_STRING Для получения параметров используйте класс ^$form
! 446: HTTP_REFERER Откуда пришел посетитель (броузер может не передавать эту информацию)
! 447: HTTP_USER_AGENT Строка USER_AGENT броузера посетителя
! 448: HTTP_X_FORWARDED_FOR Обычно заполнена если пришли через прокси
! 449: REMOTE_HOST
! 450: REMOTE_ADDR IP адрес посетителя
! 451: PARSER_VERSION Версия парсера (если не определена, то до 3.1.5)
! 452: }]
! 453:
! 454: $is_env_defined(0)
! 455: <table cellpadding="2" cellspacing="0" border="1">
! 456: <tr>
! 457: <th>Переменная</th>
! 458: <th>Значение</th>
! 459: <th><a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html">Комментарий</a></th>
! 460: </tr>
! 461: ^env_table.menu{
! 462: <tr>
! 463: <td>$env_table.name</td>
! 464: <td>^if(def $env:[$env_table.name]){$env:[$env_table.name]^is_env_defined.inc(1)}{<br />}</td>
! 465: <td>^if(def $env_table.description){$env_table.description}{<br />}</td>
! 466: </tr>
! 467: }
! 468: </table>
! 469: ^if(!$is_env_defined){
! 470: <p>^error[Не определена ни одна из переменных окружения]</p>
! 471: }
! 472:
! 473:
! 474:
! 475:
! 476: <h3>Работа с SQL</h3>
! 477: <p>
! 478: ^if(def ${SQL.connect-string}){
! 479: $sSqlQuery[SELECT 2+2^if(^SQL.connect-string.left(6) eq "oracle"){ FROM DUAL}]
! 480: ^^int:sql{$sSqlQuery}:
! 481: ^try{
! 482: ^connect[$SQL.connect-string]{
! 483: $iSqlResult(^int:sql{$sSqlQuery}[$.default{0}])
! 484: }
! 485: $iSqlResult^if($iSqlResult != 4){ [^error[Хм. Странно считает ваш SQL сервер 2+2...]]}<br />
! 486:
! 487: ^if(^SQL.connect-string.left(5) eq "mysql"){
! 488: ^rem{ *** пробуем определить серверную кодировку у MySQL *** }
! 489: <p>Определение серверной кодировки MySQL:
! 490: ^try{
! 491: $sSqlString[^SQL.connect-string.match[\?.*][]{}]
! 492: ^connect[$sSqlString]{
! 493: $tVar[^table::sql{SHOW VARIABLES}]
! 494: $sRequestCharset[^request:charset.upper[]]
! 495: ^if(^tVar.locate(
! 496: (
! 497: ^tVar.[Variable_name].upper[] eq "CHARACTER_SET"
! 498: || ^tVar.[Variable_name].upper[] eq "CHARACTER_SET_CLIENT"
! 499: )
! 500: && def $tVar.Value
! 501: )){
! 502: $sServerCharset[^tVar.Value.upper[]]
! 503: $tReplaceCharset[^table::create{from to^#0AKOI8_RU KOI8-R}]
! 504: $sServerCharset[^sServerCharset.replace[$tReplaceCharset]]
! 505: ^if($sRequestCharset ne $sServerCharset){
! 506: ^$request:charset ($request:charset) не совпадает с переменной MySQL сервера
! 507: character_set/character_set_client (SQL сервер вернул значение ^info[$tVar.Value]).<br />
! 508: ^if($sServerCharset eq "LATIN1"){
! 509: Кодировка сервера «^;по умолчанию»^; (latin1) не настроена для работы с русскими буквами.
! 510: В случае, если вы планируете хранить в БД тексты на русском языке и используется MySQL сервер
! 511: версии 4.0 или выше, вы можете сами указывать кодировку после подключения согласно
! 512: <a href="http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html">документации</a>
! 513: (выполняя после каждого соединения комманду "SET CHARACTER SET charset_name").
! 514: Если используется более ранняя версия MySQL, то вам нужно попросить вашего администратора настроить MySQL сервер.
! 515: }{
! 516: Если вы уверены, что символы из кодировки $sRequestCharset могут быть без потери преобразованы
! 517: в кодировку $sServerCharset и обратно, то в строке соединения вам нужно задать параметр:
! 518: ^info[?ClientCharset=$sServerCharset], при этом парсер будет перекодировать в указанную кодировку отправляемые MySQL серверу
! 519: запросы (из кодировки ^$request:charset), а также перекодировать полученные от него результаты обратно.
! 520: ^if($sRequestCharset eq "WINDOWS-1251" && $sServerCharset eq "KOI8-R"){
! 521: <br />Однако вместо этого лучше использовать параметр ^info[?charset=cp1251_koi8], который
! 522: заставит выполнять преобразования кодировок SQL сервер^if(^SQL.connect-string.match[charset=cp1251_koi8][i]){ (именно этот способ перекодирования используется в настоящий момент в строке соединения)}.
! 523: }
! 524: }
! 525: }{
! 526: ^$request:charset ($request:charset) и SQL переменная character_set ($tVar.Value) совпадают,
! 527: следовательно указывать дополнительные параметры в строке соединение не требуется.
! 528: }
! 529: }{
! 530: ^error[SQL сервер ничего не сообщает о наличии у него переменных с именами "character_set" или "character_set_client"]
! 531: }
! 532: }
! 533: }{
! 534: $exception.handled(1)
! 535: ^error[MySQL сервер неадекватно реагирует на комманду "SHOW VARIABLES"]
! 536: }
! 537: </p>
! 538: }
! 539:
! 540: ^rem{ *** пробуем преобразовать строку к верхнему регистру средствами SQL сервера *** }
! 541: $sLower[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]
! 542: $sUpper[^sLower.upper[]]
! 543: <p>SQL преобразование строки с русским алфавитом к верхнему регистру:
! 544: ^try{
! 545: ^connect[$SQL.connect-string]{
! 546: $sSqlResult[^string:sql{SELECT UPPER('$sLower')^if(^SQL.connect-string.left(6) eq "oracle"){ FROM DUAL}}[$.default{}]]
! 547: }
! 548: ^if($sUpper eq $sSqlResult){
! 549: преобразование прошло корректно, скорее всего кодировки настроены верно.
! 550: }{
! 551: ^error[преобразование было произведено не корректно.]
! 552: <br />Результат: '$sSqlResult' (должно быть: '$sUpper').
! 553: }
! 554: }{
! 555: <b>синтаксис запроса не подходит для вашего SQL сервера.</b>
! 556: $exception.handled(1)
! 557: }
! 558:
! 559: </p>
! 560:
! 561: }{
! 562: ^if($exception.type eq "sql.connect"){
! 563: ^error[Не удается подсоединиться к SQL серверу.] Возможно неверно заданы имя/пароль в строке соединения.
! 564: $exception.handled(1)
! 565: }{
! 566: ^if($exception.type eq "sql.execute"){
! 567: ^error[Не удается выполнить SQL запрос], хотя соединение прошло успешно. Непонятки, ибо запрос прост как 2+2
! 568: $exception.handled(1)
! 569: }{
! 570: ^error[Что-то непонятное с SQL.] Возможно не положены куда надо драйвера.
! 571: <br />Сообщение об ошибке:
! 572: <blockquote>
! 573: ^taint[html][$exception.comment]
! 574: ^if(def $exception.source){<br /><b>^taint[html][$exception.source]</b>}
! 575: </blockquote>
! 576: $exception.handled(1)
! 577: }
! 578: }
! 579: }
! 580: }{
! 581: ^info[Не определена переменная ^$SQL.connect-string,] проверка корректности работы с базой данных невозможна.
! 582: }
! 583: </p>
! 584:
! 585:
! 586: <h3>Работа с XML</h3>
! 587: <p>
! 588: Создание объекта типа xdoc:<br />
! 589: ^try{
! 590: $xml_txt[<?xml version="1.0" encoding="$request:charset" ?>
! 591: <document>
! 592: <t attr="привет" n="123"/>
! 593: <t attr="пока" n="234" n2="xxx"/>
! 594: <text>текст</text>
! 595: </document>]
! 596: <pre>
! 597: ^taint[html][^$document[^^xdoc::create{$xml_txt}]]
! 598: </pre>
! 599: $document[^xdoc::create{$xml_txt}]
! 600: Объект xdoc ^info[успешно создан].<br />
! 601:
! 602: Достаем все элементы ^taint[html][<t />] ^$elements[^^document.select[//t]] :<br />
! 603: $elements[^document.select[//t]]
! 604: Количество найденых элементов: ^elements._count[]<br />
! 605: Вывод найденых элементов с помощью foreach (порядок произвольный):<br >
! 606: ^elements.foreach[key;node]{
! 607: nodeName: '$node.nodeName', nodeType: '$node.nodeType', кол-во аттрибутов: '^node.attributes._count[]', аттрибуты: ^node.attributes.foreach[akey;aval]{$akey='$aval.value'}[, ]
! 608: }[<br />]
! 609: }{
! 610: ^if($exception.type eq "parser.runtime"){
! 611: ^error[Парсер-то надо ставить с поддержкой XML...] Или не подключены XML библиотеки... Это вам не хухры-мухры...
! 612: $exception.handled(1)
! 613: }
! 614: ^if($exception.type eq "xml"){
! 615: $no_file(1)
! 616: $exception.handled(1)
! 617: ^error[Что-то не срослось с XML-ем...] Возможно из-за кодировок...
! 618: <br />Сообщение об ошибке:
! 619: <blockquote>
! 620: ^taint[html][$exception.comment]
! 621: ^if(def $exception.source){<br /><b>^taint[html][$exception.source]</b>}
! 622: </blockquote>
! 623: }
! 624: }
! 625: </p>
! 626:
! 627:
! 628: <h3>Работа с классами <a href="http://www.parser.ru/docs/lang/statusclass.htm">Status</a> и <a href="http://www.parser.ru/docs/lang/memoryclass.htm">Memory</a></h3>
! 629: $fields[^table::create{section name measure description
! 630: rusage utime сек чистое время, затраченное текущим процессом
! 631: rusage stime сек время, сколько система читала ваши файлы
! 632: rusage maxrss блоков память, занимаемая процессом
! 633: memory used КБ занято
! 634: memory free КБ свободно (скорее всего фрагментирована)
! 635: memory ever_allocated_since_compact КБ выделено с момента последней сборки мусора
! 636: memory ever_allocated_since_start КБ выделено за все время обработки запроса
! 637: }]
! 638:
! 639: <p>
! 640: ^try{
! 641: <table cellpadding="2" cellspacing="0" border="1">
! 642: <tr>
! 643: <th rowspan="2">Поле</th>
! 644: <th rowspan="2">Описание</th>
! 645: <th colspan="3">Значения</th>
! 646: </tr>
! 647: <tr>
! 648: <th>на начало работы</th>
! 649: <th>на текущий момент</th>
! 650: <th>после ^^memory:compact[]</th>
! 651: </tr>
! 652: $status_rusage_now[$status:rusage]
! 653: $status_memory_now[$status:memory]
! 654: ^try{
! 655: $tbl1[]
! 656: $tbl2[]
! 657: $tbl3[]
! 658: $hash1[]
! 659: $document[]
! 660: $elements[]
! 661: $tables_hash[]
! 662: $hf[]
! 663: $k[]
! 664: $v[]
! 665:
! 666: ^memory:compact[]
! 667: ^memory:compact[]
! 668: $is_compact_work(1)
! 669: $status_rusage_compact[$status:rusage]
! 670: $status_memory_compact[$status:memory]
! 671: }{
! 672: $exception.handled(1)
! 673: }
! 674: ^fields.menu{
! 675: <tr>
! 676: <td>^$status:${fields.section}.$fields.name^if(def $fields.measure){ ($fields.measure)}</td>
! 677: <td>$fields.description</td>
! 678: <td>^if($fields.section eq "rusage"){$status_rusage_begin.[$fields.name]}{$status_memory_begin.[$fields.name]}</td>
! 679: <td>^if($fields.section eq "rusage"){$status_rusage_now.[$fields.name]}{$status_memory_now.[$fields.name]}</td>
! 680: ^if(!$is_compact_work && ^fields.line[] == 1){
! 681: <td rowspan="^fields.count[]">^error[В установленной версии функция не реализована.]</td>
! 682: }{
! 683: <td>^if($fields.section eq "rusage"){$status_rusage_compact.[$fields.name]}{$status_memory_compact.[$fields.name]}</td>
! 684: }
! 685: </tr>
! 686: }
! 687: </table>
! 688: }{
! 689: $exception.handled(1)
! 690: ^error[В установленной версии не работают ^$status:rusage или ^$status:memory]
! 691: }
! 692: </p>
! 693: #end @main[]
! 694:
! 695:
! 696:
! 697: ###########################################################################
! 698: @auto[filespec]
! 699: ^if(def $filespec){
! 700: $script_dir[^trim[^filespec.match[/(?:\w+\.html?)?^$][i]{/};/]]
! 701: }
! 702: $document_root[^if(def $env:DOCUMENT_ROOT){$env:DOCUMENT_ROOT}{$script_dir}]
! 703: #end @auto[]
! 704:
! 705:
! 706:
! 707:
! 708: ###########################################################################
! 709: # trim leading and trailing chars $char (spaces by default)
! 710: @trim[str;char][chr;tbl]
! 711: ^if(def $str){
! 712: $chr[^if(def $char){$char}{\s}]
! 713: $str[^str.match[^^$chr*][]{}]
! 714: $tbl[^str.match[^^(.*[^^$chr])$chr*^$]]
! 715: $result[$tbl.1]
! 716: }{
! 717: $result[]
! 718: }
! 719: #end @trim[]
! 720:
! 721:
! 722:
! 723: ###########################################################################
! 724: @check_dir[dir]
! 725: ^if(def $dir && -d $dir){каталог существует}{^error[каталога не существует]}
! 726: #end @check_dir[]
! 727:
! 728:
! 729:
! 730: ###########################################################################
! 731: # get relative path to file
! 732: @get_relative_path[from;to][ff;tt;f;t;p;up;ne;pos;i;down]
! 733: $ff[^trim[^from.match[\\][g]{/};/]]
! 734: $tt[^trim[^to.match[\\][g]{/};/]]
! 735: $f[^ff.lsplit[/]]
! 736: $t[^tt.lsplit[/]]
! 737:
! 738: $p[]
! 739: $up[/]
! 740: $ne(0)
! 741: $pos(0)
! 742: ^for[i](1;^f.count[]){
! 743: ^if(!$ne && $f.piece eq $t.piece){
! 744: $p[${p}$f.piece/]
! 745: $pos($i)
! 746: }{
! 747: $ne($i)
! 748: $up[${up}../]
! 749: }
! 750: ^f.offset(1)
! 751: ^t.offset(1)
! 752: }
! 753: $down[]
! 754: ^for[i]($pos;^t.count[]-1){
! 755: ^t.offset[set]($i)
! 756: $down[${down}$t.piece^if($i != ^t.count[]-1){/}]
! 757: }
! 758: $result[${up}$down]
! 759: #end @get_relative_path[]
! 760:
! 761:
! 762:
! 763: ###########################################################################
! 764: # override unhandled_exception for show parser error (if occur) in this test
! 765: @unhandled_exception[exception;stack]
! 766: $response:status(500)
! 767: <html>
! 768: <head><title>Unhandled Exception</title></head>
! 769: <body>
! 770: <H1>Unhandled Exception</H1>
! 771: <pre>^taint[html][$exception.comment]</pre>
! 772: ^if(def $exception.source){
! 773: <b>$exception.source</b><br>
! 774: <pre>^taint[html][$exception.file^($exception.lineno^)]</pre>
! 775: }
! 776: ^if(def $exception.type){exception.type=$exception.type}
! 777: ^if($stack){
! 778: <hr />
! 779: ^stack.menu{<tt>$stack.name</tt> $stack.file^($stack.lineno^)<br>}
! 780: }
! 781: #for [x] MSIE friendly
! 782: <span style="font-size:1px">^for[i](0;512/7){ ^;}</span>
! 783: </body>
! 784: #end @unhandled_exception[]
! 785:
! 786:
! 787:
! 788: ###########################################################################
! 789: @printDate[dtDate]
! 790: $result[^if($dtDate is "date"){$dtDate.day/$dtDate.month/$dtDate.year}]
! 791: #end @printDate[dt]
! 792:
! 793:
! 794:
! 795: ###########################################################################
! 796: @printTable[tTable;sTableWidth][tCols;sColumnWidth]
! 797: ^if($tTable is "table" && $tTable){
! 798: <table cellpadding="3" cellspacing="0" border="1"^if(def $sTableWidth){ width="$sTableWidth"}>
! 799: $tCols[^tTable.columns[]]
! 800: $sColumnWidth[^eval(100/(^tCols.count[]+1))[%d]]
! 801: <tr>
! 802: <th width="^eval(100-$sColumnWidth*^tCols.count[])%">строка</th>
! 803: ^tCols.menu{<th width="$sColumnWidth%">$tCols.column</th>}
! 804: </tr>
! 805: ^tTable.menu{
! 806: <tr>
! 807: <td>^tTable.line[]</td>
! 808: ^tCols.menu{<td>$tTable.[$tCols.column]</td>}
! 809: </tr>
! 810: }
! 811: </table>
! 812: }
! 813: #end @printTable[]
! 814:
! 815:
! 816:
! 817: ###########################################################################
! 818: @update_pattern[text]
! 819: ^if(def $text){
! 820: $result[^text.match[(\\|\.)][g]{\$match.1}]
! 821: }{
! 822: $result[]
! 823: }
! 824: #end @update_pattern[]
! 825:
! 826:
! 827:
! 828: ###########################################################################
! 829: @error[text]
! 830: $result[<b style="color:red">$text</b>]
! 831: #end @error[]
! 832:
! 833:
! 834:
! 835: ###########################################################################
! 836: @info[text]
! 837: $result[<b>$text</b>]
! 838: #end @info[]
! 839:
! 840:
! 841:
! 842: ###########################################################################
! 843: # use postprocess for cut paths and don't show them to everyones
! 844: @postprocess[sBody]
! 845: $result[$sBody]
! 846: ^if(def $sqldriversdir){$result[^result.match[^update_pattern[$sqldriversdir]][gi]{^$sqldriversdir}]}
! 847: ^if(def $charsetsdir){$result[^result.match[^update_pattern[$charsetsdir]][gi]{^$charsetsdir}]}
! 848: ^if(def $document_root){$result[^result.match[^update_pattern[$document_root]][gi]{закоментируйте postprocess чтобы увидеть}]}
! 849: ^if(def $script_dir){$result[^result.match[^update_pattern[$script_dir]][gi]{закоментируйте postprocess чтобы увидеть}]}
! 850: #end @postprocess[]
! 851:
! 852:
! 853:
! 854: ###########################################################################
! 855: # check file
! 856: @check_system_file[path][relative_path;file_stat;path_drive;root_drive]
! 857: ^if(def $path){
! 858: $path_drive[^get_drive_letter[$path]]
! 859: ^if(^path.left(1) ne "/" && !^path.match[^^[a-z]:\\][i]){
! 860: $result[относительный путь. ^info[проверка невозможна]]
! 861: }{
! 862: ^if(def $path_drive && $path_drive ne ^get_drive_letter[$document_root]){
! 863: $result[^info[на другом диске, проверка невозможна]]
! 864: }{
! 865: ^rem{ *** path начинается с X:\\ - пути win, case insensitive *** }
! 866: $path[^path.match[^^[a-z]:\\(.+)][i]{^match.1.lower[]}]
! 867:
! 868: $relative_path[^get_relative_path[$document_root;$path]]
! 869: ^if(-f $relative_path){
! 870: ^try{
! 871: $file_stat[^file::stat[$relative_path]]
! 872: $result[^if(!$file_stat.size){^error[$file_stat.size байт]}{$file_stat.size байт}]
! 873: }{
! 874: $exception.handled(1)
! 875: $result[найден, но ^error[не доступен]]
! 876: }
! 877: }{
! 878: $result[^error[не найден]]
! 879: }
! 880: }
! 881: }
! 882: }{
! 883: $result[]
! 884: }
! 885: #end @check_system_file[]
! 886:
! 887:
! 888:
! 889: ###########################################################################
! 890: @get_drive_letter[sPath]
! 891: $result[]
! 892: ^sPath.match[^^([a-z]):(?:\\|/).+][i]{$result[^match.1.lower[]]}
! 893: #end @get_drive_letter[]
! 894:
! 895:
! 896:
! 897: ###########################################################################
! 898: # check parser3 sql lib name (many people write path to sql client lib but not parser3 lib)
! 899: @check_p3_sql_lib_name[sFile;sPattern][tPart]
! 900: $result(1)
! 901: ^if(def $sFile){
! 902: $tPart[^sFile.rsplit[/]]
! 903: ^if(!^tPart.piece.match[$sPattern]){$result(0)}
! 904: }
! 905: #end @check_p3_sql_lib_name[]
! 906:
! 907:
! 908:
! 909: ###########################################################################
! 910: @try_exec[jCode;sErrorInfo]
! 911: ^try{
! 912: $result[$jCode]
! 913: }{
! 914: $exception.handled(1)
! 915: $result[^error[^if(def $sErrorInfo){$sErrorInfo}{Используемая версия Parser 3 не имеет данной возможности.}]]
! 916: }
! 917: #end @try_exec[]
! 918: #--> Для того, чтобы данный тест заработал, в качестве обработчика документов с данным расширением должен быть установлен parser3, чего сейчас не наблюдается. #
E-mail: