La bibliothèque pgtypes établie une correspondance entre les types PostgreSQL™ et les équivalents en C. Elle fournit aussi des fonctions permettant des calculs simples sur ces types en C, c'est-à-dire sans l'aide du serveur PostgreSQL™. Regardez l'exemple suivant :
EXEC SQL BEGIN DECLARE SECTION;
date date1;
timestamp ts1, tsout;
interval iv1;
char *out;
EXEC SQL END DECLARE SECTION;
PGTYPESdate_today(&date1);
EXEC SQL SELECT started, duration INTO :ts1, :iv1 FROM datetbl WHERE d=:date1;
PGTYPEStimestamp_add_interval(&ts1, &iv1, &tsout);
out = PGTYPEStimestamp_to_asc(&tsout);
printf("Started + duration: %s\n", out);
free(out);
Le type numeric permet des calculs sur une précision arbitraire. Voir Section 8.1, « Types numériques » pour le type équivalent dans le serveur PostgreSQL™. À cause de cette précision, cette variable doit être capable de étendre et de diminuer sa taille dynamiquement. C'est pourquoi vous pouvez seulement créer des variables sur le « heap » au moyen des fonctions PGTYPESnumeric_new et PGTYPESnumeric_free. Le type decimal, similaire mais limité en précision, peut être créé sur la pile comme sur le « heap ».
Les fonctions suivantes peuvent être utilisées avec le type numeric :
Demande un pointeur vers une variable numeric nouvellement allouée.
numeric *PGTYPESnumeric_new(void);
Libère un type numeric en libérant toute sa mémoire.
void PGTYPESnumeric_free(numeric *var);
Analyse un type numeric à partir de sa notation en chaîne.
numeric *PGTYPESnumeric_from_asc(char *str, char **endptr);
Les formats valides sont : -2, .794, +3.44, 592.49E07 ou -32.84e-4. Si la valeur a pu être analysée correctement, un pointeur valide est renvoyé. Dans le cas contraire, il s'agit d'un pointeur NULL. Actuellement, ecpg analyse toujours la chaîne complète et, du coup, il ne supporte pas le stockage de l'adresse du premier caractère invalide dans *endptr. Vous pouvez initialiser endptr à NULL en toute sécurité.
Renvoie un pointeur vers une chaîne allouée via malloc et contenant la représentation en chaîne du type numeric num.
char *PGTYPESnumeric_to_asc(numeric *num, int dscale);
La valeur numeric sera affichée avec dscale chiffres décimaux, avec l'application d'un arrondi si nécessaire.
Ajoute deux variables de type numeric dans une troisième.
int PGTYPESnumeric_add(numeric *var1, numeric *var2, numeric *result);
Cette fonction ajoute les variables var1 et var2 dans la variable résultat result. Elle renvoie 0 en cas de succès et -1 en cas d'erreur.
Soustrait deux variables de type numeric et renvoie le résultat dans une troisième.
int PGTYPESnumeric_sub(numeric *var1, numeric *var2, numeric *result);
Cette fonction soustrait la variable var2 à la variable var1. Le résultat de cette opération est stocké dans la variable result. La fonction renvoie 0 en cas de succès et -1 en cas d'erreur.
Multiplie deux variables de type numeric et renvoie le résultat dans une troisième.
int PGTYPESnumeric_mul(numeric *var1, numeric *var2, numeric *result);
Cette fonction multiplie les variables var1 et var2. Le résultat de cette opération est stocké dans la variable result. La fonction renvoie 0 en cas de succès et -1 en cas d'erreur.
Divise deux variables de type numeric et renvoie le résultat dans une troisième.
int PGTYPESnumeric_div(numeric *var1, numeric *var2, numeric *result);
Cette fonction divise la variable var1 par var2. Le résultat de cette opération est stocké dans la variable result. La fonction renvoie 0 en cas de succès et -1 en cas d'erreur.
Compare deux variables de type numeric.
int PGTYPESnumeric_cmp(numeric *var1, numeric *var2)
Cette fonction compare deux variables de type numeric. Dans le cas d'une erreur, INT_MAX est renvoyé. En cas de succès, la fonction renvoie un des trois résultats possibles :
1, si var1 est plus grand que var2
-1, si var1 est plus petit que var2
0, si var1 est égal à var2
Convertit une variable int en une variable numeric.
int PGTYPESnumeric_from_int(signed int int_val, numeric *var);
Cette fonction accepte une variable de type entier signé et la stocke dans une variable var de type numeric. La fonction renvoie 0 en cas de succès et -1 en cas d'erreur.
Convertit une variable long int en une variable numeric.
int PGTYPESnumeric_from_long(signed long int long_val, numeric *var);
Cette fonction accepte une variable de type entier long signé et la stocke dans une variable var de type numeric. La fonction renvoie 0 en cas de succès et -1 en cas d'erreur.
Copie une variable numeric sur une autre.
int PGTYPESnumeric_copy(numeric *src, numeric *dst);
Cette fonction copie la valeur de la variable sur laquelle pointe src dans la variable sur laquelle pointe dst. La fonction renvoie 0 en cas de succès et -1 en cas d'erreur.
Convertit une variable de type double en numeric.
int PGTYPESnumeric_from_double(double d, numeric *dst);
Cette fonction accepte une variable de type double et la stocke dans la variable sur laquelle pointe dst. La fonction renvoie 0 en cas de succès et -1 en cas d'erreur.
Convertit une variable de type numeric en double.
int PGTYPESnumeric_to_double(numeric *nv, double *dp)
Cette fonction convertit la valeur numeric de la variable vers laquelle pointe nv sur une variable de type double sur laquelle pointe dp. La fonction renvoie 0 en cas de succès et -1 en cas d'erreur, ceci incluant un dépassement possible. En cas de dépassement, la variable globale errno sera en plus initialisée à PGTYPES_NUM_OVERFLOW.
Convertit une variable de type numeric en int.
int PGTYPESnumeric_to_int(numeric *nv, int *ip);
Cette fonction convertit la valeur numeric de la variable vers laquelle pointe nv sur une variable de type integer sur laquelle pointe ip. La fonction renvoie 0 en cas de succès et -1 en cas d'erreur, ceci incluant un dépassement possible. En cas de dépassement, la variable globale errno sera en plus initialisée à PGTYPES_NUM_OVERFLOW.
Convertit une variable de type numeric en long int.
int PGTYPESnumeric_to_long(numeric *nv, long *lp);
Cette fonction convertit la valeur numeric de la variable vers laquelle pointe nv sur une variable de type long integer sur laquelle pointe lp. La fonction renvoie 0 en cas de succès et -1 en cas d'erreur, ceci incluant un dépassement possible. En cas de dépassement, la variable globale errno sera en plus initialisée à PGTYPES_NUM_OVERFLOW.
Convertit une variable de type numeric en decimal.
int PGTYPESnumeric_to_decimal(numeric *src, decimal *dst);
Cette fonction convertit la valeur numeric de la variable vers laquelle pointe nv sur une variable de type decimal sur laquelle pointe dst. La fonction renvoie 0 en cas de succès et -1 en cas d'erreur, ceci incluant un dépassement possible. En cas de dépassement, la variable globale errno sera en plus initialisée à PGTYPES_NUM_OVERFLOW.
Convertit une variable de type decimal en numeric.
int PGTYPESnumeric_from_decimal(decimal *src, numeric *dst);
Cette fonction convertit la valeur decimal de la variable vers laquelle pointe nv sur une variable de type numeric sur laquelle pointe dst. La fonction renvoie 0 en cas de succès et -1 en cas d'erreur. Comme le type decimal est une version limitée du type numeric, un dépassement ne peut survenir avec cette conversion.
Le type date en C active la gestion des dates dans vos programmes. Voir Section 8.5, « Types date/heure » pour le type équivalent dans le serveur PostgreSQL™.
Les fonctions suivantes peuvent être utilisées pour travailler avec le type date :
Extrait la date d'une variable de type timestamp.
date PGTYPESdate_from_timestamp(timestamp dt);
Cette fonction reçoit une variable de type timestamp comme seul argument et renvoie la partie date qui en est extraite.
Analyse une date à partir de sa représentation textuelle.
date PGTYPESdate_from_asc(char *str, char **endptr);
Cette fonction reçoit une chaîne C (char*) str et un pointeur vers une autre chaîne C, endptr. ecpg analyse toujours la chaîne complète. Du coup, ecpg ne supporte pas le stockage de l'adresse du premier caractère invalide dans *endptr. Vous pouvez initialiser endptr à NULL en toute sécurité.
Notez que la fonction suppose toujours avoir des dates au format MDY et il n'y a actuellement aucune variable pour modifier ceci dans ecpg.
Les formats suivants sont autorisées en entrée :
Tableau 31.1. Formats valides en entrée de PGTYPESdate_from_asc
| Entrée | Sortie |
|---|---|
| January 8, 1999 | January 8, 1999 |
| 1999-01-08 | January 8, 1999 |
| 1/8/1999 | January 8, 1999 |
| 1/18/1999 | January 18, 1999 |
| 01/02/03 | February 1, 2003 |
| 1999-Jan-08 | January 8, 1999 |
| Jan-08-1999 | January 8, 1999 |
| 08-Jan-1999 | January 8, 1999 |
| 99-Jan-08 | January 8, 1999 |
| 08-Jan-99 | January 8, 1999 |
| 08-Jan-06 | January 8, 2006 |
| Jan-08-99 | January 8, 1999 |
| 19990108 | ISO 8601; January 8, 1999 |
| 990108 | ISO 8601; January 8, 1999 |
| 1999.008 | year and day of year |
| J2451187 | Julian day |
| January 8, 99 BC | year 99 before the Common Era |
Renvoie la représentation textuelle d'une variable date.
char *PGTYPESdate_to_asc(date dDate);
Cette fonction reçoit la date dDate comme seul paramètre. Elle affichera la date sous la forme 1999-01-18, c'est-à-dire dans le format YYYY-MM-DD format.
Extrait les valeurs du jour, du mois et de l'année provenant d'une variable de type date.
void PGTYPESdate_julmdy(date d, int *mdy);
Cette fonction reçoit la date d et un pointeur vers un tableau de trois valeurs entières mdy. Le nom de la variable indique l'ordre de séquence : mdy[0] sera initialisé avec le numéro du mois, mdy[1] avec celui du jour et mdy[2] avec celui de l'année.
Crée une valeur date à partir d'un tableau de trois entiers qui précisent le jour, le mois et l'année de la date.
void PGTYPESdate_mdyjul(int *mdy, date *jdate);
Cette fonction reçoit le tableau de trois entiers (mdy) en tant que premier argument et un pointeur vers une variable de type date dans son second argument qui recevra le résultat de l'opération.
Renvoie un nombre représentant le jour de la semaine pour une valeur de type date.
int PGTYPESdate_dayofweek(date d);
Cette fonction reçoit la variable d de type date comme seul argument et renvoie un entier indiquant le jour de la semaine pour cette date.
0 - Dimanche
1 - Lundi
2 - Mardi
3 - Mercredi
4 - Jeudi
5 - Vendredi
6 - Samedi
Récupère la date actuelle.
void PGTYPESdate_today(date *d);
Cette fonction reçoit un pointeur vers une variable date (d) et l'initialise à la date actuelle.
Convertit une variable de type date en sa représentation textuelle en utilisant un masque de format.
int PGTYPESdate_fmt_asc(date dDate, char *fmtstring, char *outbuf);
Cette fonction reçoit la date à convertir (dDate), le masque de format (fmtstring) et la chaîne qui récupèrera la représentation textuelle de la date (outbuf).
La fonction renvoie 0 en cas de succès et une valeur négative en cas d'erreur.
Les chaînes suivantes indiquent les champs à utiliser :
dd - le numéro du jour dans le mois.
mm - le numéro du mois dans l'année.
yy - le numéro de l'année sur deux chiffres.
yyyy - le numéro de l'année sur quatre chiffres.
ddd - l'abréviation du nom du jour.
mmm - l'abréviation du nom du mois.
Tous les autres caractères sont copiés un à un dans la chaîne résultante.
La table suivante indique quelques formats possibles. Ceci vous donnera des idées quant à l'utilisation de cette fonction. Toutes les lignes en sortie sont basées sur la même date, le 23 novembre 1959.
Tableau 31.2. Formats valides en entrée de PGTYPESdate_fmt_asc
| Format | Résultat |
|---|---|
| mmddyy | 112359 |
| ddmmyy | 231159 |
| yymmdd | 591123 |
| yy/mm/dd | 59/11/23 |
| yy mm dd | 59 11 23 |
| yy.mm.dd | 59.11.23 |
| .mm.yyyy.dd. | .11.1959.23. |
| mmm. dd, yyyy | Nov. 23, 1959 |
| mmm dd yyyy | Nov 23 1959 |
| yyyy dd mm | 1959 23 11 |
| ddd, mmm. dd, yyyy | Mon, Nov. 23, 1959 |
| (ddd) mmm. dd, yyyy | (Mon) Nov. 23, 1959 |
Utilise un masque de format pour convertir une chaîne C (char*) en une valeur de type date.
int PGTYPESdate_defmt_asc(date *d, char *fmt, char *str);
Cette fonction reçoit un pointeur vers la valeur de type date qui contiendra le résultat de l'opération (d), le masque du format à utiliser pour analyser la date (fmt) et la chaîne C contenant la représentation textuelle de la date (str). La représentation textuelle doit correspondre masque de format. Néanmoins, vous n'avez pas besoin d'avoir une correspondance exacte. La fonction analyse seulement dans l'ordre séquentiel et cherche les constantes yy ou yyyy qui indiquent la position de l'année, mm pour la mois et dd pour le jour.
La table suivant indique quelques formats possibles. Ceci vous donnera des idées sur l'utilisation de cette fonction.
Tableau 31.3. Formats valides en entrée de rdefmtdate
| Format | Chaîne | Résultat |
|---|---|---|
| ddmmyy | 21-2-54 | 1954-02-21 |
| ddmmyy | 2-12-54 | 1954-12-02 |
| ddmmyy | 20111954 | 1954-11-20 |
| ddmmyy | 130464 | 1964-04-13 |
| mmm.dd.yyyy | MAR-12-1967 | 1967-03-12 |
| yy/mm/dd | 1954, February 3rd | 1954-02-03 |
| mmm.dd.yyyy | 041269 | 1969-04-12 |
| yy/mm/dd | In the year 2525, in the month of July, mankind will be alive on the 28th day | 2525-07-28 |
| dd-mm-yy | I said on the 28th of July in the year 2525 | 2525-07-28 |
| mmm.dd.yyyy | 9/14/58 | 1958-09-14 |
| yy/mm/dd | 47/03/29 | 1947-03-29 |
| mmm.dd.yyyy | oct 28 1975 | 1975-10-28 |
| mmddyy | Nov 14th, 1985 | 1985-11-14 |
Le type timestamp en C active la gestion des données de type timestamp dans vos programmes. Voir Section 8.5, « Types date/heure » pour le type équivalent dans le serveur PostgreSQL™.
Le fonctions suivantes sont utilisées pour travailler avec le type timestamp :
Analyse une variable de type timestamp à partir de sa représentation textuelle et la stocke dans une variable de type timestamp.
timestamp PGTYPEStimestamp_from_asc(char *str, char **endptr);
Cette fonction reçoit la chaîne à analyser (str) et un pointeur vers une chaîne C de type char* (endptr). Actuellement, ecpg analyse toujours la chaîne complète et donc il ne supporte pas le stockage de l'adresse du premier caractère invalide dans *endptr. Vous pouvez initialiser endptr à NULL en toute sécurité.
La fonction renvoie la variable de type timestamp analysée en cas de succès. En cas d'erreur, PGTYPESInvalidTimestamp est renvoyée et errno vaut PGTYPES_TS_BAD_TIMESTAMP. Voir PGTYPESInvalidTimestamp pour quelques informations importantes sur cette valeur.
En général, la chaîne en entrée contient des combinaisons de spécification autorisée de dates, un espace blanc et une spécification autorisée d'heure. Notez que les fuseaux horaires ne sont pas supportés par ecpg. Il peut les analyser et n'applique aucun calcul comme le fait le serveur PostgreSQL™ par exemple. Les fuseaux horaires sont ignorés silencieusement.
Le tableau suivant contient quelques exemples pour les chaînes en entrée :
Tableau 31.4. Formats valides en entrée de PGTYPEStimestamp_from_asc
| Entrée | Résultat |
|---|---|
| 1999-01-08 04:05:06 | 1999-01-08 04:05:06 |
| January 8 04:05:06 1999 PST | 1999-01-08 04:05:06 |
| 1999-Jan-08 04:05:06.789-8 | 1999-01-08 04:05:06.789 (fuseau horaire ignoré) |
| J2451187 04:05-08:00 | 1999-01-08 04:05:00 (fuseau horaire ignoré) |
Convertit une date en chaîne C char*.
char *PGTYPEStimestamp_to_asc(timestamp tstamp);
Cette fonction reçoit la variable tstamp de type timestamp comme seul argument et renvoie une chaîne allouée contenant la représentation textuelle du timestamp.
Récupère le timestamp actuel.
void PGTYPEStimestamp_current(timestamp *ts);
Cette fonction récupère le timestamp actuel et le sauvegarde dans la variable de type timestamp vers laquelle pointe ts.
Convertit une variable de type timestamp en une chaîne C de type char* en utilisant une masque de formatage.
int PGTYPEStimestamp_fmt_asc(timestamp *ts, char *output, int str_len, char *fmtstr);
Cette fonction reçoit un pointeur vers la variable de type timestamp en premier argument (ts), un pointeur vers le tampon en sortie (output), la longueur maximale qui a été allouée pour le tampon en sortie (str_len) et le masque de formatage à utiliser pour la conversion (fmtstr).
La fonction renvoie 0 en cas de succès et une valeur négative en cas d'erreur.
Vous pouvez utiliser les caractères de formatage suivants pour le masque de formatage. Ces caractères sont identiques à ceux utilisés dans la fonction strftime de libc™. Tout caractère n'en faisant pas partie sera copié tel quel dans le tampon de sortie.
%A - remplacé par la représentation nationale du nom complet du jour de la semaine.
%a - remplacé par la représentation nationale de l'abréviation du nom de la semaine.
%B - remplacé par la représentation nationale du nom complet du mois.
%b - remplacé par la représentation nationale de l'abréviation du nom du mois.
%C - remplacé par (année / 100) en tant que nombre décimal ; les chiffres seuls sont précédés par un zéro.
%c - remplacé par la représentation nationale de l'heure et de la date.
%D - est équivalent à %m/%d/%y.
%d - est remplacé par le jour du mois en tant que nombre décimal (01-31).
%E* %O* - extensions POSIX de la locale. Les séquences %Ec %EC %Ex %EX %Ey %EY %Od %Oe %OH %OI %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy sont supposées fournir d'autres représentations.
De plus, %OB implémenté pour représenter les autres noms des mois (utilisés en autonome, sans mention du jour).
%e - est remplacé par le jour du mois en nombre décimal (1-31) ; si un seul chiffre, un espace précède.
%F - est équivalent à %Y-%m-%d.
%G - est remplacé par une année avec le siècle. This year is the one that contains the greater part of the week (Monday as the first day of the week).
%g - est remplacé par la même année que %G mais en décimal sans le siècle (00-99).
%H - est remplacé par l'heure (sur 24 heures) en nombre décimal (00-23).
%h - idem à %b.
%I - est remplacé par l'heure (sur 12 heures) en nombre décimal (01-12).
%j - est remplacé par le jour de l'année en nombre décimal (001-366).
%k - est remplacé par l'heure (sur 24 heures) en nombre décimal (0-23) ; si inférieur à 10, ajout d'un espace.
%l - est remplacé par l'heure (sur 12 heures) en nombre décimal (1-12) ; si inférieur à 10, ajout d'un espace.
%M - est remplacé par la minute en nombre décimal (00-59).
%m - est remplacé par le mois en nombre décimal (01-12).
%n - est remplacé par un retour chariot.
%O* - identique à %E*.
%p - remplacé par la représentation nationale de soit "ante méridien" soit "post méridien" suivant le cas.
%R - est équivalent à %H:%M.
%r - est équivalent à %I:%M:%S %p.
%S - est remplacé par la seconde en nombre décimal (00-60).
%s - est remplacé par le nombre de secondes depuis Epoch, UTC.
%T - est équivalent à %H:%M:%S
%t - est remplacé par une tabulation.
%U - est remplacé par le numéro de la semaine dans l'année (dimanche étant le premier jour de l'année) en nombre décimal (00-53).
%u - est remplacé par le jour de la semaine (lundi étant le premier jour de la semaine) en nombre décimal (1-7).
%V - est remplacé par le numéro de la semaine dans l'année (lundi étant le premier jour de la semaine) en nombre décimal (01-53). Si la semaine contenant le 1er janvier a quatre jours ou plus dans la nouvelle année, alors c'est la semaine 1 ; sinon c'est la dernière semaine de l'année précédente et la semaine suivante est la semaine 1.
%v - est équivalent à %e-%b-%Y.
%W - est remplacé par le numéro de semaine de l'année (lundi étant le premier jour de la semaine) en nombre décimal (00-53).
%w - est remplacé par le jour de la semaine (dimanche étant le premier jour de la semaine) en nombre décimal (0-6).
%X - est remplacé par la représentation nationale de l'heure.
%x - est remplacé par la représentation nationale de la date.
%Y - est remplacé par l'année avec le siècle en nombre décimal.
%y - est remplacé par l'année sans le siècle en nombre décimal (00-99).
%Z - est remplacé par le nom du fuseau horaire.
%z - est remplacé par le décalage du fuseau horaire à partir d'UTC ; un signe plus au début signifie à l'est d'UTC, un signe moins signifie à l'ouest d'UTC ; les heures et les minutes suivent avec deux chiffres chacun et aucun délimiteur entre eux (format habituel pour les en-têtes de date au standard RFC 822).
%+ - est remplacé par la représentation nationale de la date et l'heure.
%-* - extension GNU libc. N'ajoute aucun espace de remplissage lors du traitement des sorties numériques.
$_* - extension GNU libc. Spécifie explicitement l'espace pour le remplissage.
%0* - extension GNU libc.Spécifie explicitement l'ajout de zéro pour le remplissage.
%% - est remplacé par %.
Soustrait une valeur de type timestamp d'une autre valeur et sauvegarde le résultat dans une variable de type interval.
int PGTYPEStimestamp_sub(timestamp *ts1, timestamp *ts2, interval *iv);
La fonction soustraiera la variable timestamp vers laquelle pointe ts2 de la variable timestamp vers laquelle pointe ts1 et stockera le résultat dans la variable interval vers laquelle pointe iv.
La fonction renvoie 0 en cas de succès et une valeur négative en cas d'erreur.
Analyse une valeur de type timestamp à partir de sa représentation textuelle en utilisant un masque de formatage.
int PGTYPEStimestamp_defmt_asc(char *str, char *fmt, timestamp *d);
La fonction reçoit la représentation textuelle d'une valeur de type timestamp dans la variable str ainsi que le masque de formatage à utiliser dans la variable fmt. Le résultat sera stocké dans la variable vers laquelle d pointe.
Si le masque de formatage fmt vaut NULL, la fonction utiliser la masque de formatage par défaut qui est %Y-%m-%d %H:%M:%S.
C'est la fonction inverse de PGTYPEStimestamp_fmt_asc. Voir la documentation pour découvrir les entrées possibles du masque de formatage.
Ajoute une variable de type interval à une variable de type timestamp.
int PGTYPEStimestamp_add_interval(timestamp *tin, interval *span, timestamp *tout);
La fonction recçoit un pointeur vers une variable de type timestamp, tin, et un pointeur vers une variable interval span. Elle ajoute l'interval au timestamp et sauvegarde le résultat, de type timestamp, dans la variable vers laquelle pointe tout.
La fonction renvoie 0 en cas de succès et une valeur négative en cas d'erreur.
Soustrait une variable de type interval à partir d'une variable de type timestamp.
int PGTYPEStimestamp_sub_interval(timestamp *tin, interval *span, timestamp *tout);
La fonction soustrait la variable de type interval vers laquelle pointe span à la variable timestamp vers laquelle pointe tin et sauvegarde le résultat dans une variable vers laquelle pointe tout.
La fonction renvoie 0 en cas de succès et une valeur négative en cas d'erreur.
Le type interval en C active la gestion des données du type SQL interval. Voir Section 8.5, « Types date/heure » pour le type équivalent dans le serveur PostgreSQL™.
Les fonctions suivantes sont disponibles pour traiter le type interval :
Renvoie un pointeur vers une variable interval nouvellement allouée.
interval *PGTYPESinterval_new(void);
Libère la mémoire d'une variable interval précédemment allouée.
void PGTYPESinterval_new(interval *intvl);
Analyse une variable de interval à partir de sa représentation textuelle.
interval *PGTYPESinterval_from_asc(char *str, char **endptr);
La fonction analyse la chaîne str en entrée et renvoie un pointeur vers une variable allouée de type interval. Actuellement, ecpg analyse toujours la chaîne complète et ne supporte donc pas le stockage de l'adresse du premier caractère invalide dans *endptr. Vous pouvez donc initialiser endptr à NULL en toute sécurité.
Convertit une variable de type interval en sa représentation textuelle.
char *PGTYPESinterval_to_asc(interval *span);
La fonction convertit la variable de type interval vers laquelle pointe span en une chaîne C de type char*. Son contenu ressemble à ceci : @ 1 day 12 hours 59 mins 10 secs.
Copie une variable de type interval.
int PGTYPESinterval_copy(interval *intvlsrc, interval *intvldest);
Cette fonction copie la variable de type interval vers laquelle pointe intvlsrc dans la variable vers laquelle pointe intvldest. Notez que vous avez besoin d'allouer la mémoire pour la variable de destination avant d'appeler cette fonction.
Le type decimal est similaire au type numeric. Néanmoins, il est limité à une précision maximale de 30 chiffres significatifs. Contrairement au type numeric qui ne peut êre créé que sur la partie heap de la mémoire, le type decimal peut être créé soit sur la piler soit sur le heap (au moyen des fonctions PGTYPESdecimal_new() et PGTYPESdecimal_free()). Il existe bien d'autres fonctions qui gèrent le type decimal dans le mode de compatibilité Informix™ décrit dans Section 31.9, « Mode de compatibilité Informix™ ».
Les fonctions suivantes sont utilisées pour travailler avec le type decimal et ne sont pas seulement contenues dans la bibliothèque libcompat.
Nécessite un pointeur vers une variable decimal nouvellement allouée.
decimal *PGTYPESdecimal_new(void);
Libère toute la mémoire d'un type decimal.
void PGTYPESdecimal_free(decimal *var);
Un argument devrait contenir une variable de type numeric (ou pointer vers une variable numeric) mais, en fait, sa représentation en mémoire était invalide.
Un dépassement est survenu. Comme le type numeric peut gérer une précision pratiquement arbitraire, convertir une variable de type numeric en d'autres types peut causer un dépassement.
Un underflow (une erreur de traitement survenant quand la valeur absolue d'une quantité calculée est plus petite que les limites de précision) est survenu. Comme le type numeric peut gérer une précision pratiquement arbitraire, convertir une variable de type numeric en d'autres types peut causer un underflow.
Tentative de division par zéro.
Une valeur de type timestamp représentant un timestamp invalide. C'est renvoyé par la fonction PGTYPEStimestamp_from_asc en cas d'erreur lors de l'analyse. Notez qu'à cause de la représentation interne du type de données timestamp, PGTYPESInvalidTimestamp est aussi en même temps un timestamp valide. Il est configuré à 1899-12-31 23:59:59. Pour détecter les erreurs, assurez-vous que votre application ne teste pas seulement PGTYPESInvalidTimestamp mais aussi errno != 0 après chaque appel à PGTYPEStimestamp_from_asc.