Page 1 of 1

OID postgresql

Posted: 17.07.2010, 10:41
by infostar
Hi from spain, i need use field OID on postgres not Bytea
how to use lo_export and lo_import with Zeos.

Excuse me, my inglish is very bad, thank you.

Posted: 19.11.2010, 13:43
by Pyh
ZEOSDBO-6.6.4-stable
Delphi 7

something like this:

Code: Select all

  TBaseZeosConnection = class( TObject)
  private
    FConnection: TZConnection;
    ...
  public
    ...
    function File_Send( const aFileName: string): integer; override;
    procedure File_Recive( const aID: integer; aFileName: string); override;
    procedure File_Delete( const aID: integer); override;
  end;


function TBaseZeosConnection.File_Send( const aFileName: string): integer;
begin

  with ( FConnection.DbcConnection as IZPostgreSQLConnection) do begin

    try
      // start transaction
      FConnection.ExecuteDirect( 'BEGIN');  
      // Send file
      Result := GetPlainDriver.ImportLargeObject( GetConnectionHandle, PCHAR( aFileName));
      if Result <= 0
      then raise Exception.Create( 'File_Send_Error...');
      FConnection.ExecuteDirect( 'COMMIT');

    except
      FConnection.ExecuteDirect( 'ROLLBACK');
      raise;
    end;

  end;

end;

procedure TBaseZeosConnection.File_Recive( const aID: integer; aFileName: string);
begin // Returns 1 on success, -1 on failure.

  with ( FConnection.DbcConnection as IZPostgreSQLConnection) do begin

    try

      FConnection.ExecuteDirect( 'BEGIN');
      if 1 <> GetPlainDriver.ExportLargeObject( GetConnectionHandle, aID, PCHAR( aFileName))
      then raise Exception.Create( 'File_Recive_Error');
      FConnection.ExecuteDirect( 'COMMIT');

    except
      FConnection.ExecuteDirect( 'ROLLBACK');
      raise;
    end;

  end;

end;

procedure TBaseZeosConnection.File_Delete( const aID: integer);
begin //  Returns 1 if successful, -1 on failure.

  with ( FConnection.DbcConnection as IZPostgreSQLConnection) do begin

    try

      FConnection.ExecuteDirect( 'BEGIN');

      if GetPlainDriver.UnlinkLargeObject( GetConnectionHandle, aID) <> 1
      then raise Exception.Create( 'TBaseZeosConnection.File_Delete_Error');

      FConnection.ExecuteDirect( 'COMMIT');

    except
      FConnection.ExecuteDirect( 'ROLLBACK');
      raise;
    end;

  end;

end;

and so on))
Please note: function postgre lo_XXX not all present in ZEOS

see also ZPlainPostgreSqlDriver.pas,
class "TZPostgreSQL8PlainDriver", functions -

Code: Select all

    function OpenLargeObject(Handle: PZPostgreSQLConnect; ObjId: Oid;
      Mode: Integer): Integer;
    function CloseLargeObject(Handle: PZPostgreSQLConnect;
      Fd: Integer): Integer;
    function ReadLargeObject(Handle: PZPostgreSQLConnect; Fd: Integer;
      Buffer: PChar; Length: Integer): Integer;
    function WriteLargeObject(Handle: PZPostgreSQLConnect; Fd: Integer;
      Buffer: PChar; Length: Integer): Integer;
    function SeekLargeObject(Handle: PZPostgreSQLConnect;
      Fd, Offset, Whence: Integer): Integer;
    function CreateLargeObject(Handle: PZPostgreSQLConnect;
      Mode: Integer): Oid;
    function TellLargeObject(Handle: PZPostgreSQLConnect;
      Fd: Integer): Integer;
    function UnlinkLargeObject(Handle: PZPostgreSQLConnect;
      ObjId: Oid): Integer;
    function ImportLargeObject(Handle: PZPostgreSQLConnect;
      FileName: PChar): Oid;
    function ExportLargeObject(Handle: PZPostgreSQLConnect; ObjId: Oid;
      FileName: PChar): Integer;