PostgreSQL
La base de données la plus sophistiquée au monde.

Ouverture de session

Navigation

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  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  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

Créer des fonctions externes en langage C

Technique - général | Créer des fonctions externes en langage C

Par mangomojito le 28/12/2006 - 15:44

Salut,

J'ai lu la doc de Postgresql 8.2 sur le site PostgreSQLFr à propos des possibilités d'extension de postgres en langage C. Chose pratique lorsqu'on veut faire des calculs mathématiques ou autre traitements rapides. Les types qui peuvent être mis en paramètres des fonctions sont indiqués dans un tableau récapitulatif. Malheureusement, j'ai l'impression qu'il est impossible de mettre en paramètre ou de renvoyer des tableaux multidimensionnels. Est-ce que je me trompe ?

Dans l'affirmative, quelqu'un pourrait il me dire si un tel passage ou renvoi de paramètres est possible ? Et si de plus on peut mettre en paramètres de fonction des types composites qui sont également constitués de tableaux multidimensionnels ?

Dans la négative, pourriez vous me dire une solution alternative pour traiter ce type de données autre que celle qui consisterait à utiliser le PL/PGSQL ?

Dans le cas où le PL/PGSQL est la seule solution pour traiter des tableaux multidimensionnels, est-ce que la perte de performance est importante par rapport à un module externe ?

J'espère que vos réponses seront nombreuses. A bientôt,

Mangomojito.

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

Il vaut mieux utiliser le pl/

sparky/ = 28 Décembre, 2006 - 19:23

Il vaut mieux utiliser le pl/pgsql, tu n'auras de pertes de performances. Personnellement je préfère avoir le code du coté de la base de données quand c'est possible.


le pl/pgsql oui, mais ...

mangomojito/ = 2 Janvier, 2007 - 10:12

Pour ce qui est de la perte de performance, elle doit exister. Mais dans quelle proportion ? Dans la doc il est bien précisé que pour des algorithmes critiques les modules C sont les bienvenus.

Je cherche réellement à savoir si cette solution est possible pour justement réutiliser des algorithmes déjà programmés en C sans avoir à les traduire en pl/pgsql et pour pouvoir les piloter à partir de Postgres directement par le biais de triggers ou autres fonctions.

Avec la fin des fêtes de fin d'années j'espère recevoir plus de réponses à ce sujet.

Sur ce, meilleurs voeux et bonne année 2007 à tous.


Pour ce qui est de la perte d

sparky/ = 2 Janvier, 2007 - 10:53

Pour ce qui est de la perte de performance, elle doit exister. Pas forcément tous dépende de ce qui est traité, pour les algo simples avec beaucoup d'opérations sur la db tu auras même une amélioration des perf. Algorithme complexe avec peu d'opérations doivent être hors de la base de données.

As-tu déjà regardé http://docs.postgresqlfr.org/8.2/xfunc-c.html
Par exemple, supposons que nous voulions écrire une fonction qui accepte un argument de n'importe quel type et qui renvoie un tableau uni-dimensionnel de ce type :

PG_FUNCTION_INFO_V1(make_array);
Datum
make_array(PG_FUNCTION_ARGS)
{
ArrayType *result;
Oid element_type = get_fn_expr_argtype(fcinfo->flinfo, 0);
Datum element;
bool isnull;
int16 typlen;
bool typbyval;
char typalign;
int ndims;
int dims[MAXDIM];
int lbs[MAXDIM];

if (!OidIsValid(element_type))
elog(ERROR, "could not determine data type of input");

/* get the provided element, being careful in case it's NULL */
isnull = PG_ARGISNULL(0);
if (isnull)
element = (Datum) 0;
else
element = PG_GETARG_DATUM(0);

/* we have one dimension */
ndims = 1;
/* and one element */
dims[0] = 1;
/* and lower bound is 1 */
lbs[0] = 1;

/* get required info about the element type */
get_typlenbyvalalign(element_type, &typlen, &typbyval,
&typalign);

/* now build the array */
result = construct_md_array(&element, &isnull, ndims, dims, lbs,
element_type, typlen, typbyval, typalign);

PG_RETURN_ARRAYTYPE_P(result);
}


pb de droit à la lecture de la lib C contenant les fonctions

agnes Terrasse/ = 12 Janvier, 2007 - 19:48

Bonjour,
je suis en CentOS 4.4 et PostgreSQL 7.3.1

Je souhaite définir des fonctions C sur triggers.

Après avoir lu la doc postgres j'ai écrit un fichier
insert_bd.c
dedans une focntion
#include "postegres.h"
int insert() {
printf'"%s","insersion");
return 1;
}
----
je compile: gcc -fpic -c insert_bd.c
je crée la lib : gcc -shared -o insert_bd.so insert_bd.o

dans trigger.sql
CREATE FUNCTION insert[) RETURNS INTERGER
AS '/home/moi/src/C/insert_bd', 'insert'
LANGUAGE C;
\g
CREATE TRIGGER tafter AFTER INSERT OR UPDATE ON table_test
FOR EACH ROW EXECUTE PROCEDURE insert();
\g

sous psql
\i trigger.sql \g
RESULTAT:MESSAGE ERREUR
psql: /home/moi/src/C/insert_bd:4 ERREUR: Impossible d'accéder au fichier '/home/moi/src/C/insert_bd' : Permission non accordée

--------- j'ai changé tout le chemin et les fichiers insert_bd* en rxw pour tout le monde ... Alors je ne comprend plus et ne sais plus que faire....

Une Idée ??


Bonjour Il faut que le pro

Christophe Chauvet/ = 14 Janvier, 2007 - 17:01

Bonjour

Il faut que le propriétaire soit le même que celui qui a lancé le service PostgreSQL.

Cordialement.

Christophe Chauvet
KrysKool.org


© PostgreSQLFr, tous droits réservés.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.