分享封装好的异步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)

大家都在看

  • java 百度人脸识别 接口代码

    package org.fh.util; import org.json.JSONObject; import java.io.BufferedReader; import jav…

    数据库 2023年6月6日
    094
  • 9.回文数

    给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文,而…

    数据库 2023年6月16日
    072
  • MySQL45讲之优化器选错索引

    前言 本文简要介绍了优化器选择索引的依据,以及如何人为地引导优化器选择较好的执行方案。 [En] This paper briefly introduces the basis f…

    数据库 2023年5月24日
    0133
  • Linx__Ubuntu_APT

    apt是Advanced Packaging Tool的简称。 在Ubuntu下,我们可以使用apt命令进行软件包的 更新, 安装, 删除, 清理等 类似于Windows的软件管理…

    数据库 2023年6月14日
    0126
  • Maven进行clean时报错,解决方法

    Q1:由于网络原因,maven仓库中产生了后缀LastUpdated文件,再次clean直接报错 参考方法:https://www.cnblogs.com/DDgougou/p/1…

    数据库 2023年6月9日
    0122
  • LRU算法

    class LRUCahce { private Node head; private Node tail; private Map hashMap; private int ca…

    数据库 2023年6月14日
    085
  • 【黄啊码】小程序:九宫格抽奖如何实现?可控制抽奖率

    黄啊码向来简单粗暴,来,代码伺候 js代码如下: php;gutter:true; //index.js //获取应用实例 const app = getApp()</p&g…

    数据库 2023年6月16日
    0113
  • MySQL系统变量和字符集

    书名《MySQL是怎样运行的:从根儿上理解MySQL》可自行百度 以下是知识点总结 重新认识Mysql MySQL是一个C/S架构的软件。 在Windows安装后首先注册成服务,然…

    数据库 2023年5月24日
    079
  • Burpsuite安装SQLmap操作

    Burpsuite安装SQLmap插件步骤: 安装准备: Burpsuite工具、SQLmap工具、python解释器 1.打开burpsuite插件; 2.找到CO2插件; 3….

    数据库 2023年6月9日
    0100
  • MySQL实战45讲 10

    10 | MySQL为什么有时候会选错索引? 使用哪个索引是由 MySQL 来确定的 可能遇到的情况:一条本来可以执行得很快的语句,却由于 MySQL 选错了索引,而导致执行速度变…

    数据库 2023年6月16日
    0102
  • ASP.NET Core Docker部署

    前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行ASP.NET …

    数据库 2023年6月11日
    0122
  • mybatis-plus详解

    旧的代码生成 记得导包,依赖如下 com.baomidou mybatis-plus-boot-starter 3.5.1 com.baomidou mybatis-plus-ge…

    数据库 2023年6月14日
    094
  • 第十八章 AOP底层实现原理

    1.核心问题 1. AOP如何创建动态代理类 2. Spring工厂如何加工创建代理对象 通过原始对象的id值,获得的是代理对象 2.动态代理类的创建 2.1 JDK动态代理 通过…

    数据库 2023年6月14日
    0106
  • Linux–>开关机+用户管理指令

    shutdown关机 语法: shutdown -h &#x5173;&#x673A;&#x65F6;&#x95F4; now 立刻1 1分种后 s…

    数据库 2023年6月14日
    092
  • 解决:阿里云服务器添加安全组端口映射后仍无法访问

    “忘记了不该忘的人,我的内心满是伤痕…….” “呸,渣女,什么人?那是配置!配置!配置!” 问题: 阿里云服…

    数据库 2023年6月6日
    084
  • day04-1群聊功能

    多用户即时通讯系统04 4.编码实现03 4.5功能实现-群聊功能实现 4.5.1思路分析 群聊的实现思路和私聊的实现非常类似。 不同的是:私聊时,服务端接收到消息后,只需要找出接…

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