InsertDB.cpp
上传用户:haiweijt
上传日期:2018-02-23
资源大小:8195k
文件大小:9k
源码类别:

Telnet服务器

开发平台:

Visual C++

  1. // TMyBuffer.cpp: implementation of the TMyBuffer class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "InsertDB.h"
  5. #include <stdio.h>
  6. #include <string.h>
  7. //////////////////////////////////////////////////////////////////////
  8. // Construction/Destruction
  9. //////////////////////////////////////////////////////////////////////
  10. InsertDB::InsertDB()
  11. {
  12. m_Offset = 0;//行中的字符索引
  13. m_flag=10;  //标记命令索引
  14. m_zhizhen=0; //标记是否读取字段名行并与配置命令所在的字段名行相符情况下的条件
  15. m_zhi=0; // 标记正在读取字段名行
  16. tco.Open();
  17. char ip[50];
  18. tco.ReadSystemString("IP", ip,32);
  19. char User[50];
  20. tco.ReadSystemString("User",User,sizeof(User));
  21. char PWD[50];
  22. tco.ReadSystemString("PWD",PWD,sizeof(PWD));
  23. char DB[50];
  24. tco.ReadSystemString("DB",DB,sizeof(DB));
  25. tn.Open(ip,User,PWD,DB);
  26. tn.Connect();
  27. char value[3];
  28. int count;
  29. int tt;
  30. char field[10][512];
  31. char v_field[6][50];
  32. char v_str[300];
  33. tco.ReadCount(value,sizeof(value));
  34. count=value[0]-48;//命令条数
  35. for(int t=0;t<count;t++)//将配置文件所有参数赋给文件变量
  36. {
  37. tco.ReadCmd(t,m_cmd[t],sizeof(m_cmd[t]));
  38. tco.ReadField(t,field[t],sizeof(field[t]));
  39. int m=0;
  40. tt=0;
  41. while(field[t][tt]!=' '&&(field[t][tt]!='')&&(field[t][tt]>0))
  42. {
  43. while(field[t][tt]==' ')
  44. {
  45. tt++;
  46. }
  47. int r=0;
  48. while((field[t][tt]!='^')&&(field[t][tt]!=''))
  49. {
  50. if(field[t][tt]=='-')
  51. {
  52. m_field[t][m][r++]='_'; //建表时字段不允许“-”符号
  53. field[t][tt]=='_';
  54. tt++;
  55. }
  56. m_field[t][m][r++]=field[t][tt++];
  57. }
  58. m_field[t][m][r]='';
  59. m++;
  60. m_fies[t]=m+48;
  61. if(field[t][tt]!='')
  62. tt++;
  63. }
  64. }
  65. for(int n=0;n<count;n++)//建表
  66. { int i=0;
  67. int j=0;
  68. while(m_cmd[n][i]!='')
  69. {
  70. if(m_cmd[n][i]==' ')
  71. { i++;
  72. v_cmd[n][j++]='_';
  73. }else{
  74. v_cmd[n][j++]=m_cmd[n][i++];
  75. }
  76. }
  77. v_cmd[n][j]='';
  78. strcpy(v_str,"CREATE TABLE ");
  79. strcat(v_str,v_cmd[n]);
  80. strcat(v_str,"( ");
  81. int k;
  82. for(k=0;k<m_fies[n]-49;k++)
  83. {
  84. strcat(v_str,m_field[n][k]);
  85. strcat(v_str," [nvarchar](300) ,");
  86. }
  87. strcat(v_str,m_field[n][k]);
  88. strcat(v_str," [nvarchar](300) )");
  89. tn.Execute(v_str);
  90. strcpy(v_str,"");
  91. }
  92. }
  93. InsertDB::~InsertDB()
  94. {
  95. }
  96. void InsertDB::InsertInto(char *str)
  97. {
  98. char Fie[6][200]={{""}};
  99. char Do[50]; //一个字段还有多个分离的字符串
  100. char str1[500]="";
  101.     char path[256];
  102. char cmd[100];
  103. int zd; //标记字段起始点
  104. int m_duozd=0; //标记遇到上条记录余下的记录
  105.    // TNewADO* tn=new TNewADO;
  106. // char* s=tco->GetConfigFileName(path,256);
  107.     int i=0;
  108.     int j=0;
  109. while((str[i]!=' ')&&(str[i]!='>'))
  110. {
  111. cmd[j++]=str[i++];
  112. }
  113. cmd[j]='';
  114. if(strcmp(cmd,"TCS_Switch")==0)
  115. {
  116. strcpy(cmd,"");
  117. i++;
  118. j=0;
  119. while(str[i]!='x0d')
  120. {
  121. cmd[j++]=str[i++];
  122. }
  123. cmd[j]='';
  124. for(int t=0;t<10;t++)
  125. {
  126. if(strcmp(cmd,m_cmd[t])==0)
  127. { //判断命令属于配置文件中的第几条,并用m_flag标注
  128. m_flag=t;
  129. for(int fo=0;fo<6;fo++)
  130. {
  131. ziduan[fo]=0;
  132. }
  133. return;
  134. }
  135. if(t==9) return;
  136. }
  137. //printf("---%sn",cmd);
  138. }
  139. i=0;j=0;
  140. while((i<strlen(str))&&m_flag!=10)//这里默认设置最多配置10条命令
  141. {
  142.   if((str[i]!=''))//(str[i]!=' ')&&
  143. {   
  144. while((str[i]=='-')&&(str[i+1]=='-'))
  145. return;
  146. zd=i;
  147. char zid[20]="";
  148. if(ziduan[0]==0){
  149. while(str[i]!=' ')
  150. {
  151. Fie[0][j++]=str[i++];
  152. }
  153. }else{
  154. while((i-zd)<ziduan[0]-1)
  155. {
  156. Fie[0][j++]=str[i++];
  157. int r;
  158. for( r=0;r<ziduan[0]-1;r++)
  159. {
  160. zid[r]=' ';
  161. }
  162. zid[r+1]='';
  163. }
  164. }
  165. Fie[0][j]='';//intferace
  166. //strcpy(v_duozd[0],Fie[0]);
  167.    if(strcmp(Fie[0],m_field[m_flag][0])==0)
  168. { //判断命令后,在找出信息列表中的表头首字段,如果是就继续读取
  169. m_zhizhen=1;
  170. m_zhi=1;
  171. if((strcmp(Fie[0],zid)==0))
  172.    {
  173.  m_duozd=1;
  174.    }
  175. if(m_zhizhen==1)
  176. {
  177. j=0;
  178. if(m_zhi==1)
  179. {
  180. while(str[i]==' ')
  181. {
  182.    i++;
  183. }
  184. if(m_zhi==1)
  185. ziduan[0]=i-zd;
  186. zd=i;
  187. while(str[i]!=' ')
  188. {
  189. if(str[i]=='-')
  190. {
  191. Fie[1][j++]='_';
  192. i++;
  193. }
  194.    Fie[1][j++]=str[i++];
  195. }
  196. }else{
  197. zd=i;
  198. while((i-zd)<ziduan[1]-1){
  199.  Fie[1][j++]=str[i++];
  200. }
  201. }
  202. Fie[1][j]=''; 
  203.  //ip
  204. //strcpy(v_duozd[1],Fie[1]);
  205. j=0;
  206. if(m_zhi==1)
  207. {
  208. while(str[i]==' ')
  209. {
  210.    i++;
  211. }
  212. if(m_zhi==1)
  213. ziduan[1]=i-zd;
  214. zd=i;
  215. while(str[i]!=' ')
  216. {
  217. if(str[i]=='-')
  218. {
  219. Fie[1][j++]='_';
  220. i++;
  221. }
  222.    Fie[2][j++]=str[i++];
  223. }
  224. }else{
  225. zd=i;
  226. while((i-zd)<ziduan[2]+1){
  227.  Fie[2][j++]=str[i++];
  228. }
  229. }
  230. Fie[2][j]='';       //ok
  231. //strcpy(v_duozd[2],Fie[2]);
  232. j=0;
  233. while((str[i]==' ')&&(str[i]!=''))
  234. {
  235.    i++;
  236. }
  237. if(m_zhi==1)
  238. ziduan[2]=i-zd;
  239. zd=i;
  240. if((m_zhi!=1)&&(ziduan[4]==2))
  241. {   int f=i;
  242. while(str[f]!='n')
  243. {
  244. f++;
  245. }
  246. ziduan[3]=f-i;
  247. }
  248. while((str[i]!=' ')&&(str[i]!=13))
  249. {
  250.    Fie[3][j++]=str[i];
  251.    
  252. i++;
  253. }
  254. Fie[3][j]='';    //method
  255.   //strcpy(v_duozd[3],Fie[3]);
  256. j=0;
  257. while((i-zd)<ziduan[3]-1)
  258. {
  259.    Do[j++]=str[i++];
  260. }
  261. Do[j]='';
  262. strcat(Fie[3],Do);
  263. strcpy(Do,"");
  264. j=0;
  265. while((str[i]==' ')&&(str[i]!=''))
  266. {
  267.    i++;
  268. }
  269. if(m_zhi==1)
  270. ziduan[3]=i-zd;
  271. zd=i;
  272. while(str[i]!=' '&&(str[i]!=''))
  273.    Fie[4][j++]=str[i++];
  274. }
  275. Fie[4][j]=' ';
  276. Fie[4][j+1]='';//status
  277. while((i-zd)<(ziduan[4]-2)){
  278. i++;
  279. j=0;
  280. while(i<(ziduan[4]+zd-1))
  281. {
  282.    Do[j++]=str[i++];
  283. }
  284. Do[j]='';
  285. strcat(Fie[4],Do);
  286. strcpy(Do,"");
  287. }
  288. //strcpy(v_duozd[4],Fie[4]);
  289. j=0;
  290. while(str[i]==' '&&(str[i]!=''))
  291. {
  292.    i++;
  293. }
  294. if(m_zhi==1)
  295. ziduan[4]=i-zd;
  296. zd=i;
  297. while((str[i]!=' ')&&(str[i]!=''))
  298. {
  299.    Fie[5][j++]=str[i++];
  300. }
  301. Fie[5][j]=''; //prot
  302. // strcpy(v_duozd[5],Fie[5]);
  303. if(m_zhi==1)
  304. {
  305. if(strcmp(Fie[1],m_field[m_flag][1])==0)
  306. {   
  307. m_zhi=0;
  308. return;
  309. }else{
  310. m_zhi=0;
  311. m_flag=10;
  312. return;
  313. }
  314. }
  315. while(i<strlen(str))
  316. {
  317.    i++;
  318. }
  319. if(m_zhi==1)
  320. ziduan[4]=i-zd;
  321. }
  322. }
  323. i++;
  324. }
  325. if(m_duozd==1){  //遇到一条记录占多行的情况 通过删除和插入累加到数据库中
  326. strcat(v_duozd[3],Fie[3]);
  327. char str2[200]="";
  328. strcpy(str2,"DELETE FROM ");
  329. strcat(str2,v_cmd[m_flag]);
  330. strcat(str2," WHERE ");
  331. strcat(str2,m_field[m_flag][0]);
  332. strcat(str2,"='");
  333. strcat(str2,v_duozd[0]);
  334. strcat(str2,"'");
  335. tn.Execute(str2);
  336. //m_duozd=0;
  337. char str3[200]="";
  338. strcpy(str3,"INSERT INTO ");
  339. strcat(str3,v_cmd[m_flag]);
  340. strcat(str3," (");
  341. int k;
  342. for(k=0;k<m_fies[m_flag]-49;k++)
  343. {
  344. strcat(str3,m_field[m_flag][k]);
  345. strcat(str3,"  ,");
  346. }
  347. strcat(str3,m_field[m_flag][k]);
  348. strcat(str3,") VALUES('");
  349. int n;
  350. for(n=0;n<m_fies[m_flag]-49;n++)
  351. {
  352. strcat(str3,v_duozd[n]);
  353. strcat(str3,"','");
  354. }
  355. strcat(str3,v_duozd[n]);
  356. strcat(str3,"')");
  357. tn.Execute(str3);
  358. }
  359. if((m_flag!=10)&&(m_duozd==0))
  360. {
  361. strcpy(str1,"INSERT INTO ");
  362. strcat(str1,v_cmd[m_flag]);
  363. strcat(str1," (");
  364. int k;
  365. for(k=0;k<m_fies[m_flag]-49;k++)
  366. {
  367. strcat(str1,m_field[m_flag][k]);
  368. strcat(str1,"  ,");
  369. }
  370. strcat(str1,m_field[m_flag][k]);
  371. strcat(str1,") VALUES('");
  372. int n;
  373. for(n=0;n<m_fies[m_flag]-49;n++)
  374. {
  375. strcat(str1,Fie[n]);
  376. strcat(str1,"','");
  377. }
  378. strcat(str1,Fie[n]);
  379. strcat(str1,"')");
  380. tn.Execute(str1);
  381. }
  382. if(m_duozd==0)
  383. {
  384. for(int k=0;k<6;k++){
  385. strcpy(v_duozd[k],Fie[k]);
  386. }
  387. }
  388. //一行一行的写入硬盘文件中
  389. FILE* fp = fopen("c:\Telnet.txt","at");
  390. fprintf(fp, "%s",str);
  391. fclose(fp);
  392. }
  393. void InsertDB::Insert(char *buf, int size)
  394. {
  395. if (size == 0)
  396. return;
  397. unsigned char tmpc = *(unsigned char *)buf;
  398. switch(tmpc)
  399. {
  400. case 8:
  401. if (m_Offset > 0)
  402. m_Offset --;
  403. break;
  404. case 13:
  405. m_Buffer[m_Offset++] = 'x0d';
  406. break;
  407. case 10:
  408. m_Buffer[m_Offset++] = 'x0a';
  409. m_Buffer[m_Offset] = '';
  410. InsertInto(m_Buffer);
  411. strcpy(m_Buffer,"");
  412. m_Offset = 0;
  413. break;
  414. default:
  415. m_Buffer[m_Offset++] = buf[0];
  416. break;
  417. }
  418. Insert(buf+1, size-1);
  419. }