このページはhttp://www.sqlite.org/capi3.htmlを翻訳したものです (といっても、まだ全然進んでないのですが)。 わかりにくいところは、原文を読んだほうが良いですよ。


SQLite Version 3 のためのC/C++インタフェース

1.0 概略

SQLite version 3.0 は SQLite 2.8.13 のコードを基にして作られていますが、 下位非互換のファイルフォーマット及び API になる予定です。 SQLite version 3.0 では次のような需要に答えるつもりです。

これら3つの機能を実装するためには非互換なデータベースフォーマットに変更する必要があったので、 version 3.0 に移行することになりました。 API の削除のような他の非互換な変更は、 非互換な変更は一度に行った方が良いという理論に基づいて同時に導入されました。

version 3.0 の API は version 2.X の API に似ています。 しかし、いくつか重要な変更があります。 最も注目すべき点として、全ての API 関数や構造体の 最初についていたプレフィックス "sqlite_" が "sqlite3_" に変更される予定です。 これは2つの API の間の混乱を回避し、もし望むならば、 SQLite 2.X と SQLite 3.0 の両方に対して同時にリンクすることが可能になります。

C のデータ型には UTF-16 文字列はありません。 そこで、SQLite は UTF-16 文字列を参照するために void* を使います。 クライアントソフトウェアは void* をシステムに適切な型にキャストすることが出来ます。

2.0 C/C++ インタフェース

2.1 データベースのオープンとクローズ

typedef struct sqlite3 sqlite3;
int sqlite3_open(const char*, sqlite3**, const char**);
int sqlite3_open16(const void*, sqlite3**, const char**);
int sqlite3_close(sqlite3*);
const char *sqlite3_errmsg(sqlite3*);
const void *sqlite3_errmsg16(sqlite3*);
int sqlite3_errcode(sqlite3*);

sqlite3_open() 関数は sqlite3 構造体へのポインタではなく、整数型のエラーコードを返します。 sqlite3_open() と sqlite3_open16() の違いは、sqlite3_open16() では データベースのファイル名を(ホスト国のバイトオーダーの) UTF-16 で受けとることです。

新しいデータベースファイルを作りたい時は、 sqlite3_open16 では UTF-16 を、sqlite3_open では UTF-8 をセットします。

sqlite3_open() の第3引数 "const char**" は、 オープン要求に適用すべきオプションを定義する、NULL で終わるキー/値のペアのリストです。 オプションが無い時は、第3引数は NULL になります。 この余分な引数は、将来のリリースで新たな機能をサポートする時の拡張方法として利用されます。 例えば、将来のリリースでは、暗号鍵/復元鍵を定義するオプションを含んでいるかもしれません。

sqlite3_errcode() 関数は最後に呼んだ主な API の結果コードを返します。 sqlite3_errmsg() は一番最後のエラーについて、英語で書かれたエラーメッセージとして返します。 エラーメッセージは UTF-8 で返され、寿命が短いです。 - 次の SQLite API 関数の呼び出して消えるかもしれません。 エラーメッセージが UTF-16 で返されるという点を除いて、 sqlite3_errmsg16() は sqlite3_errmsg() と同じような動作をします。

SQLite version 3 のエラーコードは version 2 から変更されていません。 エラーコードには次のようなものがあります:

#define SQLITE_OK           0   /* 成功しました */
#define SQLITE_ERROR        1   /* データベースが間違っています、または存在していません */
#define SQLITE_INTERNAL     2   /* SQLite の内部ロジックエラーです */
#define SQLITE_PERM         3   /* Access permission denied */
#define SQLITE_ABORT        4   /* Callback routine requested an abort */
#define SQLITE_BUSY         5   /* The database file is locked */
#define SQLITE_LOCKED       6   /* A table in the database is locked */
#define SQLITE_NOMEM        7   /* A malloc() failed */
#define SQLITE_READONLY     8   /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT    9   /* Operation terminated by sqlite_interrupt() */
#define SQLITE_IOERR       10   /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT     11   /* The database disk image is malformed */
#define SQLITE_NOTFOUND    12   /* (Internal Only) Table or record not found */
#define SQLITE_FULL        13   /* Insertion failed because database is full */
#define SQLITE_CANTOPEN    14   /* Unable to open the database file */
#define SQLITE_PROTOCOL    15   /* Database lock protocol error */
#define SQLITE_EMPTY       16   /* (Internal Only) Database table is empty */
#define SQLITE_SCHEMA      17   /* The database schema changed */
#define SQLITE_TOOBIG      18   /* Too much data for one row of a table */
#define SQLITE_CONSTRAINT  19   /* Abort due to contraint violation */
#define SQLITE_MISMATCH    20   /* Data type mismatch */
#define SQLITE_MISUSE      21   /* Library used incorrectly */
#define SQLITE_NOLFS       22   /* Uses OS features not supported on host */
#define SQLITE_AUTH        23   /* Authorization denied */
#define SQLITE_ROW         100  /* sqlite_step() has another row ready */
#define SQLITE_DONE        101  /* sqlite_step() has finished executing */

2.2 SQL ステートメントの実行

typedef struct sqlite3_stmt sqlite3_stmt;
int sqlite3_prepare(sqlite3*, const char*, sqlite3_stmt**, const char**);
int sqlite3_prepare16(sqlite3*, const void*, sqlite3_stmt**, const void**);
int sqlite3_finalize(sqlite3_stmt*);
int sqlite3_reset(sqlite3_stmt*);

このバージョンでは、コールバック関数を使わない API がデータベースに アクセスするために好ましい方法です。 コールバック関数を利用する古い API をエミュレートしたラッパ関数が提供されるかもしれません (されないかもしれません)。

sqlite3_prepare() 関数は1つの SQL ステートメントをコンパイルします。 ステートメントは "nnn" が整数の時に "?" や "?nnn" や ":nnn:" というトークンを含んでいるかもしれません。 これらのトークンは、sqlite3_bind() API によって後から加えられた 未指定のリテラル値(あるいはワイルドカード)を表しています。 "?" に続く "nnn" によって与えられた数による、いくつかのワイルドカード 。 "?" の後に整数値が出てこない場合、同じ SQL ステートメントの優先すべきワイルドカードの数。 同じSQLステートメントの中で1つ以上の同じワイルドカードがある場合、 ワイルドカードは同じ値になるでしょう。 未使用のワイルドカードの値は NULL です。

sqlite3_prepare()ではSQLステートメントはUTF-8文字列です。 sqlite3_prepare16()はSQL入力がUTF-16になること以外は同じ動作です。


最終更新日 2004/06/01 10:01:25