プリプロセッサの定義に SQLITE_ENABLE_RTREE を追加してライブラリを作成
#include <stdio.h>
#include <sqlite3.h>
// SELECTのコールバック関数
static int SelectCallbackFunc(void* option, int columnCount, char** columnValues, char** columnNames) {
for(int i = 0; i < columnCount; ++i) {
printf("| %s %s |", columnNames[i], columnValues[i]);
}
printf("\n");
return 0;
}
// SQL文の実行
int ExecSQL(sqlite3* db, const char* sql, sqlite3_callback cb) {
char* pStr = NULL;
if(sqlite3_exec(db, sql, cb, NULL, &pStr) != SQLITE_OK) {
fprintf(stderr, "Error %s %d: %s %s\n", __FILE__, __LINE__, pStr, sql);
return -1;
}
return 0;
}
int main(int argc, char* argv[]) {
sqlite3* pDB = NULL;
const char* fname = ":memory:"; // メモリに作成
// const char* fname = "data.db"; // ファイルに作成
// DBを開く
if(sqlite3_open(fname, &pDB)) {
fprintf(stderr, "Error %s %d: %s\n", __FILE__, __LINE__, sqlite3_errmsg(pDB));
sqlite3_close(pDB);
return -1;
}
// テーブルの作成 RTreeを使用
ExecSQL(pDB, "CREATE VIRTUAL TABLE tbl_index USING rtree( id, minX, maxX, minY, maxY, minZ, maxZ );", NULL);
// テーブルにデータを追加
ExecSQL(pDB, "INSERT INTO tbl_index VALUES( 1, -100.0, -50.0, 30.0, 50.0, -50.0, -20.0 );", NULL);
ExecSQL(pDB, "INSERT INTO tbl_index VALUES( 2, -50.0, -10.0, 30.0, 31.35, -50.0, -40.0 );", NULL);
ExecSQL(pDB, "INSERT INTO tbl_index VALUES( 3, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 );", NULL);
ExecSQL(pDB, "INSERT INTO tbl_index VALUES( 4, 100.0, 110.0, 40.0, 56.2, -50.0, -20.0 );", NULL);
ExecSQL(pDB, "INSERT INTO tbl_index VALUES( 5, 112.0, 119.0, 35.0, 36.51, 10.0, 18.0 );", NULL);
// データの検索
ExecSQL(pDB, "SELECT id FROM tbl_index WHERE minX>=100.0 AND maxX<=110.0;", SelectCallbackFunc);
ExecSQL(pDB, "SELECT id FROM tbl_index WHERE minX>=-5.0 AND maxX<=5.0 AND minZ>=-5 AND minZ<=5;", SelectCallbackFunc);
ExecSQL(pDB, "SELECT id FROM tbl_index WHERE minX>=150.0;", SelectCallbackFunc);
// DBを閉じる
sqlite3_close(pDB);
return 0;
}
実行結果
| id 4 |
| id 3 |
0 件のコメント:
コメントを投稿