文档章节

总结配置文件的读取和生成

菅超鹏
 菅超鹏
发布于 2014/06/17 19:48
字数 811
阅读 147
收藏 7
点赞 0
评论 0

1. 生成配置文件(把一个数据库中的所有表都导出来作为配置文件)

#include <iostream>
#include <string>
#include <vector>
#include <mysql/mysql.h>
#include "json/json.h"
#include <fstream>
#include <cstdlib>

using namespace std;

int main(int argc, char* argv[])
{
    MYSQL mysql;
    mysql_init( &mysql );

    mysql_real_connect(
        &mysql,
        "192.168.16.114",
        "root",
        "root",
        "test",
        3306,
        NULL,
        0
    );

    string sql = "show tables;";
    mysql_query( &mysql, sql.c_str() );
    
    MYSQL_RES *result = NULL;
    result = mysql_store_result( &mysql );
    
    vector<string> tables;
    MYSQL_ROW row = NULL;
    //得到所有的表
    row = mysql_fetch_row( result );
    while ( NULL != row )
    {
        tables.push_back( row[0] );
        cout << row[0] << endl;
        row = mysql_fetch_row( result );
    }

    for(vector<string>::const_iterator cit = tables.begin(); cit != tables.end(); ++ cit)
    {
        sql = "select * from " + *cit;
        mysql_query( &mysql, sql.c_str() );
        
        cout << sql << endl;
        //得到表中列的数量
        result = mysql_store_result( &mysql );
    
        MYSQL_FIELD* field = NULL;
        
        ofstream os;
        string tableName = *cit + ".json";
        os.open( tableName.c_str() );

        Json::Value jsonTable;
        MYSQL_ROW row1 = mysql_fetch_row( result );
        int field_count = mysql_num_fields( result );
        while ( NULL != row1 )
        {
            Json::Value jsonRow;
            for(int i = 0; i < field_count; ++i)
            {
                field = mysql_fetch_field_direct( result, i );
                
                    
                switch(field->type)    
                {
                case MYSQL_TYPE_TINY:
                    cout << "MYSQL_TYPE_TINY" << endl;
                    break;
                case MYSQL_TYPE_SHORT:
                    cout << "MYSQL_TYPE_SHORT" << endl;
                    break;
                case MYSQL_TYPE_BLOB:
                    cout << "MYSQL_TYPE_BLOB" << endl;
                    break;
                case MYSQL_TYPE_LONG:
                    jsonRow[field->name] = Json::Value( atoi(row1[i]) );    
                    cout << "MYSQL_TYPE_LONG" << endl;
                    break;
                case MYSQL_TYPE_VAR_STRING:
                    cout << "MYSQL_TYPE_VAR_STRING" << endl;
                    jsonRow[field->name] = Json::Value( row1[i] );    
                    break;
                }
            
            }
            
            row1 = mysql_fetch_row( result );
            //cout << *cit << endl;
            
            jsonTable.append(jsonRow);
        }
        
        
        os << jsonTable;
        os << flush;
        os.close();
    }

    
    
    return 0;
}

2. 导出的一个配置文件为student.json具体内容如下

[
    
    {
        "address" : "gzjd",
        "age" : 24,
        "id" : 2,
        "name" : "pj"
    },
    
    {
        "address" : "gzfy",
        "age" : 24,
        "id" : 1,
        "name" : "jp"
    },
    
    {
        "address" : "sdjlfjsdl",
        "age" : 23,
        "id" : 3,
        "name" : "fs"
    }
]

3. 一个生成配置文件读取的工具(相当粗糙,待优化)

//C++ 必备头文件
#include <iostream>
#include <string>
#include <vector>

//要对文件进行操作
#include <fstream>

//需要访问数据库
#include <mysql/mysql.h>

//需要用到json库
#include "json/json.h" 
using namespace std;

