2009-03-06 5 views
6

est de permettre le développement de postgres fonctions avec le code intégré rubis, mais je n'ai pas été en mesure de le construire.Installation PL/Ruby pour PostgreSQL 8.3

Comme conseillé par http://www.robbyonrails.com/articles/2005/08/22/installing-untrusted-pl-ruby-for-postgresql

Je suis en train de construire le nécessaire plruby.so de la dernière version (plruby-0.5.3.tar.gz) fourni à ftp://moulon.inra.fr/pub/ruby/

J'ai trié où mes postgres locaux mis en place est et ajuster l'invocation à:

ruby extconf.rb --with-pgsql-include=/usr/postgresql-8.3.4/include/server --enable-shared --disable-conversion --with-pgsql-version=83 

J'ai essayé assez grand nombre de variations à ce sujet, mais il ne semble pas être en mesure de faire avec succès le 'Conftest.c' fichier

Il dit ceci:

checking for catalog/pg_proc.h... yes 
*** extconf.rb failed *** 
Could not create Makefile due to some reason, probably lack of 
necessary libraries and/or headers. Check the mkmf.log file for more 
details. You may need configuration options. 

Et voici ce que je finis dans mon mkmf.log

have_header: checking for catalog/pg_proc.h... -------------------- yes 
"gcc -E -I. -I/usr/lib/ruby/1.8/x86_64-linux -I. -I/usr/postgresql-8.3.4/include/server -g -O2 -fPIC conftest.c -o conftest.i" 
checked program was: 
/* begin */ 
1: #include <catalog/pg_proc.h> 
/* end */ 

