2

我正在学习使用 Wt (witty) C++ Library,并尝试在 Dbo::Session 上即兴创作。以下是我创建的 MySQL 后端单例包装器的片段。

失败案例

该程序编译并运行时出现异常:MySQL Connect Failure。

在使用GDB进行调试时,它显示 var dbhostat的值//BREAKPOINT"localhost",但是 at//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

更新:

  1. EDIT 1:2:正如@dma 所建议的那样,这两个编辑确实简化了代码。现在垃圾是在下一次构造函数调用中获得的。即在 MySQL.C 文件中调试器的下一步
4

0 回答 0