ブログ@kaorun55

HoloLensやKinectなどのDepthセンサーを中心に書いています。

SQLite データベースクラス

お次はメインのデータベースクラス。
SQLは知識ゼロなので、open/close/exec のみ実装^^;
#毎度のことですが、ご使用は自己責任で☆


まずはヘッダ(の一部)から

/// SQLite ラッパークラス
namespace sqlite
{
    /// データベースクラス
    class Database
    {
    public:

        // コンストラクタ
        Database();
        Database( const char *filename );

        // デストラクタ
        ~Database();

        // データベースを開く
        void open( const char *filename );

        // データベースを閉じる
        void close();

        // SQL文を実行する
        void exec( const char *sql, sqlite3_callback callback = 0, void *arg = 0 );

    private:

        typedef boost::shared_ptr< sqlite3 >    DB;

        DB  db_;        ///< データベースハンドル
    };
} // namespace sqlite


次に、exec で受け取るエラーメッセージの自動解放クラス(ソースファイルの一部)

namespace
{
    /// メッセージ自動解放クラス
    class Message
    {
    public:

        // コンストラクタ/デストラクタ
        Message() : message_(0) {}
        Message( char* message ) : message_( message ) {}
        ~Message(){ if( message_ != 0 ) ::sqlite3_free( message_ ); }

        // データの取得
        char** operator & (){ return &message_; }
        char* get(){ return message_; }

    private:

        // コピーの禁止
        Message( const Message& rhs );
        Message& operator = ( const Message& rhs );

    private:

        char* message_;     ///< メッセージ文字列
    };
} // namespace


最後に、データベースクラスの本体(ソースファイルの一部)

/// SQLite ラッパークラス
namespace sqlite
{
    // コンストラクタ
    Database::Database()
    {
    }

    // コンストラクタ
    Database::Database( const char *filename )
    {
        open( filename );
    }

    // デストラクタ
    Database::~Database()
    {
        close();
    }

    // データベースを開く
    void Database::open( const char *filename )
    {
        sqlite3* db = 0;

        int ret = ::sqlite3_open( filename, &db );
        if ( ret != SQLITE_OK ) {
            throw SQLiteException( ret );
        }

        db_ = DB( db, &::sqlite3_free );
    }

    // データベースを閉じる
    void Database::close()
    {
        db_.reset();
    }

    // SQL文を実行する
    void Database::exec( const char *sql, sqlite3_callback callback /*= 0*/, void *arg /*= 0*/ )
    {
        Message errorMessage;
        int ret = ::sqlite3_exec( db_.get(), sql, callback, arg, &errorMessage );
        if ( ret != SQLITE_OK ) {
            throw SQLiteException( ret, errorMessage.get() );
        }
    }
} // namespace sqlite


最後は、SQL文作成クラス