Добрый день! Сайт был перенесен со сервера (freebsd) на новый (linux) и поставлена версия парсера 3.4.0 Появилась ошибка "mysql class is undefined" В конфигурационном файле $CLASS_PATH и вызовы прописаны.
"раньше работало" -- не аргумент, ведь вы что-то меняли :)
если бы не находился путь, то была-бы другая ошибка (о том, что не может быть найден файл). в вашем случае скорее всего этот @USE не выполняется, т.к. если-бы он выполнялся, то класс был-бы определён.
-- две большие разницы (обратите внимание на начальный слэш). почему у вас что-то не подключается я не знаю, т.к. чтобы что-то посоветовать надо знать где у вас что лежит.
P.S. простейший способ проверить подключается ли файл с классом: добавить в него метод @auto[] с ^throw[zzz;I'm working]
################################################################################################################################# $Id: mysql.p,v 1.24 2005/03/02 10:38:30 misha Exp $################################################################################################################################@CLASS
mysql
@USE
sql.p
@BASE
sql
###########################################################################@auto[]$server_name[mysql]#end @auto[]###########################################################################@init[connect-string;params]^BASE:init[$connect-string;$params]#end @init[]####################################################################################################################################################### РАБОТА С ДАТАМИ###########################################################################@today[]$result[CURDATE()]#end @today[]###########################################################################@now[]$result[NOW()]#end @now[]###########################################################################@year[source]$result[YEAR($source)]#end @year[]###########################################################################@month[source]$result[MONTH($source)]#end @month[]###########################################################################@day[source]$result[DATE_FORMAT($source,'%d')]#end @day[]###########################################################################@ymd[source]$result[DATE_FORMAT($source,'%Y-%m-%d')]#end @ymd[]###########################################################################@date_diff[t;dt_from;dt_to]$result[^if(def $dt_to){TO_DAYS($dt_to)}{^now[]} - TO_DAYS($dt_from)]#end @date_diff[]###########################################################################@date_sub[date;days]$result[DATE_SUB(^if(def $date){$date}{^today[]},INTERVAL $days DAY)]#end @date_sub[]# функции, имеющие аналоги не во всех серверах############################################################################----- не работает, заменителя не знаю@date_add[date;days]$result[]#end @date_add[]############################################################################ нету у MSSQL@date_format[source;format_string]$result[DATE_FORMAT($source, '^if(def $format_string){$format_string}{%Y-%m-%d}')]#end @date_format[]############################################################################ РАБОТА С LAST_INSERT_ID()###########################################################################@last_insert_id[table]$result(^int:sql{SELECT DISTINCT last_insert_id() FROM $table}[$.default{0}])#end @last_insert_id[]###########################################################################@set_last_insert_id[table;field]$result(^last_insert_id[$table])^void:sql{UPDATE $table SET ^if(def $field){$field}{sort_order} = $result WHERE ${table}_id = $result}#end @set_last_insert_id[]####################################################################################################################################################### РАБОТА СО СТРОКАМИ###########################################################################@substring[source;pos;length]$result[SUBSTRING($source,^if(def $pos){$pos}{1},^if(def $length){$length}{1})]#end @substring[]###########################################################################@upper[field]$result[UPPER($field)]#end @upper[]###########################################################################@lower[field]$result[LOWER($field)]#end @lower[]###########################################################################@concat[params]$result[CONCAT($params)]#end @concat[]####################################################################################################################################################### РАЗНОЕ###########################################################################@password[pass]$result[PASSWORD($pass)]#end @password[]###########################################################################@left_join[type;table;join_conditions;last]^if(^type.lower[] eq "from"){$result[LEFT JOIN $table ON ($join_conditions)]}{$result[1 = 1 ^if(!def $last){ AND}]}#end @left_join[]############################################################################ перекрываем заглушку для того, чтобы для каждого запроса получать explain информацию@_get_query_detail[type;query;sql_options][eres;cols]^if(def $query && $type ne "void"){^try{$eres[^table::sql{explain $query}[^if($sql_options is "hash"){^if($sql_options.offset){$.offset($sql_options.offset)}^if($sql_options.limit){$.limit($sql_options.limit)}}]]$cols[^eres.columns[]]$result[EXPLAIN:^#0A^cols.menu{$cols.column}[^#09]^#0A^eres.menu{^cols.menu{$eres.[$cols.column]}[^#09]}[^#0A]]}{$result[]$exception.handled(1)}}{$result[]}#end @_get_query_detail[]
у меня такая ошибка выглядит явно по другому: [Mon Sep 05 14:25:10 2011] [2840] /test/my/: путь/index.html(5:8): 'mysql' class is undefined [parser.runtime] [uri=/test/my/, method=GET, cl=0]
У вас случайно вызов конструктора mysql в конфигурационном auto.p не прописан?
Странно. Путь находится, если удалить файл mysql.p, то пишет, что он не найден...
Что касается конфигурационного:
@conf[filespec]$confdir[^file:dirname[$filespec]]$charsetsdir[$confdir/charsets]$sqldriversdir[$confdir/lib]$CHARSETS[$.koi8-r[$charsetsdir/koi8-r.cfg]# $.windows-1250[$charsetsdir/windows-1250.cfg]$.windows-1251[$charsetsdir/windows-1251.cfg]# $.windows-1257[$charsetsdir/windows-1257.cfg]]#change your client libraries paths to those on your system$SQL[$.drivers[^table::create{protocol driver client
mysql $sqldriversdir/libparser3mysql.so libmysqlclient.so
sqlite $sqldriversdir/libparser3sqlite.so sqlite3.so
pgsql $sqldriversdir/libparser3pgsql.so libpq.so
oracle $sqldriversdir/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
}]]#for ^file::load[name;user-name] mime-type autodetection$MIME-TYPES[^table::create{ext mime-type
zip application/zip
doc application/msword
xls application/vnd.ms-excel
pdf application/pdf
ppt application/powerpoint
rtf application/rtf
gif image/gif
jpg image/jpeg
png image/png
tif image/tiff
html text/html
htm text/html
txt text/plain
mts application/metastream
mid audio/midi
midi audio/midi
mp3 audio/mpeg
ram audio/x-pn-realaudio
rpm audio/x-pn-realaudio-plugin
ra audio/x-realaudio
wav audio/x-wav
au audio/basic
mpg video/mpeg
avi video/x-msvideo
mov video/quicktime
swf application/x-shockwave-flash
}]$CLASS_PATH[^table::create{path
/classes/
}]$LIMITS[$.post_max_size(10*0x400*0x400)]@fatal_error[title;subtitle;body]$response:status(500)$response:content-type[$.value[text/html]$.charset[$response:charset]]<html><head><title>$title</title></head><body><h1>^if(def $subtitle){$subtitle;$title}</h1>$body#for [x] MSIE friendly^for[i](0;512/8){<!-- -->}</body></html>@unhandled_exception_debug[exception;stack]^fatal_error[Unhandled Exception^if(def $exception.type){($exception.type)};$exception.source;
<pre>^untaint[html]{$exception.comment}</pre>^if(def $exception.file){^untaint[html]{<tt>$exception.file^(${exception.lineno}:$exception.colno^)</tt>}}^if($stack){<hr/><table>^stack.menu{<tr><td>$stack.name</td><td><tt>$stack.file^(${stack.lineno}:$stack.colno^)</tt></td></tr>}</table>}]@unhandled_exception_release[exception;stack]^fatal_error[Unhandled Exception;;
<p>The server encountered an unhandled exception
and was unable to complete your request.</p><p>Please contact the server administrator, $env:SERVER_ADMIN
and inform them of the time the error occurred,
and anything you might have done that may have caused the error.</p><p>More information about this error may be available in the Parser error log
or in debug version of unhandled_exception.</p>]@unhandled_exception[exception;stack]#use debug version to see problem details^unhandled_exception_release[$exception;$stack]^unhandled_exception_debug[$exception;$stack]@auto[]#source/client charsets$request:charset[windows-1251]$response:charset[windows-1251]$response:content-type[$.value[text/html]$.charset[$response:charset]]# mysql 3.xx & 4.0#$SQL.connect-string[mysql://user:pass@host/db?charset=cp1251_koi8]# mysql 4.1 and higher#$SQL.connect-string[mysql://user:pass@host/db?charset=cp1251]#$SQL.connect-string[sqlite://db]#$SQL.connect-string[pgsql://user:pass@host/db]#$SQL.connect-string[oracle://user:pass@service?NLS_LANG=RUSSIAN_AMERICA.CL8MSWIN1251&NLS_DATE_FORMAT=YYYY-MM-DD HH24:MI:SS]
Возможно их несколько, причем в остальных класс mysql не определен. А при переезде файлы были записаны в другом порядке, и теперь ищутся тоже в другом порядке.
Миша имеет ввиду, что нужен вывод _test.html Переименуйте времено auto.p в другое имя или закоментируйте его содержимое, чтобы парсер не падал на этой ошибке и обратитесь к тестовому файлу, результат приведите сюда.
1. если посмотреть на вывод таблицы $SQL.drivers, то можно заметить, что для протокола mysql строка в таблице некорректная. скорее всего кто-то между "mysql" и "./lib/libparser3mysql.so" написал пробел вместо символа табуляции. но я не знаю, как это может влиять на возникающую у вас ошибку (хотя из-за этого вы с mysql сервером работать не сможете).
2. у нас не находится файл клиентской библиотеки mysql: /usr/lib/mysql/libmysqlclient.so.15 (не найден) -- проверьте, что он есть по указанному пути.
3. если ещё внимательнее посмотреть на результат вывода _test.html и на , то можно заметить, что пути к библиотекам не идентичны (в приведённом вами коде написано "libmysqlclient.so", а тестовый файл показывает "/usr/lib/mysql/libmysqlclient.so.15"). т.е. похоже, что вы не в курсе, где-же на самом деле живёт ваш конфигурационный auto.p и показываете нам что-то другое.
4. определите в конфигурационном auto.p переменную $SQL.connect-string, чтобы тестовый файл попробовал проверить работу с SQL сервером.
5. смысл вызова и unhandled_exception_release и unhandled_exception_debug мне непонятен. надо вызывать ИЛИ один (на рабочем сервере) ИЛИ другой (на сервере разработке или для вас по IP)
6. попробуйте взять нашу сборку для RedHat
P.S. вообщем у вас только в конфигурационном файле достаточно косяков, чтобы запутать кого угодно. предлагаю скачать ещё раз выложенный нами конфигурационный файл, исправить в нём только пути к драйверу и библиотеке, CLASS_PATH, определить SQL.connect-string, закомментировать вызов unhandled_exception_release и раскомментировать вызов unhandled_exception_debug. сделать всё это внимательно и аккуратно. после этого ещё раз временно переименовать корневой auto.p и ещё раз показать результаты работы _test.html
судя по исходникам, если есть exception.source и stack trace -- то пытается вывестись сообщение об ошибке. если его нет -- информации о месте возникновения ошибки недоступна.