Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 IBX под Linux  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207

02.04.2021 12:35, Fr0sT-Brutal пишет:
>
> Компоненты IBX из XE2,

возьми лучше из Лазаря.

Posted via ActualForum NNTP Server 1.5

2 апр 21, 12:40    [22303328]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
Мимопроходящий

02.04.2021 12:35, Fr0sT-Brutal пишет:
>
> Компоненты IBX из XE2,

возьми лучше из Лазаря.

Попробую, спс. Надеюсь, не сильно заточены под Лазарь.
Еще вариант взять из RTL 10.3.
2 апр 21, 13:18    [22303356]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207

фиг его знает что лучше.
кроссплатформенность в Delphi весьма условна -
если (утрируя) кнопочки и формочки ещё можно "туда-сюда",
то всё остальное обычно фигушки...

Posted via ActualForum NNTP Server 1.5

2 апр 21, 13:26    [22303361]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
Fr0sT-Brutal,

Есть знакомые люди, которые переводили с Win на Linux проект. Но всё делали через Wine. И работает нормально. Это не вариант?
2 апр 21, 13:29    [22303364]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3831
Romka-Fes
Fr0sT-Brutal,
Есть знакомые люди, которые переводили с Win на Linux проект. Но всё делали через Wine. И работает нормально. Это не вариант?

Примерно как поставить в Запорожец двигатель от BMW. Наверно можно. Но зачем?
2 апр 21, 13:31    [22303366]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207
makhaon
Примерно как поставить в Запорожец двигатель от BMW.
а кто из них who?
2 апр 21, 13:35    [22303371]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Romka-Fes
Есть знакомые люди, которые переводили с Win на Linux проект. Но всё делали через Wine.

То есть процесс "перевода" свёлся к "установить WINE, запустить готовый экзешник".
РосНаноРаспил.

Posted via ActualForum NNTP Server 1.5

2 апр 21, 13:35    [22303372]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
Romka-Fes
Fr0sT-Brutal,

Есть знакомые люди, которые переводили с Win на Linux проект. Но всё делали через Wine. И работает нормально. Это не вариант?

У меня либа, которую тягают другие проекты... и в целом Wine не особо стабилен и быстр для прода.

Попробовал с IBX из RTL - есть контакт! Хотя эти динозавры до сих пор "не знают" о существовании Firebird :(
2 апр 21, 13:35    [22303373]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207
Fr0sT-Brutal
Попробовал с IBX из RTL - есть контакт! Хотя эти динозавры до сих пор "не знают" о существовании Firebird :(
дык, питарасы, сэр! ©
2 апр 21, 13:36    [22303374]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
Dimitry Sibiryakov,

Была задача - запустить проект на Linux. Самый простой способо - Wine. Никто код не менял вообще. Никаких распилов. As is.
2 апр 21, 13:55    [22303385]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
Dimitry Sibiryakov,

Но потом таки делали переход с VCL на FireMonkey. И там вроде бы было веселей с доступом к FB. Но не менее чем 3.0 кажись.
Тут вопрос - нужен только IBX - или другие компоненты доступа к БД приемлемы?
2 апр 21, 13:57    [22303387]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
Fr0sT-Brutal
Хотя эти динозавры до сих пор "не знают" о существовании Firebird :(
Добавить кастомный ServerType - пол часа работы
2 апр 21, 14:15    [22303396]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
Поковырял IBX от Лазаря - там много всяких веселостей предвидится. Уже наткнулся на TRTLCriticalSection и модуль Registry (в линуксе-то он накой??).
2 апр 21, 14:34    [22303402]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
_Vasilisk_
Fr0sT-Brutal
Хотя эти динозавры до сих пор "не знают" о существовании Firebird :(
Добавить кастомный ServerType - пол часа работы

Сделал за две минуты, добавив метод SetLibraryPath в исходники IBX. Знаешь метод без модификации либо копирования исходников IBX? Поделись, как. Эти собаки спрятали класс TIBServerLibrary внутрь юнита, и от него не наследуешься.
2 апр 21, 14:37    [22303404]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Мимопроходящий
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]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
Fr0sT-Brutal
Поделись, как
1. Копируешь класс TIBServerLibrary в TFBServerLibrary
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]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 834
Мимопроходящий

фиг его знает что лучше.
кроссплатформенность в Delphi весьма условна -
если (утрируя) кнопочки и формочки ещё можно "туда-сюда",
то всё остальное обычно фигушки...
обоснуй.
Делфи позволяет не только десктопные приложения собирать под Linux, но еще и системные демоны (по аналогии с виндовскими сервисами). Также работает доступ к железу, например к COM-портам и USB.
2 апр 21, 17:45    [22303475]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
_Vasilisk_
1. Копируешь класс TIBServerLibrary в TFBServerLibrary
2. Изменяешь метод LibraryName

Вариант, спасибо. Не нравится, что нужно дублировать, хотя возможность применения совместно со стоковой либой - это плюс.
Пока сделал через форк и добавление
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]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29662
Fr0sT-Brutal
q := TIBSQL.Create(nil);
q.Database := DB;
q.Transaction := TIBTransaction.Create(q);

вроде как не ошибка, но нафиг такое надо - вообще-то должно быть наоборот - запрос должен принадлежать транзакции.
то есть, в коннекте есть транзакциИ, в транзакции есть запросЫ.
3 апр 21, 01:08    [22303596]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
kdv
нафиг такое надо
Но isc_dsql_alloc_statement2 принимает параметром хендл соединения, а не базы
3 апр 21, 12:28    [22303685]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29662
_Vasilisk_
Но isc_dsql_alloc_statement2 принимает параметром хендл соединения, а не базы

што??? у клиента хэндл соединения и есть "хэндл базы". У клиента вообще нет никакого "хэндла базы" и не может быть, ни в обычном клиент-сервере, ни в embedded.
3 апр 21, 12:55    [22303699]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29662
kdv,

автор
у клиента хэндл соединения и есть "хэндл базы".

если непонятно, то не "есть и есть", а хэндл соединения = соединение с конкретной БД. "Хэндла базы" у клиента нет как такового. Оно есть только у сервера.
3 апр 21, 12:58    [22303702]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

_Vasilisk_
isc_dsql_alloc_statement2

А за его применение к переменным в динамической памяти надо отдельно бить по голове.

Posted via ActualForum NNTP Server 1.5

3 апр 21, 13:00    [22303703]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
_Vasilisk_
Но isc_dsql_alloc_statement2 принимает параметром хендл соединения, а не базы
Читать "а не транзакции"

kdv
хэндл соединения = соединение с конкретной БД. "Хэндла базы" у клиента нет как такового.
Некорректно выразился. Конечно же хендл соединения

Т.е. для создания стейтмента нужна и транзакция (prepare, execute) и соединение (alloc). И соединение из транзакции не извлекается.
4 апр 21, 15:13    [22304097]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить