Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Fr0sT-Brutal Member Откуда: Сообщений: 682 |
Столкнулся с проблемой. Надо портировать прогу, работающую с FB, под Linux. Компоненты IBX из XE2, немного допиленные в части совместимости. D10.3, ОС Debian 10, FB 3 Подключение проходит, но при выполнении любого запроса вылетает "EIBClientError: Unknown SQL Data type (0)". Протрейсив, понимаю, что ошибка кидается в TIBXSQLDA.Initialize, когда SqlDef неожиданный (0). Код простейший // Загрузить клиентскую библиотеку Firebird function LoadFBLib(const Path: string): Boolean; const LibString = 'IBServer'; var iLib: IGDSLibrary; tmpLibString: String; begin tmpLibString := LibString; iLib := GetGDSLibrary(tmpLibString); iLib.SetLibraryPath(Path + FB_DLL); Result := iLib.TryIBLoad; end; procedure TestDB; const TransParamsRO = 'wait;read;read_committed;rec_version'; var db: TIBDatabase; q: TIBSQL; begin if not LoadFBLib('') then raise Err('Load fail %s %s', [FBLibPath, LastErrMsg]); try db:= TIBDatabase.Create(nil); db.LoginPrompt := False; db.ServerType := 'IBServer'; db.Params.Values[DPBConstantNames[isc_dpb_lc_ctype]] := 'UTF8'; db.DatabaseName := 'localhost:someDB'; db.Params.Values[DPBConstantNames[isc_dpb_user_name]] := 'SYSDBA'; db.Params.Values[DPBConstantNames[isc_dpb_password]] := 'masterkey'; db.Connected := True; q := TIBSQL.Create(nil); q.Database := DB; q.Transaction := TIBTransaction.Create(q); q.Transaction.Params.Delimiter := ';'; q.Transaction.DefaultAction := TARollback; // Для всех транзакций - откат в случае неполадок q.Transaction.DefaultDatabase := q.Database; q.SQL.Text := 'select CURRENT_USER from Rdb$Database;'; q.Transaction.Params.DelimitedText := TransParamsRO; q.Transaction.StartTransaction; q.ExecQuery; // ! BOOM q.Transaction.Commit; finally if (q <> nil) and q.Transaction.InTransaction then q.Transaction.Rollback; FreeAndNil(q); FreeAndNil(db); end; end; Может, кто-нибудь сталкивался с такой проблемой и решал ее? |
2 апр 21, 12:35 [22303324] Ответить | Цитировать Сообщить модератору |
Мимопроходящий Member Откуда: бурятский тундрюк, эсквайр Сообщений: 32207 |
02.04.2021 12:35, Fr0sT-Brutal пишет: > > Компоненты IBX из XE2, возьми лучше из Лазаря. Posted via ActualForum NNTP Server 1.5 |
2 апр 21, 12:40 [22303328] Ответить | Цитировать Сообщить модератору |
Fr0sT-Brutal Member Откуда: Сообщений: 682 |
Попробую, спс. Надеюсь, не сильно заточены под Лазарь. Еще вариант взять из RTL 10.3. |
||||
2 апр 21, 13:18 [22303356] Ответить | Цитировать Сообщить модератору |
Мимопроходящий Member Откуда: бурятский тундрюк, эсквайр Сообщений: 32207 |
фиг его знает что лучше. кроссплатформенность в Delphi весьма условна - если (утрируя) кнопочки и формочки ещё можно "туда-сюда", то всё остальное обычно фигушки... Posted via ActualForum NNTP Server 1.5 |
2 апр 21, 13:26 [22303361] Ответить | Цитировать Сообщить модератору |
Romka-Fes Member Откуда: Kyiv Сообщений: 476 |
Fr0sT-Brutal, Есть знакомые люди, которые переводили с Win на Linux проект. Но всё делали через Wine. И работает нормально. Это не вариант? |
2 апр 21, 13:29 [22303364] Ответить | Цитировать Сообщить модератору |
makhaon Member Откуда: A galaxy far far away Сообщений: 3831 |
Примерно как поставить в Запорожец двигатель от BMW. Наверно можно. Но зачем? |
||||
2 апр 21, 13:31 [22303366] Ответить | Цитировать Сообщить модератору |
Мимопроходящий Member Откуда: бурятский тундрюк, эсквайр Сообщений: 32207 |
|
||||
2 апр 21, 13:35 [22303371] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
То есть процесс "перевода" свёлся к "установить WINE, запустить готовый экзешник". РосНаноРаспил. Posted via ActualForum NNTP Server 1.5 |
||
2 апр 21, 13:35 [22303372] Ответить | Цитировать Сообщить модератору |
Fr0sT-Brutal Member Откуда: Сообщений: 682 |
У меня либа, которую тягают другие проекты... и в целом Wine не особо стабилен и быстр для прода. Попробовал с IBX из RTL - есть контакт! Хотя эти динозавры до сих пор "не знают" о существовании Firebird :( |
||||
2 апр 21, 13:35 [22303373] Ответить | Цитировать Сообщить модератору |
Мимопроходящий Member Откуда: бурятский тундрюк, эсквайр Сообщений: 32207 |
|
||||
2 апр 21, 13:36 [22303374] Ответить | Цитировать Сообщить модератору |
Romka-Fes Member Откуда: Kyiv Сообщений: 476 |
Dimitry Sibiryakov, Была задача - запустить проект на Linux. Самый простой способо - Wine. Никто код не менял вообще. Никаких распилов. As is. |
2 апр 21, 13:55 [22303385] Ответить | Цитировать Сообщить модератору |
Romka-Fes Member Откуда: Kyiv Сообщений: 476 |
Dimitry Sibiryakov, Но потом таки делали переход с VCL на FireMonkey. И там вроде бы было веселей с доступом к FB. Но не менее чем 3.0 кажись. Тут вопрос - нужен только IBX - или другие компоненты доступа к БД приемлемы? |
2 апр 21, 13:57 [22303387] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12789 |
|
||||
2 апр 21, 14:15 [22303396] Ответить | Цитировать Сообщить модератору |
Fr0sT-Brutal Member Откуда: Сообщений: 682 |
Поковырял IBX от Лазаря - там много всяких веселостей предвидится. Уже наткнулся на TRTLCriticalSection и модуль Registry (в линуксе-то он накой??). |
2 апр 21, 14:34 [22303402] Ответить | Цитировать Сообщить модератору |
Fr0sT-Brutal Member Откуда: Сообщений: 682 |
Сделал за две минуты, добавив метод SetLibraryPath в исходники IBX. Знаешь метод без модификации либо копирования исходников IBX? Поделись, как. Эти собаки спрятали класс TIBServerLibrary внутрь юнита, и от него не наследуешься. |
||||||||
2 апр 21, 14:37 [22303404] Ответить | Цитировать Сообщить модератору |
Мимопроходящий Member Откуда: бурятский тундрюк, эсквайр Сообщений: 32207 |
02.04.2021 14:37, Fr0sT-Brutal пишет: > Сделал за две минуты, добавив метод SetLibraryPath в исходники IBX. > Знаешь метод без модификации либо копирования исходников IBX? Поделись, как. > Эти собаки спрятали класс TIBServerLibrary внутрь юнита, и от него не наследуешься. у них всё так. сделай форк и не парься. Posted via ActualForum NNTP Server 1.5 |
2 апр 21, 14:42 [22303405] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12789 |
2. Изменяешь метод LibraryName 3. В конце модуля пишешь procedure AddLib; var LLib: IGDSLibrary; begin LLib := TFBServerLibrary.Create; AddIBInterface(CFBServerType, LLib); LLib := TFBEmbeddedLibrary.Create; AddIBInterface(CFBEmpeddedServerType, LLib); end; initialization AddLib; finalization IBClientInterface.Remove(CFBServerType); IBClientInterface.Remove(CFBEmpeddedServerType); end.3. Модуль загоняешь в пакет, пакет инсталлируешь в среду Можно еще добавить в пакет такой класс type TIBDatabaseSelectionEditor = class(TSelectionEditor) public procedure RequiresUnits(AProc: TGetStrProc); override; end; { TIBDatabaseSelectionEditor } procedure TIBDatabaseSelectionEditor.RequiresUnits(AProc: TGetStrProc); var Li: Integer; LDB: TIBDatabase; begin for Li := 0 to Designer.Root.ComponentCount - 1 do begin if Designer.Root.Components[Li] is TIBDatabase then begin LDB := TIBDatabase(Designer.Root.Components[Li]); if (LDB.ServerType = CFBServerType) or (LDB.ServerType = CFBEmpeddedServerType) then begin AProc('UFBIntfImpl'); Exit; end; end; end; end; procedure Register; begin RegisterSelectionEditor(TIBDatabase, TIBDatabaseSelectionEditor); end; |
||||
2 апр 21, 16:56 [22303466] Ответить | Цитировать Сообщить модератору |
asutp2 Member Откуда: Тюмень Сообщений: 834 |
Делфи позволяет не только десктопные приложения собирать под Linux, но еще и системные демоны (по аналогии с виндовскими сервисами). Также работает доступ к железу, например к COM-портам и USB. |
||||
2 апр 21, 17:45 [22303475] Ответить | Цитировать Сообщить модератору |
Fr0sT-Brutal Member Откуда: Сообщений: 682 |
Вариант, спасибо. Не нравится, что нужно дублировать, хотя возможность применения совместно со стоковой либой - это плюс. Пока сделал через форк и добавление procedure TIBServerLibrary.SetLibraryPath(const Path: string); begin FLibPath := Path; end; function TIBServerLibrary.LibraryName: String; begin // empty custom path - use default filename if FLibPath = '' then Result := IBASE_DLL // custom path is directory - add default filename else if DirectoryExists(FLibPath) then Result := IncludeTrailingPathDelimiter(FLibPath) + IBASE_DLL // full custom path - use it else Result := FLibPath; end; |
||||
2 апр 21, 17:49 [22303477] Ответить | Цитировать Сообщить модератору |
kdv Member Откуда: iBase.ru Сообщений: 29662 |
вроде как не ошибка, но нафиг такое надо - вообще-то должно быть наоборот - запрос должен принадлежать транзакции. то есть, в коннекте есть транзакциИ, в транзакции есть запросЫ. |
||
3 апр 21, 01:08 [22303596] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12789 |
|
||||
3 апр 21, 12:28 [22303685] Ответить | Цитировать Сообщить модератору |
kdv Member Откуда: iBase.ru Сообщений: 29662 |
што??? у клиента хэндл соединения и есть "хэндл базы". У клиента вообще нет никакого "хэндла базы" и не может быть, ни в обычном клиент-сервере, ни в embedded. |
||
3 апр 21, 12:55 [22303699] Ответить | Цитировать Сообщить модератору |
kdv Member Откуда: iBase.ru Сообщений: 29662 |
kdv,
если непонятно, то не "есть и есть", а хэндл соединения = соединение с конкретной БД. "Хэндла базы" у клиента нет как такового. Оно есть только у сервера. |
||
3 апр 21, 12:58 [22303702] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52921 |
А за его применение к переменным в динамической памяти надо отдельно бить по голове. Posted via ActualForum NNTP Server 1.5 |
||
3 апр 21, 13:00 [22303703] Ответить | Цитировать Сообщить модератору |
_Vasilisk_ Member Откуда: Украина, Харьков Сообщений: 12789 |
Т.е. для создания стейтмента нужна и транзакция (prepare, execute) и соединение (alloc). И соединение из транзакции не извлекается. |
||||||||
4 апр 21, 15:13 [22304097] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Delphi | ![]() |