SQLiteのC/C++インターフェイスの導入

2011. 02. 12
この資料では、SQliteのC/C++インターフェイスの概要とロードマップを提供します。

SQLiteの初期のバージョンでは、サポートされているC/C++インターフェイスは5つのみで、とても簡単に学ぶことができました。

しかしSQLiteの性能が向上し、現在の新しいC/C++インターフェイスは185個を超えるAPIが追加されています。

これは新たなプログラマを困惑させることになります。

幸いにも、ほとんどのSQLiteのC/C++インターフェイスは特化しており、必ずしも使用する必要はありません。

非常に多くのエントリポイントを持つにも関わらず、核となるAPIは比較的単純で簡単にコード化できます。

この資料では、どのようにSQLiteが動作するかを簡単に理解できるように、必要な背景となる全ての情報の提供を目指します。

別の文書のThe SQLite C/C++ Interfaceでは、SQLiteの様々なC/C++の全てのAPIについての詳細を提供しています。

SQLiteの操作についての基本的な原理を一読して理解したら、The SQLite C/C++ Interfaceをリファレンスガイドとして使用してください。

この資料は導入と意図しており、SQLite APIの完全なあるいは正式なリファレンスではありません。


●1.0 コアオブジェクトとインターフェイス

SQLデータベースエンジンの主なタスクは、SQLのステートメントを評価することです。

この目的を遂行するために、開発者は2つのオブジェクトについて知っている必要があります。

database connectionオブジェクト:sqlite3
prepared statementオブジェクト:sqlite3_stmt

厳密に言うと、prepared statementオブジェクトは便利なラッパーインターフェイスなので必須ではなく、sqlite3_execまたはsqlite3_get_tableは、prepared statementオブジェクトを隠してこれら便利なラッパーをカプセル化して使用することができます。

しかしながら、SQLiteをフルに活用するためにはprepared statementを理解する必要があります。

database connectionprepared statementオブジェクトは、以下のC/C++インターフェイスの小さなセットによって制御されます。

sqlite3_open()
sqlite3_prepare()
sqlite3_step()
sqlite3_column()
sqlite3_finalize()
sqlite3_close()

6つのC/C++インターフェイスルーチンと上記2つのオブジェクトで、SQLiteのコア機能を形成しています。

開発者はそれらを理解することで、SQLiteを使用するための良い基礎を持つことになるでしょう。

ルーチンのリストは実際よりも概念的なものであることに注意してください。

これらルーチンの多くには複数のバージョンがあります。

例えば、上記リストの一つsqlite3_open()は、実際にはsqlite3_open()sqlite3_open16()sqlite3_open_v2()という3つに分かれており、少し異なる方法で実行されます。

リストでいうsqlite3_column()は、実際にはルーチンが存在しません。

リストにある『sqlite3_column()』は、様々なデータ型の列データを抽出するのに使用される、ルーチン全体のファミリの総称です。

ここでコアインターフェイスの要約を示します。

sqlite3_open()
このルーチンはSQLiteデータベースファイルへの接続を開き、database connectionオブジェクトを返します。
多くの場合アプリケーションで最初に呼び出すSQLite APIとなり、他のほとんどのSQLite APIの前提条件となっています。
多くのSQLiteインターフェイスは、最初のパラメータとしてdatabase connectionオブジェクトへのポインタを要求するので、database connectionオブジェクトのメソッドとして考えることができます。
このルーチンはdatabase connectionオブジェクトのコンストラクタです。

sqlite3_prepare()
このルーチンはprepared statementオブジェクト内のSQLテキストを変換し、オブジェクトへのポインタを返します。
このインターフェイスは、事前に呼び出されるsqlite3_open()によって生成されたdatabase connectionのポインタを必要とし、SQLステートメントを含むテキスト文字列を準備します。
このAPIは実際にSQLステートメントを評価するものではありません。
単にSQLステートメントを評価するための準備を行います。
新しいアプリケーションでのsqlite3_prepare()の使用は推奨しないことに注意してください。
代替のルーチンとしてsqlite3_prepare_v2()を代わりに使用してください。

