这是为了使用嵌入式ruby代码开发postgres函数,
但我一直无法建造它.
但我一直无法建造它.
据建议
http://www.robbyonrails.com/articles/2005/08/22/installing-untrusted-pl-ruby-for-postgresql
我正在尝试从ftp://moulon.inra.fr/pub/ruby/提供的最新版本(plruby-0.5.3.tar.gz)构建所需的plruby.so
我已经整理了我的本地postgres设置的位置,并将调用调整为:
ruby extconf.rb --with-pgsql-include=/usr/postgresql-8.3.4/include/server --enable-shared --disable-conversion --with-pgsql-version=83
我已经尝试了很多变化,但它似乎无法成功
‘conftest.c’文件
它说:
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.
以下是我在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 */
当我手动运行gcc行时,它表示没有’conftest.c'(并且没有,但是
它应该是生成的).
'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]
任何帮助和/或建议将不胜感激.
– 迈克贝罗
好的,我设法通过谷歌搜索日志文件来手工构建它(绕过脆弱的extconf.rb和makefile)
一个成功的构建,从我在那里看到的gcc行开始,然后摆弄gcc编译
标志和路径,直到它工作.
一个成功的构建,从我在那里看到的gcc行开始,然后摆弄gcc编译
标志和路径,直到它工作.
在plruby.h中,将SAFE_LEVEL更改为0
如下所示
#ifndef SAFE_LEVEL //#define SAFE_LEVEL 12 #define SAFE_LEVEL 0 #endif
从shell编译每个然后链接
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
将上面构建的’.so’文件放在动态库路径中($libdir)
[使用pg_config确定–pkglibdir给出(在我的情况下)/usr/postgresql-8.3.4/lib]
采用这种方法的其他人很可能不得不做自己的调整.
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;
添加’plruby’作为程序语言
CREATE PROCEDURAL LANGUAGE 'plruby' HANDLER plruby_call_handler;
测试一下:
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);
还有其他构建选项可以启用类型“转换”.上面的构建实际上是最简单的一个和所有函数参数以字符串形式进入ruby(即使它们被声明为int4).因此需要在这里调用’to_i’.