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.
[ Vous devez
vous connecter pour poster des commentaires ]
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.
[ Vous devez
vous connecter pour poster des commentaires ]
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);
}
[ Vous devez
vous connecter pour poster des commentaires ]
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 ??
[ Vous devez
vous connecter pour poster des commentaires ]