zoukankan      html  css  js  c++  java
  • mysqlcppconn之ConnectOptionsMap的使用

    由来

    继上一篇文章, 发现之前写的一篇文章中断线重连部分是错误的, 也是现在翻阅了源码才知道

    想要自动重连, 必须使用ConnectOptionsMap才可以

    但由于官方代码没有做好导出部分的处理, 直接使用此类型会造成内存异常(跨模块传递STL对象)

    所以本人简单的添加了几个导出函数, 绕过了这个问题

    添加代码

    在connection.h中, 找到

    typedef std::map< sql::SQLString, ConnectPropertyVal > ConnectOptionsMap;
    在下面紧接着添加

    CPPCONN_PUBLIC_FUNC ConnectOptionsMap* ConnectOptionsMap_New();
    CPPCONN_PUBLIC_FUNC void ConnectOptionsMap_Delete(ConnectOptionsMap *obj);
    CPPCONN_PUBLIC_FUNC void ConnectOptionsMap_Set(ConnectOptionsMap *obj, const char* k, const Variant &v);

    在mysql_connection.cpp中, 文件最后, sql的命名空间内, 即最后一个花括号内, 添加以下代码

    CPPCONN_PUBLIC_FUNC ConnectOptionsMap* ConnectOptionsMap_New()
    {
    	return new ConnectOptionsMap;
    }
    
    CPPCONN_PUBLIC_FUNC void ConnectOptionsMap_Delete(ConnectOptionsMap *obj){
    	delete obj;
    }
    
    CPPCONN_PUBLIC_FUNC void ConnectOptionsMap_Set(ConnectOptionsMap *obj, const char* k, const Variant &v){
    	(*obj)[k] = v;
    }
    编译, 取出dll和lib文件, 搞定.

    如何使用

    sql::Connection* CSqlWorker::NewSqlObject()
    {
    	try
    	{
    		typedef decltype (sql::ConnectOptionsMap_Delete)* TConnectOptionsMap_Deleter;
    		std::unique_ptr<sql::ConnectOptionsMap, TConnectOptionsMap_Deleter> Maps(sql::ConnectOptionsMap_New(), sql::ConnectOptionsMap_Delete);
    
    		sql::ConnectOptionsMap_Set(Maps.get(), "hostName", sql::Variant(sql::SQLString(m_host.c_str())));
    		sql::ConnectOptionsMap_Set(Maps.get(), "userName", sql::Variant(sql::SQLString(m_user.c_str())));
    		sql::ConnectOptionsMap_Set(Maps.get(), "password", sql::Variant(sql::SQLString(m_pass.c_str())));
    
    		sql::ConnectOptionsMap_Set(Maps.get(), "OPT_RECONNECT", sql::Variant(true));
    		sql::ConnectOptionsMap_Set(Maps.get(), "OPT_CHARSET_NAME", sql::Variant(sql::SQLString("utf8")));
    
    		return m_driver->connect(*Maps.get());
    	}
    	catch (sql::SQLException e)
    	{
    		_ASSERT(0);
    	}
    	return NULL;
    }

    更多参数及作用, 请参阅mysql_connection.cpp的MySQL_Connection::init函数

    完结

    是不是看起来比较麻烦? 

    但为了使用扩展功能(动态链接情况下), 只好先这样了

    若要避免这个问题, 只能使用静态连接, 且运行库一致, 才可以.






  • 相关阅读:
    【Markdown】Markdown相关问题
    【Eclipse】在Project Explore中隐藏不需要显示的文件
    【Eclipse】编译使用Makefile的C工程
    【C】编译提示 warning: incompatible implicit declaration of built-in function ‘calloc’ [enabled by default]
    【Ubuntu】命令记录
    【Vim】Vim学习
    【Ubuntu】安装配置apahce
    【MPI】执行mpiexec出错
    文件上传(java web)
    使用JavaMail发送邮件
  • 原文地址:https://www.cnblogs.com/jins-note/p/9513566.html
Copyright © 2011-2022 走看看