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))
SQLのstatementsを実行する。statementsは0 個以上のSQL文を含んだ文字列であること。Lispプログラムが一度に複数のDDL文(Data Definition Language: データ定義言語)を実行する必要がある場合に、このコマンドが役に立つかもしれない。
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を実行して、bodyが正常に終了した場合には最後にそのトランザクションをコミットする。bodyがエラーをシグナルするかトランザクションのコミットに失敗すると、bodyで行われたdbでの変更はロールバックされる。このマクロは正常終了してコミットが成功すると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
のバッファーをポップアップします。