文档章节

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

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

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
kubernetes用configmap实现容器中mysql应用配置文件的管理

1.configmap的作用理解 configMap起什么作用的呢? 举个例子,启用一个mysql容器。一般来说,mysql容器重要的有两部分,一部分为存储数据,一部分为配置文件my.cnf。 前面有测试过,存储数据...

am2012
08/07
0
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

没有更多内容

加载失败,请刷新页面

加载更多

解析如何用爬虫程序批量采集梨视频数据

本文介绍如何使用爬虫程序免费采集梨视频拍客的视频标题、链接、简介等信息。 采集字段: 视频标题 视频链接 点赞数 视频时长 发布时间 拍客 拍客链接 视频简介 标签 功能点目录: 如何对采集...

技术阿飞
18分钟前
1
0
《阿里铁军》的读书笔记和读后感范文2600字

《阿里铁军》的读书笔记和读后感范文2600字: 在中国互联网,有一个流传很广的说法是,百度强在技术,腾讯强在产品,阿里强在运营。虽然发展到今天,已经不能再用这样简单的视角来看待这三个...

原创小博客
47分钟前
5
0
怎样实际项目中运用责任链模式

1 模式概要 1.1 简介 责任链模式为请求创建一个接收者对象链,每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把请求传给下一个接收者,依此类推 责任链模式避...

小刀爱编程
今天
2
0
【宇润日常疯测-004】JS 遍历数组如何快!快!快!

首先,我就是一后端全栈,对前端也只是会用罢了。闲的无聊来测测,不深究,只看表面,不喜勿喷! 遍历数组在写 JS 代码时候一定是经常用的,那么怎么遍历能达到最高效率呢,很多人一定没有测...

宇润
今天
11
2
Linux系统如何定制History输出格式

Linux系统使用History命令来查看系统的运行记录,从而找出一些问题。但是History输出的数据中常常没有时间等信息。本文就来教大家Linux系统如何定制History输出格式。   具体方法如下 以r...

linuxprobe16
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部