ubuntu12.04(x64)にplv8入れてみる
Postgresでjavascriptが書けるってやつを試してみました
まずは環境作りから
※postgresql9.1インストール済
V8 Engineインストール
sudo apt-get install python scons gcc g++ svn cd /usr/local/src svn checkout http://v8.googlecode.com/svn/trunk/ v8 cd v8 scons mode=release library=shared snapshot=on arch=x64 sudo cp libv8.so /lib/
PL/V8インストール
sudo apt-get install mercurial sudo apt-get install postgresql-server-dev-9.1 cd /usr/local/src wget https://plv8js.googlecode.com/files/plv8js-20120719.tar.gz tar zxvf plv8js-20120719.tar.gz cd plv8js make sudo make install sudo cp -pR /usr/local/src/plv8js/sql /usr/share/postgresql/9.1/contrib/plv8js
インストールしたモジュールPostgresに追加
cp -p /etc/postgresql/9.1/main/postgresql.conf /etc/postgresql/9.1/main/postgresql.conf.org sudo /etc/init.d/postgresql stop vi /etc/postgresql/9.1/main/postgresql.conf >> custom_variable_classes = 'plv8' sudo /etc/init.d/postgresql start
んじゃDBにも関数とか反映
sudo su - postgres psql -c 'CREATE EXTENSION plv8' -d データベース名 psql -f /usr/share/postgresql/9.1/contrib/plv8js/plv8.sql -d データベース名
これで一通り準備は完了したのでJSしてみる
READMEにあったやつ
CREATE OR REPLACE FUNCTION plv8_test(keys text[], vals text[]) RETURNS text AS $$ var o = {}; for(var i=0; i<keys.length; i++){ o[keys[i]] = vals[i]; } return JSON.stringify(o); $$ LANGUAGE plv8 IMMUTABLE STRICT; SELECT plv8_test(ARRAY['name', 'age'], ARRAY['Tom', '29']); plv8_test --------------------------- {"name":"Tom","age":"29"} (1 row)
とりあえずループ文
CREATE OR REPLACE FUNCTION plv8_test(startval integer, endval integer) RETURNS integer AS $$ var o = 0; for(var i=startval; i<=endval; i++){ o += i; } return o; $$ LANGUAGE plv8 IMMUTABLE STRICT; SELECT plv8_test(1,10); plv8_test ----------- 55 (1 row)
とりあえずJS関数
CREATE OR REPLACE FUNCTION plv8_test() RETURNS text AS $$ var dd = new Date(); return dd.toLocaleString(); $$ LANGUAGE plv8 IMMUTABLE STRICT; SELECT plv8_test(); plv8_test ----------------------------------------- Tue Sep 18 2012 11:39:24 GMT+0900 (JST) (1 row)
とりあえず自前関数
CREATE OR REPLACE FUNCTION plv8_test() RETURNS text AS $$ var aa = "first"; sage(); hoge(); return aa; function hoge(){ aa = "hoge"; } function sage(){ aa = "sage" } $$ LANGUAGE plv8 IMMUTABLE STRICT; SELECT plv8_test(); plv8_test ----------- hoge (1 row)
変数のスコープ回りを試してみる
CREATE OR REPLACE FUNCTION plv8_test() RETURNS text AS $$ var aa = "first"; sage(); hoge(); return aa; function hoge(){ var aa = "hoge"; } function sage(){ var aa = "sage" } $$ LANGUAGE plv8 IMMUTABLE STRICT; SELECT plv8_test(); plv8_test ----------- first (1 row)
生成結果
\df plv8_test List of functions Schema | Name | Result data type | Argument data types | Type --------+-----------+------------------+----------------------------------+-------- public | plv8_test | text | | normal public | plv8_test | text | keys text[], vals text[] | normal public | plv8_test | integer | startval integer, endval integer | normal (3 rows)
個人的には配列周りが描きやすくなるかもねって感想です
※参考サイト(ここのWiki)
https://code.google.com/p/plv8js/