C/C++13天气APP:数据挖掘/HTTP协议/非结构化数据存储(filetoblob.cpp),数据管理/监控告警(hsmtable.cpp,tbspaceinfo.cpp)
Posted 码农编程录
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++13天气APP:数据挖掘/HTTP协议/非结构化数据存储(filetoblob.cpp),数据管理/监控告警(hsmtable.cpp,tbspaceinfo.cpp)相关的知识,希望对你有一定的参考价值。
文章目录
1. 数据挖掘:/etc/init.d,/etc/rc.local,sudo su
开机自启动:1./etc/rc.local(ubuntu)。2.update-rc.d管理。 mv new_service.sh /etc/init.d/,cd /etc/init.d/,update-rc.d new_service.sh defaults 90(90表明一个优先级,越高表示执行的越晚)。
在/etc/init.d目录下的可执行程序的优先级会高于/etc/systemd/system/下的.service文件(如果同时存在)。serivice xxxx start|stop|restart
相当于是对/etc/init.d下的xxxx的封装,相当于是一个管理命令,实际执行的是/etc/init.d下的可执行程序。如果/etc/init.d下没有该服务的可执行程序,则使用.service文件。
数据挖掘dmining和数据交换exptables
差不多(exptables自己设计数据表有keyid字段,从其他地方拿数据未必有keyid字段需要指定,也就是数据是增量的,但不提供增量提取方式即没有keyid字段),将数据从数据库中取出导入文件(执行一个sql拿出数据)。vi /etc/rc.local(随操作系统自启动)。
vi /htidc/gz…sh上面如下,如下要写的其实就是< selectsql >字段里内容。比如取近一小时数据,每次取到都有重复,但在入库时(获取到的数据生成xml再入自己库)处理重复就行。
//dminoracle.cpp
#include "_public.h"
#include "_ooci.h" //oracle数据库是_ooci.h,mysql数据库换成_mysql.h,PostgreSQL数据库换成_postgresql.h //公安内外网协议不通,数据挖掘不一定有数据,所以写入文件。
struct st_arg // 主程序的参数
char connstr[101];
char charset[51];
char tname[51];
char cols[1001];
char fieldname[1001];
char fieldlen[501];
int exptype;
char andstr[501];
char bname[51];
char ename[51];
char idfieldname[51];
char idfilename[301];
char exppath[301];
int timetvl;
starg;
CLogFile logfile;
connection conn;
bool _dmintables();
void EXIT(int sig);
vector<string> vfieldname; // 存放拆分fieldname后的容器
vector<int> vfieldlen; // 存放拆分fieldlen后的容器
int maxfieldlen; // 存放fieldlen的最大值
void SplitFields(); // 拆分fieldname和fieldlen
void _help(char *argv[]);
long maxkeyid; // 已挖掘数据的最大的id
bool LoadMaxKeyid(); // 从记录已获取数据最大id的文件中加载已挖掘数据的最大的id
bool UptMaxKeyid(); // 更新已挖掘数据的最大的id到文件中
bool _xmltoarg(char *strxmlbuffer);
int main(int argc,char *argv[])
if (argc!=3) _help(argv); return -1;
CloseIOAndSignal();
signal(SIGINT,EXIT); signal(SIGTERM,EXIT);
if (logfile.Open(argv[1],"a+")==false)
printf("打开日志文件失败(%s)。\\n",argv[1]); return -1;
if (_xmltoarg(argv[2])==false) return -1; //把xml解析到参数starg结构中
while (true)
if (conn.connecttodb(starg.connstr,starg.charset) != 0)
logfile.Write("connect database %s failed.\\n",starg.connstr); sleep(starg.timetvl); continue;
// logfile.Write("export table %s.\\n",starg.tname);
if (_dmintables() == false) logfile.Write("export tables failed.\\n");
conn.disconnect(); // 断开与数据库的连接
sleep(starg.timetvl);
return 0;
void EXIT(int sig)
logfile.Write("程序退出,sig=%d\\n\\n",sig);
exit(0);
//11111111111111111111111111111111111111111111显示程序的帮助
void _help(char *argv[])
printf("\\n");
printf("Using:/htidc/public/bin/dminoracle logfilename xmlbuffer\\n\\n");
printf("增量挖掘示例:\\n");
printf("Sample:/htidc/public/bin/dminoracle /log/shqx/dminoracle_surfdata_from_qx.log \\"<connstr>shqx/pwdidc@snorcl11g_198</connstr><charset>Simplified Chinese_China.ZHS16GBK</charset><tname>T_SURFDATA</tname><cols>obtid,to_char(ddatetime,'yyyymmddhh24miss'),t,p,u,wd,wf,r,vis</cols><fieldname>obtid,ddatetime,t,p,u,wd,wf,r,vis</fieldname><fieldlen>5,14,8,8,8,8,8,8,8</fieldlen><exptype>1</exptype><andstr> and obtid in ('59293','50745')</andstr><bname>SURFDATA_</bname><ename>_from_qx</ename><idfilename>/data/dmin/SURFDATA_from_qx.txt</idfilename><idfieldname>keyid</idfieldname><exppath>/data/shqx/sdata/fromqx</exppath><timetvl>30</timetvl>\\"\\n\\n");
printf("全量挖掘示例:\\n");
printf("Sample:/htidc/public/bin/dminoracle /log/shqx/dminoracle_obtcode_from_qx.log \\"<connstr>shqx/pwdidc@snorcl11g_198</connstr><charset>Simplified Chinese_China.ZHS16GBK</charset><tname>T_OBTCODE</tname><cols>obtid,obtname,provname,lat,lon,height</cols><fieldname>obtid,obtname,provname,lat,lon,height</fieldname><fieldlen>5,30,30,8,8,8</fieldlen><exptype>2</exptype><andstr> and rsts=1 and obtid in ('59293','50745')</andstr><bname>OBTCODE_</bname><ename>_from_qx</ename><exppath>/data/shqx/sdata/fromqx</exppath><timetvl>300</timetvl>\\"\\n\\n");
printf("本程序是数据中心的公共功能模块,从其它业务系统的数据库中挖掘数据,用于入库到数据中心。\\n");
printf("logfilename是本程序运行的日志文件。\\n");
printf("xmlbuffer为文件传输的参数,如下:\\n");
printf("数据库的连接参数 <connstr>shqx/pwdidc@snorcl11g_198</connstr>\\n");
printf("数据库的字符集 <charset>Simplified Chinese_China.ZHS16GBK</charset> 这个参数要与数据源数据库保持>一致,否则会出现中文乱码的情况。\\n");
printf("待挖掘数据的表名 <tname>T_SURFDATA</tname>\\n");
printf("需要挖掘字段的列表 <cols>obtid,to_char(ddatetime,'yyyymmddhh24miss'),t,p,u,wd,wf,r,vis</cols> 可以采用函数。\\n");
printf("挖掘字段的别名列表 <fieldname>obtid,ddatetime,t,p,u,wd,wf,r,vis</fieldname> 必须与cols一一对应。\\n");
printf("挖掘字段的长度列表 <fieldlen>5,14,8,8,8,8,8,8,8</fieldlen> 必须与cols一一对应。\\n");
printf("挖掘数据的方式 <exptype>1</exptype> 1-增量挖掘;2-全量挖掘,如果是增量挖掘,要求表一定要有表达记录序号的id字段。\\n");
printf("挖掘数据的附加条件 <andstr> and obtid in ('59293','50745')</andstr> 注意,关键字and不能少。\\n");
printf("数据文件的命名的前部分 <bname>SURFDATA_</bname>\\n");
printf("数据文件的命名的后部分 <ename>_from_qx</ename>\\n");
printf("挖掘数据表记录号字段名 <idfieldname>keyid</idfieldname> 当exptype=1时该参数有效。\\n");
printf("已挖掘数据id保存的文件名 <idfilename>/data/dmin/SURFDATA_from_qx.txt</idfilename> 当exptype=1时该参数有效。\\n");
printf("挖掘文件存放的目录 <exppath>/data/shqx/sdata/fromqx</exppath>\\n");
printf("挖掘数据的时间间隔 <timetvl>30</timetvl> 单位:秒,建议大于10。\\n");
printf("以上参数,除了idfieldname、idfilename和andstr,其它字段都不允许为空。\\n\\n\\n");
//1111111111111111111111111111111111111111111111把xml解析到参数starg结构中
bool _xmltoarg(char *strxmlbuffer)
memset(&starg,0,sizeof(struct st_arg));
GetXMLBuffer(strxmlbuffer,"connstr",starg.connstr);
if (strlen(starg.connstr)==0) logfile.Write("connstr is null.\\n"); return false;
GetXMLBuffer(strxmlbuffer,"charset",starg.charset);
if (strlen(starg.charset)==0) logfile.Write("charset is null.\\n"); return false;
GetXMLBuffer(strxmlbuffer,"tname",starg.tname);
if (strlen(starg.tname)==0) logfile.Write("tname is null.\\n"); return false;
GetXMLBuffer(strxmlbuffer,"cols",starg.cols);
if (strlen(starg.cols)==0) logfile.Write("cols is null.\\n"); return false;
GetXMLBuffer(strxmlbuffer,"fieldname",starg.fieldname);
if (strlen(starg.fieldname)==0) logfile.Write("fieldname is null.\\n"); return false;
GetXMLBuffer(strxmlbuffer,"fieldlen",starg.fieldlen);
if (strlen(starg.fieldlen)==0) logfile.Write("fieldlen is null.\\n"); return false;
GetXMLBuffer(strxmlbuffer,"exptype",&starg.exptype);
if ( (starg.exptype!=1) && (starg.exptype!=2) ) logfile.Write("exptype is not in (1,2).\\n"); return false;
GetXMLBuffer(strxmlbuffer,"andstr",starg.andstr);
if (strlen(starg.andstr)==0) logfile.Write("andstr is null.\\n"); return false;
GetXMLBuffer(strxmlbuffer,"bname",starg.bname);
if (strlen(starg.bname)==0) logfile.Write("bname is null.\\n"); return false;
GetXMLBuffer(strxmlbuffer,"ename",starg.ename);
if (strlen(starg.ename)==0) logfile.Write("ename is null.\\n"); return false;
GetXMLBuffer(strxmlbuffer,"idfieldname",starg.idfieldname);
if ( (starg.exptype==1) && (strlen(starg.idfieldname)==0) ) logfile.Write("idfieldname is null.\\n"); return false;
GetXMLBuffer(strxmlbuffer,"idfilename",starg.idfilename);
if ( (starg.exptype==1) && (strlen(starg.idfilename)==0) ) logfile.Write("idfilename is null.\\n"); return false;
GetXMLBuffer(strxmlbuffer,"exppath",starg.exppath);
if (strlen(starg.exppath)==0) logfile.Write("exppath is null.\\n"); return false;
GetXMLBuffer(strxmlbuffer,"timetvl",&starg.timetvl);
if (starg.timetvl==0) logfile.Write("timetvl is null.\\n"); return false;
// 拆分fieldname和fieldlen
SplitFields();
// 判断fieldname和fieldlen中元素的个数一定要相同
if (vfieldname.size() != vfieldlen.size() ) logfile.Write("fieldname和fieldlen的元素个数不同。.\\n"); return false;
return true;
//11111111111111111111111111111111111本程序的业务流程主函数
bool _dmintables()
// 从记录已获取数据最大id的文件中加载已挖掘数据的最大的id
if (LoadMaxKeyid()==false) logfile.Write("LoadMaxKeyid() failed.\\n"); return false;
// 生成挖掘数据的SQL语句
char strsql[4096];
char fieldvalue[vfieldname.size()][maxfieldlen+1]; // 输出变量定义为一个二维数组
memset(strsql,0,sizeof(strsql));
if (starg.exptype==1)
sprintf(strsql,"select %s,%s from %s where 1=1 and %s>%ld %s order by %s",starg.cols,starg.idfieldname,starg.tname,starg.idfieldname,maxkeyid,starg.andstr,starg.idfieldname);
else
sprintf(strsql,"select %s from %s where 1=1 %s",starg.cols,starg.tname,starg.andstr);
sqlstatement stmt(&conn);
stmt.prepare(strsql);
for (int ii=0;ii<vfieldname.size();ii++)
stmt.bindout(ii+1,fieldvalue[ii],vfieldlen[ii]);
if (starg.exptype==1) stmt.bindout(vfieldname.size()+1,&maxkeyid); //如果是增量挖掘,还要绑定id字段
if (stmt.execute() != 0) // 执行挖掘数据的SQL
logfile.Write("select %s failed.\\n%s\\n%s\\n",starg.tname,stmt.m_cda.message,stmt.m_sql); return false;
int iFileSeq=1; // 待生成文件的序号
char strFileName[301],strLocalTime[21];
CFile File;
while (true)
memset(fieldvalue,0,sizeof(fieldvalue));
if (stmt.next() !=0) break;
if (File.IsOpened()==false) // 把数据写入文件
memset(strLocalTime,0,sizeof(strLocalTime));
LocalTime(strLocalTime,"yyyymmddhh24miss");
memset(strFileName,0,sizeof(strFileName));
sprintf(strFileName,"%s/%s%s%s_%d.xml",starg.exppath,starg.bname,strLocalTime,starg.ename,iFileSeq++);
if (File.OpenForRename(strFileName,"w")==false)
logfile.Write("File.OpenForRename(%s) failed.\\n",strFileName); return false;
File.Fprintf("<data>\\n");
for (int ii=0;ii<vfieldname.size();ii++)
File.Fprintf("<%s>%s</%s>",vfieldname[ii].c_str(),fieldvalue[ii],vfieldname[ii].c_str());
File.Fprintf("<endl/>\\n");
//1000条记录写入一个文件完成
if (stmt.m_cda.rpc%1000==0)
File.Fprintf("</data>\\n");
if (File.CloseAndRename()==false)
logfile.Write("File.CloseAndRename(%s) failed.\\n",strFileName); return false;
// 更新已挖掘数据的最大的id到文件中
if (UptMaxKeyid()==false) logfile.Write("UptMaxKeyid() failed.\\n"); return false;
logfile.Write("create file %s ok.\\n",strFileName);
//不够1000条的写入一个文件
if (File.IsOpened()==true)
File.Fprintf("</data>\\n");
if (FileC/C++8天气APP:Oracle数据库安装,表操作,C语言操作Oracle数据库
C/C++12天气APP:不同数据建表入表,数据交换(exptables.cpp,ftpputfiles.cpp)
C/C++9天气APP:Oracle的虚表/日期/序列,索引/视图/链路/同义词,数据库高可用性
C/C++15天气APP:服务端(client.cpp,shtqappserver.cpp)
C/C++11天气APP:txt/xml文件处理入库(psurfdata.cpp,_shqx.h),数据结构设计(PowerDesigner)