FirebirdSQL logo

IMessageMetadata

Interface MessageMetadata — analogue partiel de XSQLDA (ne contient pas de données de message, mais uniquement des informations sur le format du message).Utilisé dans les appels liés à l’exécution d’instructions SQL.

  1. getCount

    unsigned getCount(StatusType* status)

    Renvoie le nombre de champs/paramètres dans le message. Dans tous les appels qui contiennent un paramètre index, cette valeur doit être : 0 >= index < getCount().

  2. getField

    const char* getField(StatusType* status, unsigned index)

    Renvoie le nom du champ.

  3. getRelation

    const char* getRelation(StatusType* status, unsigned index)

    Renvoie le nom de la relation (à partir de laquelle le champ a été sélectionné).

  4. getOwner

    const char* getOwner(StatusType* status, unsigned index)

    Renvoie le nom du propriétaire de la relation.

  5. getAlias

    const char* getAlias(StatusType* status, unsigned index)

    Renvoie un alias de champ.

  6. getType

    unsigned getType(StatusType* status, unsigned index)

    Renvoie le type SQL du champ.

  7. isNullable

    FB_BOOLEAN isNullable(StatusType* status, unsigned index)

    Renvoie true si le champ peut être défini sur NULL.

  8. getSubType

    int getSubType(StatusType* status, unsigned index)

    Renvoie un sous-type du champ BLOB (0 pour le binaire, 1 pour le texte, etc.).

  9. getLength

    unsigned getLength(StatusType* status, unsigned index)

    Renvoie la longueur maximale du champ.

  10. getScale

    int getScale(StatusType* status, unsigned index)

    Renvoie l’échelle du champ numérique.

  11. getCharSet

    unsigned getCharSet(StatusType* status, unsigned index)

    Renvoie un jeu de caractères pour les champs de caractères et un objet blob de texte.

  12. getOffset

    unsigned getOffset(StatusType* status, unsigned index)

    Renvoie le décalage des données de champ dans la mémoire tampon de message (utilisez-la pour accéder aux données de la mémoire tampon du message).

  13. getNullOffset

    unsigned getNullOffset(StatusType* status, unsigned index)

    Renvoie le décalage NULL de l’indicateur pour le champ dans le tampon de message.

  14. getBuilder

    IMetadataBuilder* getBuilder(StatusType* status)

    Renvoie le lien d’interface :#fbapi-interfaces-imetadatabuilder[IMetadataBuilder] initialisé avec les métadonnées de ce message.

  15. getMessageLength

    unsigned getMessageLength(StatusType* status)

    Renvoie la longueur de la mémoire tampon du message (utilisez-la pour allouer de la mémoire pour le tampon).

  16. getAlignment

    unsigned getAlignment(StatusType* status)

    Renvoie l’alignement en octets.

  17. getAlignedLength

    unsigned getAlignedLength(StatusType* status)

    Renvoie la taille de la structure de métadonnées après l’alignement.

Un exemple de mise en cache des messages avec IMessageMetadata en Pascal:

type
  FBRecord = Record
    fFieldName : AnsiString;
    fRelation  : AnsiString;
    fOwner     : AnsiString;
    fAliasName : AnsiString;
    fTypeField : Cardinal;
    fisNullable: Boolean;
    fSubType   : Integer;
    fLengthByte: Cardinal;
    fScale     : Integer;
    fCharSet   : Cardinal;
    fOffset    : Cardinal;
    fNullOffset: Cardinal;
  end;

var
  _outFBRecord : Array of FBRecord;
  ty_count_in  : cardinal;
  master       : IMaster ;
  util         : IUtil;
  st           : IStatus;
  dpb          : IXpbBuilder;
  att          : IAttachment;
  tra          : ITransaction;
  stmt         : IStatement;
  outMetadata  : IMessageMetadata;

begin
  master := master_interface;
  util   := master.getUtilInterface;
  st     := master.getStatus;
  dpb    := util.getXpbBuilder(st, IXpbBuilder.DPB, nil, 0);
  dpb.insertString(st,isc_dpb_set_db_charset,PAnsiChar('NONE'));
  dpb.insertInt(st,isc_dpb_set_db_sql_dialect,3);
  dpb.insertString(st, isc_dpb_user_name,  PAnsiChar('SYSDBA'));
  dpb.insertString(st, isc_dpb_password, PAnsiChar('masterkey'));
  att    := prov.attachDatabase(st,PAnsiChar('11.5.0.145/4050:/ssd3/FB5/asciidoc.fb5'), dpb.getBufferLength(st), dpb.getBuffer(st));
  tra    := att.startTransaction(st, 0, nil);
  stmt   := att.prepare(st, tra, 0, PAnsiChar(' select * from doc order by id optimize for fist rows ;'), 3, IStatement.PREPARE_PREFETCH_METADATA);
  outMetadata  := stmt.getOutputMetadata(st);
  ty_count_in := outMetadata.getCount(st);

  setlength(_outFBRecord, ty_count_in);

  for i:=0 to ty_count_in-1 do
  begin
    _outFBRecord[i].fFieldName   :=  outMetadata.getField(st,i);
    _outFBRecord[i].fRelation    :=  outMetadata.getRelation(st,i);
    _outFBRecord[i].fOwner       :=  outMetadata.getOwner(st,i);
    _outFBRecord[i].fAliasName   :=  outMetadata.getAlias(st,i);
    _outFBRecord[i].fTypeField   :=  outMetadata.getType(st,i);
    _outFBRecord[i].fisNullable  :=  outMetadata.isNullable(st,i);
    _outFBRecord[i].fSubType     :=  outMetadata.getSubType(st,i);
    _outFBRecord[i].fLengthByte  :=  outMetadata.getLength(st,i);
    _outFBRecord[i].fScale       :=  outMetadata.getScale(st,i);
    _outFBRecord[i].fCharSet     :=  outMetadata.getCharSet(st,i);
    _outFBRecord[i].fOffset      :=  outMetadata.getOffset(st,i);
    _outFBRecord[i].fNullOffset  :=  outMetadata.getNullOffset(st,i);
  end;
  ....

end;

IMetadataBuilder

Interface IMetadataBuilder — Permet de décrire les types de données des messages existants ou de créer des métadonnées.

  1. setType

    void setType(StatusType* status, unsigned index, unsigned type)

    Définit le type SQL du champ.

  2. setSubType

    void setSubType(StatusType* status, unsigned index, int subType)

    Définit le sous-type BLOB du champ.

  3. setLength

    void setLength(StatusType* status, unsigned index, unsigned length)

    Définit la longueur maximale du champ de caractère.

  4. setCharSet

    void setCharSet(StatusType* status, unsigned index, unsigned charSet)

    Définit le jeu de caractères pour le champ de caractère et l’objet blob de texte.

  5. setScale

    void setScale(StatusType* status, unsigned index, unsigned scale)

    Définit l’échelle des champs numériques.

  6. truncate

    void truncate(StatusType* status, unsigned count)

    Tronque le message afin qu’il ne contienne pas plus qu’un nombre de champs.

  7. moveNameToIndex

    void moveNameToIndex(StatusType* status, const char* name, unsigned index)

    Réorganise les champs d’un message : déplace un champ nommé nom vers une position spécifiée.

  8. remove

    void remove(StatusType* status, unsigned index)

    Supprime le champ.

  9. addField

    unsigned addField(StatusType* status)

    Ajoute un champ.

  10. getMetadata

    IMessageMetadata* getMetadata(StatusType* status)

    Renvoie le lien d’interface :#fbapi-interfaces-imessagemetadata[IMessageMetadata] construit par le compilateur.

  11. setField

    void setField(StatusType* status, unsigned index, const char* field)

    Définit le nom du champ/de la colonne.

  12. setRelation

    void setRelation(StatusType* status, unsigned index, const char* relation)

    Définit le nom de la relation pour le champ.

  13. setOwner

    void setOwner(StatusType* status, unsigned index, const char* owner)

    Définit le nom du propriétaire.

  14. setAlias

    void setAlias(StatusType* status, unsigned index, const char* alias)

    Définit l’alias du champ.