スポンサードリンク


Warning: Illegal string offset 'cache_time' in /home/fumi/public_html/wp-content/plugins/tweetable/tweetable.php on line 404

GaucheでmysqlのDBにINSERTするときに一意性制約違反をハンドリングする方法

Gaucheのmysqlのdbdを使って、Gauche状からmysqlのデータベースに対してINSERTするときのお話(メモ)です。

  • 「エラーにしたくない」だけであれば……

mysqlの機能を使って、”INSERT IGNORE …” というSQLとすれば一意性制約違反になるようなレコードは挿入されず捨てられエラーとはならない。

  • ちゃんと捕まえるためには……

例外を捕まえて、その中で一意性制約違反の場合の処理を入れます。具体的には以下のようなコードとする必要がある。

(guard (e
        ((<dbi-error> e)
         (if (= (condition-ref e 'error-code) 1062)
             unique-error ;; ここが一意性制約違反
             (raise e)))
        (else (raise e)))
       (dbi-execute hogehoge-sql))

1062 というのが、一意性制約違反のエラーコードとなる。(MySQL :: MySQL 4.1 リファレンスマニュアル :: 12.1 返されるエラー 参考)

# SQLSTATEを取得する方法って無いのかな???

参考リンク:
dbd.mysql | DBI | dev | Kahua Project

scmailをLinuxサーバにインストール

scmailをLinuxサーバにインストールし、実際に使用するところまで。

今まで scmail はwindows側のCygwin環境上に乗せ、fetchmail と組合せて使っていたのだが、あまりにも遅く、使い物にならないので家のLinux(CentOS)サーバで、fetchmail+scmailを実行させるように変更した。その時のメモ。

scmail-1.3.tar.gz をダウンロードし展開する

/usr/local 直下にインストールされるのは嫌なオールドタイプなので、Makefile を修正する。

PREFIX = /usr/local/scmail

そしてMake。これまたgaucheのPATHを指定してmakeコマンドを実行し、インストール

$ PATH=/usr/local/gauche/bin:$PATH make
$ su
# PATH=/usr/local/gauche/bin:$PATH make install

Cygwin上で使っていた dbm ファイルをLinux上にコピーして状態を確認したところ、以下のようなエラーとなって確認できない。どうやらgdbmのバージョン相違?アーキテクチャ依存?なのかは分からなかったが使えないようだ。。。

$ /usr/local/scmail/bin/scbayes --table-stat
gdbm fatal: read error

しょうがないので、手持のSPAMから再学習させようと思ったところ、これまた以下のようなエラーとなってしまった。なかなかうまくいかない。

$ /usr/local/scmail/bin/scbayes --learn-spam `pwd`
scbayes: .scmail/token-table.dbm is now being updated
scbayes: or perhaps .scmail/token-table.dbm,lock is staled.
scbayes: (Please remove the lock file if it is staled.)

上記エラーについてググったところ、調査をしてくれたサイトを見つけることができた。

作ろうとするディレクトリがすでにある場合の戻り値が0.8.14と0.9で違っている。

同サイトにはパッチもあるためそのパッチを当てたところ正常に動作することが確認できた。良かった。

Google Suggestion を SKK に取り込んでみる!?

google日本語入力のメリットの一つである「固有名詞に強い」をSKKにも取り込んでみる試み。

Google Suggestion の機能をSKKの変換に取り込んでみました。

知らない方にご説明すると、Google Suggestion とは検索時に表示してくれるアレです。以下のような機能です。

実はこのときブラウザでは JavaScript の機能を使って(?)、http のやりとりをしていますので、それを使えば同じようにクエリに対してのGoogle先生のサジェストが貰えると考えた。調べてみると、以下のようなクエリを発行するようだ。

http://www.google.co.jp/complete/search?output=toolbar&q=%e3%81%8b%e3%82%8a%e3%81%90%e3%82%89%e3%81%97

結果として取得できるのは以下のようなxml

<?xml version="1.0"?>
<toplevel>
  <CompleteSuggestion>
    <suggestion data="借りぐらしのアリエッティ"/>
    <num_queries int="1330000"/>
  </CompleteSuggestion>
  <CompleteSuggestion>
    <suggestion data="借りぐらしのアリエッティ×種田陽平展"/>
    <num_queries int="24600"/>
  </CompleteSuggestion>
  (中略)
</tolevel>

このXMLをパーズして、サジェストをSKK側に返してあげれば良い。

XMLの解析もやりやすいという理由から、gauche で実装してみた。gauche は Linuxサーバ上で動かしているため、wceSKKSERVのSKKサーバのプロキシ機能を使う。かなりやっつけながら一応できました。固有名詞を良く入力する人であれば便利だと思います。

スクリーンショット:

gaucheのソースコードを置いておきます。gaucheウィザードから見ると酷い実装なのは分かっていますが、初心者なのでうまい実装が思い付いていません。デバッグコードも各所に入れて汚ないです。

skk_google_suggest.zip