ElementRangeDB.cpp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. #pragma once
  2. #include "stdafx.h"
  3. #include "ElementRangeDB.h"
  4. #include "ElementRangeTable.h"
  5. namespace OTSSQLITE
  6. {
  7. using namespace OTSDATA;
  8. CElementRangeDB::CElementRangeDB(CDBStoreBasePtr a_datastore)
  9. {
  10. m_tableInfo.reset(new CElementRangeTable());
  11. myDB = CreateNewSQLiteDB(a_datastore,m_tableInfo);
  12. }
  13. CElementRangeDB::~CElementRangeDB()
  14. {
  15. }
  16. CElementRangeList CElementRangeDB::GetElementRangeListById(const long a_nSTDId, const long a_nElementSize)
  17. {
  18. CElementRangeList listElementRange;
  19. if (!m_listSTDItem.empty())
  20. {
  21. for (auto& pSTDItem : m_listSTDItem)
  22. {
  23. if (pSTDItem->GetSTDId() == (DWORD)a_nSTDId && pSTDItem->GetElementRange() == a_nElementSize)
  24. {
  25. listElementRange = pSTDItem->GetElementRangeList();
  26. }
  27. }
  28. }
  29. else
  30. {
  31. // read element list
  32. for (int i = 0; i < a_nElementSize; i++)
  33. {
  34. auto tableQuery = GetQueryById(a_nSTDId, i, a_nElementSize);
  35. ASSERT(tableQuery);
  36. if (!tableQuery)
  37. {
  38. return listElementRange;
  39. }
  40. CSTDItemPtr pItem = ReadSTDItem(tableQuery);
  41. ASSERT(pItem);
  42. if (!pItem)
  43. {
  44. return listElementRange;
  45. }
  46. CElementRangeList listElement = pItem->GetElementRangeList();
  47. CElementRangePtr pElement = CElementRangePtr(new CElementRange(*listElement[0].get()));
  48. listElementRange.push_back(pElement);
  49. }
  50. }
  51. return listElementRange;
  52. }
  53. CSTDItemsList& CElementRangeDB::GetSTDItemList(const BOOL a_bForce/* = FALSE*/)
  54. {
  55. if (a_bForce)
  56. {
  57. m_listSTDItem.clear();
  58. }
  59. if (m_listSTDItem.size() == 0)
  60. {
  61. ReadSTDItemList();
  62. }
  63. return m_listSTDItem;
  64. }
  65. CDBTableBasePtr CElementRangeDB::GetTableInfo()
  66. {
  67. /*if (!m_tableInfo)
  68. {
  69. m_tableInfo.reset(new CElementRangeTable);
  70. }*/
  71. return m_tableInfo;
  72. }
  73. BOOL CElementRangeDB::Init(const BOOL a_bClean /*= FALSE*/)
  74. {
  75. return myDB->Init(a_bClean);
  76. }
  77. BOOL CElementRangeDB::CreateTable(const BOOL a_bForce /*= FALSE*/)
  78. {
  79. return myDB->CreateTable(a_bForce);
  80. }
  81. BOOL CElementRangeDB::DeleteTable()
  82. {
  83. return myDB->DeleteTable();
  84. }
  85. BOOL CElementRangeDB::RemoveAllRows()
  86. {
  87. return myDB->RemoveAllRows();
  88. }
  89. BOOL CElementRangeDB::IsDBExist()
  90. {
  91. return myDB->IsDBExist();
  92. }
  93. OTSSQLITE::CDBStoreBasePtr CElementRangeDB::GetDatastore()
  94. {
  95. return myDB->GetDatastore();
  96. }
  97. OTSSQLITE::CDBQueryBasePtr CElementRangeDB::GetTableQuery(LPCTSTR a_sOrderColumnName /*= nullptr*/)
  98. {
  99. return myDB->GetTableQuery(a_sOrderColumnName);
  100. }
  101. BOOL CElementRangeDB::ReadSTDItemList()
  102. {
  103. auto tableInfoPtr = GetTableInfo();
  104. ASSERT(tableInfoPtr);
  105. if (!tableInfoPtr)
  106. {
  107. return FALSE;
  108. }
  109. auto query = GetTableQuery();
  110. ASSERT(query);
  111. if (!query)
  112. {
  113. return FALSE;
  114. }
  115. m_listSTDItem = ReadSTDItemList(query);
  116. return TRUE;
  117. }
  118. CSTDItemsList CElementRangeDB::ReadSTDItemList(CDBQueryBasePtr a_query)
  119. {
  120. CSTDItemsList listSTDItem;
  121. int nRowId = 0;
  122. int nWrongItems = 0;
  123. while (!a_query->IsEOF())
  124. {
  125. auto STDItem = ReadSTDItem(a_query); //current x-ray point
  126. if (!STDItem)
  127. {
  128. LogErrorTrace(__FILE__, __LINE__, _T("Read xray point info item failed: row id: %d"), nRowId);
  129. nWrongItems++;
  130. }
  131. else
  132. {
  133. if (!listSTDItem.empty())
  134. {
  135. int nSTDId = STDItem->GetSTDId();
  136. CElementRangeList listElementNew = STDItem->GetElementRangeList();
  137. int nIndex = 0;
  138. for (auto Item : listSTDItem)
  139. {
  140. listSTDItem.erase(listSTDItem.begin() + nIndex);
  141. if (Item->GetSTDId() == nSTDId)
  142. {
  143. CElementRangeList listElementOld = Item->GetElementRangeList();
  144. for (auto pElement : listElementNew)
  145. {
  146. listElementOld.push_back(CElementRangePtr(new CElementRange(*pElement.get())));
  147. }
  148. STDItem->SetElementRangeList(listElementOld);
  149. break;
  150. }
  151. nIndex++;
  152. }
  153. }
  154. listSTDItem.push_back(STDItem);
  155. }
  156. a_query->NextRow();
  157. nRowId++;
  158. }
  159. return listSTDItem;
  160. }
  161. CSTDItemPtr CElementRangeDB::ReadSTDItem(CDBQueryBasePtr a_query)
  162. {
  163. int nCol;
  164. CSTDItemPtr pSTDItem(new CSTDItem());
  165. int nRangeNum;
  166. nCol = (int)CElementRangeTable::ColumnID::N_RANGE_NUM - (int)CElementRangeTable::ColumnID::MIN;
  167. nRangeNum = a_query->GetColIntValue(nCol, -1);
  168. pSTDItem->SetElementRange(nRangeNum);
  169. int nSTDIdNow;
  170. nCol = (int)CElementRangeTable::ColumnID::N_STD_ID - (int)CElementRangeTable::ColumnID::MIN;
  171. nSTDIdNow = a_query->GetColIntValue(nCol, -1);
  172. pSTDItem->SetSTDId(nSTDIdNow);
  173. CElementRangePtr pElementRange = CElementRangePtr(new CElementRange());
  174. int nRangeStart;
  175. nCol = (int)CElementRangeTable::ColumnID::N_RANGE_START - (int)CElementRangeTable::ColumnID::MIN;
  176. nRangeStart = a_query->GetColIntValue(nCol, -1);
  177. int nRangeEnd;
  178. nCol = (int)CElementRangeTable::ColumnID::N_RANGE_END - (int)CElementRangeTable::ColumnID::MIN;
  179. nRangeEnd = a_query->GetColIntValue(nCol, -1);
  180. CIntRangePtr pIntRange = CIntRangePtr(new CIntRange());
  181. pIntRange->SetStart(nRangeStart);
  182. pIntRange->SetEnd(nRangeEnd);
  183. pElementRange->SetRange(pIntRange);
  184. CElementPtr pElement = CElementPtr(new CElement());
  185. int nAtomNum;
  186. nCol = (int)CElementRangeTable::ColumnID::N_ATOM_NUM - (int)CElementRangeTable::ColumnID::MIN;
  187. nAtomNum = a_query->GetColIntValue(nCol, -1);
  188. pElement->SetAtomNum(nAtomNum);
  189. double dPercent;
  190. nCol = (int)CElementRangeTable::ColumnID::F_PERCENTAGE - (int)CElementRangeTable::ColumnID::MIN;
  191. dPercent = a_query->GetColFloatValue(nCol, -1);
  192. pElement->SetPercentage(dPercent);
  193. pElementRange->SetElement(pElement);
  194. CElementRangeList listElementRange;
  195. listElementRange.push_back(pElementRange);
  196. a_query->NextRow();
  197. int nSTDIdNew;
  198. int nRowId = 0;
  199. while (!a_query->IsEOF())
  200. {
  201. nCol = (int)CElementRangeTable::ColumnID::N_STD_ID - (int)CElementRangeTable::ColumnID::MIN;
  202. nSTDIdNew = a_query->GetColIntValue(nCol, -1);
  203. if (nSTDIdNew == nSTDIdNow)
  204. {
  205. CElementRangePtr pElementRange = CElementRangePtr(new CElementRange());
  206. int nElementIndex;
  207. nCol = (int)CElementRangeTable::ColumnID::N_RANGE_ID - (int)CElementRangeTable::ColumnID::MIN;
  208. nElementIndex = a_query->GetColIntValue(nCol, -1);
  209. int nRangeStart;
  210. nCol = (int)CElementRangeTable::ColumnID::N_RANGE_START - (int)CElementRangeTable::ColumnID::MIN;
  211. nRangeStart = a_query->GetColIntValue(nCol, -1);
  212. int nRangeEnd;
  213. nCol = (int)CElementRangeTable::ColumnID::N_RANGE_END - (int)CElementRangeTable::ColumnID::MIN;
  214. nRangeEnd = a_query->GetColIntValue(nCol, -1);
  215. CIntRangePtr pIntRange = CIntRangePtr(new CIntRange());
  216. pIntRange->SetStart(nRangeStart);
  217. pIntRange->SetEnd(nRangeEnd);
  218. pElementRange->SetRange(pIntRange);
  219. CElementPtr pElement = CElementPtr(new CElement());
  220. int nAtomNum;
  221. nCol = (int)CElementRangeTable::ColumnID::N_ATOM_NUM - (int)CElementRangeTable::ColumnID::MIN;
  222. nAtomNum = a_query->GetColIntValue(nCol, -1);
  223. pElement->SetAtomNum(nAtomNum);
  224. double dPercent;
  225. nCol = (int)CElementRangeTable::ColumnID::F_PERCENTAGE - (int)CElementRangeTable::ColumnID::MIN;
  226. dPercent = a_query->GetColFloatValue(nCol, -1);
  227. pElement->SetPercentage(dPercent);
  228. pElementRange->SetElement(pElement);
  229. listElementRange.push_back(pElementRange);
  230. if (nElementIndex == nRangeNum - 1)
  231. {
  232. break;
  233. }
  234. }
  235. else
  236. {
  237. continue;
  238. }
  239. a_query->NextRow();
  240. nRowId++;
  241. }
  242. pSTDItem->SetElementRangeList(listElementRange);
  243. return pSTDItem;
  244. }
  245. CDBQueryBasePtr CElementRangeDB::GetQueryById(const long a_nSTDId, const long a_nElementId, const long a_nElementNum)
  246. {
  247. CDBQueryBasePtr query;
  248. auto datastorePtr = GetDatastore();
  249. ASSERT(datastorePtr);
  250. if (!datastorePtr)
  251. {
  252. return query;
  253. }
  254. auto tableInfoPtr = GetTableInfo();
  255. ASSERT(tableInfoPtr);
  256. if (!tableInfoPtr)
  257. {
  258. return query;
  259. }
  260. CString sSTDIdColumnName = tableInfoPtr->GetColumnName((int)CElementRangeTable::ColumnID::N_STD_ID - (int)CElementRangeTable::ColumnID::MIN);
  261. CString sElementIdColumnName = tableInfoPtr->GetColumnName((int)CElementRangeTable::ColumnID::N_RANGE_ID - (int)CElementRangeTable::ColumnID::MIN);
  262. CString sElementNumColumnName = tableInfoPtr->GetColumnName((int)CElementRangeTable::ColumnID::N_RANGE_NUM - (int)CElementRangeTable::ColumnID::MIN);
  263. CString sSQLCommand;
  264. sSQLCommand.Format(_T("SELECT * FROM \'%s\' WHERE %s = %d AND %s = %d AND %s = %d;"),
  265. (LPCTSTR)tableInfoPtr->GetTableName(),
  266. (LPCTSTR)sSTDIdColumnName,
  267. a_nSTDId,
  268. (LPCTSTR)sElementIdColumnName,
  269. a_nElementId,
  270. (LPCTSTR)sElementNumColumnName,
  271. a_nElementNum);
  272. query = datastorePtr->QueryByCommand(sSQLCommand);
  273. ASSERT(query);
  274. if (!query || !query->IsValid())
  275. {
  276. LogErrorTrace(__FILE__, __LINE__, _T("Invalid quary command (%s)."), (LPCTSTR)sSQLCommand);
  277. ASSERT(FALSE);
  278. return (CDBQueryBasePtr());
  279. }
  280. // do the table related valid checking
  281. if (query->GetColCount() != GetTableInfo()->GetColumnCount())
  282. {
  283. LogErrorTrace(__FILE__, __LINE__, _T("query col num value is %d, but not %d"), query->GetColCount(), GetTableInfo()->GetColumnCount());
  284. ASSERT(FALSE);
  285. return (CDBQueryBasePtr());
  286. }
  287. return query;
  288. }
  289. }