Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBExpert Новый топик    Ответить
 xIBEScript.dll 64-bit  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
Заинтересованные в 64-битной версии IBEScript.dll для своих приложений есть?
Имеется xIBEScript.dll 64-bit; движок абсолютно новый, с нуля; состояние - пре-альфа, я бы сказал :)
Некоторые сложные функции в IBEBlock типа ibec_CompareTables, ibec_CompareMetadata пока не реализованы.
Выполнение стандартных SQL скриптов должно работать - этот функционал хочется отладить в первую очередь.
13 июл 20, 05:23    [22166190]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
AltHasp
Member

Откуда:
Сообщений: 180
IBExpert,

О! Конечно интересно. А по какому адресу сие чудо можно скачать себе. Выложите URL, хочется по-тестировать.
А какие версии ЖП она поддерживает (2,3,4) ? Спасибо. Будем пробовать!
13 июл 20, 08:42    [22166227]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
AltHasp
А по какому адресу сие чудо можно скачать себе.


Выложил сюда:
https://www.ibexpert.com/rus/xIBEScript.sfx.exe

AltHasp
А какие версии ЖП она поддерживает (2,3,4) ?


Снаружи там [почти] все так же, как и в актуальных IBEscript.exe/dll
Специально поддержка каких-то версий не резалась, если только случайно.
13 июл 20, 09:25    [22166241]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
Добавил реализацию ibec_ExtractMetadata, ibec_ExecSQLScript, ibec_CompareTables, ibec_CompareMetadata.
28 июл 20, 09:33    [22174533]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
oleg_oleinik
Member

Откуда:
Сообщений: 13
IBExpert,
Да, заинтересованные есть. Пока интересует выполнение скрипта создания БД на родном SQL без IBEBlock. Также интересует работоспособность подобного скрипта
+ database_update.sql
execute ibeblock as
begin
  clib = ibec_GetGlobalVar('ClientLib', 'gds32.dll');
  BaseName = ibec_GetGlobalVar('dbName', ibec_ExtractFileName(ibec_GetCurrentDir()));

  ConnectionString = 'dbname=' || BaseName || ';user=sysdba;password=masterkey;clientlib=' || clib;
  conn = ibec_CreateConnection(__ctFirebird, ConnectionString);

  ibec_UseConnection(conn);

  select max(generation) from version_info into :GenValue;
  if (GenValue is null) then GenValue = 0;

  while (True) do begin
    GenNext = GenValue + 1;
    FileName = 'update_' || GenValue || '_' || GenNext || '.sql';
    if (not ibec_FileExists(FileName)) then break;

    ibec_Progress('');
    ibec_Progress('Executing script ' || FileName);

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

    StartTime = ibec_GetTickCount;
    Msg = ibec_ExecSQLScript(conn, FileName, 'StopOnError=True', cbb);
    if (Msg is null) then
    begin
      ibec_Progress('Script executed successfully.');
    end
    else
    begin
      ibec_Progress('');
      ibec_Progress('Script executed with errors.');
    end;

    ibec_Progress('Total execution time: ' || (ibec_GetTickCount - StartTime) || 'ms');
    ibec_Progress('==================================================');
    
    insert into version_info (generation) values (:GenNext);
    commit;

    GenValue = GenNext;
  end;

  ibec_CloseConnection(conn);
end
Пока к сожалению проверить не могу. Еще не все переведено на 64-бит.
21 авг 20, 04:55    [22185208]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
oleg_oleinik
Пока к сожалению проверить не могу. Еще не все переведено на 64-бит.


Там в архиве кроме dll еще и экзешник есть, просто подсунуть ему скрипт.
Пока нашел одну проблему с вызовом функций без параметров:
StartTime = ibec_GetTickCount;
Без скобок - ibec_GetTickCount() - работать не будет, но это сейчас поправим.
21 авг 20, 06:06    [22185213]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
oleg_oleinik
Member

Откуда:
Сообщений: 13
IBExpert, какие-то изменения в 64-битной версии с момента последнего поста появились?
Сейчас при вызове ibec_ExecSQLScript получаю такое сообщение:
-------- ERROR ----------
Unknown server version: . Known versions are: IB5X, IB61, IB65, IB70, IB71, IB75, IB2007, FB10, FB15, FB20, FB21, FB25, FB30, FB40, YA10.
Хотя 32-битное приложение работает нормально.
2 ноя 20, 18:10    [22225184]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
oleg_oleinik
какие-то изменения в 64-битной версии с момента последнего поста появились?


Да, там много. На днях обновлю - дам знать в этой теме.
3 ноя 20, 06:15    [22225450]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
Обновил.
6 ноя 20, 08:59    [22227339]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
oleg_oleinik
Member

Откуда:
Сообщений: 13
IBExpert, к сожалению в одном из скриптов та же ошибка, про неизвестную версию сервера, и дополнительно получил

-------- ERROR ----------
PSQL terminator (;) expected but 'into' found

