Столкнулся с проблемой, АИБС "МАРК-SQL" для школьных библиотек 1.5.4 не работала с MySQL, а разработчики заверяли, что программа не совместима с MySQL.
Решил проанализировать запросы, которые ходят между программой и сервером при помощи MySQL-Proxy [2].
И сразу увидел некорректный запрос с использованием зарезервированного слова "SEPARATOR":
После установки, запуска MySQL-Proxy и подключения lua скрипта:
В ходе экспериментов для подключения к БД был получен такой конфиг dns.ini для работы с MySQL:
Была проблема при удалении записей из таблиц словарей, исправляется в файле delidx.sql: Ищем строку:
1. Reserved Words in MySQL 5.0
2. Download MySQL Proxy
3. Download Connector/ODBC
4. 20.1 – Pattern-Matching Functions
5. MySQL On air. Мониторим SQL запросы
6. Access To MySQL
7. MySQL и MarcSQL
8. Версия АИБС "МАРК-SQL" для школьных библиотек находится в свободном доступе для российских школ.
Решил проанализировать запросы, которые ходят между программой и сервером при помощи MySQL-Proxy [2].
И сразу увидел некорректный запрос с использованием зарезервированного слова "SEPARATOR":
SELECT TAG,SUBTAG,FLAGS,SEPARATOR,CAPTION FROM TAGПосле добавления обратных кавычек к зарезервированному слову SEPARATOR [1] запрос выполнился в MySQL без проблем:
SELECT TAG,SUBTAG,FLAGS,`SEPARATOR`,CAPTION FROM TAGЗначит для нормальной работы программы АИБС "МАРК-SQL" для школьных библиотек 1.5.4 нужно ловить каждый запрос, и если требуется, экранировать зарезервированные слова MySQL на лету. С этой задачей вполне успешно справится MySQL-Proxy [2] с поддержкой lua [4] скриптов.
После установки, запуска MySQL-Proxy и подключения lua скрипта:
function MyDebug(str)
-- enable\disable debug messages print to stdout.
local dbg = 0
if dbg == 1 then
print('[DEBUG] ' .. str)
end
end
function read_query(packet)
local file = io.open('/var/log/mysql-proxy.log', 'a')
local q = string.sub(packet, 2)
MyDebug('Orig. Query: ' .. q)
file:write('Orig. Query: ' .. q .. '\n')
-- Таблица зарезервированных слов MySQL.
-- http://dev.mysql.com/doc/mysqld-version-reference/en/mysqld-version-reference-reservedwords-5-7.html
q = string.gsub(q, '(SEPARATOR)', '`%1`')
q = string.gsub(q, '(INT%d)', '`%1`')
-- Исправление поискового запроса (захардкоженного в marcp.exe) и регистронезависимый поиск.
local _,_,str1,str2,str3 = string.find(q,"SELECT TERM,CNT FROM (.-) WHERE TERM%s*>=%s*('.-')%s(.*)") -- TODO: проверить всегда ли передаются кавычки в поле WHERE TERM >= ''.
if str1 ~= nil and str2 ~= nil and str3 ~= nil then
MyDebug('str1: ' .. str1); MyDebug('str2: ' .. str2); MyDebug('str3: ' .. str3)
str2 = string.gsub(str2, "^'", '') -- Delete start '.
str2 = string.gsub(str2, "'$", '') -- Delete end '.
MyDebug('Fixed str2: ' .. str2)
q = string.format("SELECT TERM,CNT FROM %s WHERE LOWER(TERM) LIKE LOWER('%s%%') %s",str1,str2,str3)
end
-- Исправляем кавычки в запросе.
q = string.gsub(q, 'SELECT CODE,NAME FROM%s+"(.+)"%s*(.*)', 'SELECT CODE,NAME FROM `%1` %2') -- Del start '.
MyDebug('Fixed query: ' .. q .. '\n')
file:write('Fixed query: ' .. q .. '\n')
file:close()
proxy.queries:append(2, string.char(proxy.COM_QUERY) .. q, {resultset_is_needed = true})
return proxy.PROXY_SEND_QUERY
end
function read_query_result(inj)
if inj.id == 1 and inj.resultset.rows ~= nil then
local file = io.open('/var/log/mysql-proxy.log', 'a')
for row in inj.resultset.rows do
local i = 1
local fields = {}
while row[i] do
if row[i] == row then break end
file:write('Response field: ' .. inj.resultset.fields[i].name .. ' => ' .. row[i] .. '\n')
i = i + 1
end
end
file:close()
return proxy.PROXY_IGNORE_RESULT
end
end
В ходе экспериментов для подключения к БД был получен такой конфиг dns.ini для работы с MySQL:
Универс|DRIVER=MySQL ODBC 5.2 Unicode Driver;NO_SSPS=1;MULTI_STATEMENTS=1;AUTO_RECONNECT=1;LOG_QUERY=0;IGNORE_SPACE=1;COMPRESSED_PROTO=1;NO_PROMPT=1;CHARSET=cp1251;DATABASE=marcsql;SERVER=192.168.4.26;PORT=4040;UID=marcsql;PASSWORD=password;Описание некоторых опций:
- NO_SSPS=1; - Включение подстановок на стороне клиента, а не сервера (т.е. запросы в которых есть знаки "?").
- COMPRESSED_PROTO=1; - Включение сжатия (немного повышается скорость работы с большими результатами запросов).
- NO_PROMPT=1; - Отключение окна запроса, при переподключении к БД.
- CHARSET=cp1251; - Кодировка в которой будет идти обмен между сервером и клиентом (программа для Windows и работает в cp1251).
- BASE=marcsql; - Имя базы.
- SERVER=192.168.4.26; - Адрес сервера MySQL-Proxy.
- PORT=4040; - Порт на котором работает MySQL-Proxy.
- UID=marcsql; - Логин, для подключения к БД.
- PASSWORD=password; - Пароль, для подключения к БД.
[Mysql] ScriptPath=..\sql\Mysql CreateTempTable=CREATE TABLE &Table&TabSuf(DOC_ID INTEGER PRIMARY KEY) DictQuery=SELECT TERM,CNT FROM &TableВ файле DbmsParams.ini:
[Mysql] $VARCHAR=VARCHAR $COUNTER=INT AUTO_INCREMENT $DOUBLE=FLOAT $LONGTEXT=TEXT $LONGBINARY=TEXT $MIDTEXT=TEXT $TEXT=TEXT $DBPREF_=marcsql. $COLUMN= $TOP1000= $ALTERCOLUMN=ALTER COLUMNДобавляем информацию о возрастном маркере в EditMap.ini:
[333a] EditForm=TECombo ComboValues=0+ Для дошкольного возраста,6+ Для младшего школьного возраста,12+ Для среднего школьного возраста,16+ Для старшего школьного возраста,18+ Для взрослых TagValues=Для дошкольного возраста,Для младшего школьного возраста,Для среднего школьного возраста,Для старшего школьного возраста,Для взрослых Separator=, OnlyFormEdit=Yes DefaultMenu=NO [200e] EditForm=TECombo ComboValues=[0+],[6+],[12+],[16+],[18+] TagValues=[0+],[6+],[12+],[16+],[18+] Separator=, OnlyFormEdit=Yes DefaultMenu=NOДобавляем редактор LibreOffice в файле marc.ini в секцию [Editors]:
[Editors] LibreOffice=swriter.exeИзменяем файл phase.ini под потребности нашей школы:
[Книги] CreateTags=245anpbco,100ae,700ae,653a,520a,020ac,090ax,084a,110a,260abc,440a,650a,200e,300ab,333a,952be,526cde,250a,998а,773b,773d,773t,773g,013ddee EditTags=245,100,700,653,520,020,090,084,110,200,260,440,650,300,333,952,526,250,998,773 ViewTags=100a,100e,700a,700e,245a,245b,245o,245p,245n,260a,260b,260c,300a,300b,333a,440a,020a,020c,650a,090a,090x,084a ShowAllTags=YES RecType=a BibLevel=mВ файле RdrData.ini, в секции [Common] исправляем запрос LastReaderQuery:
LastReaderQuery=SELECT RDR_ID FROM &ReadersPrefREADERS ORDER BY LEN(RDR_ID) DESC, RDR_ID DESC LIMIT 1Теперь SQL файлы, заходим в каталог sql:
Была проблема при удалении записей из таблиц словарей, исправляется в файле delidx.sql: Ищем строку:
DELETE FROM &Table WHERE CNT=0;Заменяем её на:
DELETE FROM &Table WHERE CNT<=0;Исправляем проблему с удалением данных из таблицы METAIDX ищем в файле dropdict.sql строку:
DELETE FROM METAIDX WHERE NAME='&Table.TERM'Заменяем её на:
DELETE FROM `METAIDX` WHERE `NAME` = '&Table.`TERM`'; DELETE FROM `METAIDX` WHERE `NAME` = '&Table.TERM';Теперь создаем каталог Mysql и копируем все файлы из каталога Access в созданный каталог Mysql (напоминаю, мы должны быть в каталоге sql). Другими словами мы должны получить копию папки sql/Acess, но по адресу sql/Mysql. И приводим в порядок файлы в каталоге sql/Mysql: Файл crdict.sql приводим к такому виду:
INSERT INTO METAIDX(`NAME`,`TYPE`,`MAXLEN`,`TAGS`,`CAPTION`,`SEP`) VALUES('&Table.`TERM`','&Type',&MaxLen,'&Taglist','&Caption','&Sep');
CREATE TABLE &Table (
`IDX_ID` INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
`TERM` VARCHAR(&MaxLen),
`CNT` INTEGER);
CREATE TABLE `&TableX` (
`IDX_ID` INTEGER NOT NULL,
`DOC_ID` INTEGER NOT NULL,
FOREIGN KEY(`IDX_ID`) REFERENCES `&Table`(`IDX_ID`));
CREATE INDEX &TableXB ON &TableX(`DOC_ID`);
CREATE INDEX &TableXC ON &TableX(`IDX_ID`);
Файл rebuild.sql приводим к такому виду:
DROP TABLE IF EXISTS `IDXTEMP`; CREATE TABLE `IDXTEMP` (`DOC_ID` INTEGER, &Term Text); $BUILD; $Инициализация таблицы индексов; DELETE FROM &TableX; DELETE FROM &Table; $Заполнение таблицы индексов; INSERT INTO &Table(&Term,CNT) SELECT &Term, Count(&Term) FROM IDXTEMP GROUP BY &Term; $Заполнение таблицы перекрестных ссылок; INSERT INTO &TableX(IDX_ID,DOC_ID) SELECT &Table.IDX_ID,IDXTEMP.DOC_ID FROM &Table,IDXTEMP WHERE IDXTEMP.&Term=&Table.&Term; $Удаление временной таблицы; DROP TABLE IDXTEMP;На этом изменения в файлах программы окончены. Пришло время конвертировать базу, я конвертировал при помощи BullZip Access To MySQL[6], на выходе получил .sql файл, который был скопирован на сервер и залит в БД. На этом все.
1. Reserved Words in MySQL 5.0
2. Download MySQL Proxy
3. Download Connector/ODBC
4. 20.1 – Pattern-Matching Functions
5. MySQL On air. Мониторим SQL запросы
6. Access To MySQL
7. MySQL и MarcSQL
8. Версия АИБС "МАРК-SQL" для школьных библиотек находится в свободном доступе для российских школ.
Комментариев нет:
Отправить комментарий