分享封装好的异步Mysql动态的库(DyNetMysql.dll) + 项目源码

在做C++项目时,经常会用到Mysql数据库,Mysql接口提供给我们的数据是相当原始的,如:字段名、字段类型,字段长度等等,一般情况我们都想一种更方便获得数据

如:

XXXStruct pRecourdInfo = (const XXXStruct)(mysql获得的数据指针);

直接转换字段对应的结构来,这样能大大方便我们使用

这个功能已经在我之前发表上一篇文章<<分享一直在维护简单实用高效的C++Socket框架Swa-server(开源+源码)>>中实现,现在是将它封装成为一个dll

最近有点时间,就学习了dll相关知识,然后将封装成一个dll,这样方便使用及移植到其他项目。于是将swa-server中的mysql异步处理功能代码分离出来,创建一个DyNetMysql项目,设置为dll项目

关于dll项目及导出不要这里讲述,园友自己百度查询(zf把谷歌封了真是服了)

根据园友性格就先上代码(_

cpp;gutter:true; // TestDll.cpp : 定义控制台应用程序的入口点。 //</p> <h1>include "stdafx.h"</h1> <h1>include "../../DyNetServer/NetServer.h"</h1> <h1>include "../../DyNetMysql/DbSession.h"</h1> <h1>include "../../DyNetMysql/DbRecordSet.h"</h1> <h1>include</h1> <p>using namespace std;</p> <p>NetServer<em> gNetServer; IDbSession</em> gDataBase;</p> <p>void OnNetMsgEnter( NetSocket& rSocket ); void OnNetMsgExit( NetSocket& rSocket ); void OnNetMsg( NetSocket& rSocket , NetMsgHead* pHead );</p> <h1>pragma pack(push,1)</h1> <p>struct CharacterInfo { int64 type_idx; char nick[32]; int32 level; };</p> <h1>pragma pack(pop)</h1> <p>void DBCallbase(void<em> pUser, const void</em> pMsg) { const DbRecordSet<em> pRecordSet = static_cast(pMsg); for (int32 i = 0 ; i < pRecordSet->CountRecord();++i ) { const CharacterInfo</em> pInfo = static_cast(pRecordSet->GetRecordBuff(i)); printf("id:%ld nick:%s level:%d \n",pInfo->type_idx,pInfo->nick,pInfo->level); } }</p> <p>int _tmain(int argc, _TCHAR* argv[]) {</p> <pre><code>// 启动msyql gDataBase = DbSessionMgr::Instance()->AddDatabase("127.0.0.1", "root", "root", "swa_data", false); ASSERT(gDataBase); // 初始化Scoket服务 gNetServer = NetServerMgr::Instance()->AddNetServer(); gNetServer->SetAddress("127.0.0.1", 4321); gNetServer->SetHandler(OnNetMsgEnter, OnNetMsg, OnNetMsgExit); // 启动Socket服务 gNetServer->Start(); gDataBase->ExecuteAsyncSQL("SELECT type_idx,, FROM ",NULL,DBCallbase); while (true) { Sleep(1); NetServerMgr::Instance()->Update(0); //逻辑处理 DbSessionMgr::Instance()->Update(0); //SQL处理及回调 } return 0; </code></pre> <p>}</p> <p>void OnNetMsgEnter(NetSocket& rSocket) { int a = 1; }</p> <p>void OnNetMsg(NetSocket& rSocket, NetMsgHead* pHead) { int a = 1; }</p> <p>void OnNetMsgExit(NetSocket& rSocket) { int a = 1; }</p> <pre><code> 这里启动创建一个Mysql连接对象,如果成功返回!null,然后可以异步执行sql及设置回调(可以不设置回调) 上述代码运行效果图如下(为什么用printf,如果是字符放在第二以上显示为 ![](//images0.cnblogs.com/blog2015/425928/201504/232146125465965.png) 其实实现将数据直接转结构体也不是很难,即每行给一个char buffer[65536],然后将mysql的字段内存拷贝进去,之后再转为结构体即可 这里需要注意的,如果是char或varchar字段的,转出来要知道mysql是用什么字符编码,如果是utf-8则它byte最大长度为定义长度*3,本dynetmysql是按utf-8,且长度默认为字节长度,所以存储是中文时要注意,一个中文是用3个长度。 相关类部分代码1: </code></pre> <p>DbRecordSet& m_rRecordSet; vector m_vecFields; char m_arrRowBuff[65536]; // 每一行内容记录,每个字段记录它的开始位置即可,则一行记录最大为64k uint32 m_nBuffBegin; // 已经使用的位置</p> <pre><code> 相关类部分代码2: </code></pre> <p>switch (nType) { case FIELD_TYPE_TINY: { mI64Val = pszValue ? atol(pszValue) : 0; memcpy(&m_arrRowBuff[m_nBuffBegin], &mI64Val, 1); m_nBuffBegin += 1; } break; case FIELD_TYPE_SHORT: { mI64Val = pszValue ? atol(pszValue) : 0; memcpy(&m_arrRowBuff[m_nBuffBegin], &mI64Val, 2); m_nBuffBegin += 2; } break; case FIELD_TYPE_LONG: { mI64Val = pszValue ? atol(pszValue) : 0; memcpy(&m_arrRowBuff[m_nBuffBegin], &mI64Val, 4); m_nBuffBegin += 4; } break; case FIELD_TYPE_FLOAT: { mF64Val = pszValue ? atof(pszValue) : 0; memcpy(&m_arrRowBuff[m_nBuffBegin], &mF64Val, 4); m_nBuffBegin += 4; } break; case FIELD_TYPE_LONGLONG: { mI64Val = pszValue ? atol(pszValue) : 0; memcpy(&m_arrRowBuff[m_nBuffBegin], &mI64Val, 8); m_nBuffBegin += 8; } break; case FIELD_TYPE_DOUBLE: { mF64Val = pszValue ? atof(pszValue) : 0; memcpy(&m_arrRowBuff[m_nBuffBegin], &mF64Val, 8); m_nBuffBegin += 8; } break; case FIELD_TYPE_STRING:// char case FIELD_TYPE_VAR_STRING:// var_char { memcpy(&m_arrRowBuff[m_nBuffBegin], pszValue, nLen / 3); // mysql char 定义大小会按最大长底去计算长度,这里限制按字节大小去截断 m_nBuffBegin += nLen / 3; } break; case MYSQL_TYPE_TINY_BLOB: case MYSQL_TYPE_MEDIUM_BLOB: case MYSQL_TYPE_LONG_BLOB: case MYSQL_TYPE_BLOB: { memcpy(&m_arrRowBuff[m_nBuffBegin], pszValue, nLen); m_nBuffBegin += nLen; } break;

目前这个DyNetMysql.dll还不完善,如果是直接select 则可以创建结构体与它对应则可直接转结构体,如果是其它如update,delete乖等,则建议设置不使用回调或使用存储过程。

测试代码中也用到了最近封装一个异步Socket的dll,如果大家感兴趣, 请留言和推荐吧,我才会有动力跟园友一起分享!如果有问题,可以留言或qq296464231问我

分享封装好的异步Mysql动态的库(DyNetMysql.dll) + 项目源码

项目源码下载

Original: https://www.cnblogs.com/hellohuang/p/4452038.html
Author: HolleHuang
Title: 分享封装好的异步Mysql动态的库(DyNetMysql.dll) + 项目源码

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612655/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 关闭 Windows 10 鼠标移到任务栏图标上显示的预览小卡片(小窗口)

    Windows 10 在默认情况下,鼠标移到任务栏的应用程序窗口图标上,会显示一个类似缩略的小窗口预览卡片的窗口视图。在需要频繁切换窗口的时候,鼠标很容易就移到当前窗口或其他窗口的…

    数据库 2023年6月16日
    0118
  • 10、RestTemplate方式实现远程调用Client

    一、JSONObject类详解: JSONobject是FastJson提供的对象,在API中是用一个私有的常量map进行封装的,实际就是一个map,只不过 FastJson对其进…

    数据库 2023年6月6日
    080
  • SQL 版本号排序

    SQL 语句直接对内容为版本号格式的字段进行排序时,排序效果通常不是最终想要的效果,因为最终需要的效果,是需对版本号里的每一段(通常以小数点分隔)按数值进行排序。 解决这个问题,主…

    数据库 2023年5月24日
    070
  • 如何画出别人一看就懂的架构图?

    技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也体现在优秀工程师在工作效率提升、产品性能优化和用户体验改善等经验方面的分享,以提…

    数据库 2023年6月14日
    081
  • Pisa-Proxy 之 SQL 解析实践

    SQL 语句解析是一个重要且复杂的技术,数据库流量相关的 SQL 审计、读写分离、分片等功能都依赖于 SQL 解析,而 Pisa-Proxy 作为 Database Mesh 理念…

    数据库 2023年6月16日
    0113
  • redhat 7.4从openssh7.6离线升级openssh8.4p1解决方法

    具体需求 这几天生产环境服务器又进行了安全扫描,每次都会报一下漏洞错误。虽然只有一个高危问题,但是每次看到ssh远程漏洞都很烧脑 “主要是里面坑太多了”,闲…

    数据库 2023年6月14日
    070
  • 配置中心的设计-nacos vs apollo

    和 apollo 一样,nacos 也是一款配置中心,同样可以实现配置的集中管理、分环境管理、即时生效等等。不过,nacos 还具备了服务发现的功能。 分析 apollo 时,我们…

    数据库 2023年6月6日
    096
  • 老板:把系统从单体架构升级到集群架构!

    首发于公众号:BiggerBoy 如题,本文针对工作中实际经验,整理了把一个单体架构的系统升级成集群架构需要做的准备工作,以及为集群架构的升级做指导方针。 本文首先分析了单体架构存…

    数据库 2023年6月11日
    071
  • 如何利用bat文件伪装成木马病毒整蛊他人

    bat文件是dos下的批处理文件。批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。 将以下代码复制到文本文档中,保存后修改文件后缀名称…

    数据库 2023年6月11日
    095
  • BeautifulSoup4的使用

    Beautiful Soup 主要是用来解析提取 HTML 和 XML 文件中的数据。 现在官网推荐使用 Beautiful Soup 4 ,已经被移植到了BS4中。 安装 Bea…

    数据库 2023年6月9日
    092
  • MySQL–数据过滤(AND、OR、IN、NOT操作符)

    MySQL允许给出多个WHERE子句。这些子句可以两种方式使用:以AND子句的方式或OR子句的方式使用。 1、组合WHERE子句 此SQL语句检索由供应商1003制造且价格小于等于…

    数据库 2023年6月16日
    079
  • 面试现场!月薪3w+的这些数据挖掘SQL面试题你都掌握了吗? ⛵

    💡 作者:韩信子@ShowMeAI📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40📘 AI 面试题库系列:https://www….

    数据库 2023年6月14日
    078
  • 模板语法之继承

    什么是模板继承 模板继承就是指可以使父模板的内容重用,子模板直接继承父模板的全部内容,并可以覆盖父模板中相应的块 继承的语法 &#x7236;&#x6A21;&am…

    数据库 2023年6月14日
    083
  • 04-MySQL锁

    数据库锁 1、SQL语言包括那几个部分 SQL语言包括 数据定义(DDL)、数据操纵(DML)、数据控制(DCL)和数据查询(DQL)四个部分 2、每部分都有哪些操作关键词 数据定…

    数据库 2023年6月16日
    071
  • MyBatis-Plus修改数据,会不会把其他字段置为null

    前两天在用MyBatis-Plus写了一张单表的增删改查,在写到修改的时候,就突然蹦出一个奇怪的想法。 MyBatis-Plus的BaseMapper中有两个关于修改的方法。如下:…

    数据库 2023年6月11日
    0101
  • Mysql性能调优-工具篇

    首先祭出官方文档(这是5.7的,请自行选择版本): 如果你不想读英语,只需阅读这篇文章: [En] If you don’t want to read English,…

    数据库 2023年5月24日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球