123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364 |
- #pragma once
- #include "stdafx.h"
- #include "ElementRangeDB.h"
- #include "ElementRangeTable.h"
- namespace OTSSQLITE
- {
- using namespace OTSDATA;
- CElementRangeDB::CElementRangeDB(CDBStoreBasePtr a_datastore)
- {
- m_tableInfo.reset(new CElementRangeTable());
- myDB = CreateNewSQLiteDB(a_datastore,m_tableInfo);
- }
- CElementRangeDB::~CElementRangeDB()
- {
- }
- CElementRangeList CElementRangeDB::GetElementRangeListById(const long a_nSTDId, const long a_nElementSize)
- {
- CElementRangeList listElementRange;
- if (!m_listSTDItem.empty())
- {
- for (auto& pSTDItem : m_listSTDItem)
- {
- if (pSTDItem->GetSTDId() == (DWORD)a_nSTDId && pSTDItem->GetElementRange() == a_nElementSize)
- {
- listElementRange = pSTDItem->GetElementRangeList();
- }
- }
- }
- else
- {
- // read element list
- for (int i = 0; i < a_nElementSize; i++)
- {
- auto tableQuery = GetQueryById(a_nSTDId, i, a_nElementSize);
- ASSERT(tableQuery);
- if (!tableQuery)
- {
- return listElementRange;
- }
- CSTDItemPtr pItem = ReadSTDItem(tableQuery);
- ASSERT(pItem);
- if (!pItem)
- {
- return listElementRange;
- }
- CElementRangeList listElement = pItem->GetElementRangeList();
- CElementRangePtr pElement = CElementRangePtr(new CElementRange(*listElement[0].get()));
- listElementRange.push_back(pElement);
- }
- }
- return listElementRange;
- }
- CSTDItemsList& CElementRangeDB::GetSTDItemList(const BOOL a_bForce/* = FALSE*/)
- {
- if (a_bForce)
- {
- m_listSTDItem.clear();
- }
- if (m_listSTDItem.size() == 0)
- {
- ReadSTDItemList();
- }
- return m_listSTDItem;
- }
-
- CDBTableBasePtr CElementRangeDB::GetTableInfo()
- {
- /*if (!m_tableInfo)
- {
- m_tableInfo.reset(new CElementRangeTable);
- }*/
- return m_tableInfo;
- }
- BOOL CElementRangeDB::Init(const BOOL a_bClean /*= FALSE*/)
- {
- return myDB->Init(a_bClean);
- }
- BOOL CElementRangeDB::CreateTable(const BOOL a_bForce /*= FALSE*/)
- {
- return myDB->CreateTable(a_bForce);
- }
- BOOL CElementRangeDB::DeleteTable()
- {
- return myDB->DeleteTable();
- }
- BOOL CElementRangeDB::RemoveAllRows()
- {
- return myDB->RemoveAllRows();
- }
- BOOL CElementRangeDB::IsDBExist()
- {
- return myDB->IsDBExist();
- }
- OTSSQLITE::CDBStoreBasePtr CElementRangeDB::GetDatastore()
- {
- return myDB->GetDatastore();
- }
- OTSSQLITE::CDBQueryBasePtr CElementRangeDB::GetTableQuery(LPCTSTR a_sOrderColumnName /*= nullptr*/)
- {
- return myDB->GetTableQuery(a_sOrderColumnName);
- }
- BOOL CElementRangeDB::ReadSTDItemList()
- {
- auto tableInfoPtr = GetTableInfo();
- ASSERT(tableInfoPtr);
- if (!tableInfoPtr)
- {
- return FALSE;
- }
- auto query = GetTableQuery();
- ASSERT(query);
- if (!query)
- {
- return FALSE;
- }
- m_listSTDItem = ReadSTDItemList(query);
- return TRUE;
- }
- CSTDItemsList CElementRangeDB::ReadSTDItemList(CDBQueryBasePtr a_query)
- {
- CSTDItemsList listSTDItem;
- int nRowId = 0;
- int nWrongItems = 0;
- while (!a_query->IsEOF())
- {
- auto STDItem = ReadSTDItem(a_query); //current x-ray point
- if (!STDItem)
- {
- LogErrorTrace(__FILE__, __LINE__, _T("Read xray point info item failed: row id: %d"), nRowId);
- nWrongItems++;
- }
- else
- {
- if (!listSTDItem.empty())
- {
- int nSTDId = STDItem->GetSTDId();
- CElementRangeList listElementNew = STDItem->GetElementRangeList();
- int nIndex = 0;
- for (auto Item : listSTDItem)
- {
- listSTDItem.erase(listSTDItem.begin() + nIndex);
- if (Item->GetSTDId() == nSTDId)
- {
- CElementRangeList listElementOld = Item->GetElementRangeList();
- for (auto pElement : listElementNew)
- {
- listElementOld.push_back(CElementRangePtr(new CElementRange(*pElement.get())));
- }
- STDItem->SetElementRangeList(listElementOld);
- break;
- }
- nIndex++;
- }
- }
- listSTDItem.push_back(STDItem);
- }
- a_query->NextRow();
- nRowId++;
- }
- return listSTDItem;
- }
- CSTDItemPtr CElementRangeDB::ReadSTDItem(CDBQueryBasePtr a_query)
- {
- int nCol;
- CSTDItemPtr pSTDItem(new CSTDItem());
-
- int nRangeNum;
- nCol = (int)CElementRangeTable::ColumnID::N_RANGE_NUM - (int)CElementRangeTable::ColumnID::MIN;
- nRangeNum = a_query->GetColIntValue(nCol, -1);
- pSTDItem->SetElementRange(nRangeNum);
- int nSTDIdNow;
- nCol = (int)CElementRangeTable::ColumnID::N_STD_ID - (int)CElementRangeTable::ColumnID::MIN;
- nSTDIdNow = a_query->GetColIntValue(nCol, -1);
- pSTDItem->SetSTDId(nSTDIdNow);
- CElementRangePtr pElementRange = CElementRangePtr(new CElementRange());
-
- int nRangeStart;
- nCol = (int)CElementRangeTable::ColumnID::N_RANGE_START - (int)CElementRangeTable::ColumnID::MIN;
- nRangeStart = a_query->GetColIntValue(nCol, -1);
- int nRangeEnd;
- nCol = (int)CElementRangeTable::ColumnID::N_RANGE_END - (int)CElementRangeTable::ColumnID::MIN;
- nRangeEnd = a_query->GetColIntValue(nCol, -1);
- CIntRangePtr pIntRange = CIntRangePtr(new CIntRange());
- pIntRange->SetStart(nRangeStart);
- pIntRange->SetEnd(nRangeEnd);
- pElementRange->SetRange(pIntRange);
- CElementPtr pElement = CElementPtr(new CElement());
- int nAtomNum;
- nCol = (int)CElementRangeTable::ColumnID::N_ATOM_NUM - (int)CElementRangeTable::ColumnID::MIN;
- nAtomNum = a_query->GetColIntValue(nCol, -1);
- pElement->SetAtomNum(nAtomNum);
- double dPercent;
- nCol = (int)CElementRangeTable::ColumnID::F_PERCENTAGE - (int)CElementRangeTable::ColumnID::MIN;
- dPercent = a_query->GetColFloatValue(nCol, -1);
- pElement->SetPercentage(dPercent);
- pElementRange->SetElement(pElement);
- CElementRangeList listElementRange;
- listElementRange.push_back(pElementRange);
- a_query->NextRow();
- int nSTDIdNew;
- int nRowId = 0;
- while (!a_query->IsEOF())
- {
- nCol = (int)CElementRangeTable::ColumnID::N_STD_ID - (int)CElementRangeTable::ColumnID::MIN;
- nSTDIdNew = a_query->GetColIntValue(nCol, -1);
- if (nSTDIdNew == nSTDIdNow)
- {
- CElementRangePtr pElementRange = CElementRangePtr(new CElementRange());
- int nElementIndex;
- nCol = (int)CElementRangeTable::ColumnID::N_RANGE_ID - (int)CElementRangeTable::ColumnID::MIN;
- nElementIndex = a_query->GetColIntValue(nCol, -1);
- int nRangeStart;
- nCol = (int)CElementRangeTable::ColumnID::N_RANGE_START - (int)CElementRangeTable::ColumnID::MIN;
- nRangeStart = a_query->GetColIntValue(nCol, -1);
- int nRangeEnd;
- nCol = (int)CElementRangeTable::ColumnID::N_RANGE_END - (int)CElementRangeTable::ColumnID::MIN;
- nRangeEnd = a_query->GetColIntValue(nCol, -1);
- CIntRangePtr pIntRange = CIntRangePtr(new CIntRange());
- pIntRange->SetStart(nRangeStart);
- pIntRange->SetEnd(nRangeEnd);
- pElementRange->SetRange(pIntRange);
- CElementPtr pElement = CElementPtr(new CElement());
- int nAtomNum;
- nCol = (int)CElementRangeTable::ColumnID::N_ATOM_NUM - (int)CElementRangeTable::ColumnID::MIN;
- nAtomNum = a_query->GetColIntValue(nCol, -1);
- pElement->SetAtomNum(nAtomNum);
- double dPercent;
- nCol = (int)CElementRangeTable::ColumnID::F_PERCENTAGE - (int)CElementRangeTable::ColumnID::MIN;
- dPercent = a_query->GetColFloatValue(nCol, -1);
- pElement->SetPercentage(dPercent);
- pElementRange->SetElement(pElement);
-
- listElementRange.push_back(pElementRange);
- if (nElementIndex == nRangeNum - 1)
- {
- break;
- }
- }
- else
- {
- continue;
- }
- a_query->NextRow();
- nRowId++;
- }
- pSTDItem->SetElementRangeList(listElementRange);
- return pSTDItem;
- }
- CDBQueryBasePtr CElementRangeDB::GetQueryById(const long a_nSTDId, const long a_nElementId, const long a_nElementNum)
- {
- CDBQueryBasePtr query;
- auto datastorePtr = GetDatastore();
- ASSERT(datastorePtr);
- if (!datastorePtr)
- {
- return query;
- }
- auto tableInfoPtr = GetTableInfo();
- ASSERT(tableInfoPtr);
- if (!tableInfoPtr)
- {
- return query;
- }
- CString sSTDIdColumnName = tableInfoPtr->GetColumnName((int)CElementRangeTable::ColumnID::N_STD_ID - (int)CElementRangeTable::ColumnID::MIN);
- CString sElementIdColumnName = tableInfoPtr->GetColumnName((int)CElementRangeTable::ColumnID::N_RANGE_ID - (int)CElementRangeTable::ColumnID::MIN);
- CString sElementNumColumnName = tableInfoPtr->GetColumnName((int)CElementRangeTable::ColumnID::N_RANGE_NUM - (int)CElementRangeTable::ColumnID::MIN);
- CString sSQLCommand;
- sSQLCommand.Format(_T("SELECT * FROM \'%s\' WHERE %s = %d AND %s = %d AND %s = %d;"),
- (LPCTSTR)tableInfoPtr->GetTableName(),
- (LPCTSTR)sSTDIdColumnName,
- a_nSTDId,
- (LPCTSTR)sElementIdColumnName,
- a_nElementId,
- (LPCTSTR)sElementNumColumnName,
- a_nElementNum);
- query = datastorePtr->QueryByCommand(sSQLCommand);
- ASSERT(query);
- if (!query || !query->IsValid())
- {
- LogErrorTrace(__FILE__, __LINE__, _T("Invalid quary command (%s)."), (LPCTSTR)sSQLCommand);
- ASSERT(FALSE);
- return (CDBQueryBasePtr());
- }
- // do the table related valid checking
- if (query->GetColCount() != GetTableInfo()->GetColumnCount())
- {
- LogErrorTrace(__FILE__, __LINE__, _T("query col num value is %d, but not %d"), query->GetColCount(), GetTableInfo()->GetColumnCount());
- ASSERT(FALSE);
- return (CDBQueryBasePtr());
- }
- return query;
- }
- }
|