文档章节

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

菅超鹏
 菅超鹏
发布于 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

没有更多内容

加载失败,请刷新页面

加载更多

C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
47分钟前
2
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
51分钟前
1
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
53分钟前
1
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
59分钟前
1
0
使用xtrabackup完成远程备份

转载收藏,以防丢失 需求 Can I backup remote databases from my local server02-27-2013, 06:17 AMHi, I am using mysqldump so far for taking daily backups of my Production datab......

阿dai
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部