//1. 生成load json的代码
//2. 生成测试load json的代码
int main(int argc, char* argv[])
{
    MYSQL mysql;
    mysql_init( &mysql );
    
    mysql_real_connect(
        &mysql,
        "192.168.16.114",
        "root",
        "root",
        "test",
        3306,
        NULL,
        0
    );

    string sql = "select * from student"; //暂时写死表
    mysql_query( &mysql, sql.c_str() );

    cout << sql << endl << endl;

    MYSQL_RES *result = NULL;
    result = mysql_store_result( &mysql );

    //生成头文件
    fstream fs;
    fs.open("TStudent.h", ios::out);
    fs << "#ifndef _CONFIG_LOADER_STUDENT_H_" << endl;
    fs << "#define _CONFIG_LOADER_STUDENT_H_" << endl;
    
    fs << "#include <iostream>" << endl;
    fs << "#include <fstream>" << endl;
    fs << "#include \"json/json.h\"" << endl;

    fs << endl << "using namespace std;" << endl;
    
    fs << "namespace Tables" << endl;
    fs << "{" << endl;
    fs << "\tclass TStudent" << endl;
    fs << "\t{" << endl;
    fs << "\tpublic:" << endl;

    
    int field_count = mysql_num_fields( result );
    for(int i = 0; i < field_count; ++ i)
    {
        
        MYSQL_FIELD* field = mysql_fetch_field_direct( result, i);
        switch(field->type)
        {
        case MYSQL_TYPE_LONG:
            fs << "\t\t\tint ";
            break;
        case MYSQL_TYPE_VAR_STRING:
            fs << "\t\t\tstd::string ";
            break;
        }
        fs << field->name << ";" << endl;
    }
    fs << "\t};" << endl;
    fs << "\ttypedef std::vector<TStudent> SeqTStudent;" << endl << endl;
    {
        //load config function
        fs << "\tvoid fromJs( TStudent& t, Json::Value json)" << endl;
        fs << "\t{" << endl;
        fs << "\t\tt.id = json[\"id\"].asInt();" << endl;
        fs << "\t\tt.name = json[\"name\"].asString();" << endl;
        fs << "\t\tt.age = json[\"age\"].asInt();" << endl;
        fs << "\t\tt.address = json[\"address\"].asString();" << endl;
        fs << "\t}" << endl;
        
        fs << "\t" << "void loadFile(const std::string& file, SeqTStudent& seq)" << endl;
        fs << "\t" << "{" << endl;
        fs << "\t" << "\t" << "Json::Value json;" << endl;
        fs << "\t" << "\t" << "Json::Reader reader;" << endl;
        fs << "\t" << "\t" << "ifstream ifs( file.c_str() );" << endl;
        fs << "\t" << "\t" << "reader.parse(ifs, json);" << endl;
        fs << "\t" << "\t" << "TStudent stu;" << endl;
        fs << "\t" << "\t" << "for(Json::Value::UInt i = 0; i < json.size(); ++ i)" << endl;
        fs << "\t" << "\t" << "{" << endl;
        fs << "\t" << "\t" << "\t" << "fromJs( stu, json[i] );" << endl;
        fs << "\t" << "\t" << "\t" << "seq.push_back( stu );" << endl;
        fs << "\t" << "\t" << "}" << endl;
        fs << "\t" << "}" << endl;
    }
    
    fs << "}" << endl;;
    fs << endl;
    fs << "#endif // _CONFIG_LOADER_STUDENT_H_" << endl;
    fs.flush();
    fs.close();
    
    return 0;
}

4. 测试3生成出来的文件TStudent.h

#include <iostream>
#include "TStudent.h"

using namespace Tables;

int main(int argc, char* argv[])
{
    SeqTStudent seqStu;
    loadFile("student.json", seqStu);
    
    for( SeqTStudent::const_iterator cit = seqStu.begin(); cit != seqStu.end(); ++cit)
    {
        cout << "id: " << cit->id << "\t\tname: " << cit->name << "\t\tage: " << cit->age << "\t\taddress: " << cit->address << endl;
    }
    return 0;
}

5. 4的解析结果

d: 2        name: pj        age: 24        address: gzjd
id: 1        name: jp        age: 24        address: gzfy
id: 3        name: fs        age: 23        address: sdjlfjsdl


© 著作权归作者所有

共有 人打赏支持
菅超鹏
粉丝 0
博文 10
码字总数 2856
作品 0
广州
程序员
MyBatis整合Spring的实现(1)

目的 MyBatis是一个基于Java的持久层框架。也是很多程序员的最爱,因为自己控制的SQL时,写出一个好的SQL会大大的提高整体程序的性能。目前的项目一般都是MyBatis和Spring的整合,那么具体的...

tara_qri
2015/10/24
332
0
如何使用C++读取配置文件(ini)

如何使用Python3读取配置文件(ini) ini文件简介 ini是我们常见到的配置文件格式之一。 ini是微软Windows操作系统中的文件扩展名(也常用在其他系统)。 INI是英文“初始化(Initial)”的缩...

龙之田
2014/04/23
0
0
如何使用Python3读取配置文件(ini)

如何使用Python3读取配置文件(ini) ini文件简介 ini是我们常见到的配置文件格式之一。 ini是微软Windows操作系统中的文件扩展名(也常用在其他系统)。 INI是英文“初始化(Initial)”的缩...

龙之田
2014/04/15
0
0
snort配置文件中的PORT解析

简介 snort读取配置文件时每条规则包括规则头和规则选项,而规则选项中的一个重要部分就是端口。snort中对端口的解析和对IP的解析思想相同但编码却有较大的差别。 IP解析时利用拷贝副本的方式...

面码
2014/07/11
0
0
IO流学习总结(下)---配置文件

Properties 配置文件:将软件中可变的部分数据可以定义到一个文件中,方便以后更改,该文件称之为配置文件。 优势: 提高代码的维护性。 Properties继承map是键值对类型 但是集合中的键值对都...

