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.
 
 
 
 
 
 

346 lines
9.7 KiB

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) Microsoft Corporation
//
// SYNOPSIS
//
// Defines the class ReportEventCommand.
//
///////////////////////////////////////////////////////////////////////////////
#include "ias.h"
#include "reporteventcmd.h"
#include "msdasc.h"
HRESULT ReportEventCommand::Prepare(IDBCreateSession* dbCreateSession) throw ()
{
HRESULT hr;
CComPtr<IDBCreateCommand> dbCreateCommand;
hr = dbCreateSession->CreateSession(
0,
__uuidof(IDBCreateCommand),
reinterpret_cast<IUnknown**>(&dbCreateCommand)
);
if (FAILED(hr))
{
TraceOleDbError("IDBCreateSession::CreateSession", hr);
return hr;
}
CComPtr<ICommandText> commandText;
hr = dbCreateCommand->CreateCommand(
0,
__uuidof(ICommandText),
reinterpret_cast<IUnknown**>(&commandText)
);
if (FAILED(hr))
{
TraceOleDbError("IDBCreateCommand::CreateCommand", hr);
return hr;
}
hr = commandText->SetCommandText(
DBGUID_SQL,
L"{rpc dbo.report_event}"
);
if (FAILED(hr))
{
TraceOleDbError("ICommandText::SetCommandText", hr);
return hr;
}
CComPtr<ICommandWithParameters> commandWithParameters;
hr = commandText->QueryInterface(
__uuidof(ICommandWithParameters),
reinterpret_cast<void**>(&commandWithParameters)
);
if (FAILED(hr))
{
TraceComError("IUnknown::QueryInterface(ICommandWithParameters", hr);
return hr;
}
// When using RPC call semantics, the stored procedure always has a return
// value even if it's not declared. Thus, we bind and ignore.
static const DB_UPARAMS paramOrdinal[] =
{
1,
2
};
static const DBPARAMBINDINFO dbParamBindInfo[] =
{
{
L"int", // pwszDataSourceType
L"return_value", // pwszName
sizeof(long), // ulParamSize
DBPARAMFLAGS_ISOUTPUT, // dwFlags
0, // bPrecision
0 // bScale
},
{
L"ntext", // pwszDataSourceType
L"@doc", // pwszName
~0, // ulParamSize
DBPARAMFLAGS_ISINPUT, // dwFlags
0, // bPrecision
0 // bScale
}
};
hr = commandWithParameters->SetParameterInfo(
2,
paramOrdinal,
dbParamBindInfo
);
if (FAILED(hr))
{
TraceOleDbError("ICommandWithParameters::SetParameterInfo", hr);
return hr;
}
CComPtr<IAccessor> accessor;
hr = commandText->QueryInterface(
__uuidof(IAccessor),
reinterpret_cast<void**>(&accessor)
);
if (FAILED(hr))
{
TraceComError("IUnknown::QueryInterface(IAccessor)", hr);
return hr;
}
static const DBBINDING dbBinding[] =
{
{
1, // iOrdinal
0, // obValue
0, // obLength
0, // obStatus
0, // pTypeInfo
0, // pObject
0, // pBindExt
DBPART_VALUE, // dwPart
DBMEMOWNER_CLIENTOWNED, // dwMemOwner
DBPARAMIO_OUTPUT, // eParamIO
0, // cbMaxLen
0, // dwFlags
DBTYPE_I4, // wType
0, // bPrecision
0 // bScale
},
{
2, // iOrdinal
offsetof(SprocParams, doc), // obValue
0, // obLength
0, // obStatus
0, // pTypeInfo
0, // pObject
0, // pBindExt
DBPART_VALUE, // dwPart
DBMEMOWNER_CLIENTOWNED, // dwMemOwner
DBPARAMIO_INPUT, // eParamIO
0, // cbMaxLen
0, // dwFlags
(DBTYPE_WSTR | DBTYPE_BYREF), // wType
0, // bPrecision
0 // bScale
}
};
HACCESSOR h;
hr = accessor->CreateAccessor(
DBACCESSOR_PARAMETERDATA,
2,
dbBinding,
sizeof(SprocParams),
&h,
0
);
if (FAILED(hr))
{
TraceOleDbError("IAccessor::CreateAccessor", hr);
return hr;
}
// Everything succeeded, so release the old resources ...
ReleaseAccessorHandle();
// ... and store the new.
command = commandText;
accessorManager = accessor;
accessorHandle = h;
return S_OK;
}
HRESULT ReportEventCommand::Execute(const wchar_t* doc) throw ()
{
SprocParams data =
{
0,
doc
};
DBPARAMS dbParmas =
{
&data, // pData
1, // cParamSets
accessorHandle // hAccessor
};
HRESULT hr = command->Execute(
0,
IID_NULL,
&dbParmas,
0,
0
);
if (FAILED(hr))
{
TraceOleDbError("ICommand::Execute", hr);
}
return hr;
}
void ReportEventCommand::Unprepare() throw ()
{
ReleaseAccessorHandle();
accessorManager.Release();
command.Release();
version = 0;
}
HRESULT ReportEventCommand::CreateDataSource(
const wchar_t* initString,
IDBCreateSession** newDataSource
) throw ()
{
HRESULT hr;
CComPtr<IDataInitialize> dataInitialize;
hr = CoCreateInstance(
CLSID_MSDAINITIALIZE,
0,
CLSCTX_INPROC_SERVER,
__uuidof(IDataInitialize),
reinterpret_cast<void**>(&dataInitialize)
);
if (FAILED(hr))
{
TraceComError("CoCreateInstance(MSDAINITIALIZE)", hr);
return hr;
}
CComPtr<IDBInitialize> dbInitialize;
hr = dataInitialize->GetDataSource(
0,
CLSCTX_INPROC_SERVER,
initString,
__uuidof(IDBInitialize),
reinterpret_cast<IUnknown**>(&dbInitialize)
);
if (FAILED(hr))
{
TraceOleDbError("IDataInitialize::GetDataSource", hr);
return hr;
}
hr = dbInitialize->Initialize();
if (FAILED(hr))
{
TraceOleDbError("IDBInitialize::Initialize", hr);
return hr;
}
hr = dbInitialize->QueryInterface(
__uuidof(IDBCreateSession),
reinterpret_cast<void**>(newDataSource)
);
if (FAILED(hr))
{
TraceComError("IUnknown::QueryInterface(IDBCreateSession)", hr);
return hr;
}
return S_OK;
}
void ReportEventCommand::ReleaseAccessorHandle() throw ()
{
if ((accessorHandle != 0) && accessorManager)
{
accessorManager->ReleaseAccessor(accessorHandle, 0);
}
accessorHandle = 0;
}
void ReportEventCommand::TraceComError(
const char* function,
HRESULT error
) throw ()
{
IASTracePrintf("%s failed; return value = 0x%08X", function, error);
}
void ReportEventCommand::TraceOleDbError(
const char* function,
HRESULT error
) throw ()
{
IASTracePrintf("%s failed; return value = 0x%08X", function, error);
IErrorInfo* errInfo;
if (GetErrorInfo(0, &errInfo) == S_OK)
{
HRESULT hr;
BSTR description;
hr = errInfo->GetDescription(&description);
if (SUCCEEDED(hr))
{
IASTracePrintf("\tDescription: %S", description);
SysFreeString(description);
}
IErrorRecords* errRecords;
hr = errInfo->QueryInterface(
__uuidof(IErrorRecords),
reinterpret_cast<void**>(&errRecords)
);
if (SUCCEEDED(hr))
{
ULONG numRecords = 0;
errRecords->GetRecordCount(&numRecords);
for (ULONG i = 0; i < numRecords; ++i)
{
ERRORINFO info;
hr = errRecords->GetBasicErrorInfo(i, &info);
if (SUCCEEDED(hr))
{
IASTracePrintf(
"\tRecord %lu: hrError = 0x%08X; dwMinor = 0x%08X",
i,
info.hrError,
info.dwMinor
);
}
}
errRecords->Release();
}
errInfo->Release();
}
}