Utilisation de la macros FB_MESSAGE pour les messages statiques
Travailler avec des données à l’aide de décalages de champs est assez efficace, mais cela nécessite beaucoup de code. Dans C++, ce problème peut être résolu avec des modèles, mais même par rapport à eux, la façon la plus pratique de travailler avec un message est de le présenter sous sa forme native : une structure en C/C++, un record en Pascal, etc.Bien entendu, cela ne fonctionne que si le format du message est connu à l’avance. Pour créer de telles structures en C++ dans Firebird, il y a une macro spéciale FB_MESSAGE
.
FB_MESSAGE
a 3 arguments : le nom du message (structure), le type d’enveloppe d’état et la liste des champs. L’utilisation du premier et du deuxième argument est évidente, la liste des champs contient des paires (field_type, field_name)
, où field_type est l’un des suivants :
-
FB_BIGINT
-
FB_BLOB
-
FB_BOOLEAN
-
FB_CHAR(len)
-
FB_DATE
-
FB_DECFLOAT16
-
FB_DECFLOAT34
-
FB_DOUBLE
-
FB_FLOAT
-
FB_INTEGER
-
FB_INTL_CHAR(len, charSet)
-
FB_INTL_VARCHAR(len, charSet)
-
FB_SCALED_BIGINT(x)
-
FB_SCALED_INTEGER(x)
-
FB_SCALED_SMALLINT(x)
-
FB_SMALLINT
-
FB_TIME
-
FB_TIME_TZ
-
FB_TIME_TZ_EX
-
FB_TIMESTAMP
-
FB_TIMESTAMP_TZ
-
FB_TIMESTAMP_TZ_EX
-
FB_VARCHAR(len)
Dans la structure générée par le préprocesseur, les types integer
et float
sont mappés aux types C correspondants, les types date
et time
sont mappés aux classes FbDate
et FbTime
(toutes les classes mentionnées ici sont dans l’espace de noms Firebird), le type timestamp
est mappé à la classe FbTimestamp
, qui contient deux membres de données publiques, la date et l’heure des classes respectives, et le type char
est mappé à la structure du lien : #fbapi-objects-fbchar[FbChar
] et varchar
— avec la structure FbVarChar
. Pour chaque champ, le préprocesseur crée deux membres de données : name pour la valeur du champ/paramètre et nameNull pour l’indicateur NULL
. Le constructeur de message a 2 paramètres : un pointeur vers le wrapper d’état et une interface maître :
FB_MESSAGE(Output, ThrowStatusWrapper,
(FB_SMALLINT, relationId)
(FB_CHAR(31), relationName)
(FB_VARCHAR(100), description)
) output(&status, master);
Pour les messages statiques, l’utilisation de FB_MESSAGE
est le meilleur choix, mais ils peuvent facilement être passés aux méthodes execute
, openCursor
et fetch
:
rs = att->openCursor(&status, tra, 0, sqlText,
SQL_DIALECT_V6, NULL, NULL, output.getMetadata(), NULL, 0);
et est utilisé pour travailler avec les valeurs des champs individuels :
while (rs->fetchNext(&status, output.getData()) == IStatus::RESULT_OK)
{
printf("%4d %31.31s %*.*s\n", output->relationId, output->relationName.str,
output->descriptionNull ? 0 : output->description.length,
output->descriptionNull ? 0 : output->description.length,
output->description.str);
}
Pour obtenir un exemple d’utilisation de la macro FB_MESSAGE
pour travailler avec des messages, consultez l’exemple 06.fb_message.cpp
.