GObject Introspectionを使っていろいろな言語からGroongaを使う方法

# はじめに

ここでは詳しい説明をしませんが、[GObject Introspection](https://wiki.gnome.org/Projects/GObjectIntrospection)というライブラリーがあります。簡単に言うと、C言語で書かれたライブラリーを各種スクリプト言語から言語バインディングを書かずに使える機能を提供するライブラリーです。

これを使うと、各種スクリプト言語からGroongaをサーバーではなくライブラリーとして使うことができます。まずは、どのように書けるか見てみましょう。Groonga側の準備方法は後で説明します。

# 実例

以下の動作を行うスクリプトを見ていきます。

  * `/tmp/db`にGroongaのデータベースを作る
  * `Users`テーブルを作る
  * テーブルの内容をダンプする

`groonga`を使うと以下のように書ける動作です。

```
% groonga -n /tmp/db
> table_create Users TABLE_HASH_KEY ShortText
[[0,1385995731.14369,0.0537254810333252],true]
> dump
table_create Users TABLE_HASH_KEY ShortText
>
```

## Pythonから使う

まずはPythonでの例を見てみましょう。

```python
from gi.repository import Groonga

def main():
    context = Groonga.Context()
    context.create_database("/tmp/db")
    context.execute_command("table_create Users TABLE_HASH_KEY ShortText")
    print(context.execute_command("dump"))
    # => table_create Users TABLE_HASH_KEY

Groonga.init()
main()
Groonga.fin()
```

`Groonga.Context()`で`context`を作って、`execute_command()`でGroongaのコマンドを実行しているだけです。

このスクリプトの実行には[PyGObject](https://wiki.gnome.org/Projects/PyGObject)が必要です。

## JavaScriptから使う

次にJavaScriptでの例を見てみましょう。

```js
Groonga = imports.gi.Groonga;

function main() {
    var context = new Groonga.Context();
    context.create_database("/tmp/db");
    context.execute_command("table_create Users TABLE_HASH_KEY ShortText");
    print(context.execute_command("dump"));
    // => table_create Users TABLE_HASH_KEY ShortText
};

Groonga.init();
main();
Groonga.fin();
```

このスクリプトの実行には[Gjs](https://wiki.gnome.org/Projects/Gjs)または[Seed](https://wiki.gnome.org/Projects/Seed)が必要です。GjsはMozillaのSpidermonkeyというJavaScript実装を使っていて、SeedはWebKitのJavaScriptCoreというJavaScript実装を使っています。

## Rubyから使う

最後にRubyでの例を見てみましょう。RubyにはRroongaがありますが、それは使っていません。

```ruby
require "gobject-introspection"

module Groonga
end

loader = GObjectIntrospection::Loader.new(Groonga)
loader.load("Groonga")

def main
  context = Groonga::Context.new
  context.create_database("/tmp/db")
  context.execute_command("table_create Users TABLE_HASH_KEY ShortText")
  puts(context.execute_command("dump"))
  # => table_create Users TABLE_HASH_KEY ShortText
end

Groonga.init
main
Groonga.fin
```

[gobject-introspection gem](http://rubygems.org/gems/gobject-introspection)が必要です。

## 実例のまとめ

このように言語バインディングを書かなくてもスクリプト言語からGroongaの機能をサーバーではなくライブラリーとして利用できます。ここでは、Python、Gjs、Seed、Rubyでの例を示しましたが、他にもLuaやPerlやPHPやnode.jsなどいろいろなスクリプト言語でも同じようなことができるはずです。

# 準備

それでは、GObject Introspectionを使ってGroongaを使うための準備方法を説明します。

以下のようにします。

  - Groongaをインストールする（説明省略）
  - [Groonga GObject](https://github.com/groonga/groonga-gobject)をインストールする
  - `GI_TYPELIB_PATH`を設定して実行する

Groongaのインストール方法は[公式ドキュメント](http://groonga.org/ja/docs/install.html)を参照してください。

Groonga GObjectのインストール方法は以下のとおりです。

```
% git clone https://github.com/groonga/groonga-gobject
% cd groonga-gobject
% ./autogen.sh
% ./configure --prefix=/tmp/local
% make
% make install
```

これで`/tmp/local/lib/girepository-1.0/Groonga-1.0.typelib`ができます。

`GI_TYPELIB_PATH`でGObject Introspectionのサーチパスに`/tmp/local/lib/girepository-1.0`を追加すると`Groonga-1.0.typelib`を使えるようになります。

```
% export GI_TYPELIB_PATH=/tmp/local/lib/girepository-1.0:/usr/lib/girepository-1.0
% python /tmp/groonga.py
table_create Users TABLE_HASH_KEY ShortText
```

# まとめ

GObject Introspectionというライブラリーを使って、言語バインディングを書かなくてもスクリプト言語からGroongaの機能をライブラリーとして使う方法を説明しました。