| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 | #pragma once#include "stdafx.h"#include "XRayDataDB.h"#include "XRayDataTable.h"namespace OTSSQLITE{		CXRayDataDB::CXRayDataDB(CDBStoreBasePtr a_datastore)		{		m_tableInfo.reset(new CXRayDataTable());		myDB = CreateNewSQLiteDB(a_datastore,m_tableInfo);	}	CXRayDataDB::~CXRayDataDB()	{	}	CPosXrayPtr CXRayDataDB::GetXRayDataById(const long a_nXrayId, const long a_nFieldId)	{		CPosXrayPtr pPosXray;		if (!m_listPosXray.empty())		{			for (auto pxray : m_listPosXray)			{				if (pxray->GetIndex() == (DWORD)a_nXrayId && pxray->GetScanFieldId() == a_nFieldId)				{					pPosXray = pxray;				}			}		}		else		{			auto tableQuery = GetQueryById(a_nXrayId, a_nFieldId);			ASSERT(tableQuery);			if (!tableQuery)			{				return pPosXray;			}			CPosXrayPtr pPosXray;			pPosXray = CPosXrayPtr(new CPosXray());			if (!ReadOnePosXray(tableQuery,pPosXray))			{				LogErrorTrace(__FILE__, __LINE__, _T("read x-ray failed."));				return pPosXray;			}			return pPosXray ;		}		return pPosXray;	}	CPosXrayList& CXRayDataDB::GetXrayList(const BOOL a_bForce/* = FALSE*/)	{		if (a_bForce)		{			m_listPosXray.clear();		}		if (m_listPosXray.size() == 0)		{			ReadAllXrayList();		}		return m_listPosXray;	}	BOOL CXRayDataDB::SavePosXrayPtr(const CPosXrayPtr a_pXray)	{		if (!Init())		{			ASSERT(FALSE);			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;		DWORD* xrayData = a_pXray->GetXrayData();			sSQLCommand.Format(sInsertFormat,				a_pXray->GetIndex(),				a_pXray->GetScanFieldId()				);			char * sql = sSQLCommand.GetBuffer();			if (!datastorePtr->InsertBlobData (sql,xrayData, GENERALXRAYCHANNELS*4))			{				LogErrorTrace(__FILE__, __LINE__, _T("Insert x-ray data(%d:%d:%d) failed: %s command error"),					a_pXray->GetIndex(),					a_pXray->GetScanFieldId(),										0,					sSQLCommand);				ASSERT(FALSE);				return FALSE;			}		return TRUE;	}	BOOL CXRayDataDB::DeletePosXrayById(const long a_nFieldId, const long a_nXrayId)	{		if (!m_listPosXray.empty())		{			std::remove_if(m_listPosXray.begin(), m_listPosXray.end(), [a_nFieldId, a_nXrayId](const CPosXrayPtr& xrayPoint) { return(xrayPoint->GetIndex() == (DWORD)a_nXrayId) && (xrayPoint->GetScanFieldId() == (DWORD)a_nFieldId); });		}		auto tableInfoPtr = GetTableInfo();		ASSERT(tableInfoPtr);		if (!tableInfoPtr)		{			return FALSE;		}		auto datastorePtr = GetDatastore();		ASSERT(datastorePtr);		if (!datastorePtr)		{			return FALSE;		}		CString sTableName = tableInfoPtr->GetTableName();		if (!datastorePtr->IsTableExists(sTableName))		{			LogTrace(__FILE__, __LINE__, _T("Table %s not exist"), sTableName);			return TRUE;		}		CString sXrayIdColumnName = tableInfoPtr->GetColumnName((int)CXRayDataTable::ColumnID::N_INDEX - (int)CXRayDataTable::ColumnID::MIN);		CString sFieldIdColumnName = tableInfoPtr->GetColumnName((int)CXRayDataTable::ColumnID::N_FIELD_ID - (int)CXRayDataTable::ColumnID::MIN);		CString sSQLCommand;		sSQLCommand.Format(_T("DELETE FROM \'%s\' WHERE %s = %d AND %s = %d;"),			(LPCTSTR)tableInfoPtr->GetTableName(),			(LPCTSTR)sXrayIdColumnName,			a_nXrayId,			(LPCTSTR)sFieldIdColumnName,			a_nFieldId);		return datastorePtr->RunCommand(sSQLCommand);	}	CDBTableBasePtr CXRayDataDB::GetTableInfo()	{		return m_tableInfo;	}	BOOL CXRayDataDB::Init(const BOOL a_bClean /*= FALSE*/)	{		return myDB->Init();	}	BOOL CXRayDataDB::CreateTable(const BOOL a_bForce /*= FALSE*/)	{		return myDB->CreateTable(a_bForce);	}	BOOL CXRayDataDB::DeleteTable()	{		return myDB->DeleteTable();	}	BOOL CXRayDataDB::RemoveAllRows()	{		return myDB->RemoveAllRows();	}	BOOL CXRayDataDB::IsDBExist()	{		return myDB->IsDBExist();	}	OTSSQLITE::CDBStoreBasePtr CXRayDataDB::GetDatastore()	{		return myDB->GetDatastore();	}	OTSSQLITE::CDBQueryBasePtr CXRayDataDB::GetTableQuery(LPCTSTR a_sOrderColumnName /*= nullptr*/)	{		return myDB->GetTableQuery();	}	BOOL CXRayDataDB::ReadAllXrayList()	{		auto query = GetTableQuery();		ASSERT(query);		if (!query)		{			return FALSE;		}		ReadXrayListFromAQuery(query,m_listPosXray);		return TRUE;	}	BOOL CXRayDataDB::ReadXrayListFromAQuery(CDBQueryBasePtr a_query, CPosXrayList& a_XrayList)	{		int nWrongItems = 0;		while (!a_query->IsEOF())		{			CPosXrayPtr pPosXray;			pPosXray = CPosXrayPtr(new CPosXray());			if (!ReadOnePosXray(a_query, pPosXray))	//current x-ray point					{				LogErrorTrace(__FILE__, __LINE__, _T("Read xray point failed"));				nWrongItems++;				break;			}						a_XrayList.push_back(pPosXray);						a_query->NextRow();				}		return true;	}	BOOL CXRayDataDB::ReadOnePosXray(CDBQueryBasePtr a_query, CPosXrayPtr& a_xray)	{		int nCol;				int nXrayIdNow;		int nFieldIdNow;		nCol = (int)CXRayDataTable::ColumnID::N_INDEX - (int)CXRayDataTable::ColumnID::MIN;		nXrayIdNow = a_query->GetColIntValue(nCol, -1);		a_xray->SetIndex(nXrayIdNow);		nCol = (int)CXRayDataTable::ColumnID::N_FIELD_ID - (int)CXRayDataTable::ColumnID::MIN;		nFieldIdNow = a_query->GetColIntValue(nCol, -1);		a_xray->SetScanFieldId(nFieldIdNow);		nCol = (int)CXRayDataTable::ColumnID::N_XRAY_DATA - (int)CXRayDataTable::ColumnID::MIN;		int i = 2;		const unsigned char* XrayData = a_query->GetColBlobValue(nCol, i);		for (int j = 0; j < GENERALXRAYCHANNELS; j++)		{			int m = j * 4;			DWORD d = XrayData[m + 3];			d=d << 8;			d = d | XrayData[m + 2];			d=d << 8;			d = d | XrayData[m + 1];			d=d << 8;			d = d | XrayData[m];			a_xray->SetXrayDataAtChannel(d, j);		}								return TRUE;	}	CDBQueryBasePtr CXRayDataDB::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)CXRayDataTable::ColumnID::N_INDEX - (int)CXRayDataTable::ColumnID::MIN);		CString sFieldIdColumnName = tableInfoPtr->GetColumnName((int)CXRayDataTable::ColumnID::N_FIELD_ID - (int)CXRayDataTable::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;	}}
 |