Я учусь пользоваться Wt (остроумной) библиотекой C ++ и пытался импровизировать на Dbo :: Session с синглтоном. Ниже приведен фрагмент созданной мной оболочки MySQL Backend Singleton.
Программа компилируется и запускается с исключением: MySQL Connect Failure.
На отладке с GDB выяснилось, что значение вар dbhost
в //BREAKPOINT
было "localhost"
однако в //STEP1
значение было мусором.
Wt :: Dbo API своеобразно показывает, что конструктор класса MySQL имеет только один строковый аргумент, который не передается по ссылке const std::string dbhost
, Подпись функции из заголовочного файла
MySQL(const std::string &db, const std::string &dbuser="root",
const std::string &dbpasswd="", const std::string dbhost="localhost",
unsigned int dbport = 0,
const std::string &dbsocket ="/var/run/mysqld/mysqld.sock",
int fractionalSecondsPart = -1);
Тот же код только с тремя аргументами, передаваемыми конструктору суперкласса
MySQL(db, dbuser, dbpasswd) // like this
возвращает желаемый объект MySQL для кода.
Ниже приведен код, используемый для компиляции
#ifndef CANDBM_MODEL_MYSQL_SINGLETON_H
#define CANDBM_MODEL_MYSQL_SINGLETON_H
#include <Wt/Dbo/Dbo>
#include <Wt/Dbo/backend/MySQL>
namespace dbo = Wt::Dbo;
namespace Candbm { namespace Model {
class MysqlSingleton : public dbo::backend::MySQL
{
private:
static std::string const DB_NAME;
static std::string const DB_USER;
static std::string const DB_PASS;
static std::string const DB_HOST;
static int const DB_PORT;
static MysqlSingleton* mysql;
MysqlSingleton(
const std::string& db,
const std::string& dbuser = "root",
const std::string& dbpass = "",
const std::string dbhost = "localhost",
unsigned int dbport = 0,
const std::string& dbsocket = "/var/run/msyqld/mysqld.sock",
int fractionalSecondsPart = -1
)
: MySQL(db, dbuser, dbpass, dbhost, dbport, dbsocket, // STEP 1
fractionalSecondsPart
) {}
MysqlSingleton(MysqlSingleton const& m) : dbo::backend::MySQL(m) {}
MysqlSingleton operator=(MysqlSingleton const&);
public:
static MysqlSingleton* getBackend() { return instance(); }
static MysqlSingleton* instance();
};
std::string const MysqlSingleton::DB_NAME = "wt_candbm";
std::string const MysqlSingleton::DB_USER = "wtcandbm";
std::string const MysqlSingleton::DB_PASS = "somedummyvalue";
std::string const MysqlSingleton::DB_HOST = "localhost";
int const MysqlSingleton::DB_PORT = 0;
MysqlSingleton* MysqlSingleton::mysql = NULL;
MysqlSingleton* MysqlSingleton::instance()
{
if (!mysql)
{ // BREAKPOINT 1
// EDIT 1: commented the following line
// static std::string dbhost(DB_HOST.begin(), DB_HOST.end());
// EDIT 2: the constant directly passed here ,,,,,,,
mysql = new MysqlSingleton(DB_NAME, DB_USER, DB_PASS, DB_HOST, DB_PORT);
mysql->setProperty("show-queries", "true");
}
return mysql;
}
} }
#endif
EDIT 1:2:
Эти два редактирования упрощают код, как предложено @dma. И теперь мусор получается при следующем вызове конструктора. Т.е. следующий шаг в отладчике в файле MySQL.CЗадача ещё не решена.