codingcoge
04/25
0
0
使用 MyBatis Generator 工具生成MyBatis相关类和Mapper文件2

之前我写过一篇Blog说明了使用MyBatisGenerator工具,从配置文件generatorConfig.xml读取配置并生成可供MyBatis使用的对象和mapper文件。 Blog地址位于:http://my.oschina.net/Tsybius2014...

北风其凉
2016/05/20
268
0
回顾一下MyBatis逆向工程——自动生成代码

⭐⭐⭐⭐⭐最最最最最重要的事情: 我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snailclimb/Java-Guide 我...

snailclimb
07/12
0
0
【ApiDoc】自动化导出接口文档之HTML/Markdown/PDF实践

本文主要参考 ApiDoc官方文档 最近项目开始接口测试,需要提供一份最新、最全的接口文档,也许你觉得没什么,但是如果我要求每个接口文档都要像下面的例子一样: 接口标题 接口描述 请求头参数...

liqingbiubiu
2017/12/22
0
0
struts2 spring hibernate执行流程

Struts2 Hibernate Spring 运行流程与部分机制 Tomcat容器被加载,找到该webApplication相对应的web.xml 开始解析web.xml中的信息 读取到一个spring的监听器,告诉spring容器开始初始化配置文...

李永china
2016/05/04
141
0
vsftpd虚拟用户创建实例(转)

vsftpd虚拟用户创建实例,有需要的朋友可以参考下。 vsftpd虚拟用户创建实例,有需要的朋友可以参考下。 本文原始链接:http://www.jbxue.com/article/3998.html 1、生成数据库口令文件(让人...

mysoftsky
2013/11/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CentoOS6.6安装netcat

CentOS下安装netcat 使用zookeeper过程中,需要监控集群状态。在使用四字命令时(echo conf | nc localhost 2181),报出如下错误:-bash: netcat: command not found。 我的系统是CentOS 6....

ghou-靠墙哭
7分钟前
0
0
es6之解构赋值巧用

ES6 允许按照一定模式,从数组、对象等中提取值,对变量进行赋值,这被称为解构赋值。 如何进行解构赋值我这里就不赘述,本篇文章主要是将解构赋值的巧妙使用之处。 1、交互变量的值 常用交互...

秋季长青
12分钟前
0
0
Elasitcsearch High Level Rest Client学习笔记(三)批量api

Bulk Request BulkRequest可以在一起从请求执行批量添加、更新和删除,至少需要添加一个操作 BulkRequest request = new BulkRequest(); //创建BulkRequestrequest.add(new IndexRequest("...

木子SMZ
15分钟前
0
0
mybatis-dynamic sql

OGNL expressions if 判断是否存在值 <select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{tit......

writeademo
23分钟前
0
0
社交系统ThinkSNS+ V1.8.3更新播报

     研发发布版本号:1.8.3   本次版本于2018年7月16日发布   本次发布类型:新增功能、细节调整与优化   社交系统ThinkSNSPlus更新体验:请于官网下载/安装最新版或联系QQ35159...

ThinkSNS账号
26分钟前
0
0
教育思考:选择编程是一场父母和孩子的和解[图]

教育思考:选择编程是一场父母和孩子的和解[图]: 之前有个很热的段子是这样讲的:深夜十点的时候,某小区一女子大声喊叫“什么关系?啊?!到底什么关系?你说!”最后发现原来是一位妈妈陪...

原创小博客
27分钟前
0
0
X64汇编之指令格式解析

最近由于项目组内要做特征码搜索的东西,便于去Hook一些未导出函数,你懂得...于是就闲着学习了一下x86/x64的汇编指令格式。x86的汇编指令格式请参照http://bbs.pediy.com/showthread.php?t...

simpower
30分钟前
0
0
rust 语法概要(只适合不熟悉时快速查阅使用,不适合理解其精髓。未完待续)

注意:本内容只适合快查,不适合理解精髓。精髓请研读 https://kaisery.github.io/trpl-zh-cn/foreword.html 基本数据类型 i8,i16,i32,i64,i128 u8,u16,u32,u64,u128 f32,f64 char bool:true...

捍卫机密
33分钟前
0
0
JS中严格模式和非严格模式

1,使用 严格模式的使用很简单,只有在代码首部加入字符串 "use strict"。必须在首部即首部指其前面没有任何有效js代码除注释,否则无效 2.注意事项 (1)不使用var声明变量严格模式中将不通...

AndyZhouX
33分钟前
0
0
Nginx配置error_page 404 500等自定义的错误页面

Nginx 做web server时, 开发中发现有时候的网站代码有错误,我们需要跳转到一个指定内容的错误页面: 1. 在nginx.conf配置文件上加上一句: fastcgi_intercept_errors on; 2. 服务中加上: er...

MichaelShu
35分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部