Hallo Entwickler!<p>Kann man eigentlich auch UDFs mit dem Interbase 6(.01) für Linux verwenden? Wenn ja laufen, die Windows UDFs auch unter dem Linux-Server? Was gibt es für Unterschiede?<p>Gruss Andreas
Announcement
Collapse
No announcement yet.
UDFs unter Linux
Collapse
X
-
Hi,
<br>
das folgende Buch kann ich nur "wärmstens" empfehlen:
<br>http://entwickler.com/buecher/67/teaser.html
<br>(Andreas Kosch
<br>InterBase Datenbankentwicklung mit Delphi)
<br>
<br>Behandelt Delphi und Interbase 6 und unter anderem auch UDF in Delphi.
<br>
<br>Das folgende Bsp. habe ich mit Hilfe des Buches erstellt und erfolgreich mittels Kylix 2 Open Edition kompiliert und im IB eingebaut/getestet.
<br>
<br>Das Kylix projekt muß ein "SO" Projekt sein (siehe Karteikarte Neu).
<br>Die kompilierte Datei wird z.B. so aussehen: libEDC_UDF.so oder EDC_UDF.so
<br>Den Namen würde ich auf EDC_UDF ändern, den dann gilt für win als auch für Linux Interbase Server folgendes SQL-Statemant:
<br>
<pre>
DECLARE EXTERNAL FUNCTION ROUND
DOUBLE PRECISION, INTEGER
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT 'ECS_UDF_ROUND' MODULE_NAME 'ECS_UDF';
</pre>
<br><b>ECS_UDF.dpr</b>
<pre>
library ECS_UDF;
{ Wichtiger Hinweis zur Exception-Behandlung bei mehreren,
binären Modulen (EXE und gemeinsam genutzte Objekte):
Alle Projekte müssen mit derselben Version des
Laufzeit-Packages zur Exception-Behandlung baseclx compiliert werden.
Falls dies nicht beachtet wird, könnten in einem Modul ausgelöste Exceptions
unbeabsichtigte Auswirkungen in anderen Modulen haben. }
{%File '../ECS_UDF.SQL'}
uses
SysUtils,
Classes,
ECS_UDFU in 'ECS_UDFU.pas';
{$SOPREFIX ''}
exports
ECS_UDF_ROUND resident;
begin
IsMultiThread := True;
end.
</pre>
<br><b>ECS_UDFU.pas</b>
<pre>
unit ECS_UDFU;
interface
function ECS_UDF_ROUND(var x : Double; var y: Integer): Double; cdecl;
implementation
uses SysUtils, Math;
{------------------------------------------------------------}
{ DLL-Schnittstellen-Routinen }
{------------------------------------------------------------}
function ECS_UDF_ROUND(var x : Double; var y: Integer): Double; cdecl;
Var
e : Double;
begin
try
e := IntPower(10,y);
Result := Round(x * e) / e;
except
Result := -1
end;
end;
initialization
IsMultiThread := True;
end.
</pre>
<br>
<br>die Datei ECS_UDF muß in das Verzeichnis
/opt/interbase/UDF kopiert werden
<br>
<br>Mit dem Interbase werden Beispiele für DBZugriff und UDF ausgeliefert. Code ist in C++. /opt/interbase/examples
Habe diese zwar noch nicht getestet, aber ich denke das wird wohl auch funktionieren. Eins ist sicher: Die in C++ entwickelte libarie sollte wesentlich kleiner sein als die von Kylix.
<br>
<br>mfg
<br>P
Comment
Comment