読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

SQLite SQL文作成クラス

プログラム C++ SQLite

最後に SQL文を printf 形式でフォーマットする sqlite3_vmprintf() のラッパクラス
#しつこいですが、ご使用は自己責任で^^;


お約束通りヘッダ(の一部)から

/// SQLite ラッパークラス
namespace sqlite
{
    /// SQL文作成クラス
    class Sql
    {
    public:

        // コンストラクタ
        Sql();
        Sql( const char* sql, ... );

        // SQL文のフォーマット
        void format( const char* sql, ... );

        // 文字列の取得
        const char* get() const { return sql_.c_str(); }

    private:

        // SQL文の生成
        void vmprintf( const char *zFormat, va_list ap );

    private:

        std::string     sql_;       ///< クエリ
    };
} // namespace sqlite


最後に、データベースクラスの本体(ソースファイルの一部)。
中では前回のメッセージ自動解放クラス(Message)を使用。

/// SQLite ラッパークラス
namespace sqlite
{
    // コンストラクタ
    Sql::Sql()
        : sql_( "(NULL)" )
    {
    }

    // コンストラクタ
    Sql::Sql( const char* sql, ... )
        : sql_( "(NULL)" )
    {
        va_list ap;
        va_start( ap, sql );
        vmprintf( sql, ap );
        va_end( ap );
    }

    // SQL文のフォーマット
    void Sql::format( const char* sql, ... )
    {
        va_list ap;
        va_start( ap, sql );
        vmprintf( sql, ap );
        va_end( ap );
    }

    // SQL文の生成
    void Sql::vmprintf( const char *sql, va_list ap )
    {
        // SQLの作成
        Message z = sqlite3_vmprintf( sql, ap );
        if ( z.get() == 0 ) {
            throw sqlite::SQLiteException( SQLITE_NOMEM );
        }

        // クエリの取得
        sql_ = z.get();
    }
} // namespace sqlite


欲を言えばLINQみたいな構文で書きたいんだけど、出来るのか出来ないのかも分からないので、とりあえずこれを使っておく。
今のプロジェクトはこちらにあります。