'livius' liviusliv...@poczta.onet.pl [firebird-support] a écrit :
> Anybody?
>
> regards,
> Karol Bieniaszewski

HI,

little bit of functional code written with codetyphon.


unit UdrCharToInet6;

{$mode delphi}

interface

uses Firebird, sysutils, sockets;

type

  Char6Procedure = class(IExternalFunctionImpl)
    private
      _in, _out, _inlength, _outlength : cardinal;
      _inMessage: inmetata;
      _outMessage: outmetata;
      _inBuffer , _OutBuffer : pchar;
    public
      constructor create(iin, iout, iinlength, ioutlength: cardinal; 
var inMessage: inmetata; var outMessage: outmetata);overload;
      procedure dispose(); override;
      procedure getCharSet(status: IStatus; context: IExternalContext; 
name: PChar; nameSize: Cardinal); override;
      procedure execute(status: IStatus; context: IExternalContext; 
inMsg: Pointer; outMsg: Pointer); override;
  end;

        
//-------------------------------------------------------------//

  Char6Factory = class(IUdrFunctionFactoryImpl)
    private
      _in, _out, _inlength, _outlength : cardinal;
      _outMessage: outmetata;
      _inMessage: inMetata;
    public
      procedure dispose(); override;
      procedure setup(status: IStatus; context: IExternalContext; 
metadata: IRoutineMetadata; inBuilder: IMetadataBuilder; outBuilder: 
IMetadataBuilder); override;
      function newItem(status: IStatus; context: IExternalContext; 
metadata: IRoutineMetadata): iExternalFunction; override;
  end;


  var
    FBExcept : FbException;


implementation


constructor Char6Procedure.create( iin, iout, iinlength, ioutlength: 
cardinal; var inMessage: inmetata; var outMessage:outmetata);
   begin
     _in := iin;
     _out:= iout;
     _inlength := iinlength;
     _outlength := ioutlength;
     _inMessage := inMessage;
     _outMessage := outMessage;
     getmem(_inBuffer , _inlength);
     getmem(_outBuffer, _outlength);
     inherited create;
   end;

procedure Char6Procedure.dispose();
   begin
     freemem(_inBuffer);
     freemem(_outBuffer);
     freemem(_InMessage);
     freemem(_OutMessage);
     destroy;
   end;

procedure Char6Procedure.getCharSet(status: IStatus; context: 
IExternalContext; name: PChar; nameSize: Cardinal);
   begin
   end;

procedure Char6Procedure.execute(status: IStatus; context: 
IExternalContext; inMsg: Pointer; outMsg: Pointer);
   var
     fint6 : ansistring;
     Entry : TIn6_Addr;
     wordlen : word;
   begin
     try
       try
       setlength(fint6,48);

       _inbuffer  := pchar(inMsg);
       _outbuffer := pchar(outMsg);
       
move(_inbuffer[_inMessage[0].Offset],Entry.u6_addr16[0],_inMessage[0].length);
       fint6 := lowercase(HostAddrToStr6(Entry));
       wordlen := length(fint6);

       move(word(wordlen),_outbuffer[_outmessage[0].Offset],2);
       
move(pchar(fint6)^,_outbuffer[_outmessage[0].Offset+2],_outmessage[0].length-2);
       
move(_inbuffer[_inMessage[0].NullOffset],_outbuffer[_outMessage[0].NullOffset],2);

       finally
         setlength(fint6,0);
       end;
     except
       on e:exception do begin
         fbexcept := FbException.create(status);
         e.message :='Char to Inet6 Function.execute, '+ e.message;
         fbexcept.catchException(status,e);
         end;
     end;
   end;
                  
//-------------------------------------------------------------//



procedure Char6Factory.dispose();
   begin
     freemem(_InMessage);
     freemem(_OutMessage);
     destroy;
   end;