Quand je lance la ligne gcc manuellement, il dit qu'il n'y a pas de 'conftest.c' (et il n'y en a pas, mais il est censé être généré).

'uname -a' ... gives 
Linux vdev1 2.6.18.8-xen #2 SMP Thu May 8 11:52:29 PDT 2008 x86_64 x86_64 x86_64 GNU/Linux 
'ruby -v' ... gives 
ruby 1.8.6 (2008-08-11 patchlevel 287) [x86_64-linux] 

Toute aide et/ou conseil serait appréciée.

- Mike Berrow

Répondre

5

OK, je réussi à construire main ce (sans passer par le fragile extconf.rb et makefile) par googler un fichier journal de une construction réussie, en commençant par les lignes gcc J'ai vu là-bas, puis tripoter avec le gcc compiler drapeaux et les chemins jusqu'à ce que cela fonctionne.

En plruby.h changer le SAFE_LEVEL à 0 comme indiqué ci-dessous

#ifndef SAFE_LEVEL 
//#define SAFE_LEVEL 12 
#define SAFE_LEVEL 0 
#endif 

Compile chaque coquille de Lien

gcc -I. -I. -I/usr/lib/ruby/1.8/x86_64-linux -I. -DHAVE_CATALOG_PG_PROC_H -DHAVE_RB_HASH_DELETE -DHAVE_ST_H -DHAVE_UTILS_ARRAY_H -I/usr/postgresql-8.3.4/include/server -D_FILE_OFFSET_BITS=64 -fPIC -fno-strict-aliasing -g -g -O2 -fPIC -DHAVE_RB_HASH_DELETE -DHAVE_RB_INITIALIZE_COPY -DPG_UTILS_ARRAY -DPG_PL_TRYCATCH -DPG_PL_VERSION=83 -DPLRUBY_CALL_HANDLER=plruby_call_handler -DPLRUBY_VALIDATOR=plruby_validator -c plruby.c 
gcc -I. -I. -I/usr/lib/ruby/1.8/x86_64-linux -I. -DHAVE_CATALOG_PG_PROC_H -DHAVE_RB_HASH_DELETE -DHAVE_ST_H -DHAVE_UTILS_ARRAY_H -I/usr/postgresql-8.3.4/include/server -D_FILE_OFFSET_BITS=64 -fPIC -fno-strict-aliasing -g -g -O2 -fPIC -DHAVE_RB_HASH_DELETE -DHAVE_RB_INITIALIZE_COPY -DPG_UTILS_ARRAY -DPG_PL_TRYCATCH -DPG_PL_VERSION=83 -DPLRUBY_CALL_HANDLER=plruby_call_handler -DPLRUBY_VALIDATOR=plruby_validator -c plplan.c 
gcc -I. -I. -I/usr/lib/ruby/1.8/x86_64-linux -I. -DHAVE_CATALOG_PG_PROC_H -DHAVE_RB_HASH_DELETE -DHAVE_ST_H -DHAVE_UTILS_ARRAY_H -I/usr/postgresql-8.3.4/include/server -D_FILE_OFFSET_BITS=64 -fPIC -fno-strict-aliasing -g -g -O2 -fPIC -DHAVE_RB_HASH_DELETE -DHAVE_RB_INITIALIZE_COPY -DPG_UTILS_ARRAY -DPG_PL_TRYCATCH -DPG_PL_VERSION=83 -DPLRUBY_CALL_HANDLER=plruby_call_handler -DPLRUBY_VALIDATOR=plruby_validator -c plpl.c 
gcc -I. -I. -I/usr/lib/ruby/1.8/x86_64-linux -I. -DHAVE_CATALOG_PG_PROC_H -DHAVE_RB_HASH_DELETE -DHAVE_ST_H -DHAVE_UTILS_ARRAY_H -I/usr/postgresql-8.3.4/include/server -D_FILE_OFFSET_BITS=64 -fPIC -fno-strict-aliasing -g -g -O2 -fPIC -DHAVE_RB_HASH_DELETE -DHAVE_RB_INITIALIZE_COPY -DPG_UTILS_ARRAY -DPG_PL_TRYCATCH -DPG_PL_VERSION=83 -DPLRUBY_CALL_HANDLER=plruby_call_handler -DPLRUBY_VALIDATOR=plruby_validator -c pltrans.c 
gcc -shared -o plruby.so plruby.o plplan.o plpl.o pltrans.o -L. -L/usr/lib -L/usr/postgresql-8.3.4/lib -L. -Wl,-Bsymbolic -rdynamic -Wl,-export-dynamic -lruby -lpthread -ldl -lcrypt -lm -lc 

Placez le fichier '.donc' construit au-dessus de la bibliothèque dynamique chemin ($ libdir) [déterminé en utilisant pg_config --pkglibdir donnant (dans mon cas) /usr/postgresql-8.3.4/lib]

cette approche devra très probablement faire ses propres réglages.

Ajoutez ces fonctions ...

CREATE OR REPLACE FUNCTION plruby_call_handler() 
    RETURNS language_handler AS 
'$libdir/plruby', 'plruby_call_handler' 
    LANGUAGE 'c' VOLATILE 
    COST 1; 
ALTER FUNCTION plruby_call_handler() OWNER TO postgres; 

CREATE OR REPLACE FUNCTION plruby_validator(oid) 
    RETURNS void AS 
'$libdir/plruby', 'plruby_validator' 
    LANGUAGE 'c' VOLATILE 
    COST 1; 
ALTER FUNCTION plruby_validator(oid) OWNER TO postgres; 

Ajouter 'plruby' comme langue de procédure

CREATE PROCEDURAL LANGUAGE 'plruby' HANDLER plruby_call_handler; 

Test il:

CREATE FUNCTION ruby_max(int4, int4) RETURNS text AS ' 
    if args[0].to_i > args[1].to_i 
     return "The one on the left is bigger" 
    else 
     return "The one on the right is bigger" 
    end 
' LANGUAGE 'plruby'; 

select ruby_max(8, 9); 

Il existe d'autres options de construction pour ce qui permettent aux 'conversions' de type. La construction ci-dessus est la plus simple et tous les paramètres de fonction effectivement entrent dans ruby ​​comme des chaînes (même si elles sont déclarées comme int4). Ainsi, le besoin de l'appel «to_i» ici.