总结配置文件的读取和生成
总结配置文件的读取和生成
菅超鹏 发表于4年前
总结配置文件的读取和生成
  • 发表于 4年前
  • 阅读 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
×
菅超鹏
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: