powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выполнение скриптов с помощью ibescript.dll
25 сообщений из 26, страница 1 из 2
Выполнение скриптов с помощью ibescript.dll
    #38398919
RhinoFC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Собственно выполнение SQL-скрипта проблем не вызывает, но нужно сделать так, чтобы некоторые команды скрипта игнорировались. Конкретно, нужно игнорировать команды "connect" и "set clientlib", если они имеются в скрипте.
Делаю так (подробности опущу):

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
...
function BeforeExec(AStmtText, AText: PChar): Integer; stdcall;
var
  S: string;
begin
// запрещаем выполнение некоторых SQL-команд
  Result := 0;
  if StartsText('connect', S) or // нужно проигнорировать
     StartsText('set clientlib', S) // нужно проигнорировать
     StartsText('delete', S) or  // игнорировать по-идее не нужно, но добавлено для проверки работоспособности
  then
    Result := 1; // вот тут большие сомнения
end;
...
procedure RunScript(FName: string);
begin
// подключаюсь к конкретной базе
  ConnectDB(PChar(Format('db_name=%s; password=%s; user_name=SYSDBA; clientlib=fbclient.dll', [DBName, Pwd])), @ConnectError);
// выполняю скрипт
  ExecuteScriptFile(PChar(SL[i]), @ScriptError, @BeforeExec, @AfterExec);
// отключаюсь от базы
  DisconnectDB;
end



Я решил, возможно неправильно, что если функция BeforeExec возвращает в качестве результата не ноль, то команда игнорируется. И, это действительно верно для команд "set clientlib" и "delete". Но вот "connect" всё равно выполняется, хоть ты тресни.
Кто знает, как побороть?
Спасибо.
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38398923
RhinoFC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сорри, конечно

ExecuteScriptFile(PChar(FName), @ScriptError, @BeforeExec, @AfterExec);
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38398955
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CONNECT отдельно обрабатывается, пропустить не получится в текущей версии.
Скорее всего, просто забыл об этом, когда делал возможность игнорировать статементы. Только ждать исправления.
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38398974
RhinoFC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,
Спасибо за оперативный ответ.
Буду искать пути обхода. Попробую в ScriptError просто проигнорировать ошибку, если она вызвана по коннекту (я ведь правильно понимаю, что Result := 0 в этой функции обработки ошибок позволит продолжить выполнение?). Правда плохо будет, если connect у конечного пользователя окажется правильным и выполнится без ошибок.
И, раз уж Вы здесь, может сориентируете, когда обновление можно ждать?
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38399016
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С игнорированием ошибки ничего не получится. Там сначала происходит дисконнект текущего соединения, а уж потом вызывается OnBeforeExecuteStatement и создается новое соединение. Соответственно, даже если ошибку проигнорировать, коннекта уже не будет.

Result = 1 в обработчике ошибок останавливает выполнение скрипта, Result = 2 - выполнение будет продолжено.

ฺИсправленную версию ibescript постараюсь выложить завтра.
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38399092
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Впрочем, исправил уже и выложил. Но не тестил.
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38399112
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

Прошу прощения что встреваю, но как-то вспомнилось.
То, что после ExecuteScriptFile идет принудительный дисконнект - это так и задумано, или случайно получилось? Или у меня руки неправильного радиуса?

Суть задачи - есть много скриптов, которые надо последовательно выполнить на целевой базе. Ну и перед выполнением каждого скрипта надо присоединятся наново. Не то чтобы напрягает, но озвученный вопросс возник.
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38399119
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline,

Не могу сказать, почему сделано именно так. Давно это было...
А кучку скриптов из файлов на одном коннекте выполнить легко, достаточно собрать временный скрипт с INPUT'ами в нем и выполнить его.
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38399545
RhinoFC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обновление забрал, проверил, работает. Огроменное спасибо! Пласт проблем снят.

Что касается принудительного дисконнекта после выполнения скрипта...
Получается, я зря DISCONNECT использую? А я то думаю, почему после выполнения скрипта дисконнект в качестве результата -1 возвращает.
Вообще, можно конечно формировать один скрипт из пакета скриптов, но тогда в случае возникновения ошибки в одном из скриптов пакета, как определить в каком именно скрипте эта ошибка возникла? Придётся, видимо, каждый раз коннектиться перед выполнением скрипта.

И ещё вопрос. А есть где-нибудь подробная документация по использованию IBEScript? Я что-то не смог найти. А то вот что какая процедура должна возвращать в качестве результата - не очень ясно.
Ваша фраза "Result = 1 в обработчике ошибок останавливает выполнение скрипта, Result = 2 - выполнение будет продолжено." добавила вопросов. А что тогда Result = 0? Вроде тоже скрипт спокойно продолжает выполняться. И какие результаты и с каким значением могут возвращать другие процедуры?
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38399569
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RhinoFCВообще, можно конечно формировать один скрипт из пакета скриптов, но тогда в случае возникновения ошибки в одном из скриптов пакета, как определить в каком именно скрипте эта ошибка возникла? Придётся, видимо, каждый раз коннектиться перед выполнением скрипта.

А колбек-функции тебе для чего даны?
RhinoFCИ ещё вопрос. А есть где-нибудь подробная документация по использованию IBEScript? Я что-то не смог найти. А то вот что какая процедура должна возвращать в качестве результата - не очень ясно.
Ваша фраза "Result = 1 в обработчике ошибок останавливает выполнение скрипта, Result = 2 - выполнение будет продолжено." добавила вопросов. А что тогда Result = 0? Вроде тоже скрипт спокойно продолжает выполняться. И какие результаты и с каким значением могут возвращать другие процедуры?
А вот тут присоединяюсь. В свое время кроме примера на оффсайте и еще одного, немного более обширного где-то здесь больше ничего не нашел. Так что мысль о том, что я научился забивать микроскопом один тип гвоздей нет-нет да согреет :)
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38399571
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RhinoFCПолучается, я зря DISCONNECT использую?


Получается, что зря.

RhinoFC
Вообще, можно конечно формировать один скрипт из пакета скриптов, но тогда в случае возникновения ошибки в одном из скриптов пакета, как определить в каком именно скрипте эта ошибка возникла?


Ну, возьми да посмотри, что там в логах в этом случае повляется. Я вот так сходу не помню, а проверять лень.

RhinoFCИ ещё вопрос. А есть где-нибудь подробная документация по использованию IBEScript?

Нет такой.

RhinoFCА то вот что какая процедура должна возвращать в качестве результата - не очень ясно.
Ваша фраза "Result = 1 в обработчике ошибок останавливает выполнение скрипта, Result = 2 - выполнение будет продолжено." добавила вопросов. А что тогда Result = 0? Вроде тоже скрипт спокойно продолжает выполняться.

В случае 0 поведение будет зависеть от значения STOPONERROR, которое по умолчанию равно OFF, а в скрипте переключается командой SET STOPONERROR ON/OFF

RhinoFCИ какие результаты и с каким значением могут возвращать другие процедуры?

Про обработчик ошибок я рассказал все.
ฺBeforeExecuteStatement - любое ненулевое значение означает пропуск статемента.
AfterExecuteStatement - любое ненулевое значение останавливает выполнение скрипта.

Вроде все.
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38399572
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonlineА колбек-функции тебе для чего даны?


Да, про логи я ступил. Забыл, что речь про dll.
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38399608
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RhinoFCЧто касается принудительного дисконнекта после выполнения скрипта...
Получается, я зря DISCONNECT использую? А я то думаю, почему после выполнения скрипта дисконнект в качестве результата -1 возвращает.

А, вспомнил... Если ты вручную коннект создаешь функцией Connect, то для того, чтобы коннект не закрывался автоматом после выполнения скрипта, в опциях коннекта среди прочего нужно указать disconnect=manual. Тогда можно будет последовательно выполнить несколько скриптов на одном коннекте.
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38399676
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

О, disconnect=manual - это хорошо, сейчас проверим :) А как насчет более обширной документации по забиванию гвоздей микроскопом? ;)
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38399970
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline А как насчет более обширной документации по забиванию гвоздей микроскопом? ;)

Ну что тебе сказать?... Будет время - обязательно документирую все :)
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38399985
RhinoFC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miwaonlineА колбек-функции тебе для чего даны?


В колбэк-функции я получу инфу о том, какой стейтмент вызвал ошибку. А мне ещё надо в каком именно скрипте. А эта инфа потеряется, если я все скрипты солью в один и выполню его. Поэтому мне легче выполнять скрипты последовательно.
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38400018
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RhinoFCВ колбэк-функции я получу инфу о том, какой стейтмент вызвал ошибку. А мне ещё надо в каком именно скрипте. А эта инфа потеряется, если я все скрипты солью в один и выполню его.

В общем-то, ничто не мешает анализировать INPUT'ы и вытаскивать из них имя файла текущего скрипта в свою переменную.
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38400221
RhinoFC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpertRhinoFCВ колбэк-функции я получу инфу о том, какой стейтмент вызвал ошибку. А мне ещё надо в каком именно скрипте. А эта инфа потеряется, если я все скрипты солью в один и выполню его.

В общем-то, ничто не мешает анализировать INPUT'ы и вытаскивать из них имя файла текущего скрипта в свою переменную.

Ну вот тут я что-то недопонимаю.

Есть два скрипта. Во втором ошибка (insertf into...). Сделал для проверки третий скрипт с двумя input'ами:
input 's1.sql';
inpur 's2.sql';

Теперь его выполняю через ExecuteScriptFile.
Возникает ошибка, которую отлавливаю в каллбэке ScriptError.
Смотрю что даёт. Даёт ошибочный стэйтмент и сообщение об ошибке: 'Invalid token. Dynamic SQL Error. SQL error code = -104. Token unknown - line 1, column 1. insertf.'
Где я могу взять информацию о том, в каком из скриптов это произошло, в s1.sql или в s2.sql?
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38400242
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RhinoFC,

Намного раньше, когда ibescript сказал что-то типа "Executing INPUT 's2.sql'..." или что-то похожее (лень ставить експеримент чтобы узнать точную строку сообщения).
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38400250
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RhinoFCГде я могу взять информацию о том, в каком из скриптов это произошло, в s1.sql или в s2.sql?

В BeforeExec своем смотришь, что написано в INPUT, сохраняешь в свою переменную.
При возникновении ошибки смотришь в эту переменную...
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38400259
RhinoFC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miwaonlineRhinoFC,

Намного раньше, когда ibescript сказал что-то типа "Executing INPUT 's2.sql'..." или что-то похожее (лень ставить експеримент чтобы узнать точную строку сообщения).

В принципе, вариант с последовательным выполнением скриптов меня устраивает, как говорится, более чем. Но всё-же...

Где раньше-то? В каллбэке BeforeExec? Он там input'ы не показывает. Только стэйтменты. Т.е. не говорит он ни чего об "executing input".
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38400274
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpertВ BeforeExec своем смотришь, что написано в INPUT, сохраняешь в свою
переменную.
При возникновении ошибки смотришь в эту переменную...
А при возврате в главный скрипт что будет происходить?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38400296
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RhinoFCВ принципе, вариант с последовательным выполнением скриптов меня устраивает, как говорится, более чем. Но всё-же...

Где раньше-то? В каллбэке BeforeExec? Он там input'ы не показывает. Только стэйтменты. Т.е. не говорит он ни чего об "executing input".

Да, действительно. Но это поправимо.
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38400298
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА при возврате в главный скрипт что будет происходить?..


Как минимум AfterExecuteStatement сработает.
...
Рейтинг: 0 / 0
Выполнение скриптов с помощью ibescript.dll
    #38400943
RhinoFC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpertДа, действительно. Но это поправимо.
Можно ждать обновления?
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Выполнение скриптов с помощью ibescript.dll
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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