unit uoddface_archivos_bloques;

{$mode delphi}

interface

uses
  Classes, SysUtils, xmatdefs, ubtree, uoddface_table_nid;


(*



CREATE TABLE ofe_archivos_bloques (
    nid integer NOT NULL,
    nid_archivo integer NOT NULL,
    k_bloque integer,
    datos bytea NOT NULL,
    checksum character varying(256) NOT NULL
);


CREATE SEQUENCE ofe_archivos_bloques_nid_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;
ALTER SEQUENCE ofe_archivos_bloques_nid_seq OWNED BY ofe_archivos_bloques.nid;


  *)

  type

    { ofe_archivo_bloque }

    ofe_archivo_bloque = class( TRec_Nid )
      nid_archivo: integer;
      k_bloque: integer;
      datos: TDAOfByte;
      checksum: shortstring;

      constructor Create(
        nid: integer;
        nid_archivo: integer;
        k_bloque: integer;
        datos: TDAOfByte;
        checksum: shortstring );
        destructor destroy; override;

      procedure WriteToBin( f: TStream );  override;
      constructor LoadFromBin( f: TStream ); override;

      procedure CopyRec(a: TRec_key); override;

    end;



    { ofe_archivo_bloques }

    ofe_archivo_bloques = class( TTable_nid )
      constructor Create;
      constructor LoadFromBin( f: TStream );
    end;

implementation

{ ofe_archivo_bloques }

constructor ofe_archivo_bloques.Create;
begin
  inherited Create( ofe_archivo_bloque );
end;

constructor ofe_archivo_bloques.LoadFromBin(f: TStream);
begin
  inherited LoadFromBin( f, ofe_archivo_bloque  );
end;


{ ofe_archivo_bloque }

constructor ofe_archivo_bloque.Create(nid: integer; nid_archivo: integer;
  k_bloque: integer; datos: TDAOfByte; checksum: shortstring);
begin
  inherited Create( nid );
  self.nid_archivo := nid_archivo;
  self.k_bloque:= k_bloque;
  self.datos:= datos;
  self.checksum:= checksum;
end;

destructor ofe_archivo_bloque.destroy;
begin
  setlength( datos, 0 );
  inherited destroy;
end;

procedure ofe_archivo_bloque.WriteToBin(f: TStream);
var
  NBytesOfDatos: integer;

begin
  inherited WriteToBin( f );
  f.Write( nid_archivo, sizeOf( nid_archivo ) );
  f.Write( k_bloque, sizeOf( k_bloque ) );
  NBytesOfDatos:= length( datos );
  f.Write( NBytesOfDatos, sizeOf( NBytesOfDatos ) );
  if NBytesOfDatos > 0 then
   f.write( datos[0], NBytesOfDatos );
  f.Write( checksum, SizeOf( checksum ) );
end;

constructor ofe_archivo_bloque.LoadFromBin(f: TStream);
var
  NBytesOfDatos: integer;
begin
  inherited LoadFromBin( f );
  f.read( nid_archivo, sizeOf( nid_archivo ) );
  f.read( k_bloque, sizeOf( k_bloque ) );
  NBytesOfDatos:= length( datos );
  f.read( NBytesOfDatos, sizeOf( NBytesOfDatos ) );
  setlength( datos, NBytesOfDatos );
  if NBytesOfDatos > 0 then
   f.read( datos[0], NBytesOfDatos );
  f.read( checksum, SizeOf( checksum ) );
end;

procedure ofe_archivo_bloque.CopyRec(a: TRec_key);
var
  a_: ofe_archivo_bloque;
begin
  a_:= a as ofe_archivo_bloque;
  inherited CopyRec(a_);
  nid_archivo:= a_.nid_archivo;
  k_bloque:= a_.k_bloque;
  datos:= a_.datos;
  checksum:= a_.checksum;
end;

end.

