Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перехват события базы данных FireBird клиентон Delphi/Lazarus / 21 сообщений из 21, страница 1 из 1
06.11.2021, 14:59
    #40109645
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
Всем добрых выходных,

в MSSQL и C# помнится были компоненты и возможность посволяющие привязать событие в базе данных (например изменение данных в определённом поле, записи, таблице итп) к событию в программе. Есть ли что то подобное штатное в FireDac дельфей, и в штатных компонентах для работы с базами Firebird в Lazarus?
И если нет то кто и как выкручивается если перехват такого события на клиенте понадобился?

Delphi и FireDac от 10.4
Lazarus последний стабильный релиз.
Firebird от 2.5.8 и выше.

Спасибо.
...
Рейтинг: 0 / 0
06.11.2021, 15:03
    #40109646
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
hlopotunв MSSQL и C# помнится были компоненты и возможность посволяющие привязать
событие в базе данных (например изменение данных в определённом поле, записи,
таблице итп) к событию в программе.

Не было. Этот функционал есть у Firebird/Interbase и Oracle, но у MS SQL его
нет. Все выкручиваются через самописные CLR функции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.11.2021, 15:11
    #40109647
Softologic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
Dimitry Sibiryakov
hlopotunв MSSQL и C# помнится были компоненты и возможность посволяющие привязать
событие в базе данных (например изменение данных в определённом поле, записи,
таблице итп) к событию в программе.

Не было. Этот функционал есть у Firebird/Interbase и Oracle, но у MS SQL его
нет. Все выкручиваются через самописные CLR функции.
Дмитрий, а в Firebird полагаю речь идет о схеме "триггеры + события" ?
Помнится, не раз видел (в том числе и от вас) рекомендации не использовать события совсем. Насколько это актуально в тройке и четверке FB ?
...
Рейтинг: 0 / 0
06.11.2021, 15:12
    #40109648
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
...
Рейтинг: 0 / 0
06.11.2021, 15:20
    #40109649
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
SoftologicПомнится, не раз видел (в том числе и от вас) рекомендации не использовать
события совсем. Насколько это актуально в тройке и четверке FB ?

Эти рекомендации связаны в первую очередь с тем, что новички их используют
слишком рьяно вплоть до обновления запросов в гриде. Во вторую очередь - с тем,
что создать универсальный VCL компонент для их получения невозможно без
проктостоматологии, поскольку на уровне API событие приходит как вызов callback
функции в фоновом потоке. Сочетание этих двух факторов способно породить такие
спецэффекты, что без поллитра не разберёшься. Отсюда рекомендации новичкам не
использовать их, от греха подальше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.11.2021, 16:16
    #40109659
Softologic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
Dimitry Sibiryakov
SoftologicПомнится, не раз видел (в том числе и от вас) рекомендации не использовать
события совсем. Насколько это актуально в тройке и четверке FB ?

Эти рекомендации связаны в первую очередь с тем, что новички их используют
слишком рьяно вплоть до обновления запросов в гриде. Во вторую очередь - с тем,
что создать универсальный VCL компонент для их получения невозможно без
проктостоматологии, поскольку на уровне API событие приходит как вызов callback
функции в фоновом потоке. Сочетание этих двух факторов способно породить такие
спецэффекты, что без поллитра не разберёшься. Отсюда рекомендации новичкам не
использовать их, от греха подальше.
Ок, тогда следующий вопрос скорее к разработчикам. Посмотрел справку к четверке - эвенты все также без параметров. Следовательно, если нужно передать параметр, делаем конкатенацию с наименованием эвента. Но... это как то... не вполне не изящно, мягко говоря?!
...
Рейтинг: 0 / 0
06.11.2021, 16:26
    #40109662
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
SoftologicНо... это как то... не вполне не изящно, мягко говоря?!

