powered by simpleCommunicator - 2.0.19     © 2024 Programmizd 02
Map
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / xIBEScript.dll 64-bit
19 сообщений из 69, страница 3 из 3
xIBEScript.dll 64-bit
    #40134570
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert
Ты уверен, что у тебя там одна и та же клиентская либа используется в обоих случаях??
А вот еще: dbname=test.fdb. Ты embedded используешь что-ли?
Да, я использую embedded в качестве клиентской либы, это дает возможность работать при отсутствии сервера. В xIBEScript.exe путь к либе я передаю через параметр -l и дополнительно через глобальную переменную, для создания connection, это видно из первого скрипта. При работе с DLL глобальную переменную для либы для скрипта я установил (имя базы передается также и оно читается нормально, connection же создается).
Исходя из вопроса я провел исследование.
Ситуация 1: Для скрипта не устанавливаем путь к либе через глобальную переменную. Скрипт автоматом подставляет имя "gds32.dll" с кавычками. В программе на Delphi я перехватываю LoadLibraryExW и уже там меняю путь к либе и имя файла на fbembed.dll. LoadLibraryExW с именем gds32.dll за время работы скрипта вызывается 4 раза. В результате скрипт отрабатывает без ошибок.
Ситуация 2:
Устанавливаем в глобальную переменную путь к файлу fbembed.dll. LoadLibraryExW при этом вызывается 2 раза, после чего получаем ошибку на RECONNECT.
Исходя из исследований ошибка где-то внутри xIBEScript.dll, т.к. результат LoadLibraryExW в обоих случаях возвращается для одной и той же либы. Но в первом случае имя либы внутри скрипта = "gds32.dll", а во втором случае это полностью сформированный путь к fbembed.dll.
Т.е. чисто теоретически пользоваться DLL можно, но с костылями.

PS: Есть ошибка в ibesScriptFinalize. По документации функция должна возвращать 0, но она возвращает мусор.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134696
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik,

1. Сервер какой версии ты используешь?
2. Как устанавливаешь глобальную переменную при использовании xIBEScript.dll?
3. Что происходит, если прописать полный путь к fbembed.dll прямо в строку коннекта?

Вот это у меня работает без проблем:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
execute ibeblock
as

declare ibeblock cbb (BlockData variant) as
begin
  sMessage = BlockData;
  if (sMessage is not null) then
    ibec_Progress(ibec_StringReplace(sMessage, ' : ', ' : [' || ibec_Now() || '] ', 0));
end;

begin
  ibec_SetGlobalVar('ClientLib', 'D:\Projects_5\IBExpert\ClientLibs\x64\FB_40\fbclient.dll');
  clib = '"' || ibec_GetGlobalVar('ClientLib', 'gds32.dll') || '"';

  try
    DB = ibec_CreateConnection(__ctInterBase,
                               'DBName="avx-dell/3044:D:\Data\FB40_DATA\TIME_ZONES.FDB";
                               ClientLib=' || :clib || ';
                               User=SYSDBA; Password=masterkey; Names=UTF8; SqlDialect=3;');
    Msg = ibec_ExecSQLScript(DB, 'reconnect;', 'StopOnError=True', cbb);
    ibec_ShowMessage(Msg);

  finally
    ibec_CloseConnection(DB);
  end;
end;
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134723
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, оказывается можно еще много чего поисследовать)).
Однако ваш скрипт с учетом моих изменений путей к либе и к базе тоже вылетает.
Вылетает во всех вариациях - устанавливаю ли я путь к либе через глобальную переменную именно в этом скрипте, присваиваю ли я этот путь напрямую в переменную или даже если я указываю его напрямую в строке коннекта.
Это ответ на 3-й вопрос. Теперь на первые:
1. Использую Firebird-2.5.9.27139-0_x64_embed.zip . С другими версиями сервера 3.x, 4.x мое приложение не тестировалось и скорее всего переход на них будет не скоро.
2. Для установки глобальной переменной использую следующую функцию
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure SetGlobalVar(Script: THandle; const VarName, Value: string);
var
  ScriptText: AnsiString;
