Next: HTMLとXMLの解析, Previous: GnuTLS暗号化, Up: テキスト [Contents][Index]
SQLiteデータベースへのアクセスにたいする組み込みサポートとともにEmacsをコンパイルできます。このセクションではLispプログラムからSQLiteデータベースへアクセスするために利用できる機能について説明します。
この関数はビルトインSQLiteサポートが利用可能なら非nilをリターンする。
SQLiteサポートが利用可能なら、以下の関数を利用できます。
この関数はfileをSQLiteのデータベースファイルとしてオープンする。fileが存在しなければ、新たなデータベースを作成して指定されたファイルに格納する。fileが省略またはnilなら、かわりにインメモリーのデータベースを作成する。
リターン値はデータベースオブジェクト(database object)。これは以下に挙げるほとんどの関数の引数として利用できる。
この述語関数はobjectがSQLiteデータベースオブジェクトなら非nilをリターンする。sqlite-openがリターンしたデータベースオブジェクトは、この述語を満足する。
データベースdbを閉じる。通常はこの関数を明示的に呼び出す必要はない(Emacsのシャットダウンやデータベースオブジェクトがガーベージコレクトされればデータベースは自動的に閉じられる)。
SQLの命令文statementを実行時する。たとえば:
(sqlite-execute db "insert into foo values ('bar', 2)")
オプション引数valuesを与える場合には、それは命令を実行する際に値としてバインドされるリストかベクターのいずれかであること。
(sqlite-execute db "insert into foo values (?, ?)" '("bar" 2))
これは前の例とまったく同じ効果をもつが、より効率的かつ安全である(文字列の解析や挿入を何も行わないので)。
sqlite-executeは通常は影響を受ける行数をリターンする。たとえば‘insert’文は通常だと‘1’をリターンするが、‘update’文は0、あるいはそれより大きい値をリターンするかもしれない。ただし‘insert into … returning …’やその類いのSQL文を使った際には、かわりに‘returning …’によって指定された値がリターンされる。
SQLiteでの文字列は、デフォルトではutf-8として格納されて、テキストの列をselectした場合にはその文字セット(charset)を使って文字列をデコードする。blobの列をselectした場合には、何もデコードせずにrawデータをリターンする(データベースに格納されているバイトを含んだユニバイトをリターンする)。バイナリーデータをblob列にinsertする場合には、デフォルトではsqlite-executeはすべての文字列をutf-8と解釈するため注意を要する。
したがってたとえばgifと呼ばれるユニバイト文字列としてGIFデータをもっている場合には、sqlite-executeにそれが判るように特別にマークする必要がある:
(put-text-property 0 1 'coding-system 'binary gif) (sqlite-execute db "insert into foo values (?, ?)" (list gif 2))
dbからデータをselectしてそれをリターンする。たとえば:
(sqlite-select db "select * from foo where key = 2")
⇒ (("bar" 2))
sqlite-executeの場合と同様に、selectの実行前にバインドする値としてリストまたはベクターをオプションとして渡すことができる:
(sqlite-select db "select * from foo where key = ?" [2])
⇒ (("bar" 2))
これは前の例で用いた手法に比べて、通常はより効果的かつ安全である。
この関数はデフォルトではマッチした行のリストをリターンする(行は列の値のリスト)。return-typeがfullの場合には、リターン値の1つ目の要素として列の名前(文字列のリスト)をリターンする。
return-typeがsetなら、この関数はかわりにステートメントオブジェクト(statement
object)をリターンする。このオブジェクトはsqlite-next、sqlite-columns、sqlite-more-pといった関数を用いて調べることができる。結果セットが小さければ単に直接データをリターンするほうが便利な場合が多いが、結果セットが大きい場合(あるいはそのセットのデータすべてを使いたい場合)には、割り当てられるメモリーが大幅に小さくメモリー効率に優れたsetメソッドを使用すること。
この関数は結果セットstatement(通常はsqlite-selectがリターンしたオブジェクト)の次の行をリターンする。
(sqlite-next stmt)
⇒ ("bar" 2)
この関数は結果セットstatement (通常はsqlite-selectがリターンしたオブジェクト)の列名をリターンする。
(sqlite-columns stmt)
⇒ ("name" "issue")
結果セットstatement(通常はsqlite-selectがリターンしたオブジェクト)からfetchできるデータがまだあるかどうかを調べる述語である。
これ以上statementを使わない場合には、この関数を呼び出すことによってstatementが使用していたリソースが解放される。この関数の呼び出しは通常は必要ない(statementオブジェクトがガーベージコレクトされれば、Emacsがそのオブジェクトのリソースを自動的に解放する)。
dbでトランザクションを開始する。トランザクションにおいてはsqlite-commitによってそのトランザクションがコミットされるまでは、そのデータベースの他の読み取り手は結果にアクセスできない。
dbのトランザクションを終了して、データベースのファイルにデータを書き込む。
dbのトランザクションを終了して、そのトランザクションによって行われたすべての変更を破棄する。
progn(順序を参照)と同様だが、トランザクションとともにbodyを実行して、最後にそのトランザクションをコミットする。
dbにおいてpragmaを実行する。pragmaとは特定のテーブルではなく、通常はデータベース全体に効果を及ぼすコマンドのこと。たとえば不要になったデータのガーベージコレクトをSQLiteに自動的に行わせるには、以下のようにすればよい:
(sqlite-pragma db "auto_vacuum = FULL")
この関数はpragmaが成功すれば非nil、失敗するとnilをリターンする。pragmaの多くは空の新規データベースでのみ発行できる。
名前つきエクステンション(拡張)であるmoduleをデータベースdbにロードする。エクステンションは通常は共有ライブラリーであり、GNUおよびUnixのシステムではファイル名の拡張子として.soがつけられている。
使用中のSQLiteライブラリーのバージョンを表す文字列をリターンする。
SQLiteファイルの内容を一覧したければ、sqlite-mode-open-fileコマンドを使うことができます。これはSQLiteデータベースの調査(と変更)が可能なsqlite-modeのバッファーをポップアップします。
Next: HTMLとXMLの解析, Previous: GnuTLS暗号化, Up: テキスト [Contents][Index]