sqlite3_step()
このルーチンは、sqlite3_prepare()インターフェイスで事前に生成されたprepared statementの評価に使用されます。
ステートメントは結果の最初の行が使用できるポイントまで評価されます。
結果を次の行に進めるには、sqlite3_step()を再度呼び出してください。
ステートメントが完了するまでsqlite3_step()の呼び出しを続けます。
ステートメントはsqlite3_step()への単体呼び出しが完了するまで実行され、(INSERTやUPDATE、DELETEステートメントなどの)結果を返しません。

sqlite3_column()
このルーチンsqlite3_step()によって評価されたprepared statementの、結果セットの現在の行から単一列を返します。
sqlite3_step()は新しい結果セットの行の度に停止し、このルーチンはその行の全ての列の値を検索するために複数回呼び出すことができます。
上述の通り、SQLite API内に『sqlite3_column()』関数としては実際に存在していません。
我々ここで呼んでいる『sqlite3_column()』は、実際には様々なデータ型内の結果セットから値を返す関数ファミリ全体の総称です。
このファミリには、(文字列やBLOBの場合に)結果のサイズを返したり、結果セットの列数を返すルーチンがあります。

sqlite3_column_blob()
sqlite3_column_bytes()
sqlite3_column_bytes16()
sqlite3_column_count()
sqlite3_column_double()
sqlite3_column_int()
sqlite3_column_int64()
sqlite3_column_text()
sqlite3_column_text16()
sqlite3_column_type()
sqlite3_column_value()

sqlite3_finalize()
このルーチンは、事前に呼び出されたsqlite3_prepare()によって生成されたprepared statementを破棄します。
全てのprepared statementはメモリリークを回避するために、このルーチンを呼び出しを使用して破棄する必要があります。

sqlite3_close()
このルーチンは、sqlite3_open()の呼び出しによって事前に開かれたdatabase connectionを閉じます。
全てのpreoared statementsに関連付けされた接続は、接続を閉じる前にfinalizedする必要があります。


●1.1 コアルーチンとオブジェクトの典型的な使い方

アプリケーションは通常、SQLiteを使用したい場合に、sqlite3_open()を使用して初期化中に単一のdatabase connectionを生成します。

sqlite3_open()を使用することで、既存のデータベースファイを開くか、新しいデータベースファイルを生成して開くことができます。

多くのアプリケーションは単一のdatabase connectionのみを使用しており、アプリケーションは理由無く(同じデータベースまたは異なるデータベースのどちらか)複数のdatabase connectionを開くためにsqlite3_open()を複数回呼び出すことはできません。

マルチスレッドのアプリケーションでは、各スレッドにdatabase connectionを別個に生成する場合があります。

ただし手段として、2つ以上のデータベースに対し、別個のデータベース接続を開く必要はありません。

単一のdatabase connectionは、SQLコマンドのATTACHを使用して、一度に2つ以上のデータベースへのアクセスを作成することができます。

多くのアプリケーションは、シャットダウン時にsqlite3_close()の呼び出しを使用して、database connectionを破棄します。

また例えば、アプリケーションでメニューのFile → Openアクションに対する応答としてdatabase connectionを開く場合、それに対するものとしてメニューのFile → Closeでdatabase connectionを破棄します。

SQLステートメントを実行するには、アプリケーションで以下のステップを踏みます。

1. sqlite3_prepare()を使用したprepared statementの作成
2. 1回以上のsqlite3_step()の呼び出しによるprepared statementの評価
3. 照会のため、2つのsqlite3_step()の呼び出しの間で、sqlite3_column()の呼び出しによる結果の抽出
4. sqlite3_finalize()を使用したprepared statementの破棄

上記は全て、実際にSQLiteを使用する上で必要なものとして知られているものの一つです。

残りの全てはただの装飾や詳細です。


●2.0 コアルーチン周辺の便利なラッパー

sqlite3_exec()インターフェイスは、上述の4つ全ての工程を単一関数の呼び出しで実施する便利なラッパーです。

sqlite3_exec()に渡されるコールバック関数は、結果セットの各行を処理するために使用されます。

sqlite3_get_table()は、上述の4つの全ての工程を行う別の便利なラッパーです。

sqlite3_get_table()インターフェイスはsqlite3_exec()と異なり、コールバックの呼び出しというよりむしろヒープメモリ内のクエリの結果を格納します。