begin
  ScriptText := Format('execute ibeblock as begin ibec_SetGlobalVar(%s, %s); end;',
    [AnsiQuotedStr(VarName, ''''), AnsiQuotedStr(Value, '''')]);
  CheckIBEResult(ibesScriptExecuteText(Script, PAnsiChar(ScriptText)));
end;
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134741
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik,

Скачал клиента по твоей ссылке, упростил блок до предела, выполняю прямо в тестовой демке xIBEScript.dll:
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134820
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, а у меня тогда что не так? )
Единственно, что приходит на ум - разница между Delphi и FreePascal, но это же все обвязка вокруг DLL.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40134851
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, так как у вас заработало только после того, как я установил правильные параметры connection и дополнительно к connection, который создается в скрите вызвал SetConnection перед вызовом ExecuteScriptText
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  InitConnection;
  IBES.SetConnection(hConnection);
  try
    IBES.ExecuteScriptText(Memo1.Lines.Text);
  finally
    IBES.SetConnection(0);
  end;


Если же InitConnection убрать, то получаем ошибку как у меня. Но это не совсем правильно. Насколько я понимаю, вызов ibec_SetConnection должен выполнять те же действия, что и SetConnection в Delphi.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135022
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik
IBExpert, а у меня тогда что не так? )
Единственно, что приходит на ум - разница между Delphi и FreePascal, но это же все обвязка вокруг DLL.


Ну, есть еще вариант, что мы разные версии xIBEScript мучаем. Собственно, так оно и есть, просто я не помню, чтобы что-то правил по обсуждаемой теме. Но я выложил актуальную (свою) версию, так что попробуй ее.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135023
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik

Если же InitConnection убрать, то получаем ошибку как у меня. Но это не совсем правильно.


InitConnection - это для скриптов/блоков, в которых не создается собственный коннект. В данном случае он не нужен.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135038
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, попробовал - чуда не произошло.
Запускаю последний тестовый скрипт в DemoApp.
Если connection создается и устанавливается в Delphi - то скрипт отрабатывает без ошибок.
Если connection с теми же параметрами создается внутри скрипта - Cannot perform operation -- DB is not open.

С 32-битной версией xIBEScript те же ошибки, и дополнительно ошибка на скриншоте.

PS: Я попробую выполнить тестовый пример на другой машине на windows 10, может что-то в моей windows 11 накрутили.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135046
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я бы еще для полноты картины сделал следующее:
1. Проверил скрипт на нормальном коннекте по TCP, чтобы удостовериться, что дело не в embedded.
2. В скрипте, который с reconnect, выполнил что-то, что не закрывает коннект. Чтобы убедиться, что коннект там рабочий.

А пока других идей у меня нет.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135055
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, при входе в скрипт коннект рабочий, с этим проблем нет.
Лог реального скриптаExecuting script update_1_2.sql
(Line: 1) : [17.02.2022 10:11:19] Setting connection charset (WIN1251)... Successful
(Line: 3) : [17.02.2022 10:11:19] Setting connection sql dialect (3)... Successful
(Line: 5) : [17.02.2022 10:11:19] SET... Successful
(Line: 10) : [17.02.2022 10:11:19] Altering procedure CHECK_POINT_NAME... Successful
(Line: 18) : [17.02.2022 10:11:19] Altering trigger POINTS_BI0... Successful
(Line: 23) : [17.02.2022 10:11:19] Altering trigger POINTS_BU0... Successful
(Line: 30) : [17.02.2022 10:11:19] Dropping procedure CHECK_POINT_NAME... Successful
(Line: 34) : [17.02.2022 10:11:19] Dropping trigger POINTS_BI0... Successful
(Line: 35) : [17.02.2022 10:11:19] Dropping trigger POINTS_BU0... Successful
Error occurred while executing following statement (line 39):
-------- STATEMENT ----------
RECONNECT
-------- ERROR ----------
Unsuccessful execution caused by a system error that precludes successful execution of subsequent statements.
connection shutdown.
-------------------------------------------------------------------------------------------------------------
SQLCODE: -902
SQLSTATE: 08003
GDSCODE: 335544856

(Line: 39) : [17.02.2022 10:11:20] Reconnecting to 'D:\LGGT\Projects\Bases\journals.fdb'... FAILED!

Script executed with errors.
Total execution time: 1719ms
==================================================

А вот куда он дальше девается - непонятно.
И да, с моей точки зрения embedded все-таки не виноват ) по двум причинам.
1. я пробовал подключаться этим же скриптом к базе на сервере, через fbclient.dll из дистрибутива сервера - результат тот же.
2. почему-то connection, созданный и установленный из Delphi отрабатывает reconnect нормально, независимо от пути к базе и к либе.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135060
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik,

Зачем ты все время дельфи какую-то упоминаешь и логи выполнения каких-то других скриптов выдаешь?
Это процесс никак не упрощает, только запутывает. Есть вон простейший блок, на котором твоя проблема у тебя воспроизводится, а у меня - нет. Вот этот блок и надо мучать в тестовой демке.
А твоих скриптов у меня нет, и дельфи твоей нет, и что ты там в своем приложении делаешь - я тоже не знаю и воспроизвести не могу.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135068
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня продолжают терзать смутные сомнения, что xIBEScript.dll у тебя старая. Тестовая демка ищет ее уровнем выше, ты в курсе?
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135262
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, кокретно язык Delphi тут не при чем, я проверил на fpc/Lazarus - тоже самое. Я имел ввиду, что connection должен быть установлен одним из способов либо в скрипте через ibec_UseConnection, либо в вызывающей программе через ibesSetConnection. Одного вызова ibec_CreateConnection в скрипте недостаточно, после этого не работают sql-запросы именно в этом скрипте. Хотя будут работать в том, который вызвать из него если при этом передать созданный connection.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135263
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, я смог локализовать проблему с reconnect, правда теперь не знаю, что с этим делать. Если я вызываю выполнение скрипта через dll сразу после старта моей программы - все работает нормально. Но если к базе, с которой работает скрипт предварительно создать connection средствами вызывающей программы (на Delphi я использую TIBDatabase), то все нормально работает до вызова reconnect. Причём не работает, даже если я перед вызовом скрипта разорву connection в программе. Т.е. сам connection в скрипте создаётся, остальные операторы ddl отрабатывают, а reconnect - не хочет.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135296
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, да, конечно я в курсе, где демка ищет xIBEScript.dll.
Концепция поменялась, я нашел другую, более простую причину, приводяющую к неработоспособности xIBEScript.dll.
Достаточно в программе вызывающей выполнение скрипта через dll предварительно сделать вызов:
LoadLibraryExW('ПУТЬ_К_КЛИЕНТСКОЙ_БИБЛИОТЕКЕ', 0, LOAD_WITH_ALTERED_SEARCH_PATH);
т.е. ровно то же самое, что делает xIBEScript.dll при создании connection - и все.
Изменения в uTestDLL.pas из DemoApp
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  // InitConnection;
  IBES.SetConnection(hConnection);
  try
    // Добавить следующую строку
    LoadLibraryExW('C:\Program Files\FireBird\FireBird_2_5\bin\fbclient.dll', 0, LOAD_WITH_ALTERED_SEARCH_PATH);
    IBES.ExecuteScriptText(Memo1.Lines.Text);
  finally
    IBES.SetConnection(0);
  end;


Текст скрипта для теста
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
execute ibeblock as
begin
  dbName = ibec_GetCurrentDir() || '\test.fdb';
  clib = 'C:\Program Files\FireBird\FireBird_2_5\bin\fbclient.dll';
  ConnString = 'dbName="localhost:' || dbName || '";clientlib="' || clib || '";user=sysdba;password=masterkey;names=utf8;SQLDialect=3';
  if (ibec_FileExists(dbName)) then
    conn = ibec_CreateConnection(__ctFirebird, ConnString);
  else
    conn = ibec_CreateDatabase(__ctFirebird, ConnString);
  try
    ibec_UseConnection(conn);
    select 'bla-bla' from rdb$database into :Msg;
    ibec_ShowMessage(Msg);
    Msg = ibec_ExecSQLScript(conn, 'reconnect;', 'StopOnError=True', null);
    if (Msg is null) then
      select 'bla-bla-bla' from rdb$database into :Msg;
    ibec_ShowMessage(Msg);
  finally
    ibec_CloseConnection(conn);
  end;
end;

Скрипт использует установленный локальный сервер и подключается к существующей или создает новую базу в текущей папке. Если в демке добавить вызов LoadLibraryExW - то reconnect не работает. Но от этого никуда не деться - загрузка клиентской либы выполняется любыми компонентами для работы с Firebird.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135365
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
oleg_oleinik

Достаточно в программе вызывающей выполнение скрипта через dll предварительно сделать вызов:
LoadLibraryExW('ПУТЬ_К_КЛИЕНТСКОЙ_БИБЛИОТЕКЕ', 0, LOAD_WITH_ALTERED_SEARCH_PATH);
т.е. ровно то же самое, что делает xIBEScript.dll при создании connection - и все.


Вооот... Теперь все понятно.

1. Сначала ты у себя в приложении грузишь клиентскую либу, потом то же самое делает xIBEScript.
2. RECONNECT сначала закрывает коннект и выгружает fbemded.dll.
3. Перед выгрузкой fbemded.dll от FB 2.5 выполняется fb_shutdown.
4. После вызова fb_shutdown использовать загруженную в адресное пространство приложения dll
(если она там осталась, а это так раз твой случай) уже нельзя, ее нужно выгрузить полностью и
загрузить снова.

Запретить скриптеру выполнять fb_shutdown можно установкой переменной окружения
IBECallFBShutdown в FALSE/0. Но тогда только ты отвечаешь за корректную выгрузку fbemded.dll.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135377
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, все сказанное относится и к не embedded версии, если это FB 2.5.
fb_shutdown в движке эксперта выполняется только для этой версии, проверка делается по версии клиентской библиотеки.
...
Рейтинг: 0 / 0
xIBEScript.dll 64-bit
    #40135680
oleg_oleinik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert, спасибо.
Установка переменной окружения помогла, все заработало.
...
Рейтинг: 0 / 0
19 сообщений из 69, страница 3 из 3
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / xIBEScript.dll 64-bit
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (0):
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]