resultloader.h at tip Вы: nobody
Вход

File sqlite1c/SQL_DBF/resultloader.h from the latest check-in


// resultloader.h
//       -
struct sqlite3;

class ISQLiteResultLoader
{
public:
	virtual ~ISQLiteResultLoader(){}
	//     
	//    ,    .
	virtual DWORD init(DWORD colCountInResult, sqlite3* pBase, CValue* pParam) = 0;
	//     
	virtual void setColumn(DWORD colIdx, const CString& colName, const CType& type) = 0;
	//     .
	//  -    CValue,   
	//  
	virtual void addValues(CValue** ppValues) = 0;
	//   
	virtual void assignRetValue(CValue& retVal) = 0;
};

class IVTResultLoader : public ISQLiteResultLoader
{
public:
	IVTResultLoader() : m_pCont(NULL) {}
	~IVTResultLoader() { if(m_pCont) m_pCont->DecrRef(); }

	//     
	virtual DWORD init(DWORD colCountInResult, sqlite3*, CValue* pClear)
	{
		if(pClear->IsEmpty())
		{
			m_pTable->Clear(TRUE);
			return colCountInResult;
		}
		else if(1 == (long)pClear->GetNumeric())
			m_pTable->Clear(FALSE);
		DWORD colInTables = m_pTable->GetColumnCount();
		return colInTables < colCountInResult ? colInTables : colCountInResult;
	}
	//     
	virtual void setColumn(DWORD colIdx, const CString& colName, const CType& type)
	{
		if(m_pTable->GetColumnCount() <= colIdx)
			m_pTable->AddColumn(colName, type, colName, 0, CString(), 0);
	}
	//     .
	//  -    CValue,   
	//  
	virtual void addValues(CValue** ppValues)
	{
		m_pTable->AddRow(ppValues, -1);
	}
	//   
	virtual void assignRetValue(CValue& retVal)
	{
		retVal.AssignContext(m_pCont);
	}
	void setContext(CBLContext* pCont)
	{
		m_pCont = pCont;
		m_pCont->IncrRef();
		m_pTable = ((CValueTableContextData*)pCont->GetInternalData())->GetValueTable();
	}
protected:
	CBLContext* m_pCont;
	CValueTable* m_pTable;
};

class IVLResultLoader : public ISQLiteResultLoader
{
public:
	IVLResultLoader() : m_pCont(NULL) {}
	~IVLResultLoader()	{ if(m_pCont) m_pCont->DecrRef(); }
	virtual DWORD init(DWORD colCountInResult, sqlite3*, CValue* pParam)
	{
		int param = 0;
		if(!pParam->IsEmpty() && pParam->type == 1)
			param = (long)pParam->m_Number;
		if(0 == (param & 1))	//  
		{
			CValueItem** ppItems = (CValueItem**)m_pList->GetData();
			for(DWORD c = m_pList->GetSize(); c--;)
				delete *ppItems++;
			m_pList->RemoveAll();
		}
		if(param & 2)
		{
			m_putMode = putAllInValue;
			m_colCount = colCountInResult < 3 ? colCountInResult : 3;
		}
		else
		{
			m_putMode = putAllInValue;
			m_colCount = colCountInResult;
		}
		return m_colCount;
	}
	//     
	virtual void setColumn(DWORD, const CString&, const CType&)
	{
	}
	//     .
	//  -    CValue,   
	//  
	virtual void addValues(CValue** ppValues)
	{
		if(putAllInList == m_putMode)
		{
			DWORD s = m_pList->GetSize(), count = m_colCount;
			m_pList->SetSize(s + count);
			CValueItem** ppWriteValues = (CValueItem**)(m_pList->GetData()) + s;
			while(count--)
				*ppWriteValues++ = new CValueItem(**ppValues++, CString());
		}
		else
		{
			CValueItem *pItem = new CValueItem(*ppValues[0], CString());
			if(m_colCount > 1)
			{
				pItem->m_text = ppValues[1]->GetString();
				if(m_colCount > 2)
					pItem->m_bCheck = 0 != (long)ppValues[2]->GetNumeric();
			}
			m_pList->Add(pItem);
		}
	}
	//   
	virtual void assignRetValue(CValue& retVal)
	{
		retVal.AssignContext(m_pCont);
	}
	
	void setContext(CBLContext* pCont)
	{
		m_pCont = pCont;
		m_pCont->IncrRef();
		m_pList = *(CPtrArray**)(((char*)m_pCont) + 0x30);
	}
protected:
	CBLContext* m_pCont;
	CPtrArray* m_pList;
	DWORD m_colCount;
	enum {putAllInList, putAllInValue } m_putMode;
};

class IScalarResultLoader : public ISQLiteResultLoader
{
public:
	virtual DWORD init(DWORD, sqlite3*, CValue*)
	{
		return m_column + 1;
	}
	//     
	virtual void setColumn(DWORD, const CString&, const CType&)
	{
	}
	//     .
	//  -    CValue,   
	//  
	virtual void addValues(CValue** ppValues)
	{
		m_value = *ppValues[m_column];
	}
	//   
	virtual void assignRetValue(CValue& retVal)
	{
		retVal = m_value;
	}
	void setCol(DWORD col) {m_column = col;}
protected:
	DWORD m_column;
	CValue m_value;
};