IncADataDB.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. #pragma once
  2. #include "stdafx.h"
  3. #include "IncADataDB.h"
  4. #include "IncADataTable.h"
  5. namespace OTSSQLITE
  6. {
  7. CIncADataDB::CIncADataDB(CDBStoreBasePtr a_datastore)
  8. {
  9. m_tableInfo.reset(new CIncADataTable());
  10. myDB = CreateNewSQLiteDB(a_datastore,m_tableInfo);
  11. }
  12. CIncADataDB::~CIncADataDB()
  13. {
  14. }
  15. BOOL CIncADataDB::UpdataAIncA(const COTSParticlePtr a_pParticle)
  16. {
  17. if (!Init())
  18. {
  19. ASSERT(FALSE);
  20. return FALSE;
  21. }
  22. ASSERT(a_pParticle);
  23. if (!a_pParticle)
  24. {
  25. return FALSE;
  26. }
  27. auto tableInfoPtr = GetTableInfo();
  28. ASSERT(tableInfoPtr);
  29. if (!tableInfoPtr)
  30. {
  31. return FALSE;
  32. }
  33. auto datastorePtr = GetDatastore();
  34. ASSERT(datastorePtr);
  35. if (!datastorePtr)
  36. {
  37. return FALSE;
  38. }
  39. CString sSQLCommand = "Update IncAData set AveGray = %d,Area = %f,TypeID=%d where FieldID = %d and ParticleId = %d ";
  40. sSQLCommand.Format(sSQLCommand,
  41. a_pParticle->GetAveGray(),
  42. a_pParticle->GetActualArea(),
  43. a_pParticle->GetType(),
  44. a_pParticle->GetFieldId(),
  45. a_pParticle->GetParticleId());
  46. if (!datastorePtr->RunCommand(sSQLCommand))
  47. {
  48. ASSERT(FALSE);
  49. return false;
  50. }
  51. return true;
  52. }
  53. BOOL CIncADataDB::SaveAIncA(const COTSParticlePtr a_pParticle, const CPosXrayPtr a_pXray,const CPoint fldPos)
  54. {
  55. if (!Init())
  56. {
  57. ASSERT(FALSE);
  58. return FALSE;
  59. }
  60. ASSERT(a_pParticle);
  61. if(!a_pParticle)
  62. {
  63. return FALSE;
  64. }
  65. ASSERT(a_pXray);
  66. if (!a_pXray)
  67. {
  68. return FALSE;
  69. }
  70. // safety check
  71. //1. particle should be agree with xray
  72. /*if ((!(a_pParticle->GetFieldId() == a_pXray->GetScanFieldId()))
  73. || (!(a_pParticle->GetAnalysisId() == a_pXray->GetIndex())))
  74. {
  75. return FALSE;
  76. }*/
  77. auto tableInfoPtr = GetTableInfo();
  78. ASSERT(tableInfoPtr);
  79. if (!tableInfoPtr)
  80. {
  81. return FALSE;
  82. }
  83. auto datastorePtr = GetDatastore();
  84. ASSERT(datastorePtr);
  85. if (!datastorePtr)
  86. {
  87. return FALSE;
  88. }
  89. CString sInsertFormat = tableInfoPtr->GetInsertCommandFormatString(TRUE);
  90. CString sSQLCommand;
  91. sSQLCommand.Format(sInsertFormat,
  92. a_pParticle->GetFieldId(),
  93. a_pParticle->GetAnalysisId(),
  94. a_pParticle->GetAveGray(),
  95. a_pParticle->GetParticleRect().left,
  96. a_pParticle->GetParticleRect().top,
  97. a_pParticle->GetParticleRect().Width(),
  98. a_pParticle->GetParticleRect().Height(),
  99. a_pParticle->GetActualArea(),
  100. a_pParticle->GetXRayPos().x,
  101. a_pParticle->GetXRayPos().y,
  102. a_pParticle->GetType(),
  103. (int)a_pXray->GetElementQuantifyData().size(),
  104. (int)(a_pParticle->GetFeature()->GetSegmentsList().size()),
  105. fldPos.x,
  106. fldPos.y,
  107. a_pParticle->GetParticleId(),
  108. a_pParticle->GetDMax(),
  109. a_pParticle->GetDMin(),
  110. a_pParticle->GetDPerp(),
  111. a_pParticle->GetPerimeter(),
  112. a_pParticle->GetOrientation(),
  113. a_pParticle->GetDInscr(),
  114. a_pParticle->GetDMean(),
  115. a_pParticle->GetDElong(),
  116. a_pParticle->GetFeretDiameter(),
  117. a_pParticle->GetClassifyName().c_str(),
  118. a_pParticle->GetColor().c_str()
  119. );
  120. if (!datastorePtr->RunCommand(sSQLCommand))
  121. {
  122. LogErrorTrace(__FILE__, __LINE__, _T("Insert inclusion data(%d:%d:%d:%d:%d:%d:%d:%f:%d:%d:%d:%d:%s:%s:%s:%s:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f:%f) failed: %s command error"),
  123. a_pParticle->GetFieldId(),
  124. a_pParticle->GetAnalysisId(),
  125. a_pParticle->GetAveGray(),
  126. a_pParticle->GetParticleRect().left,
  127. a_pParticle->GetParticleRect().top,
  128. a_pParticle->GetParticleRect().Width(),
  129. a_pParticle->GetParticleRect().Height(),
  130. a_pParticle->GetActualArea(),
  131. a_pParticle->GetXRayPos().x,
  132. a_pParticle->GetXRayPos().y,
  133. a_pParticle->GetType(),
  134. (int)a_pXray->GetElementQuantifyData().size(),
  135. (int)(a_pParticle->GetFeature()->GetSegmentsList().size()),
  136. fldPos.x,
  137. fldPos.y,
  138. a_pParticle->GetParticleId(),
  139. a_pParticle->GetDMax(),
  140. a_pParticle->GetDMin(),
  141. a_pParticle->GetDPerp(),
  142. a_pParticle->GetPerimeter(),
  143. a_pParticle->GetOrientation(),
  144. a_pParticle->GetDInscr(),
  145. a_pParticle->GetDMean(),
  146. a_pParticle->GetDElong(),
  147. a_pParticle->GetFeretDiameter(),
  148. a_pParticle->GetClassifyName(),
  149. a_pParticle->GetColor(),
  150. sSQLCommand);
  151. ASSERT(FALSE);
  152. return FALSE;
  153. }
  154. return TRUE;
  155. }
  156. CDBTableBasePtr CIncADataDB::GetTableInfo()
  157. {
  158. /* if (!m_tableInfo)
  159. {
  160. m_tableInfo.reset(new CIncADataTable);
  161. }*/
  162. return m_tableInfo;
  163. }
  164. CDBQueryBasePtr CIncADataDB::GetQueryById(const long a_nXrayId, const long a_nFieldId)
  165. {
  166. CDBQueryBasePtr query;
  167. auto datastorePtr = GetDatastore();
  168. ASSERT(datastorePtr);
  169. if (!datastorePtr)
  170. {
  171. return query;
  172. }
  173. auto tableInfoPtr = GetTableInfo();
  174. ASSERT(tableInfoPtr);
  175. if (!tableInfoPtr)
  176. {
  177. return query;
  178. }
  179. CString sXrayIdColumnName = tableInfoPtr->GetColumnName((int)CIncADataTable::ColumnID::N_XRAY_ID - (int)CIncADataTable::ColumnID::MIN);
  180. CString sFieldIdColumnName = tableInfoPtr->GetColumnName((int)CIncADataTable::ColumnID::N_FIELD_ID - (int)CIncADataTable::ColumnID::MIN);
  181. CString sSQLCommand;
  182. sSQLCommand.Format(_T("SELECT * FROM \'%s\' WHERE %s = %d AND %s = %d;"),
  183. (LPCTSTR)tableInfoPtr->GetTableName(),
  184. (LPCTSTR)sFieldIdColumnName,
  185. a_nFieldId,
  186. (LPCTSTR)sXrayIdColumnName,
  187. a_nXrayId);
  188. query = datastorePtr->QueryByCommand(sSQLCommand);
  189. ASSERT(query);
  190. if (!query || !query->IsValid())
  191. {
  192. LogErrorTrace(__FILE__, __LINE__, _T("Invalid quary command (%s)."), (LPCTSTR)sSQLCommand);
  193. ASSERT(FALSE);
  194. return (CDBQueryBasePtr());
  195. }
  196. // do the table related valid checking
  197. if (query->GetColCount() != GetTableInfo()->GetColumnCount())
  198. {
  199. LogErrorTrace(__FILE__, __LINE__, _T("query col num value is %d, but not %d"), query->GetColCount(), GetTableInfo()->GetColumnCount());
  200. ASSERT(FALSE);
  201. return (CDBQueryBasePtr());
  202. }
  203. return query;
  204. }
  205. CDBQueryBasePtr CIncADataDB::GetQueryOfAllRecord()
  206. {
  207. CDBQueryBasePtr query;
  208. auto datastorePtr = GetDatastore();
  209. ASSERT(datastorePtr);
  210. if (!datastorePtr)
  211. {
  212. return query;
  213. }
  214. auto tableInfoPtr = GetTableInfo();
  215. ASSERT(tableInfoPtr);
  216. if (!tableInfoPtr)
  217. {
  218. return query;
  219. }
  220. CString sSQLCommand;
  221. sSQLCommand.Format(_T("SELECT * FROM \'%s\';"),
  222. (LPCTSTR)tableInfoPtr->GetTableName());
  223. query = datastorePtr->QueryByCommand(sSQLCommand);
  224. ASSERT(query);
  225. if (!query || !query->IsValid())
  226. {
  227. LogErrorTrace(__FILE__, __LINE__, _T("Invalid quary command (%s)."), (LPCTSTR)sSQLCommand);
  228. ASSERT(FALSE);
  229. return (CDBQueryBasePtr());
  230. }
  231. // do the table related valid checking
  232. if (query->GetColCount() != GetTableInfo()->GetColumnCount())
  233. {
  234. LogErrorTrace(__FILE__, __LINE__, _T("query col num value is %d, but not %d"), query->GetColCount(), GetTableInfo()->GetColumnCount());
  235. ASSERT(FALSE);
  236. return (CDBQueryBasePtr());
  237. }
  238. return query;
  239. }
  240. bool CIncADataDB::GetAllFieldsRecord(COTSFieldDataList& allFlds)
  241. {
  242. auto allRecords = this->GetQueryOfAllRecord();
  243. std::map<int, COTSFieldDataPtr> mapFld;
  244. while (!allRecords->IsEOF())
  245. {
  246. int curFldId = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_FIELD_ID);
  247. /*auto itr= std::find_if(allFlds.begin(), allFlds.end(), [curFldId](COTSFieldDataPtr curFld)
  248. {
  249. return curFldId == curFld->GetId();
  250. });*/
  251. auto itr = mapFld.find(curFldId);//map's find method would be much more faster than find_if.
  252. if (itr == mapFld.end())
  253. {
  254. COTSFieldDataPtr fld = COTSFieldDataPtr(new COTSFieldData());
  255. fld->SetId(allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_FIELD_ID));
  256. CPoint fldPos;
  257. fldPos.x = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_FldPosX);
  258. fldPos.y = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_FldPosY);
  259. fld->SetPosition(fldPos);
  260. COTSParticleList& ps=fld->GetParticleList();
  261. COTSParticlePtr p = COTSParticlePtr(new COTSParticle());
  262. p->SetFieldId(fld->GetId());
  263. p->SetSEMPos(fldPos);
  264. double dferet = allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DFERET);
  265. p->SetFeretDiameter(dferet);
  266. p->SetParticleId(allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_PARTICLE_ID));
  267. p->SetType((OTS_PARTICLE_TYPE)allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_INCA_ID));
  268. int top = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_TOP);
  269. int left= allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_LEFT);
  270. int width= allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_WIDTH);
  271. int height = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_HEIGHT);
  272. CRect r = CRect(left, top, left + width, top + height);
  273. p->SetParticleRect(r);
  274. p->SetAveGray(allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_AVE_GRAY));
  275. p->SetActualArea(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_AREA));
  276. int x = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_POS_X);
  277. int y= allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_POS_Y);
  278. p->SetXRayPos(CPoint(x,y));
  279. p->SetAnalysisId(allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_XRAY_ID));
  280. p->SetDMax(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DMAX));
  281. p->SetDMin(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DMIN));
  282. p->SetDPerp(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DPERP));
  283. p->SetDInscr(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DINSCR));
  284. p->SetDMean(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DMEAN));
  285. p->SetDElong(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DELONG));
  286. p->SetPerimeter(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_PERIMETER));
  287. p->SetOrientation(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_ORIENTATION));
  288. p->SetClassifyName(allRecords->GetColStringValue((int)CIncADataTable::ColumnID::S_NAME).GetBuffer());
  289. p->SetColor(allRecords->GetColStringValue((int)CIncADataTable::ColumnID::S_COLOR).GetBuffer());
  290. ps.push_back(p);
  291. allFlds.push_back(fld);
  292. mapFld[curFldId] = fld;
  293. }
  294. else
  295. {
  296. COTSFieldDataPtr& fld = itr->second ;
  297. COTSParticleList& ps = fld->GetParticleList();
  298. COTSParticlePtr p = COTSParticlePtr(new COTSParticle());
  299. p->SetFieldId(fld->GetId());
  300. p->SetSEMPos(fld->GetPosition());
  301. double dferet = allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DFERET);
  302. p->SetFeretDiameter(dferet);
  303. p->SetParticleId(allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_PARTICLE_ID));
  304. p->SetType((OTS_PARTICLE_TYPE)allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_INCA_ID));
  305. int top = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_TOP);
  306. int left = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_LEFT);
  307. int width = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_WIDTH);
  308. int height = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_HEIGHT);
  309. CRect r = CRect(left, top, left + width, top + height);
  310. p->SetParticleRect(r);
  311. p->SetAveGray(allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_AVE_GRAY));
  312. p->SetActualArea(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_AREA));
  313. int x = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_POS_X);
  314. int y = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_POS_Y);
  315. p->SetXRayPos(CPoint(x, y));
  316. p->SetAnalysisId(allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_XRAY_ID));
  317. p->SetDMax(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DMAX));
  318. p->SetDMin(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DMIN));
  319. p->SetDPerp(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DPERP));
  320. p->SetDInscr(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DINSCR));
  321. p->SetDMean(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DMEAN));
  322. p->SetDElong(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DELONG));
  323. p->SetPerimeter(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_PERIMETER));
  324. p->SetOrientation(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_ORIENTATION));
  325. p->SetClassifyName(allRecords->GetColStringValue((int)CIncADataTable::ColumnID::S_NAME).GetBuffer());
  326. p->SetColor(allRecords->GetColStringValue((int)CIncADataTable::ColumnID::S_COLOR).GetBuffer());
  327. ps.push_back(p);
  328. }
  329. allRecords->NextRow();
  330. } ;
  331. allRecords->Close();
  332. return true;
  333. }
  334. BOOL CIncADataDB::Init(const BOOL a_bClean /*= FALSE*/)
  335. {
  336. return myDB->Init(a_bClean);
  337. }
  338. BOOL CIncADataDB::CreateTable(const BOOL a_bForce /*= FALSE*/)
  339. {
  340. return myDB->CreateTable(a_bForce);
  341. }
  342. BOOL CIncADataDB::DeleteTable()
  343. {
  344. return myDB->DeleteTable();
  345. }
  346. BOOL CIncADataDB::RemoveAllRows()
  347. {
  348. return myDB->RemoveAllRows();
  349. }
  350. BOOL CIncADataDB::IsDBExist()
  351. {
  352. return myDB->IsDBExist();
  353. }
  354. OTSSQLITE::CDBStoreBasePtr CIncADataDB::GetDatastore()
  355. {
  356. return myDB->GetDatastore();
  357. }
  358. OTSSQLITE::CDBQueryBasePtr CIncADataDB::GetTableQuery(LPCTSTR a_sOrderColumnName /*= nullptr*/)
  359. {
  360. return myDB->GetTableQuery(a_sOrderColumnName);
  361. }
  362. }