2012年1月27日金曜日

SQLiteのRTreeを使用してみる

sqliteからソースを取得
プリプロセッサの定義に 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 件のコメント:

コメントを投稿