Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

219 lines
5.1 KiB

/******************************************************************************
Copyright (c) 2000 Microsoft Corporation
Module Name:
Database.cpp
Abstract:
This file contains the implementation of the JetBlueCOM::Database class.
Revision History:
Davide Massarenti (Dmassare) 05/20/2000
created
******************************************************************************/
#include <stdafx.h>
#ifndef NOJETBLUECOM
////////////////////////////////////////////////////////////////////////////////
JetBlueCOM::Database::Database()
{
m_db = NULL; // JetBlue::Database* m_db;
// BaseObjectWithChildren<Database,Table> m_Tables;
}
JetBlueCOM::Database::~Database()
{
Passivate();
}
HRESULT JetBlueCOM::Database::Refresh()
{
__HCP_FUNC_ENTRY( "JetBlueCOM::Database::Refresh" );
HRESULT hr;
int iTbl = m_db->NumOfTables();
int i;
m_Tables.Passivate();
for(i=0; i<iTbl; i++)
{
CComPtr<Table> child;
JetBlue::Table* tbl = m_db->GetTbl( i );
__MPC_EXIT_IF_METHOD_FAILS(hr, tbl->Open());
__MPC_EXIT_IF_METHOD_FAILS(hr, m_Tables.CreateChild( this, &child ));
__MPC_EXIT_IF_METHOD_FAILS(hr, child->Initialize( *tbl ));
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
////////////////////////////////////////
HRESULT JetBlueCOM::Database::Initialize( /*[in]*/ JetBlue::Database& db )
{
__HCP_FUNC_ENTRY( "JetBlueCOM::Database::Initialize" );
HRESULT hr;
m_db = &db;
hr = Refresh();
__HCP_FUNC_EXIT(hr);
}
void JetBlueCOM::Database::Passivate()
{
MPC::SmartLock<_ThreadModel> lock( this );
m_db = NULL;
m_Tables.Passivate();
}
////////////////////////////////////////
STDMETHODIMP JetBlueCOM::Database::get_Name( /*[out, retval]*/ BSTR *pVal )
{
__HCP_FUNC_ENTRY( "JetBlueCOM::Database::get_Name" );
USES_CONVERSION;
HRESULT hr;
MPC::SmartLock<_ThreadModel> lock( this );
__MPC_PARAMCHECK_BEGIN(hr)
__MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
__MPC_PARAMCHECK_END();
__MPC_JET_CHECKHANDLE(hr,m_db,NULL);
{
const MPC::string& str = *m_db;
hr = MPC::GetBSTR( A2W(str.c_str()), pVal );
}
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
STDMETHODIMP JetBlueCOM::Database::get_Tables( /*[out, retval]*/ IPCHDBCollection* *pVal )
{
__HCP_FUNC_ENTRY( "JetBlueCOM::Database::get_Tables" );
HRESULT hr;
MPC::SmartLock<_ThreadModel> lock( this );
__MPC_PARAMCHECK_BEGIN(hr)
__MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
__MPC_PARAMCHECK_END();
__MPC_JET_CHECKHANDLE(hr,m_db,NULL);
hr = m_Tables.GetEnumerator( pVal );
__HCP_FUNC_CLEANUP;
__HCP_FUNC_EXIT(hr);
}
////////////////////////////////////////
STDMETHODIMP JetBlueCOM::Database::AttachTable( /*[in]*/ BSTR bstrName ,
/*[in, optional]*/ VARIANT vXMLDef ,
/*[out,retval] */ IPCHDBTable* *pVal )
{
__HCP_FUNC_ENTRY( "JetBlueCOM::Database::DeleteRecord" );
USES_CONVERSION;
HRESULT hr;
MPC::SmartLock<_ThreadModel> lock( this );
JET_TABLECREATE tblcrt; ::ZeroMemory( &tblcrt, sizeof(tblcrt) );
JetBlue::TableDefinition tbldef;
JetBlue::Table* table;
LPSTR szName;
__MPC_PARAMCHECK_BEGIN(hr)
__MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrName);
__MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL);
__MPC_PARAMCHECK_END();
__MPC_JET_CHECKHANDLE(hr,m_db,NULL);
szName = W2A( bstrName );
if(vXMLDef.vt == VT_BSTR && vXMLDef.bstrVal)
{
__MPC_EXIT_IF_METHOD_FAILS(hr, tbldef.Load( vXMLDef.bstrVal ));
__MPC_EXIT_IF_METHOD_FAILS(hr, tbldef.Generate( tblcrt ));
tblcrt.szTableName = szName;
__MPC_EXIT_IF_METHOD_FAILS(hr, m_db->GetTable( NULL, table, &tblcrt ));
__MPC_EXIT_IF_METHOD_FAILS(hr, Refresh());
}
else
{
__MPC_EXIT_IF_METHOD_FAILS(hr, m_db->GetTable( szName, table ));
}
{
BaseObjectWithChildren<Database,Table>::ChildIterConst itBegin;
BaseObjectWithChildren<Database,Table>::ChildIterConst itEnd;
m_Tables.GetChildren( itBegin, itEnd );
for(;itBegin != itEnd; itBegin++)
{
CComBSTR bstr;
__MPC_EXIT_IF_METHOD_FAILS(hr, (*itBegin)->get_Name( &bstr ));
if(bstr == bstrName) break;
}
if(itBegin == itEnd)
{
__MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_FILE_NOT_FOUND);
}
else
{
__MPC_SET_ERROR_AND_EXIT(hr, (*itBegin)->QueryInterface( IID_IPCHDBTable, (void**)pVal ));
}
}
hr = S_OK;
__HCP_FUNC_CLEANUP;
(void)tbldef.Release( tblcrt );
__HCP_FUNC_EXIT(hr);
}
#endif