SQLite3と鬼車で正規表現検索 + sqlite3-ruby-1.2.1パッチ当て

力尽きたりバタバタしてたりで放っておいたマトメを。

SQLite3.3.8以降用 正規表現エクステンション(鬼車 VERSION 2.5.8を利用)

sqlite3-onig_20070329.zip

解凍するとソースコードと、IntelMac(.bundle)、Win(.dll)用バイナリが出てきます。
sqlite3.exeを起動して

select load_extension('sqlite3-onig.dll');
select * from tbl where field1 REGEXP 'ABC';

のように使えます。sqlite3-rubyを使ったRubyサンプルも入ってますが、これを実行するには次のパッチを当てる必要があります。

sqlite3-rubyでエクステンションを使うためのパッチ

作業レベルのメモは http://d.hatena.ne.jp/yotaropg/20070223/1172234315 あたりを。

sqlite3-ruby-1.2.1-extpatch.txt
execute_patch.txt

sqlite3-ruby-1.2.1.tar.gz用のパッチファイルと、patch当て実行コマンド。
Windowsな人はコンパイルする環境を作るのが面倒でしょう*1から、MinGWでビルド*2した結果も置いておきます。

sqlite3-ruby-1.2.1-extension_patched_mingw.zip

この書庫内の「lib」を、普通に入れたsqlite3-ruby-1.2.1*3の「C:\ruby\lib\ruby\gems\1.8\gems\sqlite3-ruby-1.2.1-mswin32\lib」と置き換えれば、

require 'rubygems'
require_gem 'sqlite3-ruby'

db = SQLite3::Database.new( ":memory:" )
db.enable_load_extension(1)
db.load_extension('./sqlite3-onig.dll')

db.execute( "create table test_table (id integer, message string)" ) 
db.execute( "insert into test_table values(1, 'Hello, world.')" ) 
db.execute( "insert into test_table values(2, 'Hello, Ruby.')" ) 
db.execute( "insert into test_table values(3, 'Hi, SQLite3.')" ) 
db.execute( "insert into test_table values(4, 'Hi, Ruby on Rails.')" ) 

db.execute( "select * from test_table where message REGEXP 'Hello'" ) { |row|
    p row
}

db.close

みたいに使えます。数十万件レベルなら余裕な速度で動きまする。


ご利用は自己責任で。
適当に作りすぎたので、お使いになった方で「動きが怪しい・・・」と思われたらぜひ教えてくださいまし。

*1:ほかのOSでもコレを使って「ruby extconf.rb」しなおせばOKかな

*2:MinGWだと型名が既存定義とぶつかるため、パッチを当ててからBLOB型をSQLITE3_BLOB型に手で書き換えました。わは。

*3:gem i sqlite3-ruby -r