[patch_done] Add a extra Library / Path for search.

The alpha/beta tester's forum for ZeosLib 7.0.x series

Report problems concerning our Delphi 2009+ version and new Zeoslib 7.0 features here.

This is a forum that will be removed once the 7.X version goes into stable!!

Moderators: gto, EgonHugeist, olehs

Locked
mmvisual
Senior Boarder
Senior Boarder
Posts: 51
Joined: 13.10.2010, 14:55

[patch_done] Add a extra Library / Path for search.

Post by mmvisual »

Hello,

Sometimes, I want add a extra DLL path + File for working.

Now, there is in the PlainDriver a Funktion:
FLoader := TZNativeLibraryLoader.Create([]);
{$IFNDEF UNIX}
FLoader.AddLocation(WINDOWS_DLL_LOCATION);
{$ELSE}
FLoader.AddLocation(LINUX_DLL_LOCATION);
{$ENDIF}

for adding a DLL. Now, I want install other DLL's, like "SQLite3-64.dll" and for this, I must alter the Zeos component sources.
I have looking about TZConnection, but never found a function where I can adding a extra search path/DLL into the FLoader.

It's not a bug, it's a feature.

Thank you very much for including, regards Markus

PS: Now, I use the ZeosV7 SVN1159 from here:
https://zeoslib.svn.sourceforge.net/svn ... gonhugeist
User avatar
EgonHugeist
Zeos Project Manager
Zeos Project Manager
Posts: 1936
Joined: 31.03.2011, 22:38

Post by EgonHugeist »

mmvisual,

you're right here. That's a missing thing. You're not the first who is asking for that feature. My ugly workaround: declare the WINDOWS/LINUX_DLL_LOCATION as global var. Then you can change the pathname directly from your application before you connect.

But this isn't a nice well formed solution. Having a property would be really very fine. Waiting for somebody who can patch a more elegant solution then my dirty code proposal.

Thank you for using my branch,

Michael
Best regards, Michael

You want to help? http://zeoslib.sourceforge.net/viewtopic.php?f=4&t=3671
You found a (possible) bug? Use the new bugtracker dude! http://sourceforge.net/p/zeoslib/tickets/

Image
User avatar
mdaems
Zeos Project Manager
Zeos Project Manager
Posts: 2766
Joined: 20.09.2005, 15:28
Location: Brussels, Belgium
Contact:

Post by mdaems »

mmvisual,

Michael already added a new functionality to testing branch to do exactly what you need.
It's not an ideal solution, but it does what you need.
As this feature isn't really ready, I'm not going to explain you how it works. If you can find out what happens in SVN rev. 1183/1184, then you're ready to use it.
If you want to know what the open issues are, please contact me (email) or michael, then we can send you a description of our thoughts. Also : don't hesitate to ask commit rights when you want to apply some patches. (The only thing we need to know is your sourceforge username)
And this is really a well defined job where you can be helpfull implementing the right solution.

Mark
Image
mmvisual
Senior Boarder
Senior Boarder
Posts: 51
Joined: 13.10.2010, 14:55

Post by mmvisual »

Hello Mark,

Thank you very much.
Michael have exactly do it and it works very nice.

Here is my Code:

Code: Select all

function LoadLibTest(s: String): Boolean;
Var h: THandle;
Begin
  {$ifdef LINUX}
    h := dynlibs.LoadLibrary(PAnsiChar(s));
  {$else}
    h := LoadLibrary(PChar(s));
  {$endif}
  If (h <> 0)
    {$ifndef LINUX}
    And (h <> INVALID_HANDLE_VALUE)
    {$endif}
    Then
  Begin
    {$ifdef LINUX}
    dynlibs.FreeLibrary(h);
    {$else}
    CloseHandle(h);
    {$endif}
    Result := True;
  end Else Result := False;
end; 

procedure TfrmMain.DBBeforeConnect(Sender: TObject);
{$ifdef win64}
Var s: String;
{$endif}
{$ifdef linux}
Var s: String;
    i: Integer;
{$endif}
begin
  If Not(Sender Is TZConnection) Then Exit;
  If TZConnection(Sender).LibraryLocation = '' Then
  Begin // Nur suchen wenn leer
    {$ifdef win64}
    s := TZConnection(Sender).Protocol;
    If Pos('sqlite', s) = 1 Then
    Begin
      If LoadLibTest('sqlite3-64.dll') Then
        TZConnection(Sender).LibraryLocation := 'sqlite3-64.dll';
    End Else
    If Pos('mysql', s) = 1 Then
    Begin
      If LoadLibTest('libmysql-64.dll') Then
        TZConnection(Sender).LibraryLocation := 'libmysql-64.dll';
    End;
    {$endif}
    {$ifdef linux}
    s := TZConnection(Sender).Protocol;
    TZConnection(Sender).LibraryLocation := '';
    If Pos('sqlite', s) = 1 Then
    Begin
      If LoadLibTest('libsqlite3.so.0') Then
        TZConnection(Sender).LibraryLocation := 'libsqlite3.so.0';
    End Else
    If Pos('mysql', s) = 1 Then
    Begin
      For i := 30 DownTo 15 Do
      Begin
        If LoadLibTest('libmysqlclient.so.' + IntToStr(i)) Then
        Begin
          TZConnection(Sender).LibraryLocation := 'libmysqlclient.so.' + IntToStr(i);
          Break;
        End;
      End;
    End;
    {$endif}
  end;
end; 
This Code compile something for Windows64 / Linux and checkt the DLL.
If not exists the right Version, then it open the Zeos standard libraries.
I use in my form 4 TZConnection and all TZConnection use this code.

I cannot alter the code from Zeos, this code is too difficult and when I change something, I think there comes more errors inside.
I mail this changes to Michael an he can see and correct it into the right place.

I'm a tester for the Zeos component, and I will make a stable release and I load/test the testing-egonhugeist. My application is very big and is good for testing. (Google >> EleLa :-)

Now, I think Zeos 7 can going into Beta, there are very low mistakes inside.

Markus
Locked