Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Nick74 Member Откуда: Сообщений: 215 |
Приложение на Delphi 10.2 (64bit) использует Firebird embedded (3.0+) в качестве базы данных. Используется компонента TFDIBBackup для создания бекапа (Пробовал также TFDFBNBackup - у нее формат файлов другой, но проблема ровно та же). Проблема: ровно через минуту после успешного создания бекапа (База небольшая и бекап занимает секунду, файл тоже корректный и его можно скормить процедуре восстановления БД) в файле firebird.log каталога приложения появляется строка "Shutting down the server with 1 active connection(s) to 1 database(s), 0 active service(s)", после чего любое действие в приложении вызывает ошибку "Database shutdown". Со стороны приложения (Если ничего не делать) в этот момент никаких ошибок не возникает, Connection активен. Connection и не закрываю при создании Backup. Пытаюсь понять: это глюк компоненты бекапа, или это какая-то хитрая механика Firebird (хотя зачем делать shutdown после backup - ума не приложу). Проблема №2 здесь же - без fbclient.dll программа просто не работает, пишет что-то про инициализацию engine12. Бекап-компонента же для работы в Embedded режиме требует, чтобы VendorLib назывался fbembed.dll. Две одинаковые ДЛЛ-ки - не то, чтобы мешает, но сам факт странный. |
25 янв 21, 10:55 [22268686] Ответить | Цитировать Сообщить модератору |
kdv Member Откуда: iBase.ru Сообщений: 29547 |
я не силен в FireDAC, но вообще-то компоненты не могут "требовать" чего-то там в отношении Embedded, потому что у Firebird режим Embedded обеспечивается самим сервером. Приложение понятия не имеет, embedded это или нет, разница только в строке коннекта. А строка коннекта компонентам тоже до лампочки. |
||
25 янв 21, 11:17 [22268705] Ответить | Цитировать Сообщить модератору |
Nick74 Member Откуда: Сообщений: 215 |
kdv, "требуют" в смысле не работают, если указать fbclient.dll. Ошибка "Unable to complete network request to host "xnet://Global\FIREBIRD" Подозреваю, что работает вот этот кусочек из TIBLib.GetLibraryInfo if Pos('FIREBIRD', sProd) <> 0 then begin FBrand := ibFirebird; FEmbedded := Pos('embed', sLib) > 0; end ну и далее в TIBService.Attach if (Lib.Brand = ibFirebird) and (Lib.Version >= ivFB030000) and not Lib.FEmbedded then sProt := 'xnet://' Значение галочки Embedded в DriverLink, я так понимаю, игнорируется. |
25 янв 21, 11:50 [22268732] Ответить | Цитировать Сообщить модератору |
kdv Member Откуда: iBase.ru Сообщений: 29547 |
Nick74, господи, вот это ... шляпа. xnet:// это разумеется никакой не ембеддед, а локальный коннект к серверу через протокол xnet. Вообще, нахрена этот код - мне непонятно. У FB 1.5-2.5 fbembed.dll назывался клиент с вкомпилированным сервером. Имя было изменено только для того чтобы отличать обычный fbclient.dll от аналогичного fbclient.dll с вкомпилированным сервером. Никаких других отличий для приложения больше не было. У ФБ 3 embedded устроен по другому. там fbclient.dll в случае embedded-коннекта (без имени сервера) сам подгружает engine12.dll, т.е. движок сервера. Соответственно, переименования клиентской либы не только не нужны (они никогда и не были нужны), но и наоборот, "ломают систему". В общем оба эти куска надо переделывать. Вопрос, зачем FireDAC-у вообще проперть FEmbedded. |
25 янв 21, 12:16 [22268757] Ответить | Цитировать Сообщить модератору |
kdv Member Откуда: iBase.ru Сообщений: 29547 |
где же господин Арефьев? :-) |
25 янв 21, 12:55 [22268777] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2730 |
'xnet://Global\FIREBIRD' - это стандартная подстановка FireDAC'а, когда он не понимает чего от него хотят. Сообщение было отредактировано: 25 янв 21, 14:07 |
||||
25 янв 21, 14:13 [22268840] Ответить | Цитировать Сообщить модератору |
Nick74 Member Откуда: Сообщений: 215 |
Про последнее могу сказать - по последним изысканиям если не указать название ДЛЛ-ки вообще, то он сам подставляет fbclient, если нет галочки, и fbembed если есть. Но IBLib определяет "ембеднутость" исключительно по названию библиотеки, невзирая на галочку. Поэтому и fbclient с галочкой Embedded рассматривается все равно как не-embedded. |
||||
25 янв 21, 14:41 [22268872] Ответить | Цитировать Сообщить модератору |
Nick74 Member Откуда: Сообщений: 215 |
Может у меня версия FireDac какая-то старая, проверьте плиз есть у вас вообще такое в FirуDAC.Phys.IBWrapper. Покупалось оно года 3 назад, надо отметить. |
25 янв 21, 14:52 [22268895] Ответить | Цитировать Сообщить модератору |
kdv Member Откуда: iBase.ru Сообщений: 29547 |
чего только люди не придумают... Строка коннекта в IB и FB должна содержать имя сервера, порт, или протокол, и полный путь к файлу БД с именем файла. То есть, ни в isc_attach_database, ни в attachDatabase OO API Firebird 3 нет никакого разделения строки коннекта на отдельные части. Всякие поля "протокол", "имя сервера", "имя БД"- это придумки авторов компонент и инструментов. Видимо, отсюда возникает идея "подстановок", хотя, неясно, с какого фига. Если я не указал имя сервера и протокол, почему в случае НЕэмбеддед должно быть xnet? А если я хочу embedded? Собственно, "оглашаю весь список": Connection Strings in Firebird 3 https://www.ibphoenix.com/files/ConnectionStrings_Fb3.pdf расписано всё, включая эмбеддед, шмембеддед и прочее. Причем, теоретически я бы понял этот xnet, в отношении людей, которые в среде Дельфи пытаются работать с Embedded (о геморройности чего я регулярно вещаю). Но ведь "Where embedded is not available, a hostless connection could be established using the Loopback provider, in which case full login credentials would need to be present. On Windows, the provider will try to use XNET (see below) to make the local connection and, failing that, a localhost connection via TCP/IP or, on Windows, via WNET (see below)." То есть, оно само, если embedded "недоступен". А если он должен быть, но недоступен, так зачем искривлять строку коннекта до xnet? Ну пытаюсь я голым fbclient.dll открыть базу "c:\dir\data.fdb". так я сам дурак, наверное. к чему сюда xnet-то лепить, "авось законнектится"??? |
||
25 янв 21, 16:34 [22269025] Ответить | Цитировать Сообщить модератору |
kdv Member Откуда: iBase.ru Сообщений: 29547 |
Nick74, я умолкаю, ждем или Арефьева или людей с кодом FireDac. |
25 янв 21, 18:02 [22269086] Ответить | Цитировать Сообщить модератору |
Nick74 Member Откуда: Сообщений: 215 |
Проверил на delphi 10.4 - с тех времен ничего не изменилось, ошибка та же. Выложил архив с проектом Delphi с примером ошибки. Запустить, подождать минуту до появления ошибки. Компилировалось под Delphi 10.4. Обвязка для Embedded клиента в каталоге win64/release взята из дистрибутива FB 3.0.7 База данных test.fdb там же - подойдет любая база, я взял security.fdb из дистрибутива FB, ничего мельче под рукой не нашлось. Exe-шник тоже прикладываю для тех, кому лень компилировать. Собственно всего текста программы меньше страницы. https://dropmefiles.com/n603T (Файл будет доступен 2 недели от текущего момента) P.S. Кстати, при компиляции под 10.4 отказался работать компонент TFDIBBackup с ошибкой Invalid clumped buffer structure, вроде бы даже нашел Work around от Арефьева про SizeOf(Byte), но в сорсах Firedac уже стоит SizeOf(Word), ну да не в этом суть, у меня все равно купленный 10.2 Сообщение было отредактировано: 25 янв 21, 18:47 |
25 янв 21, 18:45 [22269112] Ответить | Цитировать Сообщить модератору |
Nick74 Member Откуда: Сообщений: 215 |
Подтверждено, что проблема именно из-за двух разных DLL. Бекап-компоненты для работы в Embedded-режиме требуют fbembed.dll, а компоненты доступа - fbclient.dll. Если в TIBLib.GetLibraryInfo поправить if Pos('FIREBIRD', sProd) <> 0 then begin FBrand := ibFirebird; FEmbedded := Pos('embed', sLib) > 0; end на if Pos('FIREBIRD', sProd) <> 0 then begin FBrand := ibFirebird; FEmbedded := true; //Pos('embed', sLib) > 0; end и вписать fbclient.dll в LibName в компоненте драйвера, то ошибка исчезает. Ну правда и компонента, подозреваю, не будет работать с полноценным сервером, но в Embedded режиме все работает без проблем. Корректное для всех случаев изменение оставляю авторам FD, ибо не очень понимаю как правильно получить свойство компоненты драйвера Embedded в TIBLib. |
2 фев 21, 14:07 [22273235] Ответить | Цитировать Сообщить модератору |
kdv Member Откуда: iBase.ru Сообщений: 29547 |
Nick74, я уже предлагал посмотреть код FireDAC, на предмет "за каким" там вообще существует свойство FEmbedded. Напомню, что для клиентского приложения нет никакой разницы, embedded или нет, и какая архитектура на сервере - superserver, superclassic, или classic. Embedded начинает работать только тогда, когда строка коннекта к БД не содержит имени сервера. И никто не запрещал в 2.5 переименовать fbembed.dll в fbclient.dll. |
4 фев 21, 16:56 [22274919] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2730 |
|
||||||||
4 фев 21, 21:51 [22275154] Ответить | Цитировать Сообщить модератору |
Vlad F Member Откуда: Сообщений: 1342 |
Тогда он тем более не должен выставляться автоматически в каких-либо обработчиках, а только вручную, осознанно. Поставьте, наконец телегу и лошадь в нужном порядке. Причем все это для версии ниже тройки, в ней Embedded mode конфигурируется вообще снаружи (есть опыт с FireDAC). |
||||
5 фев 21, 00:00 [22275190] Ответить | Цитировать Сообщить модератору |
kdv Member Откуда: iBase.ru Сообщений: 29547 |
это вообще чудовищная левизна. Которая к embedded не имеет никакого отношения. Допустим, у меня есть программа, которая работает И с ИБ, и с ФБ. И она должна искать gds32.dll или fbclient.dll. Что она еще должна пытаться искать fbembed.dll я просто не смог додуматься. Просто потому что я в курсе, почему эти dll имеют такие названия. Поскольку переход с 2.5 на 3.0 уже явно происходит, этот ахтунг надо срочно убирать. Либо, НИКОГДА не включать это самое свойство Embedded в FireDAC. |
||
5 фев 21, 16:54 [22275803] Ответить | Цитировать Сообщить модератору |
alekcvp Member Откуда: Сообщений: 2730 |
Это свойства линка для FB, для IB там другой линк, насколько я понимаю. |
||||
5 фев 21, 17:14 [22275829] Ответить | Цитировать Сообщить модератору |
Nick74 Member Откуда: Сообщений: 215 |
Если Embedded=false, то компонента дописывает xnet://... к пути, и без установленного полноценного сервера FB бекап в этом случае выдает ошибку. Вернее не так, Embedded линка действительно влияет только на имя библиотеки. Но для TIBLib есть свой собственный FEmbedded, который не связан с Embedded линка и определяется исключительно по названию библиотеки. И если использовать fbclient, то бекап не работает без сервера. А если не использовать, то бекап работает. Но через минуту глушит коннект к базе данных. Текст ошибки и фрагменты сорс кода см. ранее в топике. Сообщение было отредактировано: 18 фев 21, 14:46 |
||||
18 фев 21, 14:46 [22282846] Ответить | Цитировать Сообщить модератору |
Мимопроходящий Member Откуда: бурятский тундрюк, эсквайр Сообщений: 31969 |
18.02.2021 14:46, Nick74 пишет: > Если Embedded=false, то компонента дописывает xnet://... к пути, и без установленного полноценного сервера FB бекап в этом случае выдает ошибку. > Вернее не так, Embedded линка действительно влияет только на имя библиотеки. Но для TIBLib есть свой собственный FEmbedded, который не связан с Embedded линка и определяется исключительно по названию библиотеки. И если использовать fbclient, то бекап не работает без сервера. ну и на кой черт вам эта контуженная прокладка в лице FireDAC? Posted via ActualForum NNTP Server 1.5 |
18 фев 21, 14:55 [22282860] Ответить | Цитировать Сообщить модератору |
энди Member Откуда: Киров, Россия Сообщений: 1200 |
она бесплатная и отлично работает под андроид, чего не скажешь по unidac |
18 фев 21, 15:37 [22282915] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12572 |
|
||||
18 фев 21, 15:58 [22282933] Ответить | Цитировать Сообщить модератору |
Все форумы / Delphi | ![]() |