Зато изящной является их текущая реализация в виде простейших счётчиков. Которая
таки да, не предусматривает места для payload (в отличии от оракуловской и
слоновьей, которые построены на очереди).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.11.2021, 16:29
    #40109663
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
Softologic
Следовательно, если нужно передать параметр, делаем конкатенацию с наименованием эвента
Не угадали. Вы получите события только те, на которые подписаны. Т.е., либо вы при подписке указываете сразу все возможные комбинации параметров, либо придумываете как от них отказаться
...
Рейтинг: 0 / 0
06.11.2021, 16:37
    #40109666
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
Softologic, есть параметр. :)
Параметр называется "количество срабатываний в данной транзакции".
Дело в том, что эвенты фаерберда к клиенты летят по коммиту. Прикинь, как было бы весело при (например) каскадном удалении 10000 записей получить 10 000 эвентов, да ещё с параметрами. :)
...
Совсем не сложно "параметры" писать в табличку-лог, дополняя записи таймстампом: получил эвент, выгреб параметры начиная с такого-то момета, и делай с ними, что хочешь...
...
Также несложно реализовать эвенты, как в одном из примеров для MSSQL: зовёшь udf - клиент http (например) сервера, а в приложении - вебсокеты, ждущие эвента. Только срабатывать будут сразу, а не по коммиту...
...
Рейтинг: 0 / 0
06.11.2021, 18:35
    #40109681
Softologic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
ъъъъъ
Softologic, есть параметр. :)
Параметр называется "количество срабатываний в данной транзакции".
Дело в том, что эвенты фаерберда к клиенты летят по коммиту. Прикинь, как было бы весело при (например) каскадном удалении 10000 записей получить 10 000 эвентов, да ещё с параметрами. :)
...
Совсем не сложно "параметры" писать в табличку-лог, дополняя записи таймстампом: получил эвент, выгреб параметры начиная с такого-то момета, и делай с ними, что хочешь...
...
Также несложно реализовать эвенты, как в одном из примеров для MSSQL: зовёшь udf - клиент http (например) сервера, а в приложении - вебсокеты, ждущие эвента. Только срабатывать будут сразу, а не по коммиту...

Ну я собсно вообще от них (эвентов) отказался :)
...
Рейтинг: 0 / 0
06.11.2021, 18:51
    #40109686
Softologic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
_Vasilisk_
Вы получите события только те, на которые подписаны. Т.е., либо вы при подписке указываете сразу все возможные комбинации параметров, либо придумываете как от них отказаться

Так и делал когда то давно.
...
Рейтинг: 0 / 0
06.11.2021, 21:02
    #40109725
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
hlopotun,

в IBX естьIBEvents

https://www.ibase.ru/ibx
...
Рейтинг: 0 / 0
06.11.2021, 21:23
    #40109729
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
Док
hlopotun,

в IBX естьIBEvents

https://www.ibase.ru/ibx
Но он очень глючит, пока напильником не подточишь.
...
Рейтинг: 0 / 0
07.11.2021, 07:05
    #40109766
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
YuRock,
в Лазаре нормально работает. На дельфях не проверял.
Да и использую я его для взведения пропертей-флагов. При активации/перерисовке окон/вкладок датасеты обновляются и сбрасывают флаг, только если флаг взведен. Красота.

А в чем глюк?
...
Рейтинг: 0 / 0
07.11.2021, 11:55
    #40109780
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
Док

А в чем глюк?
Да там не один, там много было, уже и не вспомню все.
И не всегда приходили события, и не все, и падало при определенном кол-ве зарегистрированных.
Ну и, конечно, логические глюки от того, что OnEvent реализован через synchronize.
...
Рейтинг: 0 / 0
07.11.2021, 16:18
    #40109820
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
YuRock
пока напильником не подточишь.
Я полностью переписал. Подточенная версия работала через пень-колоду
YuRock
логические глюки от того, что OnEvent реализован через synchronize.
Мне интересно, а чем ты это заменил? Потому что переключение потоков там необходимо.

