//------------------------------------------------------------------- // VORecordset implementation //------------------------------------------------------------------- // // Copyright ©2000 Virtual Office Systems Incorporated // All Rights Reserved // // This code may be used in compiled form in any way you desire. This // file may be redistributed unmodified by any means PROVIDING it is // not sold for profit without the authors written consent, and // providing that this notice and the authors name is included. // // This code can be compiled, modified and distributed freely, providing // that this copyright information remains intact in the distribution. // // This code may be compiled in original or modified form in any private // or commercial application. // // This file is provided "as is" with no expressed or implied warranty. // The author accepts no liability for any damage, in any form, caused // by this code. Use it at your own risk. //------------------------------------------------------------------- #include "stdafx.h" #include "VORecordset.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #ifndef TRACE #define TRACE(s) OutputDebugString(s) #endif #else #ifndef TRACE #define TRACE(s) #endif #endif const IID IID__Recordset = { 0x113033f6, 0xf682, 0x11d2, { 0xbb, 0x62, 0x00, 0xc0, 0x4f, 0x68, 0x0a, 0xcc}}; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// BOOL CVORecordset::g_Init = FALSE; CLSID CVORecordset::g_ClsID; TCHAR* CVORecordset::g_ProgID = TEXT("ADOCE.Recordset.3.0"); CVORecordset::CVORecordset(CVOConnection& rConn) : m_rConn(rConn), m_rs(NULL) { if(!g_Init) Initialize(); HRESULT hr; hr = CoCreateInstance(g_ClsID, NULL, CLSCTX_INPROC_SERVER, IID__Recordset, (LPVOID*)&m_rs); VARIANT varConn; // If Connection object is using CEDB instead of a .CDB filename, use it // as a persistent connection. For .CDB filenames, each recordset Open() // requires its own connection unfortunately. if((_Connection*)m_rConn) { varConn.pdispVal = (_Connection*)m_rConn; varConn.vt = VT_DISPATCH; hr = m_rs->put_ActiveConnection(varConn); } } CVORecordset::~CVORecordset() { Close(); if(m_rs) m_rs->Release(); } BOOL CVORecordset::Initialize() { HRESULT hr; hr = CLSIDFromProgID( g_ProgID, &g_ClsID); return(!FAILED(hr)); } BOOL CVORecordset::Open(LPCTSTR pcszSource, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType) { if(!m_rs) { TRACE(TEXT("CVORecordset::Open() RecordSet COM Object not initialized\n")); return FALSE; } HRESULT hr; if(IsOpen()) m_rs->Close(); hr = m_rs->Open(_variant_t(pcszSource), _variant_t( m_rConn.GetProvider() ), CursorType, LockType, adCmdUnknown); m_fIsOpen = (!FAILED(hr)); if(m_fIsOpen) { m_rs->get_Fields(&m_Fields); m_Fields->get_Count(&m_FldCnt); } return m_fIsOpen; } BOOL CVORecordset::Close() { if(!m_rs) { TRACE(TEXT("CVORecordset::Close() RecordSet COM Object not initialized\n")); return FALSE; } if(IsOpen() ) { m_rs->Close(); m_fIsOpen = FALSE; } return TRUE; } BOOL CVORecordset::IsBOF() { if(!m_rs) { TRACE(TEXT("CVORecordset::BOF() RecordSet COM Object not initialized\n")); return FALSE; } VARIANT_BOOL fValue; HRESULT hr = m_rs->get_BOF(&fValue); return (fValue == VARIANT_TRUE); } BOOL CVORecordset::IsEOF() { if(!m_rs) { TRACE(TEXT("CVORecordset::EOF() RecordSet COM Object not initialized\n")); return FALSE; } VARIANT_BOOL fValue; HRESULT hr = m_rs->get_EOF(&fValue); return (fValue == VARIANT_TRUE); } BOOL CVORecordset::MoveFirst() { if(!m_rs) { TRACE(TEXT("CVORecordset::MoveFirst() RecordSet COM Object not initialized\n")); return FALSE; } HRESULT hr = m_rs->MoveFirst(); return (!FAILED(hr)); } BOOL CVORecordset::MoveNext() { if(!m_rs) { TRACE(TEXT("CVORecordset::MoveNext() RecordSet COM Object not initialized\n")); return FALSE; } HRESULT hr = m_rs->MoveNext(); return (!FAILED(hr)); } Field* CVORecordset::GetField(int iField) { if(!m_rs) { TRACE(TEXT("CVORecordset::GetField() RecordSet COM Object not initialized\n")); return NULL; } HRESULT hr = m_Fields->get_Item(_variant_t((long)iField), &m_Field); if(FAILED(hr)) return NULL; return m_Field; } LPCTSTR CVORecordset::GetFieldName(int iField) { if(!m_rs) { TRACE(TEXT("CVORecordset::GetFieldName() RecordSet COM Object not initialized\n")); return NULL; } Field* pField = GetField(iField); if(!pField) { TRACE(TEXT("CVORecordset::GetFieldName() Invalid Field Index\n")); return NULL; } m_varFieldName = TEXT("Empty"); pField->get_Name(&m_varFieldName.bstrVal); if(m_varFieldName.vt != VT_BSTR) VariantChangeType(&m_varFieldName, &m_varFieldName, 0, VT_BSTR); return m_varFieldName.bstrVal; } VARIANT CVORecordset::GetFieldValue(int iField) { if(!m_rs) { TRACE(TEXT("CVORecordset::GetFieldValue() RecordSet COM Object not initialized\n")); return _variant_t(0L); } HRESULT hr; m_varFieldValue = TEXT("Empty"); Field* pField = GetField(iField); if(!pField) { TRACE(TEXT("CVORecordset::GetFieldValue() Invalid Field Index\n")); return _variant_t(0L); } hr = pField->get_Value(&m_varFieldValue); return m_varFieldValue; } LPCTSTR CVORecordset::GetFieldValueString(int iField) { if(!m_rs) { TRACE(TEXT("CVORecordset::GetFieldValueString() RecordSet COM Object not initialized\n")); return NULL; } _variant_t value = GetFieldValue(iField); m_varFieldValue = TEXT("Empty"); if(value.vt == VT_BSTR) m_varFieldValue = value; else VariantChangeType(&m_varFieldValue, &value, 0, VT_BSTR); return m_varFieldValue.bstrVal; } BOOL CVORecordset::SetFieldValue(int iField, VARIANT value) { if(!m_rs) { TRACE(TEXT("CVORecordset::SetFieldValue() RecordSet COM Object not initialized\n")); return FALSE; } HRESULT hr; Field* pField = GetField(iField); if(!pField) { TRACE(TEXT("CVORecordset::SetFieldValue() Invalid Field Index\n")); return FALSE; } pField = GetField(iField); hr = pField->put_Value(value); _variant_t varFieldName(GetFieldName(iField)); hr = m_rs->Update(varFieldName, value); return !FAILED(hr); } BOOL CVORecordset::SetFieldValue(LPCTSTR pcszFieldName, VARIANT value) { if(!m_rs) { TRACE(TEXT("CVORecordset::SetFieldValue() RecordSet COM Object not initialized\n")); return FALSE; } CVOString strFieldName(pcszFieldName); for(int iFieldIndex = 0; iFieldIndex < GetFieldCount(); iFieldIndex++) { if(strFieldName == GetFieldName(iFieldIndex)) return SetFieldValue(iFieldIndex, value); } return FALSE; } BOOL CVORecordset::Delete() { if(!m_rs) { TRACE(TEXT("CVORecordset::SetFieldValue() RecordSet COM Object not initialized\n")); return FALSE; } HRESULT hr; hr = m_rs->Delete(1); return !FAILED(hr); }