groupdb.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. #include "groupdb.h"
  2. #include <QDateTime>
  3. #include <QDir>
  4. groupdb::groupdb(std::string strdbpath)
  5. {
  6. mstrdbpath = strdbpath;
  7. }
  8. void groupdb::OpenDataBase()
  9. {
  10. mbSQL = false;
  11. msleep(100);
  12. if(QSqlDatabase::contains("sqliteadc"))
  13. mdatabase = QSqlDatabase::database("sqliteadc");
  14. else
  15. mdatabase = QSqlDatabase::addDatabase("QSQLITE","sqliteadc");
  16. // mdatabase = QSqlDatabase::addDatabase("QSQLITE");
  17. // if(QSqlDatabase::contains("sqlite"))
  18. // mdatabase = QSqlDatabase::database("sqlite");
  19. // else
  20. // mdatabase = QSqlDatabase::addDatabase("QSQLITE","sqlite");
  21. mdatabase.setDatabaseName(mstrdbpath.data());
  22. if (!mdatabase.open())
  23. {
  24. qDebug("Error: Failed to connect database. error is %s ",mdatabase.lastError());
  25. return;
  26. }
  27. else
  28. {
  29. qDebug("Succeed to connect database.");
  30. }
  31. QSqlQuery sql_query(mdatabase);
  32. bool bHaveTable = true;
  33. //查询数据
  34. sql_query.exec("select count(*) from sqlite_master where type='table' and name = 'groupdata'");
  35. if(!sql_query.exec())
  36. {
  37. qDebug("%s",sql_query.lastError());
  38. return;
  39. }
  40. else
  41. {
  42. if(sql_query.next())
  43. {
  44. int count = sql_query.value(0).toInt();
  45. // qDebug("count %d ",count);
  46. if(count < 1)bHaveTable = false;
  47. }
  48. }
  49. if(bHaveTable == false)
  50. {
  51. if(!sql_query.exec("create table groupdata(id INTEGER primary key AUTOINCREMENT,recordid BIGINT, vehid TEXT,"
  52. "recvtime BIGINT,msgtime BIGINT,groupid INTEGER,"
  53. "intragroupid INTEGER,vehdata BLOB)"))
  54. {
  55. qDebug() << "Error: Fail to create table."<< sql_query.lastError();
  56. return;
  57. }
  58. if(!sql_query.exec("CREATE INDEX index_vehid ON groupdata (vehid)"))
  59. {
  60. qDebug() << "Error: Fail to create index_vehid."<< sql_query.lastError();
  61. return;
  62. }
  63. if(!sql_query.exec("CREATE INDEX index_recvtime ON groupdata (recvtime)"))
  64. {
  65. qDebug() << "Error: Fail to create index_recvtime."<< sql_query.lastError();
  66. return;
  67. }
  68. if(!sql_query.exec("CREATE INDEX index_recordid ON groupdata (recordid)"))
  69. {
  70. qDebug() << "Error: Fail to create index_recordid."<< sql_query.lastError();
  71. return;
  72. }
  73. qDebug("Create Table groupdata successfully.");
  74. }
  75. //查询数据
  76. sql_query.exec("select count(*) from sqlite_master where type='table' and name = 'recorddata'");
  77. if(!sql_query.exec())
  78. {
  79. qDebug("%s",sql_query.lastError());
  80. return;
  81. }
  82. else
  83. {
  84. if(sql_query.next())
  85. {
  86. int count = sql_query.value(0).toInt();
  87. // qDebug("count %d ",count);
  88. if(count < 1)bHaveTable = false;
  89. }
  90. }
  91. if(bHaveTable == false)
  92. {
  93. if(!sql_query.exec("create table recorddata(id INTEGER primary key AUTOINCREMENT,recordid BIGINT, groupid INTEGER,"
  94. "vehid TEXT)"))
  95. {
  96. qDebug() << "Error: Fail to create table."<< sql_query.lastError();
  97. return;
  98. }
  99. if(!sql_query.exec("CREATE INDEX index_vehid_rec ON recorddata (vehid)"))
  100. {
  101. qDebug() << "Error: Fail to create index_vehid."<< sql_query.lastError();
  102. return;
  103. }
  104. if(!sql_query.exec("CREATE INDEX index_groupid_rec ON recorddata (groupid)"))
  105. {
  106. qDebug() << "Error: Fail to create index_groupid."<< sql_query.lastError();
  107. return;
  108. }
  109. qDebug("Create Table recorddata successfully.");
  110. }
  111. mbSQL = true;
  112. }
  113. void groupdb::run()
  114. {
  115. OpenDataBase();
  116. //建立并打开数据库
  117. if(mbSQL == false)
  118. {
  119. qDebug("SQL not OK. so not write data to database.");
  120. return;
  121. }
  122. std::vector<iv::groupdbmsg> xvectordbmsg;
  123. qint64 nLastWrite = QDateTime::currentMSecsSinceEpoch();
  124. qint64 nWriteInterval = 1000;
  125. qint64 nLastCheckRecVector = QDateTime::currentMSecsSinceEpoch();
  126. qint64 nCheckRecInterval = 3000;
  127. while(!QThread::isInterruptionRequested())
  128. {
  129. qint64 nNow = QDateTime::currentMSecsSinceEpoch();
  130. if((nNow-nLastCheckRecVector) >= nCheckRecInterval)
  131. {
  132. nLastCheckRecVector = nNow;
  133. CheckRecID();
  134. }
  135. mMutexmsg.lock();
  136. if(mvectordbmsg.size() > 0)
  137. {
  138. unsigned int i;
  139. for(i=0;i<mvectordbmsg.size();i++)
  140. {
  141. xvectordbmsg.push_back(mvectordbmsg[i]);
  142. }
  143. mvectordbmsg.clear();
  144. }
  145. mMutexmsg.unlock();
  146. if(((xvectordbmsg.size()>10000)||((nNow-nLastWrite)>nWriteInterval))&&(xvectordbmsg.size()>0))
  147. {
  148. nLastWrite = nNow;
  149. QTime xTime;
  150. xTime.start();
  151. unsigned int i;
  152. for(i=0;i<xvectordbmsg.size();i++)
  153. {
  154. xvectordbmsg.at(i).mrecid = GetRecID(xvectordbmsg[i].mstrvehid,
  155. xvectordbmsg[i].mgroupid);
  156. }
  157. mdatabase.transaction();
  158. for(i=0;i<xvectordbmsg.size();i++)
  159. {
  160. QSqlQuery query;
  161. char strsen[1000];
  162. snprintf(strsen,1000,"INSERT INTO groupdata(vehid,recordid,recvtime,msgtime,groupid,intragroupid,vehdata)"
  163. "VALUES(\"%s\",%lld, %lld, %lld,%d,%d,:vehdata)",
  164. xvectordbmsg[i].mstrvehid.data(),xvectordbmsg[i].mrecid,xvectordbmsg[i].mrecvtime,
  165. xvectordbmsg[i].mmsgtime,xvectordbmsg[i].mgroupid,xvectordbmsg[i].mintragroupid);
  166. query.prepare(strsen);
  167. // qDebug(strsen);
  168. query.bindValue(":vehdata", xvectordbmsg[i].mba);
  169. // query.bindValue(":tracedata", batrace);
  170. query.exec();
  171. }
  172. mdatabase.commit();
  173. xvectordbmsg.clear();
  174. // qDebug("transaction time :%d",xTime.elapsed());
  175. }
  176. else
  177. {
  178. mqueryWaitMutex.lock();
  179. mwc_query.wait(&mqueryWaitMutex,50);
  180. mqueryWaitMutex.unlock();
  181. // msleep(50);
  182. }
  183. if(mql_bUpdate)
  184. {
  185. ExecQueryList();
  186. mql_wc.wakeAll();
  187. }
  188. if(mqd_bUpdate)
  189. {
  190. ExecQueryData();
  191. mqd_wc.wakeAll();
  192. }
  193. // msleep(1000);
  194. }
  195. mdatabase.close();
  196. }
  197. int groupdb::addmsg(qint64 recvtime, std::string strvehid, qint64 msgtime, int groupid,
  198. int intragroupid, QByteArray & ba)
  199. {
  200. mMutexmsg.lock();
  201. if(mvectordbmsg.size()> 10000)
  202. {
  203. qDebug("groupdb::addmsg msg buffer vector > 10000 , so not add.");
  204. mMutexmsg.unlock();
  205. return -1;
  206. }
  207. mMutexmsg.unlock();
  208. mMutexmsg.lock();
  209. iv::groupdbmsg xmsg;
  210. xmsg.mgroupid = groupid;
  211. xmsg.mintragroupid = intragroupid;
  212. xmsg.mmsgtime = msgtime;
  213. xmsg.mrecvtime = recvtime;
  214. xmsg.mstrvehid = strvehid;
  215. xmsg.mba = ba;
  216. mvectordbmsg.push_back(xmsg);
  217. mMutexmsg.unlock();
  218. return 0;
  219. }
  220. qint64 groupdb::GetRecID(std::string strvehid,int groupid)
  221. {
  222. qint64 nrecid = 0;
  223. bool bFind = false;
  224. iv::recid xrec;
  225. mMutexrec.lock();
  226. unsigned int i;
  227. for(i=0;i<mvectorrecid.size();i++)
  228. {
  229. if(mvectorrecid[i].mstrvehid == strvehid)
  230. {
  231. bFind = true;
  232. nrecid = mvectorrecid[i].mrecid;
  233. mvectorrecid[i].mnLastUpdateTime = QDateTime::currentMSecsSinceEpoch();
  234. break;
  235. }
  236. }
  237. if(bFind == false)
  238. {
  239. xrec.mgroupid = groupid;
  240. xrec.mnLastUpdateTime = QDateTime::currentMSecsSinceEpoch();
  241. xrec.mrecid = QDateTime::currentMSecsSinceEpoch();
  242. xrec.mstrvehid = strvehid;
  243. nrecid = xrec.mrecid;
  244. mvectorrecid.push_back(xrec);
  245. }
  246. mMutexrec.unlock();
  247. if(bFind == false)
  248. {
  249. QSqlQuery query;
  250. char strsen[1000];
  251. snprintf(strsen,1000,"INSERT INTO recorddata(recordid,groupid,vehid)"
  252. " VALUES(%lld, %d,\"%s\")",
  253. xrec.mrecid,xrec.mgroupid,xrec.mstrvehid.data());
  254. query.exec(strsen);
  255. qDebug(strsen);
  256. // query.exec();
  257. }
  258. return nrecid;
  259. }
  260. void groupdb::CheckRecID()
  261. {
  262. qint64 nEraseTime = 60000; //More than 1 minutes no data. erase.
  263. if(mvectorrecid.size() == 0)return;
  264. mMutexrec.lock();
  265. unsigned int i;
  266. qint64 nNow = QDateTime::currentMSecsSinceEpoch();
  267. for(i=0;i<mvectorrecid.size();i++)
  268. {
  269. if((nNow - mvectorrecid[i].mnLastUpdateTime)>nEraseTime)
  270. {
  271. mvectorrecid.erase(mvectorrecid.begin()+i);
  272. // qDebug("erase");
  273. }
  274. }
  275. mMutexrec.unlock();
  276. }
  277. void groupdb::ExecQueryList()
  278. {
  279. QTime xTime;
  280. xTime.start();
  281. mql_Mutexdata.lock();
  282. QSqlQuery query(mdatabase);
  283. char strsen[1000];
  284. snprintf(strsen,1000,"select * from recorddata where((recorddata.recordid >= %lld) &(recorddata.recordid <= %lld) &(recorddata.vehid = \"%s\"))",
  285. mql_xfrom,mql_xto,mql_strvehid.data());
  286. query.exec(strsen);
  287. mql_xvectorrecordtime.clear();
  288. if(!query.exec(strsen))
  289. {
  290. qDebug()<<query.lastError();
  291. }
  292. else
  293. {
  294. while(query.next())
  295. {
  296. int id = query.value(0).toInt();
  297. qint64 recordid = query.value(1).toLongLong();
  298. mql_xvectorrecordtime.push_back(recordid);
  299. std::string strvehid = query.value(3).toString().toStdString();
  300. }
  301. }
  302. mql_bUpdate = false;
  303. mql_bUpdateRes = true;
  304. mql_Mutexdata.unlock();
  305. qDebug("Exec query time is : %d ",xTime.elapsed());
  306. }
  307. int groupdb::GetFilePathDir(QString &strdir)
  308. {
  309. int nrtn = 0;
  310. strdir = getenv("HOME");
  311. strdir = strdir + "/groupdbtmp";
  312. QDir xDir;
  313. if(xDir.exists(strdir) == false)
  314. {
  315. qDebug("%s is not exist.Create ",strdir.toLatin1().data());
  316. if(false == xDir.mkdir(strdir))
  317. {
  318. nrtn = -1;
  319. }
  320. }
  321. return nrtn;
  322. }
  323. void groupdb::ExecQueryData()
  324. {
  325. QString strdir;
  326. if(GetFilePathDir(strdir ) == -1)
  327. {
  328. qDebug("Directory Fail.");
  329. mqd_bUpdateRes = false;
  330. mqd_nError = -11;
  331. return;
  332. }
  333. QString filename = QString(mqd_strvehid.data()) + "-"
  334. +QString::number(mqd_nrecordid)+"-"
  335. +QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz");
  336. QFile xFile;
  337. xFile.setFileName(strdir + "/" + filename);
  338. if(!xFile.open(QIODevice::ReadWrite))
  339. {
  340. qDebug("Open File Fail.");
  341. mqd_bUpdateRes = false;
  342. mqd_nError = -12;
  343. return;
  344. }
  345. QTime xTime;
  346. mqd_filename = filename.toStdString();
  347. mqd_filesize = 0;
  348. xTime.start();
  349. mqd_Mutexdata.lock();
  350. mqd_filesize = 0;
  351. QSqlQuery query(mdatabase);
  352. char strsen[1000];
  353. snprintf(strsen,1000,"select * from groupdata where((groupdata.recordid = %lld) &(groupdata.vehid = \"%s\"))",
  354. mqd_nrecordid,mqd_strvehid.data());
  355. query.exec(strsen);
  356. if(!query.exec(strsen))
  357. {
  358. qDebug()<<query.lastError();
  359. mqd_nError = -13;
  360. mqd_bUpdateRes = false;
  361. }
  362. else
  363. {
  364. while(query.next())
  365. {
  366. QByteArray badata =query.value(7).toByteArray();
  367. mqd_filesize = mqd_filesize + badata.size();
  368. xFile.write(badata);
  369. // int id = query.value(0).toInt();
  370. // qint64 recordid = query.value(1).toLongLong();
  371. // mql_xvectorrecordtime.push_back(recordid);
  372. // std::string strvehid = query.value(3).toString().toStdString();
  373. }
  374. mqd_bUpdateRes = true;
  375. }
  376. mqd_bUpdate = false;
  377. xFile.close();
  378. mqd_Mutexdata.unlock();
  379. qDebug("Exec querydata time is : %d ",xTime.elapsed());
  380. }
  381. int groupdb::getlist(qint64 xfrom,qint64 xto,std::string &strvehid, std::vector<qint64> &xvectorrecordtime)
  382. {
  383. if(mbSQL == false)
  384. {
  385. return -1;
  386. }
  387. int nres = 0;
  388. mql_Mutex.lock();
  389. mql_Mutexdata.lock();
  390. mql_xfrom = xfrom;
  391. mql_xto = xto;
  392. mql_bUpdateRes = false;
  393. mql_bUpdate = true;
  394. mql_strvehid = strvehid;
  395. mql_Mutexdata.unlock();
  396. mwc_query.wakeAll();
  397. QTime xTime;
  398. xTime.start();
  399. mql_waitmutex.lock();
  400. mql_wc.wait(&mql_waitmutex,300);
  401. mql_waitmutex.unlock();
  402. qDebug("query time is %d ",xTime.elapsed());
  403. if(mql_bUpdateRes == false)
  404. {
  405. nres = -2;
  406. }
  407. else
  408. {
  409. mql_Mutexdata.lock();
  410. xvectorrecordtime = mql_xvectorrecordtime;
  411. mql_bUpdateRes = false;
  412. mql_Mutexdata.unlock();
  413. }
  414. mql_Mutex.unlock();
  415. return nres;
  416. }
  417. int groupdb::getfilepath(qint64 nrecordid, std::string strvehid,std::string & strfilename,int & nfilesize)
  418. {
  419. if(mbSQL == false)
  420. {
  421. return -1;
  422. }
  423. int nres = 0;
  424. mqd_Mutex.lock();
  425. mqd_Mutexdata.lock();
  426. mqd_nrecordid = nrecordid;
  427. mqd_strvehid = strvehid;
  428. mqd_bUpdateRes = false;
  429. mqd_bUpdate = true;
  430. mqd_Mutexdata.unlock();
  431. mwc_query.wakeAll();
  432. QTime xTime;
  433. xTime.start();
  434. mqd_waitmutex.lock();
  435. mqd_wc.wait(&mqd_waitmutex,10000);
  436. mqd_waitmutex.unlock();
  437. qDebug("query time is %d ",xTime.elapsed());
  438. if(mqd_bUpdateRes == false)
  439. {
  440. if((mqd_nError == -11)||(mqd_nError == -12))
  441. {
  442. nres = -3;
  443. }
  444. else
  445. {
  446. nres = -2;
  447. }
  448. }
  449. else
  450. {
  451. mqd_Mutexdata.lock();
  452. mqd_bUpdateRes = false;
  453. strfilename = mqd_filename;
  454. nfilesize = mqd_filesize;
  455. mqd_Mutexdata.unlock();
  456. }
  457. mqd_Mutex.unlock();
  458. return nres;
  459. }
  460. int groupdb::GetFileData(std::string strfilename, qint64 nPos, qint64 nFilesize, QByteArray &ba)
  461. {
  462. QString strpath;
  463. if(GetFilePathDir(strpath)!= 0)
  464. {
  465. qDebug("Directory not exist.");
  466. return -1; //File Directory can't found.
  467. }
  468. strpath = strpath + "/"+ strfilename.data();
  469. QFile xFile;
  470. xFile.setFileName(strpath);
  471. if(!xFile.open(QIODevice::ReadOnly))
  472. {
  473. qDebug("Open File Fail.");
  474. return -2; //File Not Exist
  475. }
  476. if(xFile.seek(nPos) == false)
  477. {
  478. qDebug("Seek File Fail. pos is %lld",nPos);
  479. xFile.close();
  480. return -3;
  481. }
  482. ba.clear();
  483. ba = xFile.read(nFilesize);
  484. return ba.size();
  485. }