SQLite module
説明
GNU emacs(x64)で実装したダイナミックロード機能の実働サンプルです。emacsにSQLite機能を追加します。
ダウンロード
sqlite_dll-20120129.zip 使用許諾条件はGPL V2です。インストール
sqlite3.dllを任意の場所に展開してください
コンパイル
- ソースからコンパイルする場合はまず以下を入手してください。
- Miscrosoft SDK for windows 6.1とそれに付属のVC++2008
emacs本体のVCランタイムとバージョンを合わせる必要があります
Miscrosoft SDK for windows 6.1(Windows SDK for Windows Server 2008 and .NET Framework 3.5) - SQlite 以下を入手後展開してください。
sqlite-amalgamation
- Miscrosoft SDK for windows 6.1とそれに付属のVC++2008
- Miscrosoft SDK for windows 6.1のCMD Shellから以下のコマンドにてdllを生成します。
"c:\Program Files\GNU\emacs23\bin\dl-nmake" "SQLITE3=SQLITEwを展開したパス"
使用法
いきなりですがサンプルコードです。
(defun trace (conn s) (insert (format "---- %s\n" s))) (defun sqlite3-sample (dll-name) (interactive "fsqlite3.dll filename: ") (let* ((library-id (load-dynamic-library dll-name)) (db-name ":memory:") (conn (sqlite3-open db-name :sqlite-open-create :sqlite-open-readwrite)) (buffer (get-buffer-create "*SQLite sample output*")) stmt) ;; create table (with-current-buffer buffer (pop-to-buffer buffer) (erase-buffer) (insert (prin1-to-string conn) "\n") (sqlite3-execute conn "create table files (name text, 'user' text, 'group' text, size integer)") (setq stmt (sqlite3-prepare conn "insert into files values(?, ?, ?, ?)")) (insert (prin1-to-string stmt) "\n") (dolist (f (directory-files-and-attributes (if (getenv "emacs_dir") (expand-file-name "lisp" (getenv "emacs_dir")) (car load-path)) nil nil t t)) (sqlite3-step stmt nil (nth 0 f) (nth 3 f) (nth 4 f) (nth 8 f))) (sqlite3-finalize stmt) (setq stmt (sqlite3-prepare conn "select * from files where name like 'f%.el' order by size" )) (let (result) (while (vectorp (setq result (sqlite3-step stmt :sqlite-vector))) (insert (format "--> %s %s %s %s\n" (aref result 0) (aref result 1) (aref result 2) (aref result 3))))) (sqlite3-finalize stmt) (sqlite3-close conn) (unload-dynamic-library library-id))))
オブジェクト
- sqlite3-connオブジェクト
sqlite3-openで作成します - sqlite3-stmtオブジェクト
sqlite3-prepare-statementで作成します - sqlite3-contextオブジェクト
sqlite3-create-functionで作成される、スカラー関数または集約関数で使用します。
関数
SQLiteのCインターフェースとほぼ同一です。リターン値はエラーシンボル, ROW(vectorまたはalist), または文字列,数値などのSQL値、メタ情報を表す文字列です。
詳しくはload-dynamic-library後にdescribe-function(\C-h f)で確認してください。
- sqlite3-open
sqlite3_open_v2を呼び出します。ファイル名に続けてフラグを指定します。最後の引数がStringの場合はvfsオプションとしてsqlite3_open_v2に渡します。 - sqlite3-enable-load-extension
- sqlite3-close
- sqlite3-execute
- sqlite3-prepare
- sqlite3-sql
- sqlite3-bind
sqlite3_bindを呼び出します。:名前を前置することで名前付けバインディングも利用できます。
バインディング型は引数の型から判別しますが、:sqlite_integer, :sqlite_float, :sqlite_blob, :sqlite_text, :sqlite_nullを前置することで強制することも可能です。 - sqlite3-step
sqlite3_stepを呼び出します。
第1引数で実行結果の返却方法を指定します。nilの場合は実行結果を表すエラーシンボル、:sqlite-vectorの場合は実行結果をベクター、:sqlite-alistの場合はalistで返します。
第2引数が与えられた場合はsqlite3_step実行前にそれぞれの引数に対してsqlite3_bindを行います。 - sqlite3-column-name
- sqlite3-column-value
- sqlite3-column-decltype
- sqlite3-column-count
- sqlite3-reset
- sqlite3-finalize
- sqlite3-result-blob
- sqlite3-result-zeroblob
- sqlite3-result-double
- sqlite3-result-int
- sqlite3-result-null
- sqlite3-result-text
- sqlite3-result-error
- sqlite3-result-error-toobig
- sqlite3-result-error-nomem
- sqlite3-result-error-code
- sqlite3-aggregate-context
- sqlite3-create-function
- sqlite3-trace
- sqlite3-connection-list
オープンしているデータベースコネクションのリストを返します。
フラグ
sqlite-openのファイル名に続けて任意の組み合わせを列挙します。
:sqlite_open_readonly,
:sqlite_open_readwrite,
:sqlite_open_create,
:sqlite_open_deleteonclose,
:sqlite_open_exclusive,
:sqlite_open_autoproxy,
:sqlite_open_uri,
:sqlite_open_main_db,
:sqlite_open_temp_db,
:sqlite_open_transient_db,
:sqlite_open_main_journal,
:sqlite_open_temp_journal,
:sqlite_open_subjournal,
:sqlite_open_master_journal,
:sqlite_open_nomutex,
:sqlite_open_fullmutex,
:sqlite_open_sharedcache,
:sqlite_open_privatecache,
:sqlite_open_wal
エラーシンボル
SQLITE_OKはt, SQLITE_ERRORはnil, その他は以下のシンボルに対応します。
sqlite-done,
sqlite-row,
sqlite-notadb,
sqlite-range,
sqlite-format,
sqlite-auth,
sqlite-nolfs,
sqlite-misuse,
sqlite-mismatch,
sqlite-constraint,
sqlite-toobig,
sqlite-schema,
sqlite-empty,
sqlite-protocol,
sqlite-cantopen,
sqlite-full,
sqlite-notfound,
sqlite-corrupt,
sqlite-ioerr,
sqlite-interrupt,
sqlite-readonly,
sqlite-nomem,
sqlite-locked,
sqlite-busy,
sqlite-abort,
sqlite-perm,
sqlite-internal,
sqlite-readonly-cantlock,
sqlite-readonly-recovery,
sqlite-corrupt-vtab,
sqlite-cantopen-notempdir,
sqlite-busy-recovery,
sqlite-locked-sharedcache,
sqlite-ioerr-seek,
sqlite-ioerr-shmmap,
sqlite-ioerr-shmlock,
sqlite-ioerr-shmsize,
sqlite-ioerr-shmopen,
sqlite-ioerr-dir-close,
sqlite-ioerr-close,
sqlite-ioerr-lock,
sqlite-ioerr-checkreservedlock,
sqlite-ioerr-access,
sqlite-ioerr-nomem,
sqlite-ioerr-blocked,
sqlite-ioerr-delete,
sqlite-ioerr-rdlock,
sqlite-ioerr-unlock,
sqlite-ioerr-fstat,
sqlite-ioerr-truncate,
sqlite-ioerr-dir-fsync,
sqlite-ioerr-fsync,
sqlite-ioerr-write,
sqlite-ioerr-short-read,
sqlite-ioerr-read,