SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Как в приложении одновременно использовать fbembedded разных версий? (Несколько firebird embedded в одном приложении одновременно.)
Как в приложении одновременно использовать fbembedded разных версий? [сообщение #512] Wed, 07 September 2022 11:43 Переход к следующему сообщению
МорскойДесант в настоящее время не в онлайне  МорскойДесант
Сообщений: 41
Зарегистрирован: September 2022
Member
Создается утилита, выполняющая преобразование файла базы из формата fb 2.0 в 3.0.
Предполагается использование fb embedded, библиотека fib+ и компоненты TpFIBBackupService/TpFIBRestoreService

Можно ли в одно приложение одновременно загрузить обе версии клиентских библиотек?
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #514 является ответом на сообщение #512] Wed, 07 September 2022 12:06 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 137
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
а у FIB-ов есть возможность указывать клиента?
самый простой путь - 2 gbak-а от нужных версий и CMD-файл.
народ даже делал с перенаправлением ouput-потока из одного gbak'а в input-поток второго gbak'а.
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #516 является ответом на сообщение #514] Wed, 07 September 2022 12:25 Переход к предыдущему сообщениюПереход к следующему сообщению
МорскойДесант в настоящее время не в онлайне  МорскойДесант
Сообщений: 41
Зарегистрирован: September 2022
Member
МП писал(а) Wed, 07 September 2022 12:06
а у FIB-ов есть возможность указывать клиента?
самый простой путь - 2 gbak-а от нужных версий и CMD-файл.
народ даже делал с перенаправлением ouput-потока из одного gbak'а в input-поток второго gbak'а.
1. Да, у fib+ клиент указывается.
2. Ага, читал. Но хочется сделать утилиту для совсем дремучих пользователей, и ещё чтобы как-то контролировался процесс.

Что-нибудь такое:
/index.php/fa/9/0/
  • Вложение: 11.png
    (Размер: 43.57KB, Загружено 305 раз)
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #519 является ответом на сообщение #512] Wed, 07 September 2022 12:49 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 84
Зарегистрирован: June 2022
Member
Можно. С 2.5 -> 3.0 проблем быть не должно.
А вот использовать 2 embedded c 3.0 и 4.0 проблематично (точнее можно, но не совсем привычным способом)

Причины в следующем. В 2.5 embedded это клиентская библиотека в которую вкомпилировано ядро Firebird.

Начиная с 3.0 fbclient.dll это и клиент и диспатчер (Y-valve), который соединяет остальные плагины с ядром.
В 3.0 embedded работает так fbclient -> engine12 <-> fbclient <-> плагины Проблема в том что связь engine12 <-> fbclient может нарушаться, когда в системе присутствует ещё одна версия загруженной fbclient
Но поскольку в 2.5 использует fbembed.dll вместо fbclient проблем быть не должно
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #520 является ответом на сообщение #516] Wed, 07 September 2022 13:08 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 137
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
Anonymous
Но хочется сделать утилиту для совсем дремучих пользователей, и ещё чтобы как-то контролировался процесс.
никогда не стоит недооценивать предсказуемость тупизны. ©
чудо на том конце провода угрохает свои данные, а ты будешь крайним.
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #521 является ответом на сообщение #516] Wed, 07 September 2022 14:22 Переход к предыдущему сообщениюПереход к следующему сообщению
kdv в настоящее время не в онлайне  kdv
Сообщений: 36
Зарегистрирован: June 2022
Member
Поточная конвертация баз Firebird 2.5 в формат ODS12 (Firebird 3.0)
https://habr.com/ru/post/445204/
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #525 является ответом на сообщение #512] Wed, 07 September 2022 15:14 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 53
Зарегистрирован: August 2022
Member
Anonymous писал(а) Wed, 07 September 2022 10:43

Предполагается использование fb embedded, библиотека fib+ и компоненты TpFIBBackupService/TpFIBRestoreService
Очень наивно думать, что любая база для 2.0 может быть сконвертирована в 3.0 простым backup-restore. Там список несовместимостей такой, что даже ручками не каждый справится. Не говоря уже о приложении, которое с этой базой работает.
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #543 является ответом на сообщение #525] Sun, 11 September 2022 23:12 Переход к предыдущему сообщениюПереход к следующему сообщению
Док в настоящее время не в онлайне  Док
Сообщений: 59
Зарегистрирован: June 2022
Member
SD

Очень наивно думать, что любая база для 2.0 может быть сконвертирована в 3.0 простым backup-restore. Там список несовместимостей такой, что даже ручками не каждый справится. Не говоря уже о приложении, которое с этой базой работает.
Дим, ты как всегда, заранее сгущаешь краски Smile


FPC/Lazarus (trunk) | Win10 x64 Ultim/Debian 11 amd64/Darwin x86_64 Monterey | Firebird 3.0.10 x64 | IBX by Rik
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #546 является ответом на сообщение #525] Mon, 12 September 2022 05:26 Переход к предыдущему сообщениюПереход к следующему сообщению
fraks в настоящее время не в онлайне  fraks
Сообщений: 59
Зарегистрирован: June 2022
Географическое положение: Новосибирск
Member
SD писал(а) Wed, 07 September 2022 19:14
Очень наивно думать, что любая база для 2.0 может быть сконвертирована в 3.0 простым backup-restore.
Между 2.0 и 2.5 уже много различий.
А между 2.0 и 3.0 - тем более Smile
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #553 является ответом на сообщение #512] Mon, 12 September 2022 19:09 Переход к предыдущему сообщениюПереход к следующему сообщению
МорскойДесант в настоящее время не в онлайне  МорскойДесант
Сообщений: 41
Зарегистрирован: September 2022
Member
МорскойДесант писал(а) Wed, 07 September 2022 11:43
Создается утилита, выполняющая преобразование файла базы из формата fb 2.0 в 3.0.
Предполагается использование fb embedded, библиотека fib+ и компоненты TpFIBBackupService/TpFIBRestoreService

Можно ли в одно приложение одновременно загрузить обе версии клиентских библиотек?
Интересно.
Если отдельно запустить TpFIBRestoreService с "embedded" (локальный коннект) fb 3.0, то рестор отрабатывает.
А если после TpFIBBackupService (с embedded 2.0 или 2.5), то получаю исключение сообщением, что модуль engine12.dll найден, но не загружен. Evil or Very Mad
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #554 является ответом на сообщение #553] Mon, 12 September 2022 20:23 Переход к предыдущему сообщениюПереход к следующему сообщению
BlackEric в настоящее время не в онлайне  BlackEric
Сообщений: 83
Зарегистрирован: June 2022
Member
Почему это нельзя сделать стандартными средствами FB?
Вызвать соответствующие библиотеки разложенные по разным папкам с параметрами командной строки и не скачать древние либы.
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #556 является ответом на сообщение #554] Tue, 13 September 2022 09:40 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 84
Зарегистрирован: June 2022
Member
А я полностью согласен с SD. backup-restore - это ещё не фига не миграция.
Во-первых сам по себе backup-restore будет успешен только когда когда на уровне метаданных устранены все несовместимости.
Во-вторых смена ODS это только первый этап миграции. Потом надо тщательно просматривать само приложение на предмет несовместимостей.
Третьи этапом правим запросы и ХП, где поплыли планы и они стали работать медленнее.
Четвертым этапом надо выискивать узкие места, которые были на предыдущей версии, и если в новой версии появились фичи которые могут улучшить эти места, переписать их.

Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #562 является ответом на сообщение #556] Tue, 13 September 2022 11:52 Переход к предыдущему сообщениюПереход к следующему сообщению
МорскойДесант в настоящее время не в онлайне  МорскойДесант
Сообщений: 41
Зарегистрирован: September 2022
Member
sim_84 писал(а) Tue, 13 September 2022 09:40
А я полностью согласен с SD. backup-restore - это ещё не фига не миграция.
Во-первых сам по себе backup-restore будет успешен только когда когда на уровне метаданных устранены все несовместимости.
Во-вторых смена ODS это только первый этап миграции. Потом надо тщательно просматривать само приложение на предмет несовместимостей.
Третьи этапом правим запросы и ХП, где поплыли планы и они стали работать медленнее.
Четвертым этапом надо выискивать узкие места, которые были на предыдущей версии, и если в новой версии появились фичи которые могут улучшить эти места, переписать их.

Не забудьте всё это учесть, когда будете решать подобные задачи.

Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #563 является ответом на сообщение #562] Tue, 13 September 2022 12:14 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 84
Зарегистрирован: June 2022
Member
Я уже это учёл.

Мои базы данных трижды мигрировали на новые версии 1.5 -> 2.5 -> 3.0 -> 4.0

Причём сложнее всего была миграция 1.5 -> 2.5. Причин тому множество, начиная с кодировки метаданных, заканчивая тем, что 1.5 использовала множество UDF, которые потом были заменены на встроенные функции.
На втором месте по сложности была миграция 2.5 -> 3.0. Там я переписывал оставшиеся UDF на PSQL функции, плюс некоторые мутные вещи которые ранее приходилось делать через (SELECT VAL FROM SOME_PROC(some_column)) тоже переписал на функции (при условии что процедура не содержала никаких SQL операторов).
А вот на 4.0 миграция прошла практически безпроблемно и быстро
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #564 является ответом на сообщение #563] Tue, 13 September 2022 12:19 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 84
Зарегистрирован: June 2022
Member
З.Ы. Это при условии что у вас нет замороченных UDF. Вот если есть, то... для миграции на 4.0 по хорошему их надо на UDR переписать.
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #572 является ответом на сообщение #553] Tue, 13 September 2022 15:02 Переход к предыдущему сообщениюПереход к следующему сообщению
МорскойДесант в настоящее время не в онлайне  МорскойДесант
Сообщений: 41
Зарегистрирован: September 2022
Member
МорскойДесант писал(а) Mon, 12 September 2022 19:09

Если отдельно запустить TpFIBRestoreService с "embedded" (локальный коннект) fb 3.0, то рестор отрабатывает.
А если после TpFIBBackupService (с embedded 2.0 или 2.5), то получаю исключение сообщением, что модуль engine12.dll найден, но не загружен.
Зараза такая, снова "искусственный интеллект" TpFIBPlus:
При аттаче к сервисам загруженная клиентская библиотека, которая инкапсулируется в объекте класса TIBClientLibrary. Класс реализует интерфейс IIbClientLibrary. Список реализаций интерфейсов хранится в vClientLibs:TInterfaceList в разделе реализации Evil or Very Mad модуля IB_Intf, т.е., недоступен.
Средство для принудительной выгрузки библиотеки есть - это метод интерфейса FreeIBLibrary. Но после вызова FreeIBLibrary() интерфейс остается торчать в списке.
Средств явной загрузки библиотеки нет, загружается закэшированный интерфейс (ключ - строка, имя фала библиотеки), а проверки на то, что библиотека выгружена - нет.
Тьпху...

Пришлось править модуль IB_Intf, добавить процедуру RemoveClientLibrary:

procedure RemoveClientLibrary(const aLibName:string);
var
  I: Integer;
begin
  EnterCriticalSection(vLibAccess);
  try
    for I := 0 to Pred(vClientLibs.Count) do
    if IIbClientLibrary(vClientLibs[i]).LibraryName=aLibName then begin
      vClientLibs.Delete(i);
      Exit
    end;
  finally
   LeaveCriticalSection(vLibAccess);
  end;
end;

В общем, вот так всё работает:
Бэкап:
var
  fsvcBackup : TpFIBBackupService;
...
begin
...
  fsvcBackup := TpFIBBackupService.Create(nil);
  try
    fsvcBackup.LibraryName := 'путь_fb_20\fb_20_LibraryName.dll';
...
<турник, анжуманя>
...
  finally
    fsvcBackyp.Free();
    IB_Intf.RemoveClientLibrary('путь_fb_20\fb_20_LibraryName.dll')
  end
Рестор:
[code]
var
  fsvcRestore : TpFIBRestoreService;
...
begin
...
  fsvcRestore := TpFIBBackupService.Create(nil);
  try
    fsvcRestore.LibraryName := 'путь_fb_30\fb_30_LibraryName.dll';
...
<анжуманя, пресс качат>
...
  finally
    fsvcRestore.Free();
    IB_Intf.RemoveClientLibrary('путь_fb_30\fb_30_LibraryName.dll')
  end
...

Если кто-то подскажет путь без правки исходников fib+, буду благодарен.
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #573 является ответом на сообщение #572] Tue, 13 September 2022 15:24 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 137
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
я тоже было думал реализовать в нашем форке IBX+ взаимодействие с клиентом посредством интерфейсов.
но по зрелом размышлении (и по совету друзей ©) отказался.
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #578 является ответом на сообщение #573] Tue, 13 September 2022 20:17 Переход к предыдущему сообщениюПереход к следующему сообщению
МорскойДесант в настоящее время не в онлайне  МорскойДесант
Сообщений: 41
Зарегистрирован: September 2022
Member
Ах да, итог.

Цитата:
В общем, вот так всё работает:
В одном приложении одновременно две библиотеки firebird "embedded" использовать не получилось.
Получилось поочередно, но с описанными выше оговорками.
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #586 является ответом на сообщение #578] Wed, 14 September 2022 18:51 Переход к предыдущему сообщениюПереход к следующему сообщению
basid в настоящее время не в онлайне  basid
Сообщений: 15
Зарегистрирован: June 2022
Географическое положение: Asia/Irkutsk
Junior Member
Жаль, что так и не удалось послушать начальника транспортного цеха ...
В чём проблема запустить два процесса (по одном на gbak каждой версии)?
Хочется эстетики и перфекционизма - можно реализовать функционал tee и параллельно записать ещё и бэкап исходной базы.
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #588 является ответом на сообщение #586] Thu, 15 September 2022 00:24 Переход к предыдущему сообщениюПереход к следующему сообщению
МорскойДесант в настоящее время не в онлайне  МорскойДесант
Сообщений: 41
Зарегистрирован: September 2022
Member
basid писал(а) Wed, 14 September 2022 18:51
Жаль, что так и не удалось послушать начальника транспортного цеха ...
В чём проблема запустить два процесса (по одном на gbak каждой версии)?
Хочется эстетики и перфекционизма - можно реализовать функционал tee и параллельно записать ещё и бэкап исходной базы.
Задача успешно решена так, как задумывалось, но всё равно интересно, почему вы считаете, что ваш способ более правильный. Расскажите, любопытно. В крайнем случае - просто поболтаем. Smile
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #590 является ответом на сообщение #588] Thu, 15 September 2022 10:36 Переход к предыдущему сообщениюПереход к следующему сообщению
basid в настоящее время не в онлайне  basid
Сообщений: 15
Зарегистрирован: June 2022
Географическое положение: Asia/Irkutsk
Junior Member
Процессы изолированы и проблема "как вгрузить одну и ту же dll двух разных версий" - просто перестаёт существовать.
Дальше я хочу понять: какие такие преимущества даёт один процесс вместо трёх, что ради этого нужно "залезать на шкаф"?
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #592 является ответом на сообщение #512] Thu, 15 September 2022 14:24 Переход к предыдущему сообщениюПереход к следующему сообщению
МорскойДесант в настоящее время не в онлайне  МорскойДесант
Сообщений: 41
Зарегистрирован: September 2022
Member
Нет никаких причин, "на шкаф" - ради желания создать удобный (с моей т.зр., конечно) и простой графический интерфейс.
И - на лету, "программно" контролировать то, что происходит, с чем юзер пытается работать. Работа с сервисным api выглядит проще, чем работа с запуском, контролем и анализом процесса и результатов работы внешнего консольного приложения.
Re: Как в приложении одновременно использовать fbembedded разных версий? [сообщение #593 является ответом на сообщение #592] Thu, 15 September 2022 14:28 Переход к предыдущему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 53
Зарегистрирован: August 2022
Member
Значит до тебя так и не дошло что такое "TpFIBBackupService/TpFIBRestoreService" и как они работают.
Предыдущая тема: Непонятная транзакция
Следующая тема: Не конвертируется blob sub_type 1 при пересылке
Переход к форуму:
  


Текущее время: Sun Dec 04 01:21:16 MSK 2022

Общее время, затраченное на создание страницы: 0.01369 секунд