#pragma once #include "stdafx.h" #include "IncADataDB.h" #include "IncADataTable.h" namespace OTSSQLITE { CIncADataDB::CIncADataDB(CDBStoreBasePtr a_datastore) { m_tableInfo.reset(new CIncADataTable()); myDB = CreateNewSQLiteDB(a_datastore,m_tableInfo); } CIncADataDB::~CIncADataDB() { } BOOL CIncADataDB::UpdataAIncA(const COTSParticlePtr a_pParticle) { if (!Init()) { ASSERT(FALSE); return FALSE; } ASSERT(a_pParticle); if (!a_pParticle) { return FALSE; } auto tableInfoPtr = GetTableInfo(); ASSERT(tableInfoPtr); if (!tableInfoPtr) { return FALSE; } auto datastorePtr = GetDatastore(); ASSERT(datastorePtr); if (!datastorePtr) { return FALSE; } CString sSQLCommand = "Update IncAData set AveGray = %d,Area = %f,TypeID=%d where FieldID = %d and ParticleId = %d "; sSQLCommand.Format(sSQLCommand, a_pParticle->GetAveGray(), a_pParticle->GetActualArea(), a_pParticle->GetType(), a_pParticle->GetFieldId(), a_pParticle->GetParticleId()); if (!datastorePtr->RunCommand(sSQLCommand)) { ASSERT(FALSE); return false; } return true; } BOOL CIncADataDB::SaveAIncA(const COTSParticlePtr a_pParticle, const CPosXrayPtr a_pXray,const CPoint fldPos) { if (!Init()) { ASSERT(FALSE); return FALSE; } ASSERT(a_pParticle); if(!a_pParticle) { return FALSE; } ASSERT(a_pXray); if (!a_pXray) { return FALSE; } // safety check //1. particle should be agree with xray /*if ((!(a_pParticle->GetFieldId() == a_pXray->GetScanFieldId())) || (!(a_pParticle->GetAnalysisId() == a_pXray->GetIndex()))) { return FALSE; }*/ auto tableInfoPtr = GetTableInfo(); ASSERT(tableInfoPtr); if (!tableInfoPtr) { return FALSE; } auto datastorePtr = GetDatastore(); ASSERT(datastorePtr); if (!datastorePtr) { return FALSE; } CString sInsertFormat = tableInfoPtr->GetInsertCommandFormatString(TRUE); CString sSQLCommand; sSQLCommand.Format(sInsertFormat, a_pParticle->GetFieldId(), a_pParticle->GetAnalysisId(), a_pParticle->GetAveGray(), a_pParticle->GetParticleRect().left, a_pParticle->GetParticleRect().top, a_pParticle->GetParticleRect().Width(), a_pParticle->GetParticleRect().Height(), a_pParticle->GetActualArea(), a_pParticle->GetXRayPos().x, a_pParticle->GetXRayPos().y, a_pParticle->GetType(), (int)a_pXray->GetElementQuantifyData().size(), (int)(a_pParticle->GetFeature()->GetSegmentsList().size()), fldPos.x, fldPos.y, a_pParticle->GetParticleId(), a_pParticle->GetDMax(), a_pParticle->GetDMin(), a_pParticle->GetDPerp(), a_pParticle->GetPerimeter(), a_pParticle->GetOrientation(), a_pParticle->GetDInscr(), a_pParticle->GetDMean(), a_pParticle->GetDElong(), a_pParticle->GetFeretDiameter(), a_pParticle->GetClassifyName().c_str(), a_pParticle->GetColor().c_str() ); if (!datastorePtr->RunCommand(sSQLCommand)) { 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"), a_pParticle->GetFieldId(), a_pParticle->GetAnalysisId(), a_pParticle->GetAveGray(), a_pParticle->GetParticleRect().left, a_pParticle->GetParticleRect().top, a_pParticle->GetParticleRect().Width(), a_pParticle->GetParticleRect().Height(), a_pParticle->GetActualArea(), a_pParticle->GetXRayPos().x, a_pParticle->GetXRayPos().y, a_pParticle->GetType(), (int)a_pXray->GetElementQuantifyData().size(), (int)(a_pParticle->GetFeature()->GetSegmentsList().size()), fldPos.x, fldPos.y, a_pParticle->GetParticleId(), a_pParticle->GetDMax(), a_pParticle->GetDMin(), a_pParticle->GetDPerp(), a_pParticle->GetPerimeter(), a_pParticle->GetOrientation(), a_pParticle->GetDInscr(), a_pParticle->GetDMean(), a_pParticle->GetDElong(), a_pParticle->GetFeretDiameter(), a_pParticle->GetClassifyName(), a_pParticle->GetColor(), sSQLCommand); ASSERT(FALSE); return FALSE; } return TRUE; } CDBTableBasePtr CIncADataDB::GetTableInfo() { /* if (!m_tableInfo) { m_tableInfo.reset(new CIncADataTable); }*/ return m_tableInfo; } CDBQueryBasePtr CIncADataDB::GetQueryById(const long a_nXrayId, const long a_nFieldId) { CDBQueryBasePtr query; auto datastorePtr = GetDatastore(); ASSERT(datastorePtr); if (!datastorePtr) { return query; } auto tableInfoPtr = GetTableInfo(); ASSERT(tableInfoPtr); if (!tableInfoPtr) { return query; } CString sXrayIdColumnName = tableInfoPtr->GetColumnName((int)CIncADataTable::ColumnID::N_XRAY_ID - (int)CIncADataTable::ColumnID::MIN); CString sFieldIdColumnName = tableInfoPtr->GetColumnName((int)CIncADataTable::ColumnID::N_FIELD_ID - (int)CIncADataTable::ColumnID::MIN); CString sSQLCommand; sSQLCommand.Format(_T("SELECT * FROM \'%s\' WHERE %s = %d AND %s = %d;"), (LPCTSTR)tableInfoPtr->GetTableName(), (LPCTSTR)sFieldIdColumnName, a_nFieldId, (LPCTSTR)sXrayIdColumnName, a_nXrayId); 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; } CDBQueryBasePtr CIncADataDB::GetQueryOfAllRecord() { CDBQueryBasePtr query; auto datastorePtr = GetDatastore(); ASSERT(datastorePtr); if (!datastorePtr) { return query; } auto tableInfoPtr = GetTableInfo(); ASSERT(tableInfoPtr); if (!tableInfoPtr) { return query; } CString sSQLCommand; sSQLCommand.Format(_T("SELECT * FROM \'%s\';"), (LPCTSTR)tableInfoPtr->GetTableName()); 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; } bool CIncADataDB::GetAllFieldsRecord(COTSFieldDataList& allFlds) { auto allRecords = this->GetQueryOfAllRecord(); std::map mapFld; while (!allRecords->IsEOF()) { int curFldId = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_FIELD_ID); /*auto itr= std::find_if(allFlds.begin(), allFlds.end(), [curFldId](COTSFieldDataPtr curFld) { return curFldId == curFld->GetId(); });*/ auto itr = mapFld.find(curFldId);//map's find method would be much more faster than find_if. if (itr == mapFld.end()) { COTSFieldDataPtr fld = COTSFieldDataPtr(new COTSFieldData()); fld->SetId(allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_FIELD_ID)); CPoint fldPos; fldPos.x = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_FldPosX); fldPos.y = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_FldPosY); fld->SetPosition(fldPos); COTSParticleList& ps=fld->GetParticleList(); COTSParticlePtr p = COTSParticlePtr(new COTSParticle()); p->SetFieldId(fld->GetId()); p->SetSEMPos(fldPos); double dferet = allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DFERET); p->SetFeretDiameter(dferet); p->SetParticleId(allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_PARTICLE_ID)); p->SetType((OTS_PARTICLE_TYPE)allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_INCA_ID)); int top = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_TOP); int left= allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_LEFT); int width= allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_WIDTH); int height = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_HEIGHT); CRect r = CRect(left, top, left + width, top + height); p->SetParticleRect(r); p->SetAveGray(allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_AVE_GRAY)); p->SetActualArea(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_AREA)); int x = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_POS_X); int y= allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_POS_Y); p->SetXRayPos(CPoint(x,y)); p->SetAnalysisId(allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_XRAY_ID)); p->SetDMax(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DMAX)); p->SetDMin(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DMIN)); p->SetDPerp(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DPERP)); p->SetDInscr(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DINSCR)); p->SetDMean(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DMEAN)); p->SetDElong(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DELONG)); p->SetPerimeter(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_PERIMETER)); p->SetOrientation(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_ORIENTATION)); p->SetClassifyName(allRecords->GetColStringValue((int)CIncADataTable::ColumnID::S_NAME).GetBuffer()); p->SetColor(allRecords->GetColStringValue((int)CIncADataTable::ColumnID::S_COLOR).GetBuffer()); ps.push_back(p); allFlds.push_back(fld); mapFld[curFldId] = fld; } else { COTSFieldDataPtr& fld = itr->second ; COTSParticleList& ps = fld->GetParticleList(); COTSParticlePtr p = COTSParticlePtr(new COTSParticle()); p->SetFieldId(fld->GetId()); p->SetSEMPos(fld->GetPosition()); double dferet = allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DFERET); p->SetFeretDiameter(dferet); p->SetParticleId(allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_PARTICLE_ID)); p->SetType((OTS_PARTICLE_TYPE)allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_INCA_ID)); int top = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_TOP); int left = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_LEFT); int width = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_WIDTH); int height = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_RECT_HEIGHT); CRect r = CRect(left, top, left + width, top + height); p->SetParticleRect(r); p->SetAveGray(allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_AVE_GRAY)); p->SetActualArea(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_AREA)); int x = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_POS_X); int y = allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_POS_Y); p->SetXRayPos(CPoint(x, y)); p->SetAnalysisId(allRecords->GetColIntValue((int)CIncADataTable::ColumnID::N_XRAY_ID)); p->SetDMax(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DMAX)); p->SetDMin(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DMIN)); p->SetDPerp(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DPERP)); p->SetDInscr(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DINSCR)); p->SetDMean(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DMEAN)); p->SetDElong(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_DELONG)); p->SetPerimeter(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_PERIMETER)); p->SetOrientation(allRecords->GetColFloatValue((int)CIncADataTable::ColumnID::F_ORIENTATION)); p->SetClassifyName(allRecords->GetColStringValue((int)CIncADataTable::ColumnID::S_NAME).GetBuffer()); p->SetColor(allRecords->GetColStringValue((int)CIncADataTable::ColumnID::S_COLOR).GetBuffer()); ps.push_back(p); } allRecords->NextRow(); } ; allRecords->Close(); return true; } BOOL CIncADataDB::Init(const BOOL a_bClean /*= FALSE*/) { return myDB->Init(a_bClean); } BOOL CIncADataDB::CreateTable(const BOOL a_bForce /*= FALSE*/) { return myDB->CreateTable(a_bForce); } BOOL CIncADataDB::DeleteTable() { return myDB->DeleteTable(); } BOOL CIncADataDB::RemoveAllRows() { return myDB->RemoveAllRows(); } BOOL CIncADataDB::IsDBExist() { return myDB->IsDBExist(); } OTSSQLITE::CDBStoreBasePtr CIncADataDB::GetDatastore() { return myDB->GetDatastore(); } OTSSQLITE::CDBQueryBasePtr CIncADataDB::GetTableQuery(LPCTSTR a_sOrderColumnName /*= nullptr*/) { return myDB->GetTableQuery(a_sOrderColumnName); } }