Я сам сделал так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TMyIBEvents.SyncAlert;
begin
  case FSynchroMethod of
    smSynchronize: TThread.Synchronize(nil, DoSync);
    smWindow: Win32Check(PostMessage(FSynchroObject, FSynchroMessage, WPARAM(Self), 0));
    smThread: Win32Check(PostThreadMessage(FSynchroObject, FSynchroMessage, WPARAM(Self), 0));
    smEvent: Win32Check(SetEvent(FSynchroObject));
  end;
end;

а потом в контексте потока БД вызывается такое
Код: pascal
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.
function TEventBlock.GetCatchedEvent(out AEvent: string; out ACount: Cardinal): Boolean;
begin
  AEvent := FCatchedEvents[0];
  ACount := Cardinal(FCatchedEvents.Objects[0]);
  FCatchedEvents.Delete(0);
  Result := FCatchedEvents.Count > 0;
  if not Result then
    QueueEvent;
end;

procedure TEventBlock.QueueEvent;
begin
  FOwner.Database.Call(
    FOwner.GDSLibrary.isc_que_events(
      StatusVector,
      @FOwner.Database.Handle,
      @FID,
      FLen,
      FEvents,
      @EventCallback,
      PVoid(Self)
    ),
    True
  );
end;
...
Рейтинг: 0 / 0
07.11.2021, 20:11
    #40109853
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
_Vasilisk_
Мне интересно, а чем ты это заменил? Потому что переключение потоков там необходимо.
Ничем, так из того потока и вызывается.
Когда надо - полылаю сообщение в главный поток (уже в обработчике), когда не надо - что-то другое делаю, прямо там.
Гриды мне там обновлять не надо, я таким не пльзуюсь. Обычно - добавляю в свою очередь задание.
...
Рейтинг: 0 / 0
07.11.2021, 20:27
    #40109858
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
ъъъъъ
Softologic, есть параметр. :)
Параметр называется "количество срабатываний в данной транзакции".
Дело в том, что эвенты фаерберда к клиенты летят по коммиту. Прикинь, как было бы весело при (например) каскадном удалении 10000 записей получить 10 000 эвентов, да ещё с параметрами. :)
...
Совсем не сложно "параметры" писать в табличку-лог, дополняя записи таймстампом: получил эвент, выгреб параметры начиная с такого-то момета, и делай с ними, что хочешь...
...
Также несложно реализовать эвенты, как в одном из примеров для MSSQL: зовёшь udf - клиент http (например) сервера, а в приложении - вебсокеты, ждущие эвента. Только срабатывать будут сразу, а не по коммиту...

Таблички, логи, udf, http, вебсокеты, ждущие ивенты. Какой ужас и кошмар. Как хорошо, что я юзаю иветны только в слоне, где они с параметрами :)
...
Рейтинг: 0 / 0
07.11.2021, 20:49
    #40109864
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
YuRock
Ничем, так из того потока и вызывается.
Из него нельзя вызывать isc_que_events() 11698503 . Или у тебя на события отдельное соединение?
...
Рейтинг: 0 / 0
07.11.2021, 21:00
    #40109870
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
_Vasilisk_
YuRock
Ничем, так из того потока и вызывается.
Из него нельзя вызывать isc_que_events() 11698503 . Или у тебя на события отдельное соединение?
Проверил.
Да, QueueEvents всё еще вызывается в synchronize. Даже не знал. Я только вызов события наверх убрал оттуда, а это вроде не мешало.
...
Рейтинг: 0 / 0
07.11.2021, 21:16
    #40109874
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события базы данных FireBird клиентон Delphi/Lazarus
_Vasilisk_Из него нельзя вызывать isc_que_events()

И не только. Оттуда вообще практически ничего нельзя вызывать.
isc_event_counts() - можно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Перехват события базы данных FireBird клиентон Delphi/Lazarus / 21 сообщений из 21, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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