[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