DataImpl.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. #include "StdAfx.h"
  2. #include "DataImpl.h"
  3. #include "CharEncoding.h"
  4. #include "Global.h"
  5. #define FREE_MSG if ( m_pszErrmsg ) { sqlite3_free(m_pszErrmsg); m_pszErrmsg = NULL;}
  6. #define FREE_MSG2 if ( psqlite_error ) { sqlite3_free(psqlite_error); psqlite_error = NULL;}
  7. CDataImpl::CDataImpl(void):m_psqlite3(NULL),m_pszErrmsg(NULL)
  8. {
  9. //sqlite3_threadsafe();
  10. }
  11. CDataImpl::~CDataImpl(void)
  12. {
  13. Close();
  14. }
  15. BOOL CDataImpl::Open()
  16. {
  17. Close();
  18. CHAR szpath[MAX_PATH] = {0};
  19. _stprintf_s(szpath, _T("%ssms.db"), Global::g_szCurModuleDir);
  20. std::string strPath;
  21. if ( !CharEncoding::ASCII2UTF8(szpath,strPath))
  22. {
  23. return FALSE;
  24. }
  25. INT nResult = sqlite3_open(strPath.c_str(), &m_psqlite3);
  26. if ( nResult != SQLITE_OK )
  27. return FALSE;
  28. // 创建表;
  29. char* psqlite_error = NULL;
  30. if ( !QueryTable("mid"))
  31. {
  32. sqlite3_exec(m_psqlite3, _CREATE_MID_TABLE_, NULL, NULL, &psqlite_error);
  33. FREE_MSG2
  34. }
  35. if ( !QueryTable("keys"))
  36. {
  37. sqlite3_exec(m_psqlite3, _CREATE_KEYS_TABLE_, NULL, NULL, &psqlite_error);
  38. FREE_MSG2
  39. }
  40. if ( !QueryTable("log"))
  41. {
  42. sqlite3_exec(m_psqlite3, _CREATE_LOG_TABLE_, NULL, NULL, &psqlite_error);
  43. FREE_MSG2
  44. }
  45. return TRUE;
  46. }
  47. void CDataImpl::Close()
  48. {
  49. if ( m_psqlite3 )
  50. sqlite3_close(m_psqlite3);
  51. m_psqlite3 = NULL;
  52. if ( m_pszErrmsg )
  53. sqlite3_free(m_pszErrmsg);
  54. m_pszErrmsg = NULL;
  55. }
  56. BOOL CDataImpl::ExecteSQL(IN LPCSTR lpSQL)
  57. {
  58. if ( lpSQL == NULL || lpSQL[0] == '\0' )
  59. {
  60. //Global::WriteTextLog(_T("ExecteSQL:执行语句空!"));
  61. return FALSE;
  62. }
  63. if(m_psqlite3 == NULL)
  64. return FALSE;
  65. char* psqlite_error = NULL;
  66. int sqlite_error = sqlite3_exec(m_psqlite3, lpSQL, NULL, 0, &psqlite_error);
  67. if(SQLITE_OK != sqlite_error)
  68. {
  69. //Global::WriteTextLog(_T("ExecteSQL:%s"), psqlite_error);
  70. FREE_MSG2
  71. return FALSE;
  72. }
  73. return TRUE;
  74. }
  75. BOOL CDataImpl::QueryTable(std::string table)
  76. {
  77. if ( table.size() == 0 )
  78. {
  79. //Global::WriteTextLog(_T("ExecteSQL:执行语句空!"));
  80. return FALSE;
  81. }
  82. if(m_psqlite3 == NULL)
  83. return FALSE;
  84. INT nRow = 0;
  85. INT nCol = 0;
  86. char** pazResult = NULL;
  87. char* psqlite_error = NULL;
  88. char szSql[MAX_PATH] = {0};
  89. _stprintf_s(szSql, _T("select * from sqlite_master where type = 'table' and name = '%s'"), table.c_str());
  90. int sqlite_error = sqlite3_get_table(m_psqlite3, szSql, &pazResult, &nRow, &nCol, &psqlite_error);
  91. if ( sqlite_error != SQLITE_OK)
  92. {
  93. //Global::WriteTextLog(_T("QueryContactsType:%s"), m_pszErrmsg);
  94. FREE_MSG2
  95. return FALSE;
  96. }
  97. sqlite3_free_table(pazResult);
  98. return nRow != 0;
  99. }
  100. INT CDataImpl::QueryMidInfo(std::string order, STMid &data)
  101. {
  102. if ( m_psqlite3 == NULL )
  103. return -1;
  104. INT nRow = 0;
  105. INT nCol = 0;
  106. char** pazResult = NULL;
  107. char* psqlite_error = NULL;
  108. std::string strSql = _SELECT_MID_TABLE_;
  109. strSql.append(" WHERE bid = '");
  110. strSql.append(order);
  111. strSql.append("';");
  112. int sqlite_error = sqlite3_get_table(m_psqlite3, strSql.c_str(), &pazResult, &nRow, &nCol, &psqlite_error);
  113. if ( sqlite_error != SQLITE_OK)
  114. {
  115. //Global::WriteTextLog(_T("QueryContactsType:%s"), m_pszErrmsg);
  116. FREE_MSG2
  117. return -1;
  118. }
  119. if( nRow == 1)
  120. {
  121. #ifndef USE_UTF8
  122. data.order = pazResult[nCol+0];
  123. data.number = pazResult[nCol+1];
  124. data.pid = pazResult[nCol+2];
  125. data.ctype = pazResult[nCol+3];
  126. data.version = pazResult[nCol+4];
  127. data.purl = pazResult[nCol+5];
  128. data.psize = pazResult[nCol+6];
  129. data.pmd5 = pazResult[nCol+7];
  130. data.status = pazResult[nCol+8];
  131. data.start_date = pazResult[nCol+9];
  132. data.finish_date = pazResult[nCol+10];
  133. data.des = pazResult[nCol+11];
  134. #else
  135. // 由Native for SQLite3插入的数据,都是utf8格式;
  136. data.order = CharEncoding::UTF82ASCII(pazResult[nCol+0]);
  137. data.number = pazResult[nCol+1];
  138. data.pid = pazResult[nCol+2];
  139. data.ctype = CharEncoding::UTF82ASCII(pazResult[nCol+3]);
  140. data.version = CharEncoding::UTF82ASCII(pazResult[nCol+4]);
  141. data.purl = CharEncoding::UTF82ASCII(pazResult[nCol+5]);
  142. data.psize = pazResult[nCol+6];
  143. data.pmd5 = CharEncoding::UTF82ASCII(pazResult[nCol+7]);
  144. data.status = pazResult[nCol+8];
  145. data.start_date = CharEncoding::UTF82ASCII(pazResult[nCol+9]);
  146. data.finish_date = CharEncoding::UTF82ASCII(pazResult[nCol+10]);
  147. data.des = CharEncoding::UTF82ASCII(pazResult[nCol+11]);
  148. #endif
  149. }
  150. sqlite3_free_table(pazResult);
  151. return nRow;
  152. }
  153. INT CDataImpl::QueryKeyInfo(std::string sn, STKeys &data)
  154. {
  155. if ( m_psqlite3 == NULL )
  156. return -1;
  157. INT nRow = 0;
  158. INT nCol = 0;
  159. char** pazResult = NULL;
  160. char* psqlite_error = NULL;
  161. std::string strSql = _SELECT_KEYS_TABLE_;
  162. strSql.append(" WHERE sn = '");
  163. strSql.append(sn);
  164. strSql.append("';");
  165. int sqlite_error = sqlite3_get_table(m_psqlite3, strSql.c_str(), &pazResult, &nRow, &nCol, &psqlite_error);
  166. if ( sqlite_error != SQLITE_OK)
  167. {
  168. //Global::WriteTextLog(_T("QueryContactsInfo:%s"), m_pszErrmsg);
  169. FREE_MSG2
  170. return -1;
  171. }
  172. if ( nRow == 1)
  173. {
  174. #ifndef USE_UTF8
  175. data.sn = pazResult[nCol+0];
  176. data.keys = pazResult[nCol+1];
  177. data.copy_date = pazResult[nCol+2];
  178. data.report_date = pazResult[nCol+3];
  179. data.copy_status = pazResult[nCol+4];
  180. data.report_status = pazResult[nCol+5];
  181. #else
  182. // 由Native for SQLite3插入的数据,都是utf8格式;
  183. data.sn = CharEncoding::UTF82ASCII(pazResult[nCol+0]);
  184. data.keys = CharEncoding::UTF82ASCII(pazResult[nCol+1]);
  185. data.copy_date = CharEncoding::UTF82ASCII(pazResult[nCol+2]);
  186. data.report_date = CharEncoding::UTF82ASCII(pazResult[nCol+3]);
  187. data.copy_status = pazResult[nCol+4];
  188. data.report_status = pazResult[nCol+5];
  189. #endif
  190. }
  191. sqlite3_free_table(pazResult);
  192. return nRow;
  193. }
  194. INT CDataImpl::QueryUnReportKeyInfo(std::vector<STKeys> &vtdata)
  195. {
  196. if ( m_psqlite3 == NULL )
  197. return -1;
  198. INT nRow = 0;
  199. INT nCol = 0;
  200. char** pazResult = NULL;
  201. char* psqlite_error = NULL;
  202. std::string strSql = "SELECT sn,copy_date FROM keys WHERE copy_date <> '' and report_status in(0,-1)";
  203. int sqlite_error = sqlite3_get_table(m_psqlite3, strSql.c_str(), &pazResult, &nRow, &nCol, &psqlite_error);
  204. if ( sqlite_error != SQLITE_OK)
  205. {
  206. //Global::WriteTextLog(_T("QueryContactsInfo:%s"), m_pszErrmsg);
  207. FREE_MSG2
  208. return -1;
  209. }
  210. vtdata.resize(nRow);
  211. std::vector<STKeys>::iterator it = vtdata.begin();
  212. for(int i = 1; i <= nRow; i++, it++)
  213. {
  214. it->sn = pazResult[i*nCol+0];
  215. it->copy_date= pazResult[i*nCol+1];
  216. }
  217. sqlite3_free_table(pazResult);
  218. return nRow;
  219. }
  220. INT CDataImpl::QueryLogInfo(std::string sn, STLog &data)
  221. {
  222. if ( m_psqlite3 == NULL )
  223. return -1;
  224. INT nRow = 0;
  225. INT nCol = 0;
  226. char** pazResult = NULL;
  227. char* psqlite_error = NULL;
  228. int sqlite_error = sqlite3_get_table(m_psqlite3, _SELECT_LOG_TABLE_, &pazResult, &nRow, &nCol, &psqlite_error);
  229. if ( sqlite_error != SQLITE_OK)
  230. {
  231. //Global::WriteTextLog(_T("QueryTaskInfo:%s"), m_pszErrmsg);
  232. FREE_MSG2
  233. return -1;
  234. }
  235. if ( nRow == 1 )
  236. {
  237. #ifndef USE_UTF8
  238. data.type = pazResult[nCol+0];
  239. data.sn = pazResult[nCol+1];
  240. data.content = pazResult[nCol+2];
  241. data.gdate = pazResult[nCol+3];
  242. data.report_status = pazResult[nCol+4];
  243. #else
  244. // 由Native for SQLite3插入的数据,都是utf8格式;
  245. data.type = CharEncoding::UTF82ASCII(pazResult[nCol+0]);
  246. data.sn = CharEncoding::UTF82ASCII(pazResult[nCol+1]);
  247. data.content = CharEncoding::UTF82ASCII(pazResult[nCol+2]);
  248. data.gdate = pazResult[nCol+3];
  249. data.report_status = pazResult[nCol+4];
  250. #endif
  251. }
  252. sqlite3_free_table(pazResult);
  253. return nRow;
  254. }
  255. INT CDataImpl::QueryUnReportLogInfo(std::vector<STLog> &vtdata)
  256. {
  257. if ( m_psqlite3 == NULL )
  258. return -1;
  259. INT nRow = 0;
  260. INT nCol = 0;
  261. char** pazResult = NULL;
  262. char* psqlite_error = NULL;
  263. std::string strSql = "SELECT type, sn, content, gdate FROM log WHERE report_status in(0,-1)";
  264. int sqlite_error = sqlite3_get_table(m_psqlite3, strSql.c_str(), &pazResult, &nRow, &nCol, &psqlite_error);
  265. if ( sqlite_error != SQLITE_OK)
  266. {
  267. //Global::WriteTextLog(_T("QueryContactsInfo:%s"), m_pszErrmsg);
  268. FREE_MSG2
  269. return -1;
  270. }
  271. vtdata.resize(nRow);
  272. std::vector<STLog>::iterator it = vtdata.begin();
  273. for(int i = 1; i <= nRow; i++, it++)
  274. {
  275. it->type = pazResult[i*nCol+0];
  276. it->sn= pazResult[i*nCol+1];
  277. it->content= pazResult[i*nCol+2];
  278. it->gdate= pazResult[i*nCol+3];
  279. }
  280. sqlite3_free_table(pazResult);
  281. return nRow;
  282. }
  283. BOOL CDataImpl::InsertMidInfo(STMid &data)
  284. {
  285. if(m_psqlite3 == NULL)
  286. return FALSE;
  287. std::string strInsert = "INSERT INTO mid(bid, number, pid, ctype, version, purl, psize, pmd5)VALUES ('";
  288. strInsert.append(data.order);
  289. strInsert.append("','");
  290. strInsert.append(data.number);
  291. strInsert.append("','");
  292. strInsert.append(data.pid);
  293. strInsert.append("','");
  294. strInsert.append(data.ctype);
  295. strInsert.append("','");
  296. strInsert.append(data.version);
  297. strInsert.append("','");
  298. strInsert.append(data.purl);
  299. strInsert.append("','");
  300. strInsert.append(data.psize);
  301. strInsert.append("','");
  302. strInsert.append(data.pmd5);
  303. strInsert.append("');");
  304. char* psqlite_error = NULL;
  305. int sqlite_error = sqlite3_exec(m_psqlite3, strInsert.c_str(), NULL, 0, &psqlite_error);
  306. if(SQLITE_OK != sqlite_error)
  307. {
  308. //Global::WriteTextLog(_T("InsertContactsType:%s"), psqlite_error);
  309. FREE_MSG2
  310. return FALSE;
  311. }
  312. return TRUE;
  313. }
  314. BOOL CDataImpl::InsertKeyInfo(STKeys &data)
  315. {
  316. if(m_psqlite3 == NULL)
  317. return FALSE;
  318. std::string strInsert = "INSERT INTO keys(sn, keys) VALUES ('";
  319. strInsert.append(data.sn);
  320. strInsert.append("','");
  321. strInsert.append(data.keys);
  322. strInsert.append("');");
  323. char* psqlite_error = NULL;
  324. int sqlite_error = sqlite3_exec(m_psqlite3, strInsert.c_str(), NULL, 0, &psqlite_error);
  325. if(SQLITE_OK != sqlite_error)
  326. {
  327. //Global::WriteTextLog(_T("InsertContactsInfo:%s"), psqlite_error);
  328. FREE_MSG2
  329. return FALSE;
  330. }
  331. return TRUE;
  332. }
  333. BOOL CDataImpl::InsertLogInfo(STLog &data)
  334. {
  335. if(m_psqlite3 == NULL)
  336. return FALSE;
  337. std::string strInsert = "INSERT INTO log(type, sn, content, report_date, report_status) VALUES ('";
  338. strInsert.append(data.type);
  339. strInsert.append("','");
  340. strInsert.append(data.sn);
  341. strInsert.append("','");
  342. strInsert.append(data.content);
  343. strInsert.append("','");
  344. strInsert.append(data.report_date);
  345. strInsert.append("','");
  346. strInsert.append(data.report_status);
  347. strInsert.append("');");
  348. char* psqlite_error = NULL;
  349. int sqlite_error = sqlite3_exec(m_psqlite3, strInsert.c_str(), NULL, 0, &psqlite_error);
  350. if(SQLITE_OK != sqlite_error)
  351. {
  352. //Global::WriteTextLog(_T("InsertContactsInfo:%s"), psqlite_error);
  353. FREE_MSG2
  354. return FALSE;
  355. }
  356. return TRUE;
  357. }
  358. INT CDataImpl::BatchInsertKeyInfo(std::vector<STKeys> &vtdata)
  359. {
  360. char* psqlite_error = NULL;
  361. INT nRet = sqlite3_exec(m_psqlite3, "begin;", 0, 0, &psqlite_error);
  362. if ( nRet != SQLITE_OK )
  363. {
  364. FREE_MSG2
  365. return -1;
  366. }
  367. sqlite3_stmt *stmt;
  368. const char* sql = "INSERT INTO keys(sn, keys) VALUES (?,?)";
  369. sqlite3_prepare_v2(m_psqlite3, sql, strlen(sql), &stmt, 0);
  370. std::vector<STKeys>::iterator it = vtdata.begin();
  371. for ( int i = 0; it != vtdata.end(); it++, i++ )
  372. {
  373. sqlite3_reset(stmt);
  374. sqlite3_bind_text(stmt, 1, it->sn.c_str(), it->sn.size(), SQLITE_STATIC);
  375. sqlite3_bind_text(stmt, 2, it->keys.c_str(), it->keys.size(), SQLITE_STATIC);
  376. sqlite3_step(stmt);
  377. }
  378. nRet = sqlite3_finalize(stmt);
  379. if ( nRet != SQLITE_OK )
  380. {
  381. return -1;
  382. }
  383. nRet = sqlite3_exec(m_psqlite3, "commit;", 0, 0, &psqlite_error);
  384. if ( nRet != SQLITE_OK )
  385. {
  386. FREE_MSG2
  387. return -1;
  388. }
  389. return vtdata.size();
  390. }
  391. BOOL CDataImpl::UpdateDownloadStatus(std::string order, int status, std::string des /* = "" */ )
  392. {
  393. if(m_psqlite3 == NULL)
  394. return FALSE;
  395. char szStatus[10] = {0};
  396. _itoa_s(status, szStatus, 10);
  397. std::string strInsert = "UPDATE mid SET status ='";
  398. strInsert.append(szStatus);
  399. strInsert.append("', des='");
  400. if ( status == -1 )
  401. {
  402. strInsert.append(des);
  403. strInsert.append("'");
  404. }
  405. else if ( status == 1 )
  406. {
  407. strInsert.append("下载成功");
  408. strInsert.append("',finish_date=current_timestamp");
  409. }
  410. strInsert.append(" WHERE bid ='");
  411. strInsert.append(order);
  412. strInsert.append("';");
  413. char* psqlite_error = NULL;
  414. int sqlite_error = sqlite3_exec(m_psqlite3, strInsert.c_str(), NULL, 0, &psqlite_error);
  415. if(SQLITE_OK != sqlite_error)
  416. {
  417. //Global::WriteTextLog(_T("UpdateContactsType:%s"), psqlite_error);
  418. FREE_MSG2
  419. return FALSE;
  420. }
  421. return TRUE;
  422. }
  423. BOOL CDataImpl::UpdateKeyCopyStatus(std::string sn, int status)
  424. {
  425. if(m_psqlite3 == NULL)
  426. return FALSE;
  427. // 只记录抄写成功;
  428. if ( status != 1)
  429. return FALSE;
  430. char szStatus[10] = {0};
  431. _itoa_s(status, szStatus, 10);
  432. std::string strInsert = "UPDATE keys SET copy_status = '";
  433. strInsert.append(szStatus);
  434. strInsert.append("', copy_date=current_timestamp");
  435. strInsert.append(" WHERE sn ='");
  436. strInsert.append(sn);
  437. strInsert.append("';");
  438. char* psqlite_error = NULL;
  439. int sqlite_error = sqlite3_exec(m_psqlite3, strInsert.c_str(), NULL, 0, &psqlite_error);
  440. if(SQLITE_OK != sqlite_error)
  441. {
  442. //Global::WriteTextLog(_T("UpdateContactsInfo:%s"), psqlite_error);
  443. FREE_MSG2
  444. return FALSE;
  445. }
  446. return TRUE;
  447. }
  448. BOOL CDataImpl::UpdateKeyReportStatus(std::string sn, int status)
  449. {
  450. if(m_psqlite3 == NULL)
  451. return FALSE;
  452. // 只记录抄写成功;
  453. if ( status != 1)
  454. return FALSE;
  455. char szStatus[10] = {0};
  456. _itoa_s(status, szStatus, 10);
  457. std::string strInsert = "UPDATE keys SET report_status = '";
  458. strInsert.append(szStatus);
  459. strInsert.append("', report_date=current_timestamp");
  460. strInsert.append(" WHERE sn ='");
  461. strInsert.append(sn);
  462. strInsert.append("';");
  463. char* psqlite_error = NULL;
  464. int sqlite_error = sqlite3_exec(m_psqlite3, strInsert.c_str(), NULL, 0, &psqlite_error);
  465. if(SQLITE_OK != sqlite_error)
  466. {
  467. //Global::WriteTextLog(_T("UpdateContactsInfo:%s"), psqlite_error);
  468. FREE_MSG2
  469. return FALSE;
  470. }
  471. return TRUE;
  472. }
  473. BOOL CDataImpl::UpdateLogReportStatus(std::string sn, std::string type, int status)
  474. {
  475. if(m_psqlite3 == NULL)
  476. return FALSE;
  477. // 只记录抄写成功;
  478. if ( status != 1)
  479. return FALSE;
  480. char szStatus[10] = {0};
  481. _itoa_s(status, szStatus, 10);
  482. std::string strInsert = "UPDATE log SET report_status = '";
  483. strInsert.append(szStatus);
  484. strInsert.append("', report_date=current_timestamp");
  485. strInsert.append(" WHERE sn ='");
  486. strInsert.append(sn);
  487. strInsert.append("' and type ='");
  488. strInsert.append(type);
  489. strInsert.append("';");
  490. char* psqlite_error = NULL;
  491. int sqlite_error = sqlite3_exec(m_psqlite3, strInsert.c_str(), NULL, 0, &psqlite_error);
  492. if(SQLITE_OK != sqlite_error)
  493. {
  494. //Global::WriteTextLog(_T("UpdateContactsInfo:%s"), psqlite_error);
  495. FREE_MSG2
  496. return FALSE;
  497. }
  498. return TRUE;
  499. }