思いつきメモ Lisp
SolrをJSONで使うときにはまったことのメモ
Apache Solrの検索機能を試してみた。自作Lispアプリからdrakmaを使用してJSONによりデータを追加しようとした。
結論からすると、Solrは、JSONの文字列は、シングルクオートではなく、ダブルクオートでないとエラーになる。
自分の調べた範囲では、JSONとしてはシングルクオートでもダブルクオートでも文字列としてvalidである(らしい)ので、これはSolr側の問題であると思う。
Parenscriptを使用して文字列を作ると、シングルクオートで囲われてしまう。代わりに、CL-JSONを使用することにした。こちらはなかなか使い方が難しかったが、
(defun get-insert-answer-json (id uid qid ans)
(with-output-to-string (stream)
(json:with-object (stream)
(json:as-object-member (:add stream)
(json:with-object (stream)
(json:encode-object-member "doc"
`((id . ,id) (uid_i . ,uid) (tp_i . 2 ...
MySQL + cl-mysql によるPrepared Statement
あまり詳しく調査はしていないが、clsqlでもMySQLでのPrepared Statementはそれほどうまく動作しないらしい。それで、cl-mysqlでもできないか調べてみた。
Prepared Statementには2種類の実装方法がある。動的、静的とそれぞれ呼ばれている。最近のMySQLは静的Prepared Statementを実装している。ここを参照。それでPrepared StatementでSQLを実行し、結果を返す関数は次のように実装できた。
(defun with-prepared-statement (st &rest arg)
(cl-mysql:query (format nil "PREPARE stmt1 FROM '~a';" st))
(let ((syms (loop for x from 1 to (length arg)
for sym = (gensym)
collect sym)))
(loop for param in syms ...
quicklisp + mysql メモ
自分用のメモ。
quicklispでmysqlに接続するには、cl-msyqlというパッケージかclsqlを使う。cl-mysqlはまだprepared statementが実装されていなさそう(嘘かも)。なのでclsqlを使う。
(ql:quickload "clsql")ではuffi(lispからC関数を呼び出すためのライブラリ?)やmysqlへの接続用ダイナミックライブラリを作るのにCコンパイラとmakeが必要。それとmysql.hが無いと、clsqlに含まれているclsql_mysql.cのコンパイルができない(これはdb-mysqlディレクトリにclsql_mysql.soが存在するかで確認する)。しかし、これらのコンパイルに失敗しても(ql:quickload "clsql")自体はエラーを出力しないようだ。実際にclsql:connectをするときにエラーになる。とにかく原因追求が大変だった。