31.8. Bibliothèque pgtypes

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);

31.8.1. Type numeric

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 :

PGTYPESnumeric_new

Demande un pointeur vers une variable numeric nouvellement allouée.

numeric *PGTYPESnumeric_new(void);
PGTYPESnumeric_free

Libère un type numeric en libérant toute sa mémoire.

void PGTYPESnumeric_free(numeric *var);
PGTYPESnumeric_from_asc

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é.

PGTYPESnumeric_to_asc

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.

PGTYPESnumeric_add

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.

PGTYPESnumeric_sub

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.

PGTYPESnumeric_mul

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.

PGTYPESnumeric_div

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.

PGTYPESnumeric_cmp

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

PGTYPESnumeric_from_int

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.

PGTYPESnumeric_from_long

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.

PGTYPESnumeric_copy

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.

PGTYPESnumeric_from_double

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.

PGTYPESnumeric_to_double

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.

PGTYPESnumeric_to_int

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.

PGTYPESnumeric_to_long

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.

PGTYPESnumeric_to_decimal

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.

PGTYPESnumeric_from_decimal

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.

31.8.2. Type date

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 :

PGTYPESdate_from_timestamp

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.

PGTYPESdate_from_asc

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


PGTYPESdate_to_asc

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.

PGTYPESdate_julmdy

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.

PGTYPESdate_mdyjul

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.

PGTYPESdate_dayofweek

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

PGTYPESdate_today

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.

PGTYPESdate_fmt_asc

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


PGTYPESdate_defmt_asc

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


31.8.3. Type timestamp

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 :

PGTYPEStimestamp_from_asc

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é)


PGTYPEStimestamp_to_asc

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.

PGTYPEStimestamp_current

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.

PGTYPEStimestamp_fmt_asc

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 %.

PGTYPEStimestamp_sub

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.

PGTYPEStimestamp_defmt_asc

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.

PGTYPEStimestamp_add_interval

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.

PGTYPEStimestamp_sub_interval

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.

31.8.4. Type interval

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 :

PGTYPESinterval_new

Renvoie un pointeur vers une variable interval nouvellement allouée.

interval *PGTYPESinterval_new(void);
PGTYPESinterval_free

Libère la mémoire d'une variable interval précédemment allouée.

void PGTYPESinterval_new(interval *intvl);
PGTYPESinterval_from_asc

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é.

PGTYPESinterval_to_asc

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.

PGTYPESinterval_copy

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.

31.8.5. Type decimal

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.

PGTYPESdecimal_new

Nécessite un pointeur vers une variable decimal nouvellement allouée.

decimal *PGTYPESdecimal_new(void);
PGTYPESdecimal_free

Libère toute la mémoire d'un type decimal.

void PGTYPESdecimal_free(decimal *var);

31.8.6. Valeus errno de pgtypeslib

PGTYPES_NUM_BAD_NUMERIC

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.

PGTYPES_NUM_OVERFLOW

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.

PGTYPES_NUM_OVERFLOW

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.

PGTYPES_NUM_DIVIDE_ZERO

Tentative de division par zéro.

PGTYPES_DATE_BAD_DATE
PGTYPES_DATE_ERR_EARGS
PGTYPES_DATE_ERR_ENOSHORTDATE
PGTYPES_INTVL_BAD_INTERVAL
PGTYPES_DATE_ERR_ENOTDMY
PGTYPES_DATE_BAD_DAY
PGTYPES_DATE_BAD_MONTH
PGTYPES_TS_BAD_TIMESTAMP

31.8.7. Constantes spéciales de pgtypeslib

PGTYPESInvalidTimestamp

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.