日々の記録。

プログラミングのメモや感じた事などを記録。

FileMaker ProとRubyを接続してみた。

最近FileMaker Pro(以下FM)というDBを利用する機会があったのですが、このFMのスクリプトがどうしても好きになれず、rubyスクリプトが書けないか模索してみました。

(好きになれない理由: FMではスクリプトを作成するために、本来のテーブル構造には不要なテーブルオカレンスやらフィールドを追加しなければならず、構造が汚れるのが嫌。簡潔から遠のく感じがします。)

結論

先に結論を書くと、ODBCによる接続はあきらめました。

色々なサイトを参考(※1)にして、FileMaker〜iODBC間の接続は行えたのですが、ruby-odbc〜iODBC間でSQLを発行すると、select文でsegmentation faultが発生することがあり、これがどうしても解決できずあきらめました。(どうやらruby-odbcruby1.9.1 (32bit)までしか対応していない?)

※1 参考にしたサイト

で、接続できた環境は以下の通りです。 rubyJDBCって接続できる環境ない?って思ったのが解決のきっかけでした。

・・・rubyはあきらめて、Javaruby実装であるjRubyで接続する事にしました。 今までjRubyの使い道ってどこにあるんだろうと思っていましたが、こんなところで使うことになるとは思いませんでした。

余談ですが、FileMaker Serverと接続する場合には、もっと良さそうなRfmというgemが存在するので、そちらを使った方が良いと思います。

手順

具体的な導入手順です。

1: jRubyをインストールする.

http://jruby.orgより、jRubyの最新版(バイナリ版)を任意のフォルダにダウンロードします。

以下は一例

# jRuby を /usr/local/jRuby-1.7.10  に保存したとします。
cd /usr/local
ln -s jRuby-1.7.10 jRuby_current_version # symbolic linkを設定します。

2: PATHを設定します。

vim ~/.bash_profile # ログインシェルがbashの例
PATH="$PATH":/usr/local/jruby_crrent_version/bin/ #適当な行に追加する.

3: JDKが入っていない場合は、JDKをインストールします。

ダウンロード先 Java SDK Downloads

4: jdbc-helperをインストールします。

参考 jdbc-helper

jRuby -S gem install jdbc-helper

5: FileMakerJDBCドライバをインストールします。

参考 FileMaker Pro ODBCとJDBCガイド

FileMakerインストーラより、fmjdbc.jarを任意のフォルダにコピーします。

コピー先の例 ~/Library/JDBC/fmjdbc.jar

6: classpathの追加

vim ~/.bash_profile # ログインシェルがbashの例
export CLASSPATH=$CLASSPATH:~/Library/JDBC/fmjdbc.jar

以上で、jRuby-JDBCのインストールは終了です。

テスト

FileMaker

1: FileMaker Proでテストをするファイルを開きます。仮に"test.fmp12"とします。

2: ファイル 共有設定で[ODBC/JDBCを有効にする]を選択します。

3: ODBC/JDBC共有をONにして、ファイルのアクセスを[すべてのユーザ]にします。 (必要に応じて制限します)

4: ファイルオプションの[開く]タブにてアカウント名とパスワードを指定します。 (無指定だとJDBCから接続できなかったので、念のため指定します)

注意:接続する際は、test.fmp12は開きっぱなしの必要があります。

ソース

1: test.rb

テストソースを、テスト環境に合わせて作成します。

require 'jdbc-helper'

con = JDBCHelper::FileMaker.connect('localhost', 'testuser', 'password', 'test')
sql = 'SELECT id, name, "点数" FROM "テスト"'
con.query(sql) do |row|
  id, name, score = row
  puts "#{id} #{name} #{score}"
end

con.close

2: 実行

jruby test.rb

以上です。