procedure Char6Factory.setup(status: IStatus; context: 
IExternalContext; metadata: IRoutineMetadata; inBuilder: 
IMetadataBuilder; outBuilder: IMetadataBuilder);
   var
     inmeta, outmeta : IMessageMetadata;
     i : integer;
   begin
     try
       inMeta  := inBuilder.getMetadata(status);
       _in     := inMeta.getCount(status) -1;
       _inlength := inmeta.getMessageLength(status);
       outmeta := outbuilder.getMetadata(status);
       _out    := outmeta.getCount(status)-1;
       _outlength := outmeta.getMessageLength(status);

       if ((_inlength<> 18) or (_outlength<>52)) then
         raise exception.Create('Length error between 
input('+inttostr(_inlength-2)+') and 
output('+inttostr(_outlength-2)+')');
     except
       on e:exception do begin
         fbexcept := FbException.create(status);
         e.message :='Char to Inet6 Factory.setup, OutMessage : '+ 
e.message;
         fbexcept.catchException(status,e);
         end;
     end;
     try
       setlength(_outMessage, sizeof(FBMessage)*_out+1);
       for i:=0 to _out do begin
         _OutMessage[i].FieldName   := outmeta.getField(status, i);
         _OutMessage[i].RelationName:= outmeta.getRelation(status, i);
         _OutMessage[i].OwnerName   := outmeta.getOwner(status, i);
         _OutMessage[i].AliasName   := outmeta.getAlias(status, i);
         _OutMessage[i].FBType      := outmeta.gettype(status, i);
         _OutMessage[i].isNullable  := outmeta.isNullable(status, i);
         _OutMessage[i].SubType     := outmeta.getSubType(status, i);
         _OutMessage[i].Length      := outmeta.getLength(status, i);
         _OutMessage[i].Scale       := outmeta.getScale(status, i);
         _OutMessage[i].CharSet     := outmeta.getCharSet(status, i);
         _OutMessage[i].Offset      := outmeta.getOffset(status, i);
         _OutMessage[i].NullOffset  := outmeta.getNullOffset(status, 
i);
      end;
      outmeta := nil;
     except
       on e:exception do begin
         fbexcept := FbException.create(status);
         e.message :='Char to Inet6 Factory.setup, Iout = 
'+inttostr(_out)+' OutMessage : '+ e.message;
         fbexcept.catchException(status,e);
         end;
     end;
     try
       setlength(_InMessage, sizeof(FBMessage)*_in+1);
       for i:=0 to _in do  begin
         _InMessage[i].FieldName:=    inmeta.getField(status, i);
         _InMessage[i].RelationName:= inmeta.getRelation(status, i);
         _InMessage[i].OwnerName:=    inmeta.getOwner(status, i);
         _InMessage[i].AliasName:=    inmeta.getAlias(status, i);
         _InMessage[i].FBType:=       inmeta.gettype(status, i);
         _InMessage[i].isNullable:=   inmeta.isNullable(status, i);
         _InMessage[i].SubType:=      inmeta.getSubType(status, i);
         _InMessage[i].Length:=       inmeta.getLength(status, i);
         _InMessage[i].Scale:=        inmeta.getScale(status, i);
         _InMessage[i].CharSet:=      inmeta.getCharSet(status, i);
         _InMessage[i].Offset:=       inmeta.getOffset(status, i);
         _InMessage[i].NullOffset:=   inmeta.getNullOffset(status, i);
       end;
       inMeta := nil;
     except
       on e:exception do begin
         fbexcept := FbException.create(status);
         e.message :='Char to Inet6 Factory.setup, InMessage : '+ 
e.message;
         fbexcept.catchException(status,e);
         end;
     end;
  end;

function Char6Factory.newItem(status: IStatus; context: 
IExternalContext; metadata: IRoutineMetadata):iExternalFunction;// 
int16Procedure;
   begin
     Result := Char6Procedure.create(_in, _out, _inlength, 
_outlength,_inMessage, _outMessage);
   end;

end.

-- 
Norbert Saint Georges
http://tetrasys.fi



------------------------------------

------------------------------------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Visit http://www.firebirdsql.org and click the Documentation item
on the main (top) menu.  Try FAQ and other links from the left-side menu there.

Also search the knowledgebases at http://www.ibphoenix.com/resources/documents/ 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
------------------------------------

Yahoo Groups Links

<*> To visit your group on the web, go to:
    http://groups.yahoo.com/group/firebird-support/

<*> Your email settings:
    Individual Email | Traditional

<*> To change settings online go to:
    http://groups.yahoo.com/group/firebird-support/join
    (Yahoo! ID required)

<*> To change settings via email:
    firebird-support-dig...@yahoogroups.com 
    firebird-support-fullfeatu...@yahoogroups.com

<*> To unsubscribe from this group, send an email to:
    firebird-support-unsubscr...@yahoogroups.com

<*> Your use of Yahoo Groups is subject to:
    https://info.yahoo.com/legal/us/yahoo/utos/terms/

  • [firebird-suppor... 'livius' liviusliv...@poczta.onet.pl [firebird-support]
    • Re: [firebi... 'livius' liviusliv...@poczta.onet.pl [firebird-support]
      • [firebi... Norbert Saint Georges n...@tetrasys.eu [firebird-support]
        • Re:... 'livius' liviusliv...@poczta.onet.pl [firebird-support]
          • ... Dimitry Sibiryakov s...@ibphoenix.com [firebird-support]
            • ... 'livius' liviusliv...@poczta.onet.pl [firebird-support]
              • ... Norbert Saint Georges n...@tetrasys.eu [firebird-support]
              • ... Dimitry Sibiryakov s...@ibphoenix.com [firebird-support]

Reply via email to