sql >> データベース >  >> RDS >> PostgreSQL

PL / Ruby forPostgreSQL8.3のインストール

    OK、なんとかハンドビルドできました これ(壊れやすいをバイパスする extconf.rbとmakefile)成功した​​ビルドのログファイルをグーグルで検索し、そこで見たgcc行から始めて、それが機能するまでgccコンパイルフラグとパスをいじります。

    plruby.hで、以下に示すようにSAFE_LEVELを0に変更します

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

    シェルからそれぞれをコンパイルしてからリンクします

    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);
    

    型「変換」を有効にする他のビルドオプションがあります。上記のビルドは最も単純なものであり、すべての関数パラメーターは実際には文字列としてルビーになります(int4として宣言されている場合でも)。したがって、ここで「to_i」を呼び出す必要があります。 。




    1. ユーザーアクティビティフィード(Facebook)。同様の活動をグループ化する方法は?

    2. 列としてのSQLクエリフィールド

    3. OracleのSYS_CONTEXTに代わるPostgreSQLおよび/またはSQLServer

    4. mysqlデータを3列に分割するエラー