最後に 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みたいな構文で書きたいんだけど、出来るのか出来ないのかも分からないので、とりあえずこれを使っておく。
今のプロジェクトはこちらにあります。