[prev in list] [next in list] [prev in thread] [next in thread]
List: ms-dcom
Subject: Re: Transaction Context
From: Sorin Rojea <SorinR () IQ-L ! COM>
Date: 2004-09-01 1:45:36
Message-ID: 76ECB90A3007E641955E4F879A18800A0434C3 () corp_tormail ! iq-l ! com
[Download RAW message or body]
Howard,
My only comment on this is that if the transaction gets aborted after the call to \
MoveFileEx, the file moved will not be rolled back , therefore the transaction will \
not behave atomically. I think you need to employ CRM(Compensating Resource Manager) \
to integrate the file operation with the DTC transaction.
-----Original Message-----
From: Howard Pinsley [mailto:HPinsley@KAYESCHOLER.COM]
Sent: Tue 8/31/2004 2:34 PM
To: DCOM@DISCUSS.MICROSOFT.COM
Cc:
Subject: Re: Transaction Context
Sorin:
My apologies for getting back to this thread so late!
>>Where do you catch the exceptions raised by the stored procedure?
>>Can you post the COM+ code where you call the stored procedure from?
As requested, here's the code:
STDMETHODIMP CKDCDocumentUpdate::ReturnDocument(long LibraryIdOfDocument,
long DocumentId, long LibraryIdOfUser,
long ReturnedById, BSTR FileType,
long Filesize,
VARIANT_BOOL PermanentVersion,
long RepositoryId,
BSTR FileLocation,
BSTR VersionComments,
BSTR TempFilespec,
BSTR FinalFilespec, long *NewVersionId)
{
IKDCConnectionPtr KDI;
_ConnectionPtr Conn;
_CommandPtr Cmd;
_variant_t varMissing(DISP_E_PARAMNOTFOUND, VT_ERROR);
//Specifies missing optional value
_variant_t varNULL; //You must change this to
VT_NULL!!!
_ParameterPtr parDocumentId;
_ParameterPtr parReturnedById;
_ParameterPtr parFileType;
_ParameterPtr parFilesize;
_ParameterPtr parPermanentVersion;
_ParameterPtr parRepositoryId;
_ParameterPtr parFileLocation;
_ParameterPtr parVersionComments;
_ParameterPtr parVersionId;
IKDCWorkspaceQueryPtr WSQ; //WorkspaceQuery is marked
Support transactions
IKDCWorkspaceUpdatePtr WSU; //WorkspaceUpdate is marked as
Requires transacations
HRESULT hr;
try {
if (this->m_spObjectContext != NULL)
this->m_spObjectContext->SetAbort();
if (!NewVersionId)
return Error("Bad pointer passed to ReturnDocument.",
__uuidof(IKDCDocumentUpdate), E_POINTER);
*NewVersionId = 0;
/*************************************************
* Change varNULL's type to VT_NULL as required. *
*************************************************/
varNULL.ChangeType(VT_NULL);
hr = KDI.CreateInstance(__uuidof(KDCConnection));
if (FAILED(hr))
return Error("Failed to create a KDConnection object.",
__uuidof(IKDCDocumentUpdate), hr);
/************************
* Create a connection. *
************************/
Conn = KDI->GetConnection(LibraryIdOfDocument);
/***********************************************************************
* Create a command object and associate it with the connection
object.*
***********************************************************************/
hr = Cmd.CreateInstance(__uuidof(Command));
if (FAILED(hr))
return Error("Failed to create a Command object.",
__uuidof(IKDCDocumentUpdate), hr);
Cmd->ActiveConnection = Conn;
/*************************************
* Create the procedures parameters. *
*************************************/
parDocumentId = Cmd->CreateParameter("DocumentId", adInteger,
adParamInput, 0, _variant_t(DocumentId));
parReturnedById = Cmd->CreateParameter("ReturnedById",
adInteger, adParamInput, 0, _variant_t(ReturnedById));
parFileType = Cmd->CreateParameter("FileType", adChar,
adParamInput, SysStringLen(FileType), _bstr_t(FileType));
parFilesize = Cmd->CreateParameter("Filesize", adInteger,
adParamInput, 0, _variant_t(Filesize));
parPermanentVersion = Cmd->CreateParameter("PermanentVersion",
adBoolean, adParamInput, 0, _variant_t(PermanentVersion));
parRepositoryId = Cmd->CreateParameter("RepositoryId",
adInteger, adParamInput, 0, _variant_t(RepositoryId));
parFileLocation = Cmd->CreateParameter("FileLocation", adChar,
adParamInput, SysStringLen(FileLocation), _bstr_t(FileLocation));
if (SysStringLen(VersionComments))
parVersionComments =
Cmd->CreateParameter("VersionComments", adChar, adParamInput,
SysStringLen(VersionComments), _bstr_t(VersionComments));
else
parVersionComments =
Cmd->CreateParameter("VersionComments", adChar, adParamInput, -1, varNULL);
/********************************
* Create the output parameter. *
********************************/
parVersionId = Cmd->CreateParameter("VersionId", adInteger,
adParamOutput, sizeof(long));
/************************************************
* Append the parameters to the command object. *
************************************************/
Cmd->Parameters->Append(parDocumentId);
Cmd->Parameters->Append(parReturnedById);
Cmd->Parameters->Append(parFileType);
Cmd->Parameters->Append(parFilesize);
Cmd->Parameters->Append(parPermanentVersion);
Cmd->Parameters->Append(parRepositoryId);
Cmd->Parameters->Append(parFileLocation);
Cmd->Parameters->Append(parVersionComments);
Cmd->Parameters->Append(parVersionId);
Cmd->CommandText = "dbo.ReturnDocument";
Cmd->Execute(&varMissing, &varMissing, adCmdStoredProc);
/*********************************************************************************
* Note that output parameters are not available until you
close the connection. *
*********************************************************************************/
Conn->Close();
*NewVersionId = parVersionId->Value;
/*********************************************************
* Remove the document from the user's checkouts folder. *
*********************************************************/
WSQ = CreateIKDCWorkspaceQueryPtr();
WSU = CreateIKDCWorkspaceUpdatePtr();
int FolderId;
FolderId = WSQ->LookupUsersCheckoutsFolderId(LibraryIdOfUser,
ReturnedById);
WSU->RemoveDocumentFromFolder(LibraryIdOfDocument, DocumentId,
LibraryIdOfUser,
FolderId);
// 12/16/99 - Add it to the recently used folder
FolderId =
WSQ->LookupUsersRecentlyUsedFolderId(LibraryIdOfUser, ReturnedById);
WSU->AddDocumentToFolder(LibraryIdOfDocument, DocumentId,
LibraryIdOfUser, FolderId);
/*****************************************************************
* Rename the file from the temp filespec to the final
filespec. *
*****************************************************************/
_bstr_t Msg;
Msg = _bstr_t("Renaming ") + _bstr_t(TempFilespec) +
" to " + _bstr_t(FinalFilespec);
ATLTRACE("%s\n", (LPCTSTR) Msg);
if (!MoveFileEx(_bstr_t(TempFilespec), _bstr_t(FinalFilespec),
0))
return Error(LPCOLESTR(Msg),
__uuidof(IKDCDocumentUpdate), HRESULT_FROM_WIN32(GetLastError()));
if (this->m_spObjectContext != NULL)
this->m_spObjectContext->SetComplete();
return S_OK;
}
catch (const _com_error &E) {
if (this->m_spObjectContext != NULL)
this->m_spObjectContext->SetAbort();
return Error(LPOLESTR(_bstr_t(E.ErrorMessage()) + " from " +
E.Source() +
" " + E.Description() +
" in ReturnDocument"),
__uuidof(IKDCDocumentUpdate), E.Error());
}
catch (...) {
if (this->m_spObjectContext != NULL)
this->m_spObjectContext->SetAbort();
return Error("Caught unknown exception in ReturnDocument",
__uuidof(IKDCDocumentUpdate), E_FAIL);
}
}
----------------------------------------------------------------
Users Guide http://discuss.microsoft.com/archives/mailfaq.html
contains important info. Save time, search the archives at
http://discuss.microsoft.com/archives/index.html .
To unsubscribe, mailto:DCOM-signoff-request@DISCUSS.MICROSOFT.COM
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic