敢不敢更懒,本身编写的mysql C++自动代码生成工具

我一直有一个梦想,就是那天可以让计算机去帮我编写代码,而我只须要将我本身的规划告诉它,就能够自动生成我须要的代码。
梦想永远是梦想,必定要本身一步步的去实现,不然和咸鱼有什么区别?
自动化代码生成,一直是我这几年正在一步步实现的想法。
毕竟,一个系统中不客气的说50%的代码,实际是重复性较强的代码,人为去编写重复性的代码,极可能会出错,并且,不一样的人,代码风格,水平,习惯是不一样的,写出来的代码,排错和代码走查非本人都是比较麻烦的。因而开发了一系列代码自动生成工具,减小人为因素的干扰,涉及到数据库,脚本(Lua),IO(socket,file,RPC)等等。

不说废话了,
因而本身用C++编写了一个跨平台的代码生成工具,支持生成mysql调用端的核心部分代码。让"代码"写"代码"。
实现目标:
(1)简单的SQL增,删,改,查 代码生成。(C++代码结构)
(2)自动编写MYSQL的链接池技术。
(3)同时生成数据库的SQL脚本(能够直接建立数据库表结构)
(4)自动生成对应SQL语句的C++类结构和接口。供上层系统调用。
(5)自动生成能够本身检测的数据函数测试接口。
(6)自动生成数据库配置文件的相关建立,读写。
(7)代码支持自动融合,也就是说,已经编写的代码,在下次生成中,若是未发生变化,就不会被重写。(保证一些特殊业务逻辑的代码,不会随着程序迭代而反复融合,而是工具会自动保留这些特殊的代码)

好了,上述就是目标了。
为了实现上述功能,我选用了XML做为个人描述文档。
首先,工程代码能够在VS2012或者Linux GCC4.4.1以上的版本完美编译,编译完的工具,生成的代码,能够支持windows和Linux跨平台编译,方便调试和测试。
工具是C++本身写的,在这里就不作过多的描述。只是让你们看看如何使用。
首先,工具备一个目录,是/bin/XMLData/
这里,你能够创建任意个XML配置文件,每一个文件,你均可以创建任意张数据表和丢应的代码文件。
举个例子,好比,你创建一个叫作db_tps_global.xml的文件。

<?xml version="1.0" encoding="UTF-8"?>

<configer ProcName="DBTest" DB="mysql">
    <TableClass database="db_tps_global" table="tb_useridlimit" class="CUserIdLimit" key="sid" func="select;insert;update;delete;" desc="">
        <Column name="sid" dbtype="int" classtype="int" value="0" />
        <Column name="useridlimit" dbtype="int" classtype="int" value="0" />
        <Column name="curuserid" dbtype="int" classtype="int" value="0" />
    </TableClass>
</configer>

每个表,都是一个<TableClass>的元素集合,你能够根据你的须要,创建任何多个文件(按照表分类),任意多个<TableClass>,工具会扫描这个目录下的全部xml文件,生成对应的C++代码。
我一个个来解释其中的含义mysql

database 数据库名称,这个参数必须指定,指定于你的数据库实例名
tb_useridlimit 你要创建的表名
CUserIdLimit 对应这个表的C++类名,主要和表字段一一映射造成的类
key 这个指的是生成的查询条件,能够是多个,以逗号隔开
func 生成的C++代码支持那种操做,能够任意组合,自多支持四种,select;insert;update;delete;
desc 表名的描述字段,用于文档支持


这些都是一个表的基本信息,你能够任意设置成你的表信息。
<Column>子集能够是多个git

name 数据库字段名称,同时也是类中对应字段名称
dbtype 数据类型,目前支持数据库基本基本类型(之后能够持续扩展支持)
classtype 类对应类型,对应数据类型的字段类型(之后能够持续扩展支持)
value 类数据的初始值,在类初始化的时候使用



上面的例子,就是要生成一个database="db_tps_global" table="tb_useridlimit"表的所有代码。

生成的代码,会自动新建一个目录为DBTest
在这里面,你会看到几个目录github

cfg 数据库配置文件目录,自动生成数据库
DataWrapper 生成对应数据库表的全部类文件都放在这里
DBScript 生成mysql数据库脚本
DBServer 自动生成DBserver启动代码,能够用于生成自动测试集
DBWrapper 生成mysql数据连接池的代码
rapidjson 读写json字段相关代码,能够支持生成Json字段的mysql字段,并支持生成与之对应还原成类结构的C++读写json代码。
ShareMemory 生成读写共享内存映射相关的代码,这部分与个人业务相关,我须要程序启动后把一部分数据读写到共享内存中去。


关于共享内存和json,我目前已经开发支持了,由于个人业务须要。
这部分代码,会按照个人要求自动生成相关代码。
对应一个配置文件的例子

    <!-- 若是这个对象须要内存池,须要指定classpool标签的个数,若是须要共享内存,则须要填写shmkey(为保证跨平台key必须是数字) -->
    <!-- key是pool须要用到的关键字,必须是class里面的成员,用于map对象检索 -->
    <!-- 关于isdependfunc,dependclass的说明:
        一、dependfunc定义控制内存池是否依赖的是函数
        二、dependclass定义控制内存池是否依赖是对象池对象
        三、以上两点必须有且只有一条是被定义的,另外一条是空的-->
    <TableClass database="db_userdata" table="tb_userdata" class="CUserData" classpool="500" shmkey="1111" key="id" func="select;insert;update;delete;" isdependfunc="1" dependclass="" desc="">
        <Column name="id" dbtype="int" classtype="int" value="0" />
        <Column name="nickname" dbtype="varchar" classtype="char" length="32" value="'\0'" />
        <Column name="account" dbtype="varchar" classtype="char" length="32" value="'\0'" />
        <Column name="uuid" dbtype="varchar" classtype="char" length="255" value="'\0'" />
        <Column name="thirdaccount" dbtype="varchar" classtype="char" length="32" value="'\0'" />
        <Column name="thirduserid" dbtype="int" classtype="int" value="0" />
        <Column name="useremail" dbtype="varchar" classtype="char" length="32" value="'\0'" />
        <!-- 最后更新时间,这个字段由update的时候,自动记录。-->
        <Column name="activetime" dbtype="date" classtype="char" length="32" value="'\0'" />
        <!-- 用户身上物品格子。用于测试类之间的包含,这部分存储为json到数据库 -->
        <Column name="userbaglist" dbtype="varchar" classtype="CUserBagList"/>
        <Column name="bodyitemlist" dbtype="varchar" classtype="CBodyItemList"/>
    </TableClass>

经过设置相关参数,我能够生成支持共享内存的相关代码。这部分也不用我本身手写了。

另外,对于一些特殊的SQL语句,由于不涉及表建立,可能还有关联查询,这部分代码我专门用了一个类型去描述。

    <TableExt database="db_userdata" table="tb_userdata" class="CUserData" >
        <!-- 扩展sql只支持查询操做,不支持其余操做 
          selecttype为1表示查询正常的数据库记录,此时返回数据类型如 vector<CUserData>& vecObj;
          为2数值时表示非正常数据库记录好比 count(*)或者查询指定的字段信息,此时返回数据类型如 vector < map<string, string> >& vmResultData;使用者须要对返回的字段值本身处理    
        -->
        <Sql value="select * from db_userdata.tb_userdata order by activetime desc limit 300;" funcname="select_tb_userdata_for_pool" selecttype="1" forpool="1" inputvalue="vector<CUserData>&amp; vecObj"/>

        <Sql value="select id from db_userdata.tb_userdata where uuid = '%s';" funcname="select_tb_userdata_by_uuid" selecttype="2" inputvalue="char* szuuid,vector<map<string,string> >&amp; vmResultData"/>

        <Sql value="select id from db_userdata.tb_userdata where account = '%s';" funcname="select_tb_userdata_by_account" selecttype="2" inputvalue="char* szaccount,vector<map<string,string> >&amp; vmResultData"/>

        <Sql value="select id from db_userdata.tb_userdata where account = '%s';" funcname="select_tb_userdata_by_nickname" selecttype="2" inputvalue="char* sznickname,vector<map<string,string> >&amp; vmResultData"/>
    </TableExt>

这里能够生成我想要的特殊SQL代码,目前仅支持查询代码的生成,之后扩展支持其余的代码。

目前,这个工具在个人某些项目中使用,生成超过3000行以上的代码,节省了个人开发时间。若是有兴趣,你们能够从github上下载它,随意玩耍,若是有需求,也能够给我意见完善它哈。
github地址:https://github.com/freeeyes/XML2DataBase 或者直接找我要也行。sql

相关文章
相关标签/搜索