sqlite3_exec()sqlite3_get_table()も、コアルーチンを使用して実行することができない何かができるわけではないことが重要です。

実際にこれらのラッパーは、コアルーチンに基づいて純粋に実行されます。


●3.0 パラメータの結合とprepared statementの再利用

先の解説では、各SQLステートメントが事前に準備され、評価し、破棄されると仮定しました。

しかし、SQLiteは同じprepared statementに対して複数回評価することができます。

これは以下のルーチンを使用して実現することができます。

sqlite3_reset()
sqlite3_bind()

1回以上のsqlite3_step()の呼び出しによってprepared statementを評価した後、sqlite3_reset()を呼び出すことによってリセットし再度評価することができます。

既存のprepared statementsqlite3_reset()を使用することによって、新しいprepared statementを生成するよりも、不必要なsqlite3_prepare()の呼び出しを避けることができます。

多くのSQLステートメントではsqlite3_step()の実行に、sqlite3_prepare()の実行に必要な時間と同等以上の時間を必要とします。

sqlite3_prepare()の呼び出しを避けることで、パフォーマンスの向上に重大な結果をもたらします。

しかしながら通常は、同じSQLステートメントを1回以上厳密に評価するのは有用ではありません。

多くの場合、同様のステートメントを評価します。

例えば異なる値を挿入する際に、INSERTステートメントを複数回評価する場合があります。

このような柔軟性を持って対応できるように、SQLiteは評価を行う前に、SQLステートメントに『bound』という値をparametersに含めることができます。

これらの値は後で変更することができ、同じprepared statementに対し新しい値を使用して2回目の評価をすることができます。

SQLiteでは、以下のいずれか文字列のparameterを使用することができます。

・?
・?NNN
・:AAA
・$AAA
・@AAA
上記の例では、NNNは整数値で、AAAは識別子を表します。

パラメータは初期値としてNULL値を持っています。

最初にsqlite3_step()を呼び出す前、あるいはsqlite3_reset()後すぐに、アプリケーションは値にパラメータを添付してsqlite3_bind()インターフェイスの内の一つを呼び出します。

sqlite3_bind()の各呼び出しでは、事前に同じパラメータに結合されてオーバーライドします。

アプリケーションは、事前に複数のSQLステートメントを準備し、必要に応じてそれらを評価することを許可しています。

未処理のprepared statementsの数に制限はありません。


●4.0 SQLiteの拡張

SQLiteは、その機能を拡張するために使用できる下記のようなインターフェイスが含まれています。

sqlite3_create_collation()
sqlite3_create_function()
sqlite3_create_module()

sqlite3_create_collation()インターフェイスは、テキストのソートするための新しい照合シーケンスの生成に使用されます。

sqlite3_create_module()インターフェイスは、新しい仮想テーブルの実装に使用されます。

sqlite3_create_function()インターフェイスは(スカラーまたは集合の)新しいSQL関数を生成します。

新しい関数の実装は通常、以下の追加インターフェイスを使用して作成します。

sqlite3_aggregate_context()
sqlite3_result()
sqlite3_user_data()
sqlite3_value()

SQLiteに組み込まれている全てのSQL関数は、まさにこれと同じインターフェイスを使用して生成されています。

例としては、SQLiteのdata.cやfunc.cのソースファイルを参照してください。


●5.0 その他のインターフェイス

この項では基本となるSQLiteインターフェイスについて説明します。

SQLiteのライブラリにはここで説明していない多くの便利な機能を実装するAPIが含まれています。

C/C++ Interface Specificationに、SQLiteアプリケーションプログラミングインターフェイスの手法についてのcomplete list of functionsがあります。

全てのSQLiteインターフェイスについての完全且つ正式な情報については、そちらを参照してください。



参考文献

An Introduction To The SQLite C/C++ Interface

0 CommentsPosted in SQLite





Bose SoundSport wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
02 | 2017/03 | 03
Sun Mon Tue Wed Thu Fri Sat
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
Recent Articles
iTunes


Swift
Categories
Tips
WACOM


Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
BOSE

Bose SoundSport wireless headphones
ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
SQLite
OpenGL ES
Amazon


Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Profile

Author:水月杏香
永遠の初心者プログラマ。

QR Code
QR
Visitors