ich benötige etwas Unterstützung im Bereich UDR / FreePascal. Ich möchte den Levenshtein-Algorithmus als UDR implementieren. Leider bin ich nicht der Pascal-Experte und hänge an einer Stelle.
Dies ist der relevante Auszug der UDR:
Code: Alles auswählen
unit SynDeskLevenshtein;
interface
uses Firebird, SysUtils, Math;
const
  vcFb = 32765;
type
  IncInMessage = record
    v1: record       // Erste Zeichenkette
      Length: Word;
      Value: array [0..vcFb - 1] of AnsiChar;
      Null: WordBool;
    end;
    v1Null: WordBool;
    v2: record       // Zweite Zeichenkette
      Length: Word;
      Value: array [0..vcFb - 1] of AnsiChar;
      Null: WordBool;
    end;
    v2Null: WordBool;
  end;
  IncInMessagePtr = ^IncInMessage;
  IncOutMessage = record
    Result: integer;
    resultNull: wordbool;
  end;
  IncOutMessagePtr = ^IncOutMessage;
  IncFunction = class(IExternalFunctionImpl)
    procedure dispose(); override;
    procedure getCharSet(status: iStatus; context: iExternalContext;
      Name: pansichar; nameSize: cardinal); override;
    procedure Execute(status: iStatus; context: iExternalContext;
      inMsg: Pointer; outMsg: Pointer); override;
  end;
  IncFactory = class(IUdrFunctionFactoryImpl)
    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;
implementation
procedure IncFunction.dispose();
begin
  Destroy;
end;
procedure IncFunction.getCharSet(status: iStatus; context: iExternalContext;
  Name: pansichar; nameSize: cardinal);
begin
end;
procedure IncFunction.Execute(status: iStatus; context: iExternalContext;
  inMsg: Pointer; outMsg: Pointer);
var
  xInput: IncInMessagePtr;
  xOutput: IncOutMessagePtr;
  s1: string;
  s2: string;
begin
  xInput := IncInMessagePtr(inMsg);
  xOutput := IncOutMessagePtr(outMsg);
  s1 := xInput^.v1.Value;
  s2 := xInput^.v2.Value;
  xOutput^.resultNull := xInput^.v2.Null;
  xOutput^.Result := Length(s1) + Length(s2);   // Länge von s2 ist immer 0
end;
procedure IncFactory.dispose();
begin
  Destroy;
end;
procedure IncFactory.setup(status: iStatus; context: iExternalContext;
  metadata: iRoutineMetadata; inBuilder: iMetadataBuilder; outBuilder: iMetadataBuilder);
begin
end;
function IncFactory.newItem(status: iStatus; context: iExternalContext;
  metadata: iRoutineMetadata): IExternalFunction;
begin
  Result := IncFunction.Create;
end;
end.
Code: Alles auswählen
create function Inc (
    v1 varchar(100),
    v2 varchar(100)
) returns integer
    external name 'SynDeskUDR!syndesk_levenshtein'
    engine udr;
    
select inc('bklm', 'test') from rdb$database;
Vielen Dank für eure Mühen
Martin
