站点数据上传
站点数据入库,注意此时是站点数据入库
debug参数
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/idc1/bin/obtmindtodb",
"args": ["/idcdata/surfdata" ,"127.0.0.1,root,mysqlpwd,mysql,3306" ,"utf8", "/log/idc/obtmindtodb.log"],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
程序运行参数
- 首先,上传的文件,现在和刚刚的站点参数文件不一样了,他现在是有多个文件的,不只有一个文件,而是多个文件,所以提供一个目录,代表上传的文件都放在哪里?
- 数据库连接参数
- 数据库的字符集
- 日志文件
主要流程
- 打开日志
- 开始工作
_obtmindtodb() 上传文件夹中的文件
流程
- 打开文件夹
- 将文件夹中的每个文件读出来,这里面文件类型不仅仅有xml还有csv格式,根据格式对一个文件进行解析,并解析到结构中,最终绑定到结构体中,上传。
- 将每个文件往数据库去存放
- 其实还是刚刚那个逻辑,不过现在,是针对于一个文件中所有的文件,而不是刚刚的只有一个的文件。但是逻辑还是一样的。
拿一个文件出来,将文件的每一条数据解析到专用数据结构中,从而通过专用的数据结构上传,但是记住此时的文件有可能是csv结构,所以要进行处理。
while(true)
{
//读取一个文件出来
while(文件读取每一行)
{
//如果该文件读取结束,break
//将读取的那一行解析到上传的结构体中,那个结构体和语句已经绑定好了
//所以你要将你读取的数据解析到那个结构体就行,这样那个类对象可以上传
//你获得是数据,但是你的数据不一定可以直接上传,所以要通过专业的数据
//接口上传,所以,你要将你的数据解析到那个数据接口,才可以上传数据
//通过类对象上传
}
//删除已经上传完成的文件
//统计
//提交事务
}
读取文件的每一行------->解析到上传的结构体之中------->上传
处理类CZHOBTMIND
说明,该类用于上传一个文件的数据到数据库中。
- 成员对象:数据库连接对象
- 日志对象
- 插入表的SQL语句句柄
- 你从文件中读取的一行,把他传送给他,要对他进行解析。但是这里是不是有点多余?这里是将执行的结果产生的结果的反馈给类去管理,即插入失败后,写入日志的时候要使用,到底是那一条数据插入失败了。所以要这个对象,其实没啥用,只是后来做功能的时候发现确实要。
- 最终用于上传数据的数据对象
- 这样,插入一条数据的职责交给一个类,你要在上传一条数据的时候,使用类的接口从而将改数据解析成统一接口,最后通过类上传。这个文件的每一条数据都这么上传知道这个文件结束,接着下一个文件。
SplitBuffer(char *strBuffer,bool bisxml)
该函数根据你传进来的一行数据,并且文件的格式,将给数据解析成接口数据结构,从而上传数据。
InsertTable()
生成上传的SQL 语句,上传到数据库。只管上传,如果有重复上传失败,那就把重复的数据写到日志文件中。这里不会,为什么呢?是因为,同一时间的天气数据是不可能有相同的,你这样的重复就是错误,直接忽略就行,但是其他的错误就不能局略,需要记录下,并且这个职责给了这个类,所以才要那个看起来没啥用的“一行数据对象”。
class CZHOBTMIND
{
public:
connection *m_conn; // 数据库连接。
CLogFile *m_logfile; // 日志。
sqlstatement m_stmt; // 插入表操作的sql。
char m_buffer[1024]; // 从文件中读到的一行。
struct st_zhobtmind m_zhobtmind; // 全国站点分钟观测数据结构。
CZHOBTMIND();
CZHOBTMIND(connection *conn,CLogFile *logfile);
~CZHOBTMIND();
void BindConnLog(connection *conn,CLogFile *logfile); // 把connection和CLogFile的传进去。
bool SplitBuffer(char *strBuffer,bool bisxml); // 把从文件读到的一行数据拆分到m_zhobtmind结构体中。
bool InsertTable(); // 把m_zhobtmind结构体中的数据插入到T_ZHOBTMIND表中。
};