Modernes C++ programmieren

Okt 20, 2024

lst-0011-book.cpp

// https://godbolt.org/z/c8xfM1nEa
#include <string>
#include <sqlite3.h>
class DbWrapper {
  sqlite3 *db_;
public:
  DbWrapper(const std::string& dbname)
    : db_{nullptr}
  {
    const int errCode = sqlite3_open(dbname.c_str(), &db_);
    if(errCode) db_ = nullptr;  // mark as 'not successful'
  }
  sqlite3* operator*() { return db_; }
  explicit operator bool() const {
    return db_ != nullptr;      // evaluate the mark
  }
  ~DbWrapper() {
    if(db_) sqlite3_close(db_);
  }
  // ... Rest as before ...
};
bool dbExec(const std::string &dbname, const std::string &sql) {
  DbWrapper db { dbname };
  if(db) {                      // check for successful initialization
    const int errCode = sqlite3_exec(*db,sql.c_str(),nullptr,nullptr,nullptr);
    if(errCode)
      return false;             // still correct RAII
  }
  return (bool)db;
}