お次はメインのデータベースクラス。
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文作成クラス