в скрипте
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
  clib = '"' || ibec_GetGlobalVar('ClientLib', 'gds32.dll') || '"';
  BaseName = ibec_GetGlobalVar('dbName', ibec_ExtractFileName(ibec_GetCurrentDir()));

  ibec_Progress('');
  ibec_Progress('BaseName = ' || BaseName);

  ConnectionString = 'dbname="' || BaseName || '";user=sysdba;password=masterkey;SQLDialect=3;names=win1251;clientlib=' || clib;
  conn = ibec_CreateConnection(__ctFirebird, ConnectionString);
  try
    ibec_UseConnection(conn);

    select max(generation) from version_info into :GenValue;
    if (GenValue is null) then GenValue = 0;

    while (True) do 
    begin
      GenNext = GenValue + 1;
      FileName = 'update_' || GenValue || '_' || GenNext || '.sql';
      if (not ibec_FileExists(FileName)) then break;

      ibec_Progress('');
      ibec_Progress('Executing script ' || FileName);

      StartTime = ibec_GetTickCount();
      Msg = ibec_ExecSQLScript(conn, FileName, 'StopOnError=True', cbb);
      if (Msg is null) then
      begin
        ibec_Progress('Script executed successfully.');
      end
      else
      begin
        ibec_Progress('');
        ibec_Progress('Script executed with errors.');
      end;

      ibec_Progress('Total execution time: ' || (ibec_GetTickCount() - StartTime) || 'ms');
      ibec_Progress('==================================================');
      
      insert into version_info (generation) values (:GenNext);
      commit;

      GenValue = GenNext;
    end;
  finally
    ibec_CloseConnection(conn);
  end
end
9 ноя 20, 14:09    [22228748]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
oleg_oleinik
IBExpert, к сожалению в одном из скриптов та же ошибка, про неизвестную версию сервера


Исправил. Но версию сервера таки стоит указывать для пущей определенности: ServerVersion=FB25 или какая она там у тебя.

oleg_oleinik
и дополнительно получил

-------- ERROR ----------
PSQL terminator (;) expected but 'into' found


Тоже исправил.
9 ноя 20, 17:42    [22228925]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
oleg_oleinik
Member

Откуда:
Сообщений: 13
IBExpert, версию сервера в общем случае я не знаю, он на стороне заказчика и 32-битная версия как-то нормально отрабатывала такое. Переданный мной скрипт так и не работает

-------- ERROR ----------
''='' expected but ';' found

Разный вывод результатов у 32/64 версий для одного и того же скрипта
execute ibeblock as
begin
  if (not exists (select id from mlist)) then 
  begin
    mark_name = ibec_GetGlobalVar('user_name', 'Тестовый маркшейдер');
    insert into mlist (name) values (:mark_name);
    commit;
  end;
end
32-битная версия
D:\LGGT\Projects\Bases\Scripts\journals>..\..\..\FBLocal\IBEScript -GClientLib=fbembed.dll setup.sql
IBEScript Version 2020.11.9.1 Copyright (c) 2002-2020 IBExpert Ltd (www.ibexpert.com)
Executing script: setup.sql
(Line: 10) : Executing IBEBlock...


Error in script: setup.sql
Error occurred while executing following statement (line 10):
-------- STATEMENT ----------
IF not exists (select id from mlist)

-------- ERROR ----------
Cannot perform operation -- DB is not open.


Script executed with errors.
Total execution time: 0ms

64-битная версия
D:\LGGT\Projects\Bases\Scripts\journals>..\..\..\FBLocal64\IBEScript -GClientLib=fbembed.dll setup.sql
xIBEScript Version 2020.11.9.1 (very Alpha) Copyright (c) 2002-2020 IBExpert KG (www.ibexpert.net)
Executing script: D:\LGGT\Projects\Bases\Scripts\journals\setup.sql
(Line: 1): Executing IBEBlock... FAILED!

Error occurred while executing following statement:
-------- STATEMENT ----------
execute ibeblock as
begin
if (not exists (select id from mlist)) then
begin
mark_name = ibec_GetGlobalVar('user_name', '???????? ??????????');
insert into mlist (name) values (:mark_name);
commit;
end;
end



-------- ERROR ----------
Cannot perform operation -- DB is not open.

Successful Time spent: 00:00.000

И непонятная кодировка результата второго скрипта. При перехвате вывода выяснилось, что это utf-8. Такое ощущение, что 64-битная версия и загружает скрипт в другой кодировке.

PS: Наша компания при переводе дельфийского приложения на 64 бита сначала убрала асмовские вставки, потом приведение типов pointer/integer заменили на pointer/int_ptr, ну и по мелочи. Я думал у вас также. А тут такое ощущение, что полностью новое приложение пишется.

Сообщение было отредактировано: 11 ноя 20, 16:06
11 ноя 20, 16:07    [22230221]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
oleg_oleinik
А тут такое ощущение, что полностью новое приложение пишется.


Об этом было сказано в самом первом сообщении темы: да, полностью новое.

Ну и на твоем блоке я могу только проверить работу парсера, а как блок выполняется - не могу.
12 ноя 20, 08:33    [22230551]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
oleg_oleinik
Member

Откуда:
Сообщений: 13
IBExpert, так у меня скрипт видимо проверку синтаксиса не проходит.

-------- ERROR ----------
''='' expected but ';' found


для проверки скрипта в БД нужна таблица

CREATE TABLE VERSION_INFO (
    GENERATION  INTEGER
);


Запускаю на выполнение командой
xIBEScript -GClientLib=fbembed.dll -GdbName=[алиас БД] database_update.sql

во время работы скрипт ищет в текущей папке файлы с именами
update_0_1.sql
update_1_2.sql
...
и пытается выполнить все необходимые для обновления структуры БД
12 ноя 20, 16:37    [22230902]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
oleg_oleinik
IBExpert, так у меня скрипт видимо проверку синтаксиса не проходит.

-------- ERROR ----------
''='' expected but ';' found


Да нет, твой блок у меня парсится без ошибок сейчас. А в этих update_0_1.sql что? Может, там парсер ошибки находит?
Он вообще доходит до выполнения этих скриптов или сразу ошибку выше выплевывает?

Завтра еще посмотрю, что там может быть.
12 ноя 20, 17:07    [22230947]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
oleg_oleinik
Member

Откуда:
Сообщений: 13
IBExpert, update_0_1.sql это предполагается скрипт, сгенерированный через инструмент сравнения БД за минусом строки коннекта.
Но сейчас в папке нет ни одного такого файла.
+ Полный результат выполнения
xIBEScript Version 2020.11.12.1 (very Alpha) Copyright (c) 2002-2020 IBExpert KG (www.ibexpert.net)

Executing script: D:\LGGT\Projects\Bases\Scripts\database_update.sql
(Line: 1): Executing IBEBlock... FAILED!

Error occurred while executing following statement:
-------- STATEMENT ----------
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
clib = '"' || ibec_GetGlobalVar('ClientLib', 'gds32.dll') || '"';
BaseName = ibec_GetGlobalVar('dbName', ibec_ExtractFileName(ibec_GetCurrentDir()));

ibec_Progress('');
ibec_Progress('BaseName = ' || BaseName);

ConnectionString = 'dbname="' || BaseName || '";user=sysdba;password=masterkey;SQLDialect=3;names=win1251;clientlib=' || clib;
conn = ibec_CreateConnection(__ctFirebird, ConnectionString);
try
ibec_UseConnection(conn);

select max(generation) from version_info into :GenValue;
if (GenValue is null) then GenValue = 0;

while (True) do
begin
GenNext = GenValue + 1;
FileName = 'update_' || GenValue || '_' || GenNext || '.sql';
if (not ibec_FileExists(FileName)) then break;

ibec_Progress('');
ibec_Progress('Executing script ' || FileName);

StartTime = ibec_GetTickCount();
Msg = ibec_ExecSQLScript(conn, FileName, 'StopOnError=True', cbb);
if (Msg is null) then
begin
ibec_Progress('Script executed successfully.');
end
else
begin
ibec_Progress('');
ibec_Progress('Script executed with errors.');
end;

ibec_Progress('Total execution time: ' || (ibec_GetTickCount() - StartTime) || 'ms');
ibec_Progress('==================================================');

insert into version_info (generation) values (:GenNext);
commit;

GenValue = GenNext;
end;
finally
ibec_CloseConnection(conn);
end
end


-------- ERROR ----------
''='' expected but ';' found


Time spent: 00:00.000
12 ноя 20, 20:17    [22231079]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
oleg_oleinik,

Исправил кое-что, и вывод об ошибке сделал более детальным.
Пробуй.
15 ноя 20, 13:22    [22232323]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
oleg_oleinik
Member

Откуда:
Сообщений: 13
IBExpert, основной скрипт, вызываемый через IBEScript сейчас выполняется нормально.
Но есть еще замечания:
1. При отсутствии файла скрипта получаем циклическую ошибку
xIBEScript Version 2020.11.15.1 (very Alpha) Copyright (c) 2002-2020 IBExpert KG (www.ibexpert.net)

Executing script: D:\LGGT\Projects\Bases\Scripts\journals\test.sql
Exception at 000000010001C089: EFOpenError:
Unable to open file "test.sql".
xIBEScript Version 2020.11.15.1 (very Alpha) Copyright (c) 2002-2020 IBExpert KG (www.ibexpert.net)

Executing script: D:\LGGT\Projects\Bases\Scripts\journals\test.sql
Exception at 000000010001C089: EFOpenError:
Unable to open file "test.sql".
xIBEScript Version 2020.11.15.1 (very Alpha) Copyright (c) 2002-2020 IBExpert KG (www.ibexpert.net)

2. При вызове подчиненного скрипта через ibec_ExecSQLScript что-то неправильно с кодировкой.
Очень похоже на то, что описано здесь: https://www.sql.ru/forum/1328448/neponyatnoe-povedenie-ibec-createdatabase
Только закрытие БД и окрытие её заново в текущей ситуации не помогают.
Для тестов можно взять скрипты из той темы.
16 ноя 20, 11:14    [22232698]     Ответить | Цитировать Сообщить модератору
 Re: xIBEScript.dll 64-bit  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
Обновил.
вчера, 08:06    [22241217]     Ответить | Цитировать Сообщить модератору
Все форумы / IBExpert Ответить