Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/06/2011, 12h20   #1
Membre du Club
 
Homme
Ingénieur TIC
Inscription : mars 2010
Messages : 87
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur TIC
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mars 2010
Messages : 87
Points : 59
Points : 59
Par défaut [procédures stockées en C] postgresql 8.4

Bonjour,

je viens de commencer actuellement à travailler sur des procédures stockées en langage C sous windows xp, et je rencontre un problème lors de l'appel de mon fichier so via un procédures pl/pgsql/.

voici le petit code d'essai de ma fonction:

Code :
1
2
3
4
5
6
7
8
9
 
 
int projet(int);
 
int projet(int a) {
 
                 RETURN a;
 
                      }

et voici le code d'appel de mon fichier.so

Code :
1
2
3
4
5
 
 
CREATE FUNCTION projet( int ) RETURNS int 
 AS 'c:\\projet.so' 
 LANGUAGE 'C';
et voici l'erreur retournée:

Citation:

ATTENTION: utilisation non standard de \\ dans une chaîne littérale
LINE 2: AS 'c:\\projet.so'
^
HINT: Utilisez la syntaxe de chaîne d'échappement pour les antislashs, c'est-à-dire E'\\'.


ERREUR: bibliothèque « c:\projet.so » incompatible : bloc magique manquant
HINT: Les bibliothèques étendues nécessitent l'utilisation de la macro
PG_MODULE_MAGIC.

********** Erreur **********

ERREUR: bibliothèque « c:\projet.so » incompatible : bloc magique manquant
État SQL :XX000
Astuce : Les bibliothèques étendues nécessitent l'utilisation de la macro
PG_MODULE_MAGIC.
merci d'avance et bonne journée.
ratata est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2011, 17h57   #2
Inactif
 
Inscription : novembre 2004
Messages : 247
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 247
Points : 217
Points : 217
Bonjour
Pour l'O/S Microsoft regardez dans ce lien
http://www.scribd.com/doc/40725510/B...ons-on-Windows
Cordialement
bustaf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 17h49   #3
Membre du Club
 
Homme
Ingénieur TIC
Inscription : mars 2010
Messages : 87
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur TIC
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mars 2010
Messages : 87
Points : 59
Points : 59
Bonjour bustaf,

Merci pour le lien, il s'est avéré très intéressant, mais Windows m'a agacé la vie, donc je re à mon linux, le problème c'est que dans la même situation telle que j'avais décrit au départ il m'affiche l'erreur suivante:
Citation:
ERROR: incompatible library "chemin de ma lib partagé": missing magic block
SQL state: XX000
Hint: Extension libraries are required to use the PG_MODULE_MAGIC macro.
et ce sachant que j'ai précédé le début du code c par la définition du PG_Module_MAGIC macro.
ratata est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 07h31   #4
Inactif
 
Inscription : novembre 2004
Messages : 247
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 247
Points : 217
Points : 217
Bonjour ratata

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "/usr/local/pgsql/include/server/postgres.h"
#include <string.h>
#include "/usr/local/pgsql/include/server/utils/geo_decls.h"
#include"/usr/local/pgsql/include/server/utils/errcodes.h"
#include "/usr/local/pgsql/include/server/fmgr.h"
PG_MODULE_MAGIC;

int projet(int arg)
{
  return arg + 1;
}
//ou autrement 

/*PG_FUNCTION_INFO_V1(projet);
Datum projet(PG_FUNCTION_ARGS)
{
int32   arg = PG_GETARG_INT32(0);
PG_RETURN_INT32(arg + 1);
} */

// POUR COMILER
// gcc -fPIC -c projet.c
// gcc -shared -o projet.so projet.o
// cp projet.so projet.o /usr/lib
// ldconfig

//COMMANDE ET RESULTAT
//base=# CREATE FUNCTION projet(integer) RETURNS integer   AS '/usr/lib/projet', 'projet'   LANGUAGE C STRICT;
//CREATE FUNCTION
//base=# 
(Il ne faut pas utiliser c++ (g++)
Cordialement
bustaf est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/07/2011, 14h04   #5
Membre du Club
 
Homme
Ingénieur TIC
Inscription : mars 2010
Messages : 87
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur TIC
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mars 2010
Messages : 87
Points : 59
Points : 59
Bonjour Bustaf,

Merci pour ta réponse, alors à ce qui paraît, j'ai une arborescence un peu différente, vu que mes include n'existent pas dans les chemins que vous m'avez cités aussi, je n'ai pas les fichiers "fmgr.h" et "geo_decls.h", mais en cherchant par-ci par-là, j'ai trouvé que "postgres.h" suffirait, ainsi que elog.h et errcodes.h,mais au moment de la compilation:

gcc -shared projet.c -o projet.so (j'ai aussi essayé la commande que vous m'avez proposée )
ça me donne ce qui est en-dessous, je rappelle juste que je suis sur postgresql 9.0

Citation:
In file included from /usr/include/postgresql/postgres.h:48,
from projet.c:1:
/usr/include/postgresql/utils/elog.h:69:28: error: utils/errcodes.h: No such file or directory
ratata est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 18h03   #6
Inactif
 
Inscription : novembre 2004
Messages : 247
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 247
Points : 217
Points : 217
Bonjour ratata
Les chemins que je donne dans l'exemple sont les chemins par défaut
avec des sources postgresql compilées sans un flag (--prefix) défini

tapez au shell (en root)
find / -name errcodes.h -print

vous devez trouver un répertoire include/server/utils qui contient également palloc.h etc ...
Si ces fichiers sont absents, il faut compiler les sources pour générer une installation complète standard.

Je peux vous aider pour cette tâche si vous me donnez les infos suivantes

1] Votre distribution Linux ?
2] gcc -v ?
3] cat /proc/cpuinfo (ou dmidecode -t4) ?
Cordialement
bustaf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 18h30   #7
Membre du Club
 
Homme
Ingénieur TIC
Inscription : mars 2010
Messages : 87
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur TIC
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mars 2010
Messages : 87
Points : 59
Points : 59
reBonjour Bustaf,

Tous mes fichiers d'extension "h" sont contenus dans /usr/include/potgresql,dans lequel sont localisés des dossiers (dont utils fait partie et absence de server et des fichier dont postgres.h ).

Pour errcodes et palloc, ils sont contenus dans /usr/include/postgresql/utils/

Pour les informations que vous m'avez demandées:

je suis sur la distribution ubuntu 10.04 LTS.

ma version du compilateur gcc est 4.4.3

pour mon processeur : c'est un Core 2 DUO

Citation:
LE PREMIER

processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 Duo CPU E4500 @ 2.20GHz
stepping : 13
cpu MHz : 1200.000
cache size : 2048 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm lahf_lm
bogomips : 4389.72
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
Citation:

LE DEUXIÈME

processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 Duo CPU E4500 @ 2.20GHz
stepping : 13
cpu MHz : 1200.000
cache size : 2048 KB
physical id : 0
siblings : 2
core id : 1
cpu cores : 2
apicid : 1
initial apicid : 1
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm lahf_lm
bogomips : 4388.96
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
s'il est objet de changer certains softwares ou carrément de système , j'y serais prêt , juste atteindre les performances que je me suis fixées au départ en passant par le langage C sera mon grand plaisir.
Merci encore une fois Bustaf, et passez une agréable fin de journée.
ratata est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 18h59   #8
Inactif
 
Inscription : novembre 2004
Messages : 247
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 247
Points : 217
Points : 217
Re bonjour
Changez le path qui est dans postgres.h ligne 48 et 49
Code :
1
2
#include "utils/elog.h"
#include "utils/palloc.h"
par votre (path) complet..
Code :
1
2
3
 
#include "/usr/include/postgres/utils/elog.h"
#include "/usr/include/postgres/utils/palloc.h"

(ldconfig c'est pour informer le cache d'une nouvelle librairie)
(la copie du so dans /usr/lib c'est pour qu'il trouve la lib)
la copie optionnelle de l'objet *.o c'est pour retrouver l'objet natif.


Votre configuration machine est parfaitement appropriée à un serveur Postgresql
http://ark.intel.com/Product.aspx?id=30781
Vote O/S Linux est installé en 32 ou en 64 ?
Si on compile une deuxième instance postgresql en parallèle cela ne change absolument rien à votre ensemble pré-existant...

Cordialement
bustaf est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/07/2011, 12h07   #9
Membre du Club
 
Homme
Ingénieur TIC
Inscription : mars 2010
Messages : 87
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur TIC
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mars 2010
Messages : 87
Points : 59
Points : 59
Bonjour,

Merci beaucoup pour votre feedback, mon linux est installé en 32 bits.
Donc je recompile une deuxième instance de postgresql et je réalise les rectifications et je vous tiens en courant des nouveautés.

Excellente journée.
ratata est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 13h59   #10
Membre du Club
 
Homme
Ingénieur TIC
Inscription : mars 2010
Messages : 87
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur TIC
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mars 2010
Messages : 87
Points : 59
Points : 59
Bonjour Bustaf,

vous êtes vraiment une perle, merci beaucoup d'avoir pris la peine et aussi d'avoir consacré le temps pour résoudre la problématique, effectivement j'ai compilé et installé une nouvelle instance de postgreSQL à partir du code source, aussi pour tous les includes qui existent dans mes fichier ".h" il a fallu mettre la totalité du chemin (depuis la racine).

Un conseil aux personnes qui liront ce post et qui utilisent le SGBD postgreSQL, mieux vaut compiler et installer vous-même votre SGBD à partir du code source que de suivre la méthode standard d'installation , comme ça vous êtes connaisseur de votre arborescence système et du fait qu'il ne lui manque absolument rien, puisque vous faites tout par vos propres mains, et non pas la machine.

Merci encore bustaf, et bonne journée.
ratata est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2011, 17h22   #11
Membre du Club
 
Homme
Ingénieur TIC
Inscription : mars 2010
Messages : 87
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur TIC
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mars 2010
Messages : 87
Points : 59
Points : 59
Re bonjour,

le seul soucis qui reste, c'est qu'il faut passer par tous les fichier ".h" pour modifier les chemins de leurs include, par contre je crois avoir déjà vu quelque part qu'on peut préciser au moment de la compilation le chemin des librairies , comme ça ce souci ne se présentera plus, il faut juste que je retrouve la syntaxe (je m'en rappelle plus), sinon si tu l'as entre les mains bustaf je t'en remercierais infiniment, entre temps je vais la chercher.

bonne journée.
ratata est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 03h24   #12
Inactif
 
Inscription : novembre 2004
Messages : 247
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 247
Points : 217
Points : 217
bonjour ratata

Pour les .h
le flag gcc est -I (majuscule)
pour les .a ou .so
le flag gcc est -L (majuscule)

Si ça ne marche pas ne vous prenez pas la tête,
patientez juste un petit moment je vais installer une Ubuntu en 32 pour voir ce qui ne va pas.
j'utilise une Debian 6 , normalement Ubuntu c'est la même base .

Cordialement
bustaf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 12h18   #13
Membre du Club
 
Homme
Ingénieur TIC
Inscription : mars 2010
Messages : 87
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur TIC
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mars 2010
Messages : 87
Points : 59
Points : 59
Bonjour Bustaf,

effectivement, j'avais testé hier cette commande avec cette option, mais ça donne toujours le même soucis j'ai utilisé comme PATH : /user/local/pgsql/include.

pour Ubuntu c'est une distribution de la famille Debian ??

Excellente journée.
ratata est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 14h00   #14
Inactif
 
Inscription : novembre 2004
Messages : 247
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 247
Points : 217
Points : 217
Bonjour ratata
Oui Ubuntu est générée à partir d'une base Debian
C'est une distribution de très grande qualité qui est
gérée par une équipe très sérieuse et très compétente.
Cordialement
bustaf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 12h31   #15
Inactif
 
Inscription : novembre 2004
Messages : 247
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 247
Points : 217
Points : 217
Bonjour ratata
J'ai installé une Unbuntu 10.04 (32)
ça fonctionne parfaitement comme sous Debian
postgres@bustaf-desktop:/usr/local/pgsql/bin$ ./psql base
psql (9.0.4)
Type "help" for help.

base=# CREATE FUNCTION projet(integer) RETURNS integer AS '/usr/lib/projet', 'projet' LANGUAGE C STRICT;
CREATE FUNCTION
base=#


Le compilateur GNU d'origine (Ubuntu 10.04)
root@bustaf-desktop:/usr/local/pgsql/bin# gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
root@bustaf-desktop:/usr/local/pgsql/bin#


dans /usr/local/pgsql/include/server/utils/elog.h
ligne 69 vous désactivez //#include "utils/errcodes.h"
Dans la fonction
Code :
1
2
3
#include "/usr/local/pgsql/include/server/postgres.h"
#include <string.h>
#include "/usr/local/pgsql/include/server/fmgr.h"
uniquement
(je termine les explications ce soir) j'ai du TAF .....

(la suite .....)
Avec une Unbuntu 10.04 (32)
Menu Applications -> accessoires-> terminal
sudo -s (votre password est demandé pour passer en root)
aptitude install libreadline-dev libreadline6 libreadline6-dev flex
zlib1g-dev zlib1g sed automake
téléchargez les sources de pg 9.0.4
http://wwwmaster.postgresql.org/redi...l-9.0.4.tar.gz
mkdir /usr/src/download (création d'un répertoire pour compiler)
chmod -R 777 /usr/src/download (ouverture complète des droits sur ce repertoire)
cp votre_rep_de_telechargemnet/postgresql-9.0.4.tar.gz /usr/src/download
cd/usr/src/download
tar xvfz postgresql-9.0.4.tar.gz (décompression de l'archive)
cd postgresql-9.0.4
./configure (il n' y a pas d'erreurs logiquement)
make --jobs=2 (compilation avec 2 forks)
(Après quelques minutes La compilation se termine sans erreurs)
adduser postgres (création d'un utilisateur postgres (je lui donne un passwd uniquement))
su postgres (je passe en utilisateur postgres)
time make check
je vois 120 tests OK et le temps (time)
exit (je reviens en root)
make install (une instance s'installe dans /usr/local/pgsql)
cd /home
mkdir pgsql (création du répertoire de la base de données)
chmod -R 0700 pgsql (Droits d’accès)
chown -R postgres pgsql (propriété)

su postgres (je passe en utilisateur postgres)
./initdb -D /home/pgsql (initialisation l'instance dans le répertoire /home/pgsql)
exit (je reviens en root)
cd /usr/local/pgsql/bin
création du fichier projet.c
Code :
1
2
3
4
5
6
7
8
9
10
 
#include "/usr/local/pgsql/include/server/postgres.h"
#include <string.h>
#include "/usr/local/pgsql/include/server/fmgr.h"
PG_MODULE_MAGIC;
 
int projet(int arg)
{
  RETURN arg + 1;
}
dans /usr/local/pgsql/include/server/utils/elog.h
ligne 69 a desactiver //#include "utils/errcodes.h"

gcc -fPIC -c projet.c
gcc -shared -o projet.so projet.o
cp projet.so projet.o /usr/lib
ldconfig

su postgres (je passe en utilisateur postgres)
./pg_ctl -D /home/pgsql start (démarrage de l'instance)
./createdb base (création d'une base bidon pour le test)
./psql base (ouverture dans la base base)
CREATE FUNCTION projet(integer) RETURNS integer AS '/usr/lib/projet', 'projet' LANGUAGE C STRICT;

La fonction se charge....
Pour votre processeur avant de compiler ou le ./configure de postgres tapez
export CFLAGS="-mtune=core2"

Avec votre type de processeur essayez en O/S 64 je pense que c'est plus judicieux.
Pour PG la 9.04 me semble très fiable et bien plus performante que la série des 8.x ..
c'est à vous de voir ....
Cordialement


bustaf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 10h43   #16
Membre du Club
 
Homme
Ingénieur TIC
Inscription : mars 2010
Messages : 87
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Ingénieur TIC
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : mars 2010
Messages : 87
Points : 59
Points : 59
ReBonjour,

Merci beaucoup bustaf, effectivement, je suis déjà passé par l'installation à la main de postgresql 9.04, et ma première petite fonction avait bien marché en modifiant les chemins des entêtes de mes fichiers ".h auxquels je fait appel, la problématique que j'avais annoncé venait du fait qu'avec d'autres fonctions on fera appel à d'autres fichiers ".h" dont il faudra aussi modifier les chemins des entêtes, ce qui nous laisse penser qu'il faut modifier les entêtes de tous les fichiers ".h" du dossier /usr/local/pgsql/include/, chose que j'ai faite

Bon, là c'est résolu en entier, merci encore, je cherche juste une référence pour pouvoir écrire des fonctions C très avancées, surtout que je n'arrive pas à trouver l'équivalent de "GetAttributeByName" en input "le set en BD" , et je vois bien que ce poste sera une petite première capitalisation pour le forum et pour les personnes qui désirent s'initier en développement des procédures stockées en langage C.

Passez une agréable journée.
ratata est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 14h13   #17
Inactif
 
Inscription : novembre 2004
Messages : 247
Détails du profil
Informations forums :
Inscription : novembre 2004
Messages : 247
Points : 217
Points : 217
Bonjour ratata
Lisez ce lien.
http://www.postgresql.org/docs/9.0/static/xfunc-c.html
Cordialement
bustaf est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h29.


 
 
 
 
Partenaires

Hébergement Web