/****************************************************************************** Copyright (c) 2000 Microsoft Corporation Module Name: Column.cpp Abstract: This file contains the implementation of the JetBlue::Column class. Revision History: Davide Massarenti (Dmassare) 05/17/2000 created ******************************************************************************/ #include //////////////////////////////////////////////////////////////////////////////// JetBlue::Column::Column() { m_sesid = JET_sesidNil; // JET_SESID m_sesid; m_tableid = JET_tableidNil; // JET_TABLEID m_tableid; // MPC::string m_strName; // JET_COLUMNDEF m_coldef; ::ZeroMemory( &m_coldef, sizeof(m_coldef) ); m_coldef.cbStruct = sizeof(m_coldef); } JetBlue::Column::~Column() { } //////////////////////////////////////// HRESULT JetBlue::Column::Get( /*[out]*/ CComVariant& vValue ) { __HCP_FUNC_ENTRY( "JetBlue::Column::Get" ); HRESULT hr; JET_ERR err; JET_RETINFO ret; void* pvData; unsigned long cbData; unsigned long cbActual; BYTE rgBuf[2048+2]; BYTE* pBufLarge = NULL; vValue.Clear(); switch(m_coldef.coltyp) { case JET_coltypBit : pvData = &rgBuf[0] ; cbData = sizeof( rgBuf[0] ) ; break; case JET_coltypUnsignedByte: pvData = &vValue.bVal ; cbData = sizeof( vValue.bVal ) ; break; case JET_coltypShort : pvData = &vValue.iVal ; cbData = sizeof( vValue.iVal ) ; break; case JET_coltypLong : pvData = &vValue.lVal ; cbData = sizeof( vValue.lVal ) ; break; case JET_coltypCurrency : pvData = &vValue.cyVal ; cbData = sizeof( vValue.cyVal ) ; break; case JET_coltypIEEESingle : pvData = &vValue.fltVal; cbData = sizeof( vValue.fltVal ) ; break; case JET_coltypIEEEDouble : pvData = &vValue.dblVal; cbData = sizeof( vValue.dblVal ) ; break; case JET_coltypDateTime : pvData = &vValue.date ; cbData = sizeof( vValue.date ) ; break; ///////////////////////////////////////////////////////////////////////////////////////////// case JET_coltypText : case JET_coltypLongText : pvData = rgBuf ; cbData = sizeof( rgBuf ) - 2; break; default: __MPC_SET_ERROR_AND_EXIT(hr, E_INVALIDARG); } __MPC_JET__MTSAFE(m_sesid, err, ::JetRetrieveColumn( m_sesid, m_tableid, m_coldef.columnid, pvData, cbData, &cbActual, JET_bitRetrieveCopy, NULL )); // // No value, bail out. // if(err == JET_wrnColumnNull) { vValue.vt = VT_NULL; __MPC_SET_ERROR_AND_EXIT(hr, S_OK); } __MPC_EXIT_IF_JET_FAILS(hr, err); if(cbActual > cbData) { __MPC_EXIT_IF_ALLOC_FAILS(hr, pBufLarge, new BYTE[cbActual+2]); pvData = pBufLarge; cbData = cbActual; __MPC_EXIT_IF_JET_FAILS__MTSAFE(m_sesid, hr, ::JetRetrieveColumn( m_sesid, m_tableid, m_coldef.columnid, pvData, cbData, &cbActual, JET_bitRetrieveCopy, NULL )); } switch(m_coldef.coltyp) { case JET_coltypBit : vValue.vt = VT_BOOL; vValue.boolVal = rgBuf[0] ? VARIANT_TRUE : VARIANT_FALSE; break; case JET_coltypUnsignedByte: vValue.vt = VT_UI1; break; case JET_coltypShort : vValue.vt = VT_I2; break; case JET_coltypLong : vValue.vt = VT_I4; break; case JET_coltypCurrency : vValue.vt = VT_CY; break; case JET_coltypIEEESingle : vValue.vt = VT_R4; break; case JET_coltypIEEEDouble : vValue.vt = VT_R8; break; case JET_coltypDateTime : vValue.vt = VT_DATE; break; case JET_coltypText : case JET_coltypLongText: // Put the trailing zeros, just in case... ((BYTE*)pvData + cbActual)[0] = 0; ((BYTE*)pvData + cbActual)[1] = 0; if(m_coldef.cp == 1200) vValue = (LPWSTR)pvData; else vValue = (LPSTR )pvData; break; } hr = S_OK; __HCP_FUNC_CLEANUP; if(pBufLarge) delete [] pBufLarge; __HCP_FUNC_EXIT(hr); } HRESULT JetBlue::Column::Get( /*[out]*/ MPC::CComHGLOBAL& hgValue ) { __HCP_FUNC_ENTRY( "JetBlue::Column::Get" ); HRESULT hr; void* pvData; unsigned long cbData; unsigned long cbActual; BYTE rgBuf[256]; BYTE* pBufLarge = NULL; switch(m_coldef.coltyp) { case JET_coltypBinary : break; case JET_coltypLongBinary: break; default: __MPC_SET_ERROR_AND_EXIT(hr, E_INVALIDARG); } pvData = rgBuf; cbData = sizeof(rgBuf); __MPC_EXIT_IF_JET_FAILS__MTSAFE(m_sesid, hr, ::JetRetrieveColumn( m_sesid, m_tableid, m_coldef.columnid, pvData, cbData, &cbActual, JET_bitRetrieveCopy, NULL )); if(cbActual > cbData) { __MPC_EXIT_IF_ALLOC_FAILS(hr, pBufLarge, new BYTE[cbActual]); pvData = pBufLarge; cbData = cbActual; __MPC_EXIT_IF_JET_FAILS__MTSAFE(m_sesid, hr, ::JetRetrieveColumn( m_sesid, m_tableid, m_coldef.columnid, pvData, cbData, &cbActual, JET_bitRetrieveCopy, NULL )); } __MPC_EXIT_IF_METHOD_FAILS(hr, hgValue.New( GMEM_FIXED, cbActual )); ::CopyMemory( hgValue.Get(), pvData, cbActual ); hr = S_OK; __HCP_FUNC_CLEANUP; if(pBufLarge) delete [] pBufLarge; __HCP_FUNC_EXIT(hr); } HRESULT JetBlue::Column::Get( /*[out]*/ MPC::wstring& strValue ) { __HCP_FUNC_ENTRY( "JetBlue::Column::Get" ); HRESULT hr; CComVariant vValue; __MPC_EXIT_IF_METHOD_FAILS(hr, Get( vValue )); __MPC_EXIT_IF_METHOD_FAILS(hr, vValue.ChangeType( VT_BSTR )); strValue = SAFEBSTR( vValue.bstrVal ); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT JetBlue::Column::Get( /*[out]*/ MPC::string& strValue ) { __HCP_FUNC_ENTRY( "JetBlue::Column::Get" ); USES_CONVERSION; HRESULT hr; CComVariant vValue; __MPC_EXIT_IF_METHOD_FAILS(hr, Get( vValue )); __MPC_EXIT_IF_METHOD_FAILS(hr, vValue.ChangeType( VT_BSTR )); strValue = W2A( SAFEBSTR( vValue.bstrVal ) ); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT JetBlue::Column::Get( /*[out]*/ long& lValue ) { __HCP_FUNC_ENTRY( "JetBlue::Column::Get" ); HRESULT hr; CComVariant vValue; __MPC_EXIT_IF_METHOD_FAILS(hr, Get( vValue )); __MPC_EXIT_IF_METHOD_FAILS(hr, vValue.ChangeType( VT_I4 )); lValue = vValue.lVal; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT JetBlue::Column::Get( /*[out]*/ short& sValue ) { __HCP_FUNC_ENTRY( "JetBlue::Column::Get" ); HRESULT hr; CComVariant vValue; __MPC_EXIT_IF_METHOD_FAILS(hr, Get( vValue )); __MPC_EXIT_IF_METHOD_FAILS(hr, vValue.ChangeType( VT_I2 )); sValue = vValue.iVal; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT JetBlue::Column::Get( /*[out]*/ BYTE& bValue ) { __HCP_FUNC_ENTRY( "JetBlue::Column::Get" ); HRESULT hr; CComVariant vValue; __MPC_EXIT_IF_METHOD_FAILS(hr, Get( vValue )); __MPC_EXIT_IF_METHOD_FAILS(hr, vValue.ChangeType( VT_UI1 )); bValue = vValue.bVal; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////// HRESULT JetBlue::Column::Put( /*[in]*/ const VARIANT& vValue , /*[in]*/ int iIdxPos ) { __HCP_FUNC_ENTRY( "JetBlue::Column::Put" ); USES_CONVERSION; HRESULT hr; const void* pvData; unsigned long cbData; BYTE fBool; VARTYPE vt; CComVariant vTmp; const VARIANT* pvPtr; JET_GRBIT grbit = 0; if(vValue.vt == VT_NULL) { pvData = NULL; cbData = 0; } else { switch(m_coldef.coltyp) { case JET_coltypBit : vt = VT_BOOL; break; case JET_coltypUnsignedByte: vt = VT_UI1 ; break; case JET_coltypShort : vt = VT_I2 ; break; case JET_coltypLong : vt = VT_I4 ; break; case JET_coltypCurrency : vt = VT_CY ; break; case JET_coltypIEEESingle : vt = VT_R4 ; break; case JET_coltypIEEEDouble : vt = VT_R8 ; break; case JET_coltypDateTime : vt = VT_DATE; break; case JET_coltypText : vt = VT_BSTR; break; case JET_coltypLongText : vt = VT_BSTR; break; default : __MPC_EXIT_IF_METHOD_FAILS(hr, E_INVALIDARG); break; } if(vt != vValue.vt) { __MPC_EXIT_IF_METHOD_FAILS(hr, vTmp.ChangeType( vt, &vValue )); pvPtr = &vTmp; } else { pvPtr = &vValue; } if(vt == VT_BOOL) { fBool = pvPtr->boolVal == VARIANT_FALSE ? 0 : 1; } switch(m_coldef.coltyp) { case JET_coltypBit : pvData = &fBool ; cbData = sizeof( fBool ) ; break; case JET_coltypUnsignedByte: pvData = &pvPtr->bVal ; cbData = sizeof( pvPtr->bVal ) ; break; case JET_coltypShort : pvData = &pvPtr->iVal ; cbData = sizeof( pvPtr->iVal ) ; break; case JET_coltypLong : pvData = &pvPtr->lVal ; cbData = sizeof( pvPtr->lVal ) ; break; case JET_coltypCurrency : pvData = &pvPtr->cyVal ; cbData = sizeof( pvPtr->cyVal ) ; break; case JET_coltypIEEESingle : pvData = &pvPtr->fltVal ; cbData = sizeof( pvPtr->fltVal ) ; break; case JET_coltypIEEEDouble : pvData = &pvPtr->dblVal ; cbData = sizeof( pvPtr->dblVal ) ; break; case JET_coltypDateTime : pvData = &pvPtr->date ; cbData = sizeof( pvPtr->date ) ; break; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// case JET_coltypText : case JET_coltypLongText: if(m_coldef.cp == 1200) { pvData = SAFEBSTR( pvPtr->bstrVal ) ; cbData = wcslen( (LPWSTR)pvData ) * 2; } else { pvData = W2A( SAFEBSTR( pvPtr->bstrVal ) ); cbData = strlen( (LPSTR )pvData ) ; } break; } if(cbData == 0) grbit = JET_bitSetZeroLength; } { JET_ERR err; if(iIdxPos == -1) { __MPC_JET__MTSAFE(m_sesid, err, ::JetSetColumn( m_sesid, m_tableid, m_coldef.columnid, pvData, cbData, grbit, NULL )); // // Special case: Jet returns a warning, we want to return an error. // if(err == JET_wrnColumnMaxTruncated) { __MPC_SET_ERROR_AND_EXIT(hr, HRESULT_BASE_JET | (err & 0xFFFF)); } } else { __MPC_JET__MTSAFE(m_sesid, err, ::JetMakeKey( m_sesid, m_tableid, pvData, cbData, iIdxPos > 0 ? 0 : JET_bitNewKey )); } __MPC_EXIT_IF_JET_FAILS(hr, err); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } HRESULT JetBlue::Column::Put( /*[out]*/ const MPC::CComHGLOBAL& hgValue ) { __HCP_FUNC_ENTRY( "JetBlue::Column::Put" ); HRESULT hr; LPVOID pvData; unsigned long cbData; unsigned long cbActual; BYTE rgBuf[256]; BYTE* pBufLarge = NULL; pvData = hgValue.Lock(); cbData = hgValue.Size(); switch(m_coldef.coltyp) { case JET_coltypBinary : break; case JET_coltypLongBinary: break; default: __MPC_SET_ERROR_AND_EXIT(hr, E_INVALIDARG); } __MPC_EXIT_IF_JET_FAILS__MTSAFE(m_sesid, hr, ::JetSetColumn( m_sesid, m_tableid, m_coldef.columnid, pvData, cbData, 0, NULL )); hr = S_OK; __HCP_FUNC_CLEANUP; hgValue.Unlock(); __HCP_FUNC_EXIT(hr); } HRESULT JetBlue::Column::Put( /*[out]*/ const MPC::wstring& strValue ) { return Put( strValue.c_str() ); } HRESULT JetBlue::Column::Put( /*[out]*/ const MPC::string& strValue ) { return Put( strValue.c_str() ); } HRESULT JetBlue::Column::Put( /*[out]*/ LPCWSTR szValue ) { return Put( CComVariant( szValue ) ); } HRESULT JetBlue::Column::Put( /*[out]*/ long lValue ) { return Put( CComVariant( lValue ) ); } HRESULT JetBlue::Column::Put( /*[out]*/ LPCSTR szValue ) { return Put( CComVariant( szValue ) ); } HRESULT JetBlue::Column::Put( /*[out]*/ short sValue ) { return Put( CComVariant( sValue ) ); } HRESULT JetBlue::Column::Put( /*[out]*/ BYTE bValue ) { return Put( CComVariant( bValue ) ); }