敢不敢更懶,本身編寫的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

相關文章
相關標籤/搜索