ecpg

Name

ecpg  --  préprocesseur SQL C embarqué

Synopsis

ecpg [-v] [-t] [-I include-path] [-o outfile] file...

Entrées

ecpg accepte les arguments en ligne de commande suivants :

-v

Affiche l'information sur la version.

-t

Active l'auo-validation des transactions. Dans ce mode, chaque requête est automatiquement validée à moins qu'elle soit incluse dans un bloc de transaction explicite. Dans le mode par défaut, les requêtes sont validées seulement quand exec sql commit est utilisé.

-I include-path

Spécifie un chemin additionnel. Par défaut c'est . (répertoire courant), /usr/local/include, le chemin PostgreSQL défini lors de la compilation defined at compile time (par défaut : /usr/local/pgsql/include), et /usr/include.

-o outfile

Spécifie que ecpg écrira toutes ses sorties dans outfile. Si aucune option supplémentaire n'est fournie la sortie sera écrite dans name.c, supposant que le fichier d'entrée était nommé name.pgc. Si le fichier d'entrée a le suffixe .pgc attendu, le fichier sortie aura .pgc attaché au nom de fichier d'entrée.

file

Les fichiers à traiter.

Sorties

ecpg créera un fichier ou écrira dans stdout.

Valeur de retour

ecpg retourne 0 au shell lors de la completion, non-zero pour les erreurs.

Description

ecpg est un préprocesseur SQL embarqué pour le langage C et PostgreSQL. Il permet le développement de programmes en C avec le code SQL embarqué.

Linus Tolke () fut l'auteur à l'origine de ecpg (jusqu'à la version 0.2). Michael Meskes () est l'auteur et mainteneur actuel de ecpg. Thomas Good () est l'auteur de la dernière révision des pages de manuel de ecpg, sur lesquelles ce document est fondé.

Utilisation

Pré-traitement pour la compilation

Un fichier source SQL embarqué doit être pré-traité avant compilation :

ecpg [ -d ] [ -o file ] file.pgc
où le flag optionnel -d active le débugage. L'extension .pgc est un moyen arbitraire de noter un source ecpg.

Vous pouvez vouloir rediriger la sortie préprocesseur vers un fichier de log.

Compilation et mise en relation

En supposant que les binaires PostgreSQL soient dans /usr/local/pgsql, vous aurez besoin de compiler et lier votre fichier source pré-traité :

gcc -g -I /usr/local/pgsql/include [ -o file ] file.c -L /usr/local/pgsql/lib -lecpg -lpq

Grammaire

Bibliothèques

Le préprocesseur ajoutera deux directives à la source :

#include <ecpgtype.h>
#include <ecpglib.h>

Déclaration de variable

Les variables déclarées dans le code source ecpg doivent être précédées par :

EXEC SQL BEGIN DECLARE SECTION;

De façon similaire, les sections de déclaration de variable doivent se terminer par :

EXEC SQL END DECLARE SECTION;

Note

Avant la version 2.1.0, devait être déclarée sur un ligne séparée. Depuis la version 2.1.0 de multiples variables peuvent être déclarées sur une seule ligne :

char  foo[16], bar[16];

Traitement d'erreur

La zone de communication SQL est définie avec :

EXEC SQL INCLUDE sqlca;

Note

Le sqlca est en minuscules. Alors que la convention SQL peut être suivie, i.e., utiliser des majuscules pour séparer le SQL embarqué des instructions en C, sqlca (qui comprend le fichier d'en-têtes sqlca.h) doit être en minuscules. Ceci parce que le préfixe EXEC SQL indique que cette inclusion sera analysée par ecpg. ecpg est sensible à la casse (SQLCA.h ne sera pas trouvé). EXEC SQL INCLUDE peut être utilisé pour inclure d'autres fichiers d'en-têtes tant que la sensibilité à la casse est respectée.

La commande sqlprint est utilisée avec l'instruction EXEC SQL WHENEVER pour activer le traitement d'erreur à travers le programme :

EXEC SQL WHENEVER sqlerror sqlprint;
et
EXEC SQL WHENEVER not found sqlprint;

Note

Ceci n'est pas un exemple exhaustif de l'usage de l'instruction EXEC SQL WHENEVER. D'autres exemples peuvent être trouvés dans les manuels de SQL (ex., The LAN TIMES Guide to SQL par Groff et Weinberg).

Connection à un serveur de base

On se connecte à une base en utilisant :

EXEC SQL CONNECT TO dbname;
où le nom de la base n'est pas entre guillemets. Avant la version 2.1.0, le nom de la base devait être entre guillemets.

Spécifier un nom de serveur et un port dans l'instruction de connexion est également possible. La syntaxe est :

dbname[@server][:port]
ou
<tcp|unix>:postgresql://server[:port][/dbname][?options]

Requêtes

En général, des requêtes SQL acceptables par les autres applications comme psql peuvent être insérées dans votre code C. Ici, quelques exemples de la façon de faire :

Création de table:

EXEC SQL CREATE TABLE foo (number int4, ascii char(16));
EXEC SQL CREATE UNIQUE index num1 on foo(number);
EXEC SQL COMMIT;

Insertion :

EXEC SQL INSERT INTO foo (number, ascii) VALUES (9999, 'doodad');
EXEC SQL COMMIT;

Suppression :

EXEC SQL DELETE FROM foo WHERE number = 9999;
EXEC SQL COMMIT;

Sélection unitaire :

EXEC SQL SELECT foo INTO :FooBar FROM table1 WHERE ascii = 'doodad';

Sélection en utilisant des curseurs :

EXEC SQL DECLARE foo_bar CURSOR FOR
    SELECT number, ascii FROM foo
    ORDER BY ascii;
EXEC SQL FETCH foo_bar INTO :FooBar, DooDad;
...
EXEC SQL CLOSE foo_bar;
EXEC SQL COMMIT;

Mises à jour :

EXEC SQL UPDATE foo
    SET ascii = 'foobar'
    WHERE number = 9999;
EXEC SQL COMMIT;

Notes

La définition de structure complète DOIT être listée dans la section de déclaration.

Voir le fichier TODO dans le source pour d'autres fonctionnalités.