From 0b8c7409dbe69bdd782e3afa4650636493415374 Mon Sep 17 00:00:00 2001 From: Johns-305 <32582356+Johns-305@users.noreply.github.com> Date: Sun, 18 Mar 2018 11:08:07 -0400 Subject: [PATCH] Adding Community ODBC Adapter Community ODBC Adapter for BizTalk Server 2010 and higher. --- .../Adapter/Design-Time/AdapterManagement.cs | Bin 0 -> 39422 bytes .../Design-Time/AdapterManagement.csproj | 236 + .../Adapter/Design-Time/AssemblyInfo.cs | Bin 0 -> 1394 bytes .../Design-Time/DatalinkTypeConverter.cs | 95 + .../Design-Time/DatalinkUITypeEditor.cs | 256 + .../Adapter/Design-Time/ODBCAdapter.snk | Bin 0 -> 596 bytes .../Design-Time/ODBCAdapterResource.resx | 119 + .../Adapter/Design-Time/ReceiveHandler.xsd | Bin 0 -> 2784 bytes .../Adapter/Design-Time/ReceiveLocation.xsd | Bin 0 -> 24644 bytes .../Adapter/Design-Time/SQLUITypeEditor.cs | 90 + .../Adapter/Design-Time/SQLUITypeEditor.resx | 223 + .../Adapter/Design-Time/SchemaPicker.cs | 384 ++ .../Adapter/Design-Time/SchemaPicker.resx | 193 + .../Adapter/Design-Time/TransmitHandler.xsd | Bin 0 -> 12252 bytes .../Adapter/Design-Time/TransmitHandler.xsx | 9 + .../Adapter/Design-Time/TransmitLocation.xsd | Bin 0 -> 13392 bytes .../Adapter/Design-Time/TransmitLocation.xsx | 9 + .../Adapter/Design-Time/WSDLGen.cs | 101 + .../Adapter/Design-Time/wsdlODBCSchemaReq.xml | 24 + .../Design-Time/wsdlODBCSchemaResp.xml | 24 + .../Run-Time/ODBCReceive/AssemblyInfo.cs | Bin 0 -> 1312 bytes .../Run-Time/ODBCReceive/ODBCAdapter.snk | Bin 0 -> 596 bytes .../ODBCReceive/ODBCAdapterProperties.cs | Bin 0 -> 13058 bytes .../Run-Time/ODBCReceive/ODBCMsgContext.cs | Bin 0 -> 5914 bytes .../ODBCReceive/ODBCReceiveAdapter.csproj | 195 + .../Run-Time/ODBCReceive/ODBCReceiver.cs | Bin 0 -> 4218 bytes .../ODBCReceive/ODBCReceiverEndpoint.cs | Bin 0 -> 26756 bytes .../Run-Time/ODBCTransmit/AssemblyInfo.cs | Bin 0 -> 1312 bytes .../ODBCTransmit/BTSExplorerHelper.cs | 76 + .../Run-Time/ODBCTransmit/ODBCAdapter.snk | Bin 0 -> 596 bytes .../ODBCTransmit/ODBCAdapterExceptions.cs | Bin 0 -> 3850 bytes .../ODBCTransmit/ODBCAdapterProperties.cs | Bin 0 -> 11128 bytes .../ODBCTransmit/ODBCTransmitAdapter.csproj | 194 + .../ODBCTransmit/ODBCTransmitAdapterBatch.cs | Bin 0 -> 30134 bytes .../Run-Time/ODBCTransmit/ODBCTransmitter.cs | Bin 0 -> 5190 bytes .../Source Code/BaseAdapter/Adapter.cs | 134 + .../BaseAdapter/AdapterException.cs | 57 + .../BaseAdapter/AdapterTransaction.cs | 132 + .../BaseAdapter/AsyncBatchedTransmitter.cs | 125 + .../BaseAdapter/AsyncTransmitter.cs | 104 + .../BaseAdapter/AsyncTransmitterBatch.cs | 122 + .../Source Code/BaseAdapter/BTSTicket.cs | 59 + .../BaseAdapter/BatchAsyncResult.cs | 86 + .../Source Code/BaseAdapter/BatchResult.cs | 92 + .../Source Code/BaseAdapter/BatchState.cs | 104 + .../BaseAdapter/ConfigProperties.cs | 178 + .../BaseAdapter/ControlledTermination.cs | 113 + .../BaseAdapter/IManageEndpoints.cs | 39 + .../BaseAdapter/IThreadpoolWorkItem.cs | 38 + .../Source Code/BaseAdapter/NativeCalls.cs | 113 + .../Source Code/BaseAdapter/ODBCAdapter.snk | Bin 0 -> 596 bytes .../BaseAdapter/ODBCBaseAdapter.csproj | 119 + .../BaseAdapter/Properties/AssemblyInfo.cs | 36 + .../Source Code/BaseAdapter/Receiver.cs | 185 + .../BaseAdapter/ReceiverEndpoint.cs | 42 + .../Source Code/BaseAdapter/SSOResult.cs | 68 + .../StandardReceiveBatchHandler.cs | 316 ++ .../StandardRequestResponseHandler.cs | 149 + .../StandardTransmitBatchHandler.cs | 454 ++ .../Source Code/BaseAdapter/TaskScheduler.cs | 182 + .../Source Code/BaseAdapter/ThreadPool.cs | 65 + .../BaseAdapter/TransactionDispenser.cs | 87 + .../BaseAdapter/TransmitterMessage.cs | 115 + .../Source Code/BaseAdapter/VirtualStream.cs | 243 + .../Source Code/BaseAdapter/batch.cs | 620 +++ .../Source Code/BizTalk ODBC Adapter 2010.sln | 104 + .../Source Code/Install/Install.vdproj | 4332 +++++++++++++++++ .../ODBCDriverPrompt/AssemblyInfo.cs | 16 + .../ODBCDriverPrompt/ODBCAdapter.snk | Bin 0 -> 596 bytes .../ODBCDriverPrompt/ODBCDriverDialog.cs | 256 + .../ODBCDriverPrompt/ODBCDriverDialog.resx | 120 + .../ODBCDriverPrompt/ODBCDriverPrompt.csproj | 182 + .../ODBCDriverPrompt/ODBCDriverUI.cs | 19 + .../ODBCDriverPrompt/ODBCHelper.cs | 115 + .../ODBCDriverPrompt/PasswordDialog.cs | 185 + .../ODBCDriverPrompt/PasswordDialog.resx | 120 + .../ODBCQueryProcessor/AssemblyInfo.cs | 16 + .../ODBCQueryProcessor/BTSODBCQueryEngine.cs | 684 +++ .../ODBCQueryProcessor/ODBCAdapter.snk | Bin 0 -> 596 bytes .../ODBCPerformanceCounterInstaller.cs | 86 + .../ODBCPerformanceCounterInstaller.resx | 123 + .../ODBCQueryProcessor.csproj | 177 + .../ODBCSchemaWizard/ADOCommandOverride.cs | 514 ++ .../ODBCSchemaWizard/ADOCommandOverride.resx | 120 + .../ODBCSchemaWizard/AssemblyInfo.cs | 16 + .../ODBCSchemaWizard/BTSODBCQueryEngine.cs | 358 ++ .../Source Code/ODBCSchemaWizard/Form1.cs | 59 + .../Source Code/ODBCSchemaWizard/Form1.resx | 42 + .../ODBCSchemaWizard/ODBCAdapter.snk | Bin 0 -> 596 bytes .../ODBCSchemaWizard/ODBCSchemaHelper.cs | 901 ++++ .../ODBCSchemaWizard/ODBCSchemaWizard.csproj | 243 + .../ODBCSchemaWizard/TestCases.xls | Bin 0 -> 14336 bytes .../Source Code/ODBCSchemaWizard/Validator.cs | 179 + .../ODBCSchemaWizard/WizardLogo.JPG | Bin 0 -> 1850 bytes .../WizardUI/ADOParameters.cs | 273 ++ .../WizardUI/ADOParameters.resx | 120 + .../ODBCSchemaWizard/WizardUI/DBConnection.cs | 211 + .../WizardUI/DBConnection.resx | 120 + .../WizardUI/FinishDisplay.cs | 76 + .../WizardUI/FinishDisplay.resx | 120 + .../WizardUI/ODBCAdapterWizardForm.cs | 474 ++ .../WizardUI/ODBCAdapterWizardForm.resx | 120 + .../ODBCSchemaWizard/WizardUI/QueryEditor.cs | 261 + .../WizardUI/QueryEditor.resx | 120 + .../ODBCSchemaWizard/WizardUI/QueryType.cs | 126 + .../ODBCSchemaWizard/WizardUI/QueryType.resx | 120 + .../WizardUI/SchemaMetaData.cs | 279 ++ .../WizardUI/SchemaMetaData.resx | 120 + .../ODBCSchemaWizard/WizardUI/WizardForm.cs | 330 ++ .../ODBCSchemaWizard/WizardUI/WizardForm.resx | 159 + .../WizardUI/WizardUserControl.cs | 123 + .../WizardUI/WizardUserControl.resx | 120 + .../Resources/BizTalk ODBC Adapter.doc | Bin 0 -> 329216 bytes .../Resources/BizTalk ODBC Adapter.vsd | Bin 0 -> 66048 bytes .../Source Code/Resources/NorthhWindsMods.sql | Bin 0 -> 38090 bytes .../Source Code/Resources/ODBCAdapter.reg | 37 + .../Source Code/Resources/ODBCAdapter.snk | Bin 0 -> 596 bytes .../Resources/ODBCAdapter_Local.reg | Bin 0 -> 4148 bytes .../Source Code/Resources/ODBCTYPESMatch.XSD | 40 + .../Resources/RosettaStoneTypeMappings.xls | Bin 0 -> 15360 bytes .../Source Code/TestHarness/AssemblyInfo.cs | 16 + .../TestHarness/BTSODBCQueryEngine.cs | 358 ++ .../TestHarness/ConnectionString.cs | 141 + .../TestHarness/ConnectionString.resx | 193 + .../Source Code/TestHarness/MetaData.cs | 174 + .../Source Code/TestHarness/MetaData.resx | 220 + .../Source Code/TestHarness/ODBCAdapter.snk | Bin 0 -> 596 bytes .../Source Code/TestHarness/TestForm.cs | 681 +++ .../Source Code/TestHarness/TestForm.resx | 129 + .../TestHarness/TestHarness.csproj | 195 + .../Source Code/TestHarness/Validator.cs | 178 + .../Source Code/TestHarness/app.config | 3 + .../TestHarness/odbcCommandHelper.cs | 636 +++ 133 files changed, 21645 insertions(+) create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/AdapterManagement.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/AdapterManagement.csproj create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/AssemblyInfo.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/DatalinkTypeConverter.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/DatalinkUITypeEditor.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ODBCAdapter.snk create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ODBCAdapterResource.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ReceiveHandler.xsd create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ReceiveLocation.xsd create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SQLUITypeEditor.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SQLUITypeEditor.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SchemaPicker.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SchemaPicker.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitHandler.xsd create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitHandler.xsx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitLocation.xsd create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitLocation.xsx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/WSDLGen.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/wsdlODBCSchemaReq.xml create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/wsdlODBCSchemaResp.xml create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/AssemblyInfo.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCAdapter.snk create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCAdapterProperties.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCMsgContext.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCReceiveAdapter.csproj create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCReceiver.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCReceiverEndpoint.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/AssemblyInfo.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/BTSExplorerHelper.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCAdapter.snk create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCAdapterExceptions.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCAdapterProperties.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCTransmitAdapter.csproj create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCTransmitAdapterBatch.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCTransmitter.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/Adapter.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AdapterException.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AdapterTransaction.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AsyncBatchedTransmitter.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AsyncTransmitter.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AsyncTransmitterBatch.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BTSTicket.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BatchAsyncResult.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BatchResult.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BatchState.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ConfigProperties.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ControlledTermination.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/IManageEndpoints.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/IThreadpoolWorkItem.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/NativeCalls.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ODBCAdapter.snk create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ODBCBaseAdapter.csproj create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/Properties/AssemblyInfo.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/Receiver.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ReceiverEndpoint.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/SSOResult.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/StandardReceiveBatchHandler.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/StandardRequestResponseHandler.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/StandardTransmitBatchHandler.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/TaskScheduler.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ThreadPool.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/TransactionDispenser.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/TransmitterMessage.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/VirtualStream.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/batch.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BizTalk ODBC Adapter 2010.sln create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Install/Install.vdproj create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/AssemblyInfo.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCAdapter.snk create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverDialog.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverDialog.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverPrompt.csproj create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverUI.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCHelper.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/PasswordDialog.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/PasswordDialog.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/AssemblyInfo.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/BTSODBCQueryEngine.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCAdapter.snk create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCPerformanceCounterInstaller.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCPerformanceCounterInstaller.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCQueryProcessor.csproj create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ADOCommandOverride.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ADOCommandOverride.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/AssemblyInfo.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/BTSODBCQueryEngine.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/Form1.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/Form1.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ODBCAdapter.snk create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ODBCSchemaHelper.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ODBCSchemaWizard.csproj create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/TestCases.xls create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/Validator.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardLogo.JPG create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ADOParameters.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ADOParameters.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/DBConnection.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/DBConnection.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/FinishDisplay.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/FinishDisplay.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ODBCAdapterWizardForm.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ODBCAdapterWizardForm.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryEditor.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryEditor.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryType.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryType.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/SchemaMetaData.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/SchemaMetaData.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardForm.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardForm.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardUserControl.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardUserControl.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/BizTalk ODBC Adapter.doc create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/BizTalk ODBC Adapter.vsd create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/NorthhWindsMods.sql create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCAdapter.reg create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCAdapter.snk create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCAdapter_Local.reg create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCTYPESMatch.XSD create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/RosettaStoneTypeMappings.xls create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/AssemblyInfo.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/BTSODBCQueryEngine.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/ConnectionString.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/ConnectionString.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/MetaData.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/MetaData.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/ODBCAdapter.snk create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/TestForm.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/TestForm.resx create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/TestHarness.csproj create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/Validator.cs create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/app.config create mode 100644 BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/odbcCommandHelper.cs diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/AdapterManagement.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/AdapterManagement.cs new file mode 100644 index 0000000000000000000000000000000000000000..dc860f907a8afabe23decb9c2691f1543f3c65d7 GIT binary patch literal 39422 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 literal 0 HcmV?d00001 diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/AdapterManagement.csproj b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/AdapterManagement.csproj new file mode 100644 index 00000000..88b02bb9 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/AdapterManagement.csproj @@ -0,0 +1,236 @@ + + + + Local + 9.0.30729 + 2.0 + {CD29DF32-44FE-4CC6-A43E-01A74B25B9E3} + Debug + AnyCPU + + + + + ODBCAdapterManagement + ODBCAdapter.snk + JScript + Grid + IE50 + false + Library + Microsoft.BizTalk.Adapters.ODBC.ODBCDesignTime + OnBuildSuccess + + + + + + + true + 3.5 + + + + + + + + + false + v4.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + AllRules.ruleset + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + AllRules.ruleset + + + + Microsoft.Biztalk.Adapter.Framework + ..\..\..\Program Files\Microsoft BizTalk Server 2004\Developer Tools\Microsoft.Biztalk.Adapter.Framework.dll + + + Microsoft.BizTalk.ExplorerOM + ..\..\..\Program Files\Microsoft BizTalk Server 2004\Developer Tools\Microsoft.BizTalk.ExplorerOM.dll + + + Microsoft.BizTalk.Pipeline + ..\..\..\Program Files\Microsoft BizTalk Server 2004\Microsoft.BizTalk.Pipeline.dll + + + System + + + System.Data + + + System.Drawing + + + System.Drawing.Design + + + System.Windows.Forms + + + System.XML + + + {F25132D9-07AA-4B41-90AD-828E54704692} + ODBCDriverPrompt + + + {3BCB956F-E5FB-4D40-9090-8E44E92C5353} + ODBCSchemaWizard + + + + + Code + + + Code + + + Code + + + Form + + + Form + + + Code + + + Code + + + Designer + + + Designer + + + Designer + + + SchemaPicker.cs + Designer + + + SQLUITypeEditor.cs + Designer + + + Designer + + + Designer + + + + + TransmitHandler.xsd + + + TransmitLocation.xsd + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + + + CALL "%25VS100COMNTOOLS%25vsvars32.bat" +gacutil.exe /i "$(TargetPath)" + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/AssemblyInfo.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/AssemblyInfo.cs new file mode 100644 index 0000000000000000000000000000000000000000..bd5b223cba5465a35c572d8231efb713e5186021 GIT binary patch literal 1394 zcmc(fPfx-?5XIlw#P85>!b^i3Jm?9_&A(CN#dxR`v7rS*!K8k8^*3884cgeAOw-Ly zJNstd%$xoE*eFx1xu)`TuN-TwiBg^EPzS2}>+24$7bUD?PQ+S(@%NbxUgn*0&R4*x zR7-5bSrOmXH|#OHY>Q`kJSxP__?qe&?_8(kJJ|a+;^f+4b@|)TIrh6ooJ}-y{0e+q zJ@wV&IbnCBA-(~-fg-$@t_CX*JRRxDRiar2Lznj${Mexsb@{JstiE%)6w}=eIfdVy z>cXwll3UrW5X@YLa0Rk)UC@UGan{t!yjF0xbr-K~tXqc~k+rF-E>^StwvBBJmN2v) zPW8Ht|MROyUI8_%Dyexze5bYqWqOrJnX^p$rBWm2q%DJyt9|6AC1gKy6)aG^7HSTt ze*%Bg&ZL526WM$!9~>9EWlW95EF8nC&)aivb16^`MlqyWXGbNfjJhW#sZdKb& lY(3Kcy + /// Class DatalinkTypeConverter. + /// + public class DatalinkTypeConverter : StringConverter + { + #region Methods + + public override bool CanConvertTo( ITypeDescriptorContext context, Type destinationType ) + { + return ( typeof( string ) == destinationType ) || base.CanConvertTo( context, destinationType ); + } + + /// + /// Convert actual value to desired type for display. + /// + /// + /// The parameter value contains the actual connection string, + /// including password. For security reasons, the password + /// must be masked. + /// + /// + /// Property grid cell context. + /// + /// + /// Culture to use for localized formatting. + /// + /// + /// Actual value to display in grid cell. + /// + /// + /// Desired type to display (grid cell's type). + /// + /// + /// Converted value with password masked. + /// + public override object ConvertTo( ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType ) + { + if ( typeof( string ) == destinationType && value is string ) + { + string pass = base.ConvertTo( context, culture, value, destinationType ) as string; + return SecurePassword( pass );//FIXConnectionString.SecurePassword(pass); + } + return base.ConvertTo( context, culture, value, destinationType ); + } + + private string SecurePassword( string ConnectionString ) + { + if ( ConnectionString != "" ) + { + int iPasswordIndex = ConnectionString.IndexOf( "PWD=", 1 ); + + if ( iPasswordIndex > 0 ) + { + int iEndOfPassword = ConnectionString.IndexOf( ";", iPasswordIndex ); + + //Deal with the fact that we may not have a ; at the end of our statement + if ( iEndOfPassword < 0 ) + iEndOfPassword = ConnectionString.Length; + + string password = ConnectionString.Substring( iPasswordIndex + 4, iEndOfPassword - ( iPasswordIndex + 4 ) ); + return ConnectionString.Replace( password, "*********" ); + + } + else + { + return ConnectionString; + } + } + else + { + return String.Empty; + } + + } + + #endregion + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/DatalinkUITypeEditor.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/DatalinkUITypeEditor.cs new file mode 100644 index 00000000..1b82e8cd --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/DatalinkUITypeEditor.cs @@ -0,0 +1,256 @@ +//--------------------------------------------------------------------- +// File: DatalinkUITypeEditor.cs +// +// Summary: Implementation of an adapter framework sample adapter using the ODBC provider for ADO.NET. +// +// Sample: Adapter framework runtime adapter. +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- +using System; +using System.ComponentModel; +using System.Data.OleDb; +using System.Diagnostics; +using System.Windows.Forms; +using System.Windows.Forms.Design; +using System.Security; +using System.Security.Permissions; +using System.Runtime.InteropServices; + +using ODBCDriverPrompt; //Custom written dialog to get ODBC connections + +namespace Microsoft.BizTalk.Adapters.ODBC.ODBCDesignTime +{ + #region DatalinkDialog + + public class DataLinkDialog + { + + private string connectionString = String.Empty; + + public DataLinkDialog( ) + { + + } + + public string ConnectionString + { + get + { + return connectionString; + } + set + { + connectionString = value; + } + } + + public DialogResult Show( System.IntPtr parent ) + { + try + { + CDataLink datalink = new CDataLink( ); + + System.Guid riid = new Guid( "0C733A8B-2A1C-11CE-ADE5-00AA0044773D" ); //IID_IDBInitialize + IDataInitialize dataInitialize = ( IDataInitialize )datalink; + + object pIDBInit = null; + dataInitialize.GetDataSource( null, 1, connectionString, ref riid, out pIDBInit ); + + IDBPromptInitialize dbPrompt = ( IDBPromptInitialize )datalink; + dbPrompt.PromptDataSource( null, parent, 18, 0, 0, null, ref riid, ref pIDBInit ); + + dataInitialize.GetInitializationString( pIDBInit, true, out connectionString ); + } + catch ( System.Runtime.InteropServices.COMException ) + { + // A COM exception is thrown when user cancels + return DialogResult.Cancel; + } + + return DialogResult.OK; + } + } + + #endregion + + class LaunchForm : Form + { + private DataLinkDialog form; + private DialogResult dialogResult; + private delegate void NextDialogDelegate( ); + private NextDialogDelegate nextDialog; + + public LaunchForm( DataLinkDialog form ) + { + this.form = form; + this.dialogResult = DialogResult.Cancel; + this.ShowInTaskbar = false; + this.StartPosition = FormStartPosition.CenterParent; + + // Switch to using Opacity if it is supported (its not on win2k) + if ( Environment.OSVersion.Version.Major > 5 || ( Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor > 0 ) ) + this.Opacity = 0.00; + else + this.WindowState = System.Windows.Forms.FormWindowState.Minimized; + + this.nextDialog = new NextDialogDelegate( NextDialog ); + this.Load += new EventHandler( LoadEvent ); + } + + private void NextDialog( ) + { + this.dialogResult = this.form.Show( this.Handle ); + this.Close( ); + } + + private void LoadEvent( object sender, EventArgs e ) + { + this.nextDialog.BeginInvoke( null, null ); + } + + public new DialogResult DialogResult + { + get + { + return dialogResult; + } + } + } + + #region DatalinkTypeEditor + + public class DatalinkUITypeEditor : System.Drawing.Design.UITypeEditor + { + private DataLinkDialog _form; + + public DatalinkUITypeEditor( ) + { + this._form = new DataLinkDialog( ); + this._form.ConnectionString = "";//"Provider=SQLOLEDB.1"; + } + + public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle( System.ComponentModel.ITypeDescriptorContext context ) + { + return System.Drawing.Design.UITypeEditorEditStyle.Modal; + } + + public override object EditValue( System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value ) + { + // If the value is null or it's an invalid connection string, we will discard it + if ( null != value ) + { + try + { + Validator.ValidateConnectionString( value.ToString( ) ); + this._form.ConnectionString = value.ToString( ); + } + catch ( SqlValidationException ) { } + } + + ODBCDriverUI DriverDialog = new ODBCDriverUI( ); + this._form.ConnectionString = DriverDialog.GetDSN( ); + + // // this form used to launch the dialog - see comment on class + // LaunchForm launchForm = new LaunchForm(this._form); + // + // // seems to be only way to launch modal dialogs from the adapter framework + // IWindowsFormsEditorService service = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); + // DialogResult result = service.ShowDialog(launchForm); + // + // DialogResult dialogResult = launchForm.DialogResult; + + // switch (dialogResult) + // { + // case System.Windows.Forms.DialogResult.OK: + value = this._form.ConnectionString; + + // Use OleDbConnection to read the database name and server name, generates URI + // OleDbConnection myConnection = new OleDbConnection(this._form.ConnectionString); + // string uriString = string.Empty; + //// if (myConnection.DataSource.Length == 0) + //// uriString = "ODBC://" + "." + "/" + myConnection.Database + "/"; + //// else + // uriString = "ODBC://" + value + "/"; + // + // // Writes to URI property + // object o = context.Instance; + // Type t = o.GetType(); + // System.Reflection.PropertyInfo p = t.GetProperty("uri"); + // if (null != p) + // p.SetValue(context.Instance, uriString , null); + + // break; + // case System.Windows.Forms.DialogResult.Cancel: + // break; + // } + return value; + } + } + + #endregion + + #region Interop Classes + + [ComImport] + [TypeLibType( TypeLibTypeFlags.FCanCreate )] + [ClassInterface( ClassInterfaceType.None )] + [Guid( "2206CDB2-19C1-11D1-89E0-00C04FD7A829" )] + public class CDataLink { } + + [ComImport] + [InterfaceTypeAttribute( ComInterfaceType.InterfaceIsIUnknown )] + [Guid( "2206CCB0-19C1-11D1-89E0-00C04FD7A829" )] + [CLSCompliant( false )] + public interface IDBPromptInitialize + { + void PromptDataSource( + [MarshalAs( UnmanagedType.Interface )] Object pUnkOuter, + IntPtr hWndParent, + uint dwPromptOptions, + uint cSourceTypeFilter, + int rgSourceTypeFilter, + string pwszszzProviderFilter, + ref System.Guid riid, + [MarshalAs( UnmanagedType.Interface )] ref Object ppDataSource ); + + } + + [ComImport] + [InterfaceTypeAttribute( ComInterfaceType.InterfaceIsIUnknown )] + [Guid( "2206CCB1-19C1-11D1-89E0-00C04FD7A829" )] + [CLSCompliant( false )] + public interface IDataInitialize + { + void GetDataSource( + [MarshalAs( UnmanagedType.Interface )] Object pUnkOuter, + uint dwClsCtx, + string pwszInitializationString, + ref System.Guid riid, + [MarshalAs( UnmanagedType.Interface )] out Object ppDataSource ); + + void GetInitializationString( + [MarshalAs( UnmanagedType.Interface )] Object pDataSource, + bool fIncludePassword, + [MarshalAs( UnmanagedType.LPWStr )] out string ppwszInitString ); + } + + [ComImport] + [InterfaceTypeAttribute( ComInterfaceType.InterfaceIsIUnknown )] + [Guid( "0C733A8B-2A1C-11CE-ADE5-00AA0044773D" )] + public interface IDBInitialize { } + + #endregion +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ODBCAdapter.snk b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ODBCAdapter.snk new file mode 100644 index 0000000000000000000000000000000000000000..0d564ea32858712121e1a4107e9400b9222978b6 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097ln4vQ4k&*q7xIBtACM>^uMjNyP06TNf zDH+G}B9=JY*p#EM9E0?3_%Po57I03rNK(JD11In*3z%gxEcNcc^74h!Kn5rDJNL=1 zbtGWj3vI;cA|lhHEdReXS{NEG?rA(|$tK(`)-GssxzFmqLt}vM(~?oFv<3+oO6^9#QW*Pa@HeX6wRhNdY$yq{w5ftPw(CN& zKAXY%q^8m^B;R`9d|lwb=Oh93Wqi$X^#H9MA@(hNj*=~9So3peD*%N+tOOlYx`2~_ zm^da99t?`XY8BSdN*J;1=SO1j-hYTMjc{@OpS7}{8NZWa=(9cbV>?Abk(%@ zsbbMvj=FE`YbF|;xvTV(62C2&1$A7 z;}@t^2T1c>ax;46MSn&1E3RmsB=%Jzw2lGcI5?&7@%TJctkTR_b3QKPNI`a%ff` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Virtual Directory + + + Enter virtual directory, including query string + + + Return Content Type + + + Enter content type to be used for the HTTP repsonse + + + Loop Back + + + Select loopback to route the request back as the response + + + Endpoint Configuration + + + Tuning Parameters + + + Error Threshold + + + Destination Url + + + Enter the destination URI that identifies the Internet resource that the message will be sent to + + + Transmit Location + + + HTTP Method + + + Enter the HTTP request method to use when contacting the Internet resource + + + GET + + + HEAD + + + POST + + + Time out + + + Enter the time-out value for the HTTP request + + + ContentType + + + Enter content type of the HTTP request + + + Authentication Type + + + Enter the type of Authentication to use to contact the Internet resource + + + Security Settings + + + Kerberos + + + Anonymous + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ReceiveHandler.xsd b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ReceiveHandler.xsd new file mode 100644 index 0000000000000000000000000000000000000000..ef07fdac9c61cb624af8e642ae7525a7487e65f7 GIT binary patch literal 2784 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 ZcwT?qdUJVd*^1|-ySzQx-|W8;{tp*Z=E?v7 literal 0 HcmV?d00001 diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SQLUITypeEditor.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SQLUITypeEditor.cs new file mode 100644 index 00000000..b4b32e21 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SQLUITypeEditor.cs @@ -0,0 +1,90 @@ +//--------------------------------------------------------------------- +// File: SQLUITypeEditor.cs +// +// Summary: Implementation of an adapter framework sample adapter using the ODBC provider for ADO.NET. +// +// Sample: Adapter framework runtime adapter. +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- +using System; +using System.IO; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Xml; +using System.Xml.Schema; +using System.Reflection; +using System.Security; +using System.Security.Permissions; + +using Microsoft.BizTalk.Component.Interop; + +namespace Microsoft.BizTalk.Adapters.ODBC.ODBCDesignTime +{ + public class SqlUITypeEditor : System.Drawing.Design.UITypeEditor + { + private SchemaPicker _form; + + public SqlUITypeEditor( ) + { + this._form = new SchemaPicker( ); + } + + [EnvironmentPermissionAttribute( SecurityAction.LinkDemand, Unrestricted = false )] + public override System.Drawing.Design.UITypeEditorEditStyle GetEditStyle( System.ComponentModel.ITypeDescriptorContext context ) + { + return System.Drawing.Design.UITypeEditorEditStyle.Modal; + } + + [EnvironmentPermissionAttribute( SecurityAction.LinkDemand, Unrestricted = false )] + public override object EditValue( System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value ) + { + string target = null; + string root = null; + string uriString = string.Empty; + + switch ( this._form.ShowDialog( ) ) + { + case System.Windows.Forms.DialogResult.OK: + value = this._form.sqlScript; + root = this._form.rootElementName; + target = this._form.targetNamespace; + + //WARNING: This could be a problem if the query gets over 256 characters! + uriString = "ODBC://" + value + "/"; + + // Writes to URI property + object o = context.Instance; + Type t = o.GetType( ); + System.Reflection.PropertyInfo p = t.GetProperty( "RootName" ); + + p.SetValue( context.Instance, root, null ); + p = t.GetProperty( "Namespace" ); + p.SetValue( context.Instance, target, null ); + + p = t.GetProperty( "uri" ); + p.SetValue( context.Instance, uriString, null ); + + break; + case System.Windows.Forms.DialogResult.Cancel: + break; + } + + return value; + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SQLUITypeEditor.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SQLUITypeEditor.resx new file mode 100644 index 00000000..97edff15 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SQLUITypeEditor.resx @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + Private + + + Private + + + Private + + + False + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + Private + + + False + + + Private + + + False + + + Private + + + Private + + + Private + + + False + + + Private + + + False + + + Private + + + Private + + + False + + + (Default) + + + False + + + False + + + 4, 4 + + + True + + + SqlScriptForm + + + SqlScriptForm + + + 80 + + + True + + + Private + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SchemaPicker.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SchemaPicker.cs new file mode 100644 index 00000000..d3af4c51 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SchemaPicker.cs @@ -0,0 +1,384 @@ +//--------------------------------------------------------------------- +// File: SchemaPicker.cs +// +// Summary: Implementation of an adapter framework sample adapter using the ODBC provider for ADO.NET. +// +// Sample: Adapter framework runtime adapter. +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- +using System; +using System.IO; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Xml; +using System.Xml.Schema; + +using Microsoft.Win32; + +using Microsoft.BizTalk.ExplorerOM; +using Microsoft.BizTalk.Component.Interop; + +namespace Microsoft.BizTalk.Adapters.ODBC.ODBCDesignTime +{ + /// + /// Summary description for SchemaPicker. + /// + internal class SchemaPicker : System.Windows.Forms.Form + { + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Button buttonOK; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + private System.Windows.Forms.ComboBox comboProject; + private System.Windows.Forms.ComboBox comboSchema; + + private BtsCatalogExplorer ce; + private ArrayList schemaNames = new ArrayList( ); + private System.Windows.Forms.Button buttonCancel; + + private string m_sqlScript = String.Empty; + private string m_rootElementName = String.Empty; + private string m_targetNamespace = String.Empty; + + public string sqlScript + { + get + { + return m_sqlScript; + } + set + { + m_sqlScript = value; + } + } + + public string targetNamespace + { + get + { + return m_targetNamespace; + } + set + { + m_targetNamespace = value; + } + } + + public string rootElementName + { + get + { + return m_rootElementName; + } + set + { + m_rootElementName = value; + } + } + + public SchemaPicker( ) + { + // + // Required for Windows Form Designer support + // + InitializeComponent( ); + + // this.label1.Text = ODBCResourceHandler.GetResourceString("SchemaPickerSelectLabel"); + // this.label2.Text = ODBCResourceHandler.GetResourceString("SchemaPickerSelectSchemaLabel"); + // this.buttonOK.Text = ODBCResourceHandler.GetResourceString("FormOKButton"); + // this.label3.Text = ODBCResourceHandler.GetResourceString("SchemaPickerTitleLabel"); + // this.buttonCancel.Text = ODBCResourceHandler.GetResourceString("FormCancelButton"); + // this.Text = ODBCResourceHandler.GetResourceString("SchemaPickerTitle"); + + RegistryKey bts30admin = Registry.LocalMachine.OpenSubKey( @"SOFTWARE\Microsoft\BizTalk Server\3.0\Administration" ); + string mgmtDBName = ( string )bts30admin.GetValue( "MgmtDBName" ); + string mgmtDBServer = ( string )bts30admin.GetValue( "MgmtDBServer" ); + + // Initialize ExplorerOM + ce = new BtsCatalogExplorer( ); + ce.ConnectionString = "Server=" + mgmtDBServer + ";Database=" + mgmtDBName + ";Integrated Security=SSPI"; + + // Get all the assembly names (project names) + //comboProject.Items.Add(ODBCResourceHandler.GetResourceString("SchemaAllProjects")); + ICollection assemblies = ce.GetCollection( CollectionType.Assembly ); + foreach ( IBtsAssembly assembly in assemblies ) + { + comboProject.Items.Add( assembly.Name ); + } + + // Get all the schema names but don't show them yet + ICollection schemas = ce.GetCollection( CollectionType.Schema ); + foreach ( IBtsSchema schema in schemas ) + { + if ( SchemaType.Property != schema.Type && !schema.BtsAssembly.IsSystem ) + schemaNames.Add( schema.AssemblyQualifiedName ); + } + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if ( disposing ) + { + if ( components != null ) + { + components.Dispose( ); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent( ) + { + this.label1 = new System.Windows.Forms.Label( ); + this.label2 = new System.Windows.Forms.Label( ); + this.comboProject = new System.Windows.Forms.ComboBox( ); + this.comboSchema = new System.Windows.Forms.ComboBox( ); + this.buttonOK = new System.Windows.Forms.Button( ); + this.label3 = new System.Windows.Forms.Label( ); + this.buttonCancel = new System.Windows.Forms.Button( ); + this.SuspendLayout( ); + // + // label1 + // + this.label1.Location = new System.Drawing.Point( 12, 52 ); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size( 100, 16 ); + this.label1.TabIndex = 10; + this.label1.Text = "Assembly"; + // + // label2 + // + this.label2.Location = new System.Drawing.Point( 12, 100 ); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size( 100, 16 ); + this.label2.TabIndex = 12; + this.label2.Text = "Schema"; + // + // comboProject + // + this.comboProject.AccessibleName = "comboProject"; + this.comboProject.Location = new System.Drawing.Point( 12, 72 ); + this.comboProject.Name = "comboProject"; + this.comboProject.Size = new System.Drawing.Size( 348, 21 ); + this.comboProject.TabIndex = 11; + this.comboProject.SelectedIndexChanged += new System.EventHandler( this.comboProject_SelectedIndexChanged ); + // + // comboSchema + // + this.comboSchema.AccessibleName = "comboSchema"; + this.comboSchema.Location = new System.Drawing.Point( 12, 120 ); + this.comboSchema.Name = "comboSchema"; + this.comboSchema.Size = new System.Drawing.Size( 348, 21 ); + this.comboSchema.TabIndex = 13; + // + // buttonOK + // + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.Location = new System.Drawing.Point( 198, 156 ); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size( 76, 23 ); + this.buttonOK.TabIndex = 14; + this.buttonOK.Text = "OK"; + this.buttonOK.Click += new System.EventHandler( this.buttonOK_Click ); + // + // label3 + // + this.label3.Location = new System.Drawing.Point( 12, 12 ); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size( 348, 32 ); + this.label3.TabIndex = 5; + this.label3.Text = "Please select the BizTalk assembly and schema containing the database script to e" + + "xecute"; + // + // buttonCancel + // + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.Location = new System.Drawing.Point( 282, 156 ); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size( 76, 23 ); + this.buttonCancel.TabIndex = 15; + this.buttonCancel.Text = "Cancel"; + // + // SchemaPicker + // + this.AcceptButton = this.buttonOK; + this.AutoScaleBaseSize = new System.Drawing.Size( 5, 13 ); + this.CancelButton = this.buttonCancel; + this.ClientSize = new System.Drawing.Size( 370, 188 ); + this.Controls.Add( this.buttonCancel ); + this.Controls.Add( this.label3 ); + this.Controls.Add( this.buttonOK ); + this.Controls.Add( this.comboSchema ); + this.Controls.Add( this.comboProject ); + this.Controls.Add( this.label2 ); + this.Controls.Add( this.label1 ); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; + this.Name = "SchemaPicker"; + this.Text = "Select Schema"; + this.ResumeLayout( false ); + + } + #endregion + + private void comboProject_SelectedIndexChanged( object sender, System.EventArgs e ) + { + comboSchema.Items.Clear( ); + comboSchema.ResetText( ); + string strProjName = comboProject.SelectedItem.ToString( ); + + // Show all the schemas + if ( strProjName == "AllProjects" ) //ODBCResourceHandler.GetResourceString("SchemaAllProjects")) + strProjName = ""; + + // If the project name contains space, it will be converted to underscore in schema name + strProjName = strProjName.Replace( " ", "_" ); + + for ( int i = 0; i < schemaNames.Count; i++ ) + if ( schemaNames[ i ].ToString( ).IndexOf( strProjName ) >= 0 ) + comboSchema.Items.Add( schemaNames[ i ].ToString( ) ); + } + + private void buttonOK_Click( object sender, System.EventArgs e ) + { + if ( comboSchema.SelectedIndex < 0 ) + { + MessageBox.Show( "Please select a schema before continuing", "ODBC Configuration Error", MessageBoxButtons.OK, MessageBoxIcon.Error ); + return; + } + + //Use the full schema name to get the content of the schema + try + { + string assemblyQualifiedName = comboSchema.SelectedItem.ToString( ); + + int index = assemblyQualifiedName.IndexOf( ',' ); + string docName = assemblyQualifiedName.Substring( 0, index ); + string assemblyName = assemblyQualifiedName.Substring( index + 1 ); + + IDocumentSpec ds = new DocumentSpec( docName, assemblyName ); + + //Get the first schema + XmlSchemaCollection schemas = ds.GetSchemaCollection( ); + XmlSchemaCollectionEnumerator enumerator = schemas.GetEnumerator( ); + enumerator.MoveNext( ); + XmlSchema schema = enumerator.Current; + sqlScript = GetFirstSQLStatement( schema ); + targetNamespace = GetTarget( schema ); + rootElementName = GetRoot( schema ); + + if ( sqlScript == null ) + { + MessageBox.Show( "The selected schema does not contain a SQL script. Please select another", "ODBC Configuration Error", MessageBoxButtons.OK, MessageBoxIcon.Error ); + return; + } + else + { + // We don't support parameters as part of a receive process. How would someone + // populate the parameters on a receieve only port? + + //WARNING: Need to fix this as they could be calling a proc with outparameters + //We'll skip the RC for a SP. + if ( sqlScript.IndexOf( "?", 3 ) > 0 ) + { + MessageBox.Show( "The selected schema contain a SQL script input parameters. This is not supported for receive ports. Please select another", "ODBC Configuration Error", MessageBoxButtons.OK, MessageBoxIcon.Error ); + return; + } + else + { + this.DialogResult = DialogResult.OK; + this.Close( ); + } + } + } + catch ( System.Runtime.InteropServices.COMException ) // Something wrong in schema cache + { + MessageBox.Show( "An error has occured connecting the BizTalk Configuration system", "ODBC Configruation Error", MessageBoxButtons.OK, MessageBoxIcon.Error ); + return; + } + catch ( Exception exp ) + { + string msg = exp.Message; + MessageBox.Show( "An error has occured connecting the BizTalk Configuration system" + " " + msg, "Big trouble", MessageBoxButtons.OK, MessageBoxIcon.Error ); + return; + } + } + + private string GetFirstSQLStatement( XmlSchemaObject parent ) + { + if ( parent is XmlSchemaAppInfo ) + { + foreach ( XmlNode child in ( ( XmlSchemaAppInfo )parent ).Markup ) + { + if ( child.LocalName == "ODBCCMD" ) + { + XmlAttribute att = child.Attributes[ "value" ]; + if ( null != child.InnerText ) + return child.InnerText; + } + } + return null; + } + else if ( parent is XmlSchema ) + { + foreach ( XmlSchemaObject child in ( ( XmlSchema )parent ).Items ) + { + string result = GetFirstSQLStatement( child ); + if ( result != null ) + return result; + } + } + else if ( parent is XmlSchemaAnnotation ) + { + foreach ( XmlSchemaObject child in ( ( XmlSchemaAnnotation )parent ).Items ) + { + string result = GetFirstSQLStatement( child ); + if ( result != null ) + return result; + } + } + return null; + } + + private string GetRoot( XmlSchema parent ) + { + foreach ( XmlSchemaObject child in parent.Items ) + { + if ( child is XmlSchemaElement ) + return ( ( XmlSchemaElement )child ).Name; + } + return null; + } + + private string GetTarget( XmlSchema parent ) + { + return parent.TargetNamespace; + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SchemaPicker.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SchemaPicker.resx new file mode 100644 index 00000000..22a0d178 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/SchemaPicker.resx @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + (Default) + + + False + + + False + + + 4, 4 + + + SchemaPicker + + + True + + + 80 + + + True + + + Private + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitHandler.xsd b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitHandler.xsd new file mode 100644 index 0000000000000000000000000000000000000000..2fa23162ff7aa42eb33ab89d763ff19376377ec3 GIT binary patch literal 12252 zcmeI2+in{-5QceOpzk2$x^e9Ega%H6oC*Yuoi=ic-W9SV*+Oi|mE6YTt>JUqybZ^x*YO<7OItC*0B}pM9#4 z7n)JfcIpFg`GhT`AQ1syPRP=re2jN-h zX6w&6?`y4$L!vXSl2I4ovEB#b;7YBtD4Rd@j9iBLeW+GjH?m@uzIq+%89Gz((9>-F zIIb#(592YHF4}CaeJ-ucwdT3xlvZw%+bhc8#=<^2vIe)2VU!;dnCaJ1aXlYyBex1O zR;8cjWQAQxa1`ZimJFvkw`MPwQGaj4QFtf0_p>?b{ikY0i{?9}o;me8XIShgJeOWi zqJ^0j%o|-&aQ#RYG}5Q9elv~Xt*a+&5>Lf@XA55G@7|gBsIJ%7k#pCJbBsl)_s=ZL zM^#5&N>1=H5O1r;*f_(7JJJNUJ=7Xl-9+oi?egPMWIZo+eumN4&Lx9);>oc0@DTVn?=)-@J-eJJ$c|7;Kqei7DOii*UB1zSv|hN`5gZNU z+!NXGfu8Hpq#8wbYSD}s^j!AwP#R88CQ-BSBhduScht+)1NM&;_g>1f9BrOte0-&~ zJI!kBJP-x!lQ`j#hTgyGJ&*9j_uKm0jeqobB>5A8h-t(VJdZd}EItqP_*w7AdPV|2 zsr8+B8;eU&?ye~H#NnQNeK&ls4^a(kMLR#}9SWDChQFW}qVYtsn&|yZG>KQ>n9qM8 zEkBi(bB$JYLC%4nuKMgp9tO${%$h9Iu{`5*YtuDpev@;8Z2ph>Ea_yOR&#r($BEUx z%}9%Z2HeNtjeRToP>)9Icr?T$C-7`7p-d-6 zS2C~7_ZM!P&Kp_8Rm@qi4aYHR6XYN4rI;h3;A+0>)Hg>rr;y99t)B9+{+u$Adepj} z-Hr2Q>r1#$LYF2kxE`J?w00;h;ax-;Z>xGniEcX`F5|Qvf;l(NsUwnG!NB?_KqZ>q4sK z{P}8f-tEHaxEH+RD2{YG#a{iUaDF zz7D>rkWekT8GC^9UMDtrq%|-X=L?rnvYg8q;`=&2%^oqg{Hon;(YVd7@5RD4UrMLc z47Z4keYQC-Zx^eo_POa^aJ64t+&A);$wioapSAovr7d)RpZv5(osM&~~m*I;poz(GU*g%1`|* zbK`v9?#@h@C{0#%)Fc<&; literal 0 HcmV?d00001 diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitHandler.xsx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitHandler.xsx new file mode 100644 index 00000000..43265faf --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitHandler.xsx @@ -0,0 +1,9 @@ + + + + + + <_x0028_TransactionSupport_x0029__XmlSimpleType left="317" top="5080" width="5292" height="2963" selected="0" zOrder="5" index="0" expanded="1" /> + + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitLocation.xsd b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitLocation.xsd new file mode 100644 index 0000000000000000000000000000000000000000..f28e500774c3ac7798e8e5b4c1a1700ff7ef8a26 GIT binary patch literal 13392 zcmeI3Yi|=r6o%(>rTzzt&m{yZwJHiAZk13;pg2_hRym17EMhyg9ZdS;+rG~nA7*xU z)^;u`R9IHcg$LnQxEr>@w!S-h zG75+K{YXzo;az-s9%kV<+}5ZcH0Duw7`_ePgdNeFhWq+E3@4g53_Z=aHAeBtfqprT z6rPCMU!u~}`tQSIQSXH_-NVPv`s-b-?}t13C=~% zXR-$Fy1K&d@J2jzw%~`IxCiDVs(W%?a}IiOjj<^8KCRL|t2*;cvVfOk@wR-9%`*(R zFKJ`H1MPv`O|*~P_O6c3lDj8geC-bmQ_(NJBOZqS5sYv)~)B&FPuHxzT z`!Y>ET+FSG=~VQ&BM(XvDsgoAeIaKMa3D>&4K?=#4mHQEv#b4x_8qO!wAGGiCR^;t zC-9A_w?CcS{(O%c#WlWn~0MgShrYHoU9rdc>$k zimh72BF?;$eLRtd)0IioEPP)yLF_G!vi*SXBgMA2vMfiG=NTX0Y41+68XtE>0sABt zcr;=3Z@SN;I5GU5{){Bsi4(M%pjKNXQck+1@g2pJ zy6;fIqAN0P)`2e3(K1WsTh2kO^85oXjXUO4^AO9k>$!_XHZp&zmWvqe$Y(4QPqbKJ zvZ$%aWsp%bk4e5w_E6RB)pD99jg(z4w~T~m|3}o^ixy{In&aiZw1D*S@4R|CkCDM_ zEU!&-FXq~Dds7`zt(EYmSw&dhW7W~R@-L6WpRCU2imKp1euX~~*U6so>8j0_cwBDz zuJatVOWxPq=`*e0te47r=?atqy0p`$! zt7qhnR`kNs80#kCDd6VUfk(NIgW`1b$O1fvUv4>$4pdTJ<0h2BS}oRGzAKY#(lS}% z*mxo^@-7O*}gs9dh{^Yu;7 zY4*BRV0nJoTUYPH@uWOI&v2~^Nmk97#QS$hwvHC$z zRV%-GrsA65yN;ZzE4jpvbDMj;XC>4)R4tw>(7hv0kQ-229SavYL9=R)2-wjGy!J#9 z^g?&+Z>;N7dzCXAs2xVyBaNp@v@CDDsGsIqiOwt)+^8nQ4f2=`IC3GOW}a}<$n!>; zpbJcZAihiLW@^OT_N#UW|C>CJ%3)d6_a$B=1rKoVdU6nGb_Bd1K(RY=jvvus7Na<)xXN=S0 zfzS_J2Enj=a!yAtkPxgg1hbPG!*+17g!sq@478X4Ek=TWyw&zmc_$|ZtjalUnFgmp z%m5dUZm2I-wW<2M3>(Z_2lMKY%ROzAgAy%}VDsI{>tRC)ZOYitrW;3wI^MO7|8mf- zjYHp2j&(1E7Kb|hB!lwY)6Rf-C&qF(@-WUTPxbBjlx2#BaL77;SIROs-iorf3MY%x zM@}UB5xwkG)%yO_(RBXF-t2uV-U`aAc1|N~-5g!PK<9>&*4Gv4P*^{A^z65uJ<>Pe z#68J|-uYl5i+UW`WXju8Hc8*Hind-y zKhqQHUDlg@dSCHoFx2X05Oo?oCRN@E^>}Js1n0;RmpNp&=Wzsxn0g20I^XxpyDNTn zNuP9snr?^r_w`US%_ibD&wJZ_B+Xp^j5*DzzBAZdC5^;>+W*f%8kbv3>HjjMk)^fM NQ{H{>|K;;A{0p3Z+u;BJ literal 0 HcmV?d00001 diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitLocation.xsx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitLocation.xsx new file mode 100644 index 00000000..3dd98353 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitLocation.xsx @@ -0,0 +1,9 @@ + + + + + + <_x0028_TransactionSupport_x0029__XmlSimpleType left="317" top="5080" width="5292" height="2963" selected="0" zOrder="5" index="0" expanded="1" /> + + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/WSDLGen.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/WSDLGen.cs new file mode 100644 index 00000000..56d1a440 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/WSDLGen.cs @@ -0,0 +1,101 @@ +//--------------------------------------------------------------------- +// File: WSDLGen.cs +// +// Summary: Implementation of an adapter framework sample adapter using the ODBC provider for ADO.NET. +// +// Sample: Adapter framework runtime adapter. +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- +using System; +using System.Xml; +using System.IO; +using System.Reflection; + +namespace Microsoft.BizTalk.Adapters.ODBC.ODBCDesignTime +{ + public class WSDLGen + { + private static string WsdlNamespace = "http://schemas.xmlsoap.org/wsdl/"; + + public WSDLGen( ) { } + + private static string CreateWSDLFromTemplate( string MessageSchema, string targetNamespace, string RootElementName, string wsdlTemplate ) + { + try + { + XmlDocument xsdDocument = new XmlDocument( ); + xsdDocument.LoadXml( MessageSchema ); + + // get the WSDL from the resources and set the targetNamespace + XmlDocument wsdlDocument = GetWSDL( targetNamespace, wsdlTemplate ); + + // add the schema to the WSDL + XmlNamespaceManager nsManager = new XmlNamespaceManager( new NameTable( ) ); + nsManager.AddNamespace( "wsdl", WsdlNamespace ); + + XmlNode types = wsdlDocument.SelectSingleNode( "wsdl:definitions/wsdl:types", nsManager ); + XmlNode schema = wsdlDocument.ImportNode( xsdDocument.DocumentElement, true ); + types.AppendChild( schema ); + + // add other WSDL junk into the WSDL document + XmlNode part = wsdlDocument.SelectSingleNode( "wsdl:definitions/wsdl:message/wsdl:part", nsManager ); + part.Attributes["element"].Value = "ODBC_" + RootElementName; + + // Make sure we change the schema name by modifing the ServiceName element in the WSDL + XmlNode Servicepart = wsdlDocument.SelectSingleNode( "wsdl:definitions/wsdl:service", nsManager ); + Servicepart.Attributes["name"].Value = "ODBC_" + RootElementName; + + return wsdlDocument.OuterXml; + } + catch + { + return ""; + } + } + + public static string CreateWSDL( string MessageSchema, string targetNamespace, string RootElementName, bool isRequestMessage ) + { + if (isRequestMessage) + { + return CreateWSDLFromTemplate(MessageSchema, targetNamespace, RootElementName, "Microsoft.BizTalk.Adapters.ODBC.ODBCDesignTime.wsdlODBCSchemaReq.xml"); + } + else + { + return CreateWSDLFromTemplate(MessageSchema, targetNamespace, RootElementName, "Microsoft.BizTalk.Adapters.ODBC.ODBCDesignTime.wsdlODBCSchemaResp.xml"); + } + } + + private static XmlDocument GetWSDL( string targetNamespace, string wsdlTemplateName ) + { + Stream stream = Assembly.GetExecutingAssembly( ).GetManifestResourceStream( wsdlTemplateName ); + StreamReader reader = null; + string wsdlTemplate = null; + + using ( reader = new StreamReader( stream ) ) + { + wsdlTemplate = reader.ReadToEnd( ); + } + + XmlDocument wsdlDocument = new XmlDocument( ); + wsdlDocument.LoadXml( wsdlTemplate ); + + wsdlDocument.DocumentElement.SetAttribute( "xmlns", targetNamespace ); + wsdlDocument.DocumentElement.SetAttribute( "targetNamespace", targetNamespace ); + + return wsdlDocument; + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/wsdlODBCSchemaReq.xml b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/wsdlODBCSchemaReq.xml new file mode 100644 index 00000000..d44f9572 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/wsdlODBCSchemaReq.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/wsdlODBCSchemaResp.xml b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/wsdlODBCSchemaResp.xml new file mode 100644 index 00000000..b20f073d --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/wsdlODBCSchemaResp.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/AssemblyInfo.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/AssemblyInfo.cs new file mode 100644 index 0000000000000000000000000000000000000000..016e3e7e9fc2549e196a104f24fee2ef565d87cb GIT binary patch literal 1312 zcmc(fOHaa35QWd$#Q)H^(hWftE_8)uXM9A78{?u*+et4uRw z!vc)prU@3H&XIDcUeqMbtdM zHDeLDr7Dz5@GavUHgdczsG8}`serAYUYq;7aom{bt;>G*SC8rD{w!#rk zDD`Lc-gC0s#d@@2_L%HCylsECqpOc=6PVI-CAW!jR$-4gNxhCuC;9@sQdij9o%MBY FJ^*$Y-MIh& literal 0 HcmV?d00001 diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCAdapter.snk b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCAdapter.snk new file mode 100644 index 0000000000000000000000000000000000000000..0d564ea32858712121e1a4107e9400b9222978b6 GIT binary patch literal 596 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 literal 0 HcmV?d00001 diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCMsgContext.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCMsgContext.cs new file mode 100644 index 0000000000000000000000000000000000000000..62940b56df5bd6b37bb08ecd25ba94cfa34bbf20 GIT binary patch literal 5914 zcmdUy(Qg_@5XSepQvZijo>HlSs_IjlMzX=F-3G9LB+XMqF;G;D=|PgZQU3L$zi)=k z-oX*8k=34c;`VlTcIMmJZ)S%N@0+0+9@OUfGJFA^X2`rx zVMcoumSMx(U%VS(%xGGdz6Rk{xa1jyJY1WeVfY=bYc!70J>pB>KC)qMLT|*}hLs~E zGx1h2v*XMg+2` zeY!t{Pnt9<-D4Y{vd1fM%VX}(Ipgw>MwW(d#aHyP#;cIX#<}T|UPR-L{S#AMTw*WTQNn+wRL8>#)nQd25aLrzUaC*xzBuibePXe+}?L zZobIreH*^v`Oe1M;g>!CWEM{=7?Y!C1|s?VK32Y>t+J>1%i+1+DH_C~BM>NRk|wcO zY!ag#(*lk(1ijD`cHzV|o{?jeZdi#Y^$aBS5)e0eZ1c*2Km&8df`Tt7uZJ zRPCtj!HDj#C$%HRjYn$ad(%9ktgs}XD#jJ38Az|#jdIa$29eKnT9Wcum!G7;d&MlG zJm#5Y&ey{BI^9~7FBF>|&B_b1?X$ivW-K9}A(?|pGBaeWJd*srMmpxe^?|cHC5sKv z)Ur%{!q-vglCzcFx@7VmG2LNoNWaI3=KDc%=d``>jPW*ot+>aWbV=hq+UI-?!zofv zY1P--KJPC57mW0<;1*weWL5^#WxE}|wl$|{mzEP&X1sqj%O}_vZ0!o8tag}rLMt>{ zD=jTXp3>L%PmCRJv2?L5Op@>L8*X(C85gHzFR`htdv_Bl}2%BeS z$M@|1Z6YnykIi=1G)RYgTt1P9m$=MKcvX4SGLs66xli;)^#sT zVC4_y-9xht_T1abXva%qvT~8KtLK+}?l11ogt-cl{FW>%->GW&Ix=QzI~4%?TvcCD-0k@m^TyrtQ+#p7Jc>J9+I)@c!^qb}PF}jLp5P4Bmr?!Z{R_Q#;9Ef|A zA63c3`fC7soshC{7G9EPR0Fqdenix!*)#L?k4P;+sGHd1BWjNA=UeEZSHAuCHWabi zm)|%q$vW!Yh9*@bu_o9MiPy%#+tDnZ<@i{)Yn8?#Hn*=`#*dq| zmc8k|tXfsgu!vOu7B(eD#+lfDdVQ1d2~D7+3qAV{f-rJ#-rw z_fh$ID$W*QpB#vlh^HFm=bcwIW9xW+)ky1hp4BM-&+{$jje4GI5n=t#vxx4$JjY^f z>D6PSbi?Yu(xKbe@5VZw_Dz`UcK$cvy(^4RJ$ASFAjEfv4XNI}ja$5Y)4vP<06&`t AnE(I) literal 0 HcmV?d00001 diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCReceiveAdapter.csproj b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCReceiveAdapter.csproj new file mode 100644 index 00000000..857dcf01 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCReceiveAdapter.csproj @@ -0,0 +1,195 @@ + + + + Local + 9.0.30729 + 2.0 + {16B6C5EF-0B60-4D90-9A79-69B1CADA756A} + Debug + AnyCPU + + + + + ODBCReceiveAdapter + ODBCAdapter.snk + JScript + Grid + IE50 + false + Library + Microsoft.BizTalk.Adapters.ODBC.RunTime.ODBCReceiveAdapter + OnBuildSuccess + + + + + + + true + 3.5 + + + + + + + + + false + v4.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + AllRules.ruleset + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + AllRules.ruleset + + + + Microsoft.BizTalk.GlobalPropertySchemas + ..\..\..\..\Program Files\Microsoft BizTalk Server 2004\Microsoft.BizTalk.GlobalPropertySchemas.dll + + + Microsoft.BizTalk.Interop.TransportProxy + ..\..\..\..\Program Files\Microsoft BizTalk Server 2004\Microsoft.BizTalk.Interop.TransportProxy.dll + + + Microsoft.BizTalk.Pipeline + ..\..\..\..\Program Files\Microsoft BizTalk Server 2004\Microsoft.BizTalk.Pipeline.dll + + + Microsoft.XLANGs.BaseTypes + ..\..\..\..\Program Files\Microsoft BizTalk Server 2004\Microsoft.XLANGs.BaseTypes.dll + + + System + + + System.Data + + + System.XML + + + {6EF6BB4C-9417-4CAE-990D-49F1F368284B} + ODBCBaseAdapter + + + ODBCQueryProcessor + {516F27B0-23E4-4704-9A86-A5064769522A} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + + + CALL "%25VS100COMNTOOLS%25vsvars32.bat" +gacutil.exe /i "$(TargetPath)" + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCReceiver.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCReceiver.cs new file mode 100644 index 0000000000000000000000000000000000000000..86632b7e67f4a2fb7ff45c947621d60c27ed1e57 GIT binary patch literal 4218 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 P4y4fL+r~F4nvDDxe7x4L literal 0 HcmV?d00001 diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/AssemblyInfo.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/AssemblyInfo.cs new file mode 100644 index 0000000000000000000000000000000000000000..016e3e7e9fc2549e196a104f24fee2ef565d87cb GIT binary patch literal 1312 zcmc(fOHaa35QWd$#Q)H^(hWftE_8)uXM9A78{?u*+et4uRw z!vc)prU@3H&XIDcUeqMbtdM zHDeLDr7Dz5@GavUHgdczsG8}`serAYUYq;7aom{bt;>G*SC8rD{w!#rk zDD`Lc-gC0s#d@@2_L%HCylsECqpOc=6PVI-CAW!jR$-4gNxhCuC;9@sQdij9o%MBY FJ^*$Y-MIh& literal 0 HcmV?d00001 diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/BTSExplorerHelper.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/BTSExplorerHelper.cs new file mode 100644 index 00000000..d67c5a09 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/BTSExplorerHelper.cs @@ -0,0 +1,76 @@ +//--------------------------------------------------------------------- +// File: BTSExplorerHelper.cs +// +// Summary: Implementation of an adapter framework sample adapter using the ODBC provider for ADO.NET. +// +// Sample: Adapter framework runtime adapter. +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- +using System; + +using Microsoft.Win32; + +using Microsoft.BizTalk.ExplorerOM; + +namespace Microsoft.BizTalk.Adapters.ODBC.RunTime.ODBCTransmitAdapter +{ + /// + /// This Class provides helper functions as relates to the the scehmas stored in biztalk assemblies + /// + public class BtsSchemaHelper + { + RegistryKey btsAdmin = Registry.LocalMachine.OpenSubKey( @"SOFTWARE\Microsoft\BizTalk Server\3.0\Administration" ); + string mgmtDBName; + string mgmtDBServer; + BtsCatalogExplorer ce; + + public BtsSchemaHelper( ) + { + // Initialize ExplorerOM + // NB: The ce.ConnectionString call can take several seconds to return, hence it is done + // here and can be cached by caller for later use. + + mgmtDBName = ( string )btsAdmin.GetValue( "MgmtDBName" ); + mgmtDBServer = ( string )btsAdmin.GetValue( "MgmtDBServer" ); + ce = new BtsCatalogExplorer( ); + ce.ConnectionString = "Server=" + mgmtDBServer + ";Database=" + mgmtDBName + ";Integrated Security=SSPI"; + } + + public string GetSchema( string sAssemblyQualifiedName ) + //Input string containing namespace + //Returns matching schema's XML or "" if no matches found + { + //NOTE: This is a fix to addess formatting inconsitencies between the context object and + //the BizTalk Explorer + sAssemblyQualifiedName = sAssemblyQualifiedName.Remove( sAssemblyQualifiedName.IndexOf( " ", 1 ), 1 ); + + string strResult = string.Empty; + + System.Collections.ICollection schemas = ce.GetCollection( CollectionType.Schema ); + + foreach ( IBtsSchema schema in schemas ) + { + if ( schema.AssemblyQualifiedName == sAssemblyQualifiedName ) + { + strResult = schema.XmlContent; + break; + } + } + return strResult; + + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCAdapter.snk b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCAdapter.snk new file mode 100644 index 0000000000000000000000000000000000000000..0d564ea32858712121e1a4107e9400b9222978b6 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097ln4vQ4k&*q7xIBtACM>^uMjNyP06TNf zDH+G}B9=JY*p#EM9E0?3_%Po57I03rNK(JD11In*3z%gxEcNcc^74h!Kn5rDJNL=1 zbtGWj3vI;cA|lhHEdReXS{NEG?rA(|$tK(`)-GssxzFmqLt}vM(~?oFv<3+oO6^9#QW*Pa@HeX6wRhNdY$yq{w5ftPw(CN& zKAXY%q^8m^B;R`9d|lwb=Oh93Wqi$X^#H9MA@(hNj*=~9So3peD*%N+tOOlYx`2~_ zm^da99t?`XY8BSdN*J;1=SO1j-hYTMjc{@OpS7}{8NZWa=(9cbV>?Abk(%@ zsbbMvj=FE`YbF|;xvTV(62C2&1$A7 z;}@t^2T1c>ax;46MSn&1E3RmsB=%Jzw2lGcI5?&7@%TJctkTR_b3QKPNI`a%ff`7p>CDg} z=mQCvwCBF}+G}6V`SW|rw(R+X`5xON@N8LPdp5GM4ed4kmhIZM?O5Fg*0T#+FrQk( zep;WN#v_~A)aF)WW^TEZyw|a%P5648ybMyicFwsu^80A&(Nq5%Nn`Y=-wSI?`U_?! zVWx;6LHkV%HFh1?DgT$8S<+6~HAG@kz%^klWwuH}0;*|d<0%+qqtHZoedeZ&d&rd3 z1(=5comxp1hE_J8+K*u6(4MXKYERCLb1(%_5vwegj&X*>^+djAXqKKRWdc zYwy?iNr>VZ`Yt&$vNJpGE(L8^*M`B-tY0&R3WQ6+TKp zA0uCOEjgnYQy#cqBQG%yr@`BbHD%ct^oop_A#)^L@QKk0KgF&%RQyy~RAw+n&h1Rf zBFUCUp;Yt_s1ahs5j|&JShYG}z8`Ykk(4=;x3tSW?DA&WC|!9g33bA&%m{tsVC!k7 zQIWr3)?-MlNVl)5zC<6nFV2`rL8U!s?5$!X=Y7uZNyeqBS!5@+^4&i5rGuoMP!}8Y z>ei$}s_rzYn=NajrOwU+`pvN3rdlTUft8khWPX>iPHeDGvLtbX_7gp6XxTBX#&yoL z`EN4*!b}SduJOwXT|%Tw_im^$pE%zLQW~60=zk8H8|dg{dWBJ1k61aR6&lqiN!elM zn6dirnA^^t%?_wK{0mb&j^w06jK-G0jKH-X*T zR%=+cB*qo}ssc4^RAu!1QO(RV!zGEAqO|qQkc@IZlxs%~ev9|9GG?0-%IoqF7~Th&0%B&Gi6M&|0-~r5IOq9x>p^cRBbQ5Orq4X zl=W9o5?(j;tS0LQ%b8!_Efi6I8BLts#EK!c%WodVd6Dz#7fg=3C_hT9n!6wtPC^~; zgGVvvsN+bHHqQk?G^k0&h+BR-#$X+JnN;V ydZ)b5>(%q=CkXt7SsYhcsgsf|iOR^E`*WLP-o&;l?l-Ysm7-X~iu*icuI(>cLqNs= literal 0 HcmV?d00001 diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCAdapterProperties.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCAdapterProperties.cs new file mode 100644 index 0000000000000000000000000000000000000000..6873bd682cb0bd7ca1c3230339855f4346d41b5f GIT binary patch literal 11128 zcmeI2U2hXd6o%)zQvbusS0EJ!RlTBWrF>DMk~oc%0#}i79O7b<$Toz4`0H)oXO2&1 zciCNUAV4Zrk+ZwAGw0(yA9K#w|NOlYR>Hko^Y?xDPV%gTEIbV3FbSjZK=-|{5!S+b zSPe&E5YEF~Qbcm41>ywcx5vo9mn{cxgHGtnQ4(?ECJ zpXlyXeBjOVTqC2>_*Bp572LDM+O%pEX`M^XvF_%=IZ0GUVJ_-ZNz44PBpyktENq2i z{l65Y*SZcQ;gPOqn#t^u=ADH%QBvf;)Mz#Rx#s!0m=t28Pin53#h5{O{RK3Q)^J3%k(3HMda z+|vC{e7_f%x2re3@TbN%^vsHm=0OXJ9bKR34i3F=pexU-TC=DBJ9>Vmk)Ajh$7fg4 zW%6`*Z^Yd4MC&&rl})Y8bpJGR-V~4if-f?{bz5&9>xwkwC8(@x)x(x`C8tNN3+}X73(v3G&|yTKSyZm3Odn5=$?1hh*d=aw566J>7mO8q0i&6&CTj zrWItB;+w?rG*YyEeXz*7Z8R#c`*gOJ8#3OygteU!(!9@1sRC z*_pp{(Rm&-=}=GkD$gkvDO6RIS*#V=v&e|-a8YV)gIUJL< z@QcLL_EvVD`NDIZn_ru`PNF8n@?nei_)yg_sPT9 zmOYnffP=?F7Ih^yUdg}F)AxV!+aJo(F3%{u)qAQ3^BAiR@f7ekjqsSXz9?_ruU*Dw z>#T|POj0DRABoRIo^EntGqkIp@r$IvPrESTF5k(HiFP$meD%|AZ7( zFO*NTg4iWiENZLstD(W3KzHgHi)xt;;Xy;h5*x`9wmX&O>kKk#vUt&ge%8{=#rN1U zF2y~U`eGil1%3tUcu+ngS^jH>40tq4^)Xh~)!?h>mCjJ`7*MjDj+9{SXjv?<=g=*3 z;*qZ~>iw%Kd!}qcjd!NHhW(4^qF00Os-&PFrF&2QUA<@H#l^~}SQ)gXo~fG3V!erO z+_PiMrR_A@=en|H;e%*=i1w+nQBh|1o}#zxig(H+=7;P8TiPkCPTh_c@k*JfnZ>%F z(+JKIpD*UID*q1szKm=|^g(YdURCns-(5$Z=3SB~uHKEStWaIO`rc3XF|Uj;pV7SD zXB9nZSxr#w=T6J4=1+cYYs;c_mhI)Y2eD<6eo4$etyW3=9&kyay-MiThRdm}iA6*}NtCxxrdEHX{UZ#q+ zM{4^_-&MU^nzU@YkJz_w)401+(dT2f+zFW1eygbU3aG12 zvTY|-jd*kS?eYC>dd#MbgGAP6aPD}$I@bJ>j+v}N|H^qsIm6WFm%Qy)uF1R8c-rB3 zC(RC*=CGBOvq z?g-}-J<(BjYR(CKRr#8?RvQh>VxLlhb#qcS?^ytX_)j|?3$=co8R zzrUcvr=vZ()kxJ#{q>PM(4I%E{rAwTmi+4?NF7QYJy7S*ckXW4+Z?CJSSR<_Lyt;l#yKgWxT4sc6KBV zBniLiV@EiM-u6(LZmRD;E@PL#elfi2$*4^H`yQv@*Lq&XbH%1Q{Zpi=sw3Vv)(=(> z_oXw@buOLwC071dTI`qUcaHWAq@4xZZyR0b@|Dhtvs%s<>3fr38MajX)GYJ(`vE-m zt-Al?SaWr*zJGt9>UbsocBT$%=ZpVX#RkV;^|`OlP1IJ%m`=s*+d$KyPBVVr`8?|8 f>+lvkX>I4-WweY_o_8}H^FYVOuf + + + Local + 9.0.30729 + 2.0 + {6ED3D08A-2369-441B-BE6F-AF06A94B4674} + Debug + AnyCPU + + + + + ODBCTransmitAdapter + ODBCAdapter.snk + JScript + Grid + IE50 + false + Library + Microsoft.BizTalk.Adapters.ODBC.RunTime.ODBCTransmitAdapter + OnBuildSuccess + + + + + + + true + 3.5 + + + + + + + + + false + v4.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + AllRules.ruleset + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + AllRules.ruleset + + + + Microsoft.BizTalk.ExplorerOM + ..\..\..\..\Program Files\Microsoft BizTalk Server 2004\Developer Tools\Microsoft.BizTalk.ExplorerOM.dll + + + Microsoft.BizTalk.Interop.TransportProxy + ..\..\..\..\Program Files\Microsoft BizTalk Server 2004\Microsoft.BizTalk.Interop.TransportProxy.dll + + + Microsoft.BizTalk.Pipeline + ..\..\..\..\Program Files\Microsoft BizTalk Server 2004\Microsoft.BizTalk.Pipeline.dll + + + System + + + System.Data + + + System.XML + + + {6EF6BB4C-9417-4CAE-990D-49F1F368284B} + ODBCBaseAdapter + + + ODBCQueryProcessor + {516F27B0-23E4-4704-9A86-A5064769522A} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + + + CALL "%25VS100COMNTOOLS%25vsvars32.bat" +gacutil.exe /i "$(TargetPath)" + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCTransmitAdapterBatch.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCTransmitAdapterBatch.cs new file mode 100644 index 0000000000000000000000000000000000000000..a4c110e069b84516ed6aa3743ed347dbe5266686 GIT binary patch literal 30134 zcmeI5eQz8`a>nQ11ju(-)4)NxL@Qt70EsOdpx!JZ5^0n4`3&P=NE9XU#J6y%vvh*L zdXnci&lbCT-gai?_$0s}w6iu=Vo=Yy7Aup{ZsXiqUUBctL|4v z)p2!LeWvd_)!piLb*I{|E~>}XX|1;g8sQ$KhoVV>oMP`-&eX9x?bq)Y4u#^q4QE#(s+9{MNhAI zw5#9$tvhLZnT_>K=T6mE(9LLDHU0E^s(;XVeAV-X&M5({Z#yf z7v_WMKGXc%3w%mapiPtK^Q-I8E{^Y`cJ5!z;F)HEo(8YZ#fuAZp{W;-)b2o6&csnP zh8DMV?r+j+IQde)k>y48*ZOl-{cH7!{yweG->v?u#h;m0#F_N+jqW*;cD$(jyrxmE z>z=OhXn&zQ_)Hp%CTxlVWS@FM?&!ecil(PpS0R%)&P094l6j%A2f72TP12{YBWVcQ za$4&ID}&W@Tx$)h4jr25_)7GZYb`XsYeppp6IFejWJXAf5up;jeJXncM@-QTU58e# zKGpdHQPf`b@Qg8NWsP@#N&gcqSR1dCBYiur=lX0pBI^TdVjY4jjP0wwFRTodKUd2O zQAL~QYTLz;#P@|-huvEA$nJq`z@B=#Q`?Vw`nFkZ%i3Zawq=8Ns$Gq;DJgI1`*wYO zx1!zGy0TOKQRnaKH+O8P9evT`hK}Fq+kW*xt-jTf-@CNIMn-+4D-U&q8t$c+J38~Ne)Ih+ox8oH zWm{uI6YU@A-~O_%eVs?A881n&?7KM=Mr7We%_IHV)wmCq^W4;!TlF}ev-x{dt)cpU zJ@$6p1AUm|@B|LSFF1ckR6neLC7Qn0xm~r{srisr=KEzWUrF0TTlciq@kxi$%Fk== z_FbK8)`!(=wO!Q?tz6aSPa5xdWh-nWHtI?n*wEEBL57oa51AVSvvt>;1Y4smV9F$WPbbMT|#OE5*xcn>0I>)usIn~6> zjwxciICjxe%4_P#*EHkc94O#*t-FqG_H^ZMni(Dr9>aU10px%+z!qFey4$)FYmxNX zUh%g0p7gK1&OtQ&R)9W|_9Q(aGDyAVx&+D^*0x!VSc&wW)NKzdI50HxadTZYk1=$0 zNw<3)gg(R^h(hffSW~v6A)TXIF4lE)^e4?14+QoD%XhV&tHp4CaBWo^cx{^(^v3b$ z+TwK0mx!F0{FdaH$Io9DHY)mw)?1QbiR4qvFP+IOo(MJ66clx|gOtd9k1TV~& z9I<~}w64#@L1K0IgN7QD`xyS&5ok~u$DlSwrYF$&v3dc6fCpaHRJb?Ct*k4?AjXNY ziE)3@dE(_VQYMbzn&;#=BhiSycx?~!{^ls|mzL*j8BJm(9E<-|RPY^qiM{CKD7tjL zQ@+F6&zgJFd0%jR`2J{>qs6)WLKkWZyuuvj(g|jXzC6?s8C+8wQsRP?OTvof2;npN z#i@3hdscDrx@hQIaWU68ZfXWt-Z%9O>_Kh811~Kk75pQ*hbGPyyvAkVx2`Z>$)(6_u;xK3 zhvMR*j;P^njAKrAt;yhG93z@%7U8!K^qt;5sSymnZs}iBn%H!*CZHsc&O!Ch`s-VH zFYG7J7=6Ui zw8M2v0k4P8xRf7UND_FE@3bD_Ot)>0o|?yLni6+=Zd)}+!=sYra~y)LZE7@L4ph}A z0VuaLFP8|GxW;HP@eYp-YK_%7MII&XwsCz@Up1G=!zIc>s^r)CH`m`f)FnyhQr%OJ z=y}orG#2{+r<+^}n?<&Fnl=QFtQG6fA3elsb)5usXlde+A`UC-Bh6W~HK;8!_w?>` zmXxfL{-VZrSPm@D6UoNbJ!u187fa;0C2CLW>O}Cg>0#%JkAtt5ikHi^QQGgMIZb4M zCN+6)4dP1pJT%FEFQ}P%Y*T+%6o(YTtprA)R$}-1NGFVF@Sth_hT>h%5n~?_f=$`hd$B)?2HhRf@XVSD1388}}!m*d`$0xZbdskn! zBRg`qL?~@vhHY8bQ}t`l-_N@IW+y@_&Eq<2r`gB*ZYTP)WzCro*A8by;*M$d!}>@3 z$c`4T^S1xNB7mjIV}Ux~=+pV)Xp8S5I>Kii)cX*?-Ol4j1}`dNV4G=HqAkbUqJ=E| zsj@nZIhPf)wAPDa{fNvX})H1JE zlAiaPaBs?}mHD)(8Qg1<4Hba5%9#AD(a{6*hHo2Jxw&>mqMgZOp8%OOX0)NZ1Jh2y zEnZz^?Ay#Gf`!^>D>F_qUKQWf+$`f`^gDL0QQ61Z<`o%htMRStAt`@ki8eCFKute$SJomfq$YNReIL;`o_ME zZ9CV#u~V(gl#^)J?ePTRKWBA4Vx#(DMWyS{h0h+gv%~g`3OIXlz@)>td7RBk(p**V zpR4Z1UM?&EJPq8?rzhR>@Yybzm$lhciS0+SP_dQa;K-G*^BN0AMXo#dJItH)Dr2Sw zYC%3_E)P1Ohn-ik+r!mB5c#k^BqS42KwuYJ#8e4LIqxq1Hs#cPH+Tnx^hO#D#h0R) zy+W5-L*QY@Cg|T?T_;D!Jm`yTul0hu-LZOs4?~*LuM7Bq>3b@^tw(evj6DU=W$zgg zAiwNE*pUb}eJV7{Y?}TR@3vq2=;oD(4Lsw(wdMe0vp!v!>ykpujQ!kCH1;$7;Zc*v z{i)_N2$^~ZvtTaJyHI=tU3pH`m;sxZKYehnKGN=mlnI95Xcbg5Pl47zaCP~9n?Ap&4@_Vk}mzSqJ}z5SD(M{x8nVh=&S2akwi}UbdS9bE=ZaL=UE*_8b~a0bl97( zrqo`1xEGJ#_WW(#=~^M7Kc(IcOTXQ7^wK<{>AwUrO}Ho4>KM&tbgDMFb_~yKeBEUj zH8%OsC+YiIdpt!EHu^-m6Z_TzuOQiG{>CV*v`S@PLs+XxUHlGBveuanC@S~UmZPpS zP9HY{W#WB}JIB!w_pL)qjKt2#z(eTwke&>$$KYlhORoBPi>FtJ8k*UA>G?XF8#JM} zp~I_VtQaqjF)m2RQApak7uUwvm*_8!zBjjbLE|{SbjO0xdmPuPjI}8nYl(+x`t|dM zTeTf9R%H(Cvql@R31CqWrx71G)Onjgg+{03UqQHjs)Pvaxz_R6niLXswA5vNu)*(= zJ?`fAkat3|f&XH6jy14b=lXHT$2Cu=Ex5ME>R{xq(fcvWYA>{Z#lh7$63MdWjZB>r z-W7d0F3f${6koj#w)s$Yl&_M)m>uPb@9SHSrmRZ&j7LkZE(Nmrrp7Mdr+d;-=UQ0z z#_{d*PhFJo;EUi`Wea z&3Q|zb5zoKDvMp-)5a)~Nj{<}?;oja^~X%Gg}(%b9glhf&jk9xZ#Q=-wsUjl)zD00 zM&zB0AXAQpJPv;4M3%^TlZe}~Lh+QR^Bw6fvQQyaJQ977YvLIca#rNPs7&FLe3$FE zC$)8pXEDgEkYDpPfBL!ev9k%EM?UL9+`?O=%tNA|xy1eso-B(TU78UUxBN{8V<;$h zPI$#Id!EbQ5kJ$e3iREPcUzuRqw&_hk0)ZuNO_O*MzMZuUugaOYAqQ#ZitIy3(vJf z04eA4A%lf4;#oWLv3|D(&)%^w=B6-c{*H~C%eQL$Tir`~9{q;;=Kj)7j53wrtKhRs~kev_)knW}3Xh@2cO4Vj{<8Th37z$IdkGn_jyi z=8S)1IPrGWOk?IB*Lse;M<98mgJL$E)$KJXzG(_)H+FF8n%oTc&*HL&w z1iBM+x)wuZb*4%MZ{tbY$%-TMjx|Rj$$qk1kgL=iuuphOvai$V{r#l&xn+bJG=5VN zrr*dEzS{de{KOL8JDy5Gm%_(3C#FGcGo(%LE9oTjxw zueAUlopQgXy*vl^!Vk3Xxh5?E-4WeA9x0K&+gcPzEQ+I(?^AGixz+jC$a1e%}P zPLpiVQ;v_-W-LGJ4G!xcKj-KVlJC?fCA%pATTw|3O=lgZnrI&{N?QI<(-LppxTbYZ z{e(5{>`baNc8%t0GMF`uI|f5zQ=HKO?cl-rw02>!(f)rZ{-&&l;FhgoSUvkxTflA$ zhV{df=9KwN_~Q#{QMXlGpT4NvdJoL3e&YwIiAok0F4^R^#({)VeH85Dy0!Cepb9u0 zds3&+_;benDfj(eXq)y^?wOL&3fVS~#^QdXhSwoTVoIKX=b9a-cI6RlF{aH5?k98* zw6M!3@Bs3|hbC_|m3MyQ)xP>6R%30m7QF}KwZ=JCT*}+Wax30{PoS@<7CMbYROmNR z?CY2!LS{+t(eo5edL4fwE6)4YzE>~zWc9sg`JR4x$35>yZ9e~ zRK9vlM@A(wO4%zi)OlWO%A8U!Wo|5&)0k}9yYcj)WYorfUQ77=^nNt_YKl&&5M!gL z|A%d~4~RFkCd7p<;-kPB@6I8=Md4I@&#BuhXoH8jJy?CuG(6zUIF`2iO(Z#|nonE& z|G%XKogLaa!Lt{i2?OJ?leAXLoVN{rSv<2bjmNyf1E7Q3_Hzbj*|+&fAtGnkKLYvB+vIOBtw=mmt&N@j;&tots_nLg8e&6Ku-EDl(R zF|i}g$AXr;Pld|jN0Tf|L~2bd;dM=|Ip@q?9T`UzF>)Hs3X?1EyyKAAl($Oa zm*S6iFZvx{z5~e{(MDE-zCg(6CAJRDjH+tdM}+nw$(NJ3+s9R~Ra#N}LXu!^s4!;4 zClC`FZ*|u}rz6ScShk^&70eOCAGJc*Y2#hMc{^RH;Y#^#|g`u{eaJ zBXgHuC*Pg_j+$D~8Ct&T7^`^|t?((gGI^yg^79b^JX*>z-du`L?cOgCnUSsxc{$pB z=}LO)azoaYx>NIsMz2irr)YI#$+70xZ7M$A^&4wxA^lGEt1@rv6@gBAk1{=$xpS=k z4@;jOPj&Q3B|LTi&V)Wm*}8n#cFhb2FJ_5Il6M_q`O*^k$9BuLf@zmUHr0YugPWK5H5 zj*-F>wmqAzOdc;_z4^aiUWrP4FZX)4Mi(W{N{^9$NlAO(V$<)YO0R2YU|EmG|0S?L zO6R6ym1$4LHzORXY|VGsuYN1*Fa|1jY@~c`6BVud##U_e>Rd=0yMe;e+b`Og4>CVZ zjM$ak!1jk98mmWJbOw3oQy?}=c#Df)GgOpLt_qDi`9ggwPZly()g zKK5ywpmgA7DHrS?t_S2U0Dn5njN$!YHevkW17cO Q0$o&e-(Ok_|N6Q5KSi%Ok^lez literal 0 HcmV?d00001 diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCTransmitter.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCTransmitter.cs new file mode 100644 index 0000000000000000000000000000000000000000..e6d1d35505eb0f503d570dbeade688f085021b91 GIT binary patch literal 5190 zcmd6rTW=dh6vyWoiSMwuFNs8)QVhKy9$Y7_qt;GjyFedZCr&JU>v~f#Rlhp$`=8m# zUb4Oj@er+?ot-)JKld|d^3UJL?${kYnCENv74jUr$h~qCH+5I;1>fCeZjE}30`RA>GSE)j@Vyv1FzcxrtK)oVRBB+*E(Os2qLn%dOMy=LEt z9g?}Wz!**BiC~>2c8k$4Lg#U+t5!SEjaXUWTdjzq?Dal4 znb)7V$2<+_`o!*=d-jQl<^>*HvuA?eZVdAPE{7ZVi9R-;%ex7?7WhNHZ=!>|ogsyo z&LZ&=%HWgmj)>XdOX+nBg0i6Kb79Hz$~8r@&j<0IBE8~76pGCi2umJWbY|4DlaH+3 z7R;pDWJ$%bu*FeQ`ph~uyU1g6s@T+I)#@cPBg=ouoj{$pnRtjw(X0&Ac#(d^cb1B* zcK9kY0by#oj#G}Zg>ZcgDaU0ezp9!O`1y=hw#P^%nrmpQERyBg3hG&E%hd+owaNNE zNG+?6r;M7eOSGvPbg7@`t_PPUUOr>owe_A8-32S>?ic1y_|}dZbixv1jrXsN2Cfa& zJKp+kvZu%2F5mB&IfsMi_&#T^H|&!P-`buw=t4PVXT;y%jPofx`YB(@D6Sn=-tv|- z+AEY6Gw=A;_%(AcQ(3z3mQ14W@EfF91LhUe;+I8J5xcC3I7)A?O^2@@eA}s>O?aLe zAFs2w?=jSp`jzqS8iFvq#bpy&SoV_TTS)!ZzA~9EnCn4vZg$8r^I=uXTcSNgYoA=# z$*0Wz$*j9+wT_o(WQwPf&UwoFQC}}r(mEE?xvJAm=ah1{jvajkQVm{KNU#rX2Q;1c zLpvv{G53+TU&_tmNl?evmryLtS~2{jp|4rRmCQnOLzHwnfqV_#N24O1IE7BBPJG>B zvjHAdEzVZTJya1x`hPb6MntimB{(0fu8#OprBogCr$D}k3Y^RMzIsO1eKpy?Myion zB1d6B7J!SkHts8cx z9q!ayU06cIzpy*V3cl(Nbe1c(X2@0S0(J9Ht>Vc1vpZPBx; zA3j?YS^oE#_ZRbbmCuXux=3#$>JWV|{|N~+)=4{Oq+UgNt((jhk(S*uE}+ycV{=qj z=VpjHby&*MA>0C1~7Zs!>%G z(pjgT?B=^R^~e)utMhxiC3efR1pU60d0T~eDaOYp*)wUYEg38-|0LvHjFzhS_ob-b zzs(cEkX==6!<|95>zL<$6t;;E-7a*p#3f&>?X + /// Summary description for Adapter. + /// + public abstract class Adapter : + IBTTransport, + IBTTransportControl, + IPersistPropertyBag + { + // core member data + private string propertyNamespace; + private IBTTransportProxy transportProxy; + private IPropertyBag handlerPropertyBag; + private bool initialized; + + // member data for implementing IBTTransport + private string name; + private string version; + private string description; + private string transportType; + private Guid clsid; + + protected Adapter ( + string name, + string version, + string description, + string transportType, + Guid clsid, + string propertyNamespace) + { + this.transportProxy = null; + this.handlerPropertyBag = null; + this.initialized = false; + + this.name = name; + this.version = version; + this.description = description; + this.transportType = transportType; + this.clsid = clsid; + + this.propertyNamespace = propertyNamespace; + } + + protected string PropertyNamespace { get { return propertyNamespace; } } + protected IBTTransportProxy TransportProxy { get { return transportProxy; } } + protected IPropertyBag HandlerPropertyBag { get { return handlerPropertyBag; } } + protected bool Initialized { get { return initialized; } } + + // IBTTransport + public string Name { get { return name; } } + public string Version { get { return version; } } + public string Description { get { return description; } } + public string TransportType { get { return transportType; } } + public Guid ClassID { get { return clsid; } } + + // IBTransportControl + public virtual void Initialize (IBTTransportProxy transportProxy) + { + // this is a Singleton and this should only ever be called once + if (this.initialized) + { + Trace.WriteLine("Adapter already initialized!","Base Adapter: Error" ); + throw new AdapterException(AdapterException.Error_AlreadyInitialized); + } + + this.transportProxy = transportProxy; + this.initialized = true; + } + public virtual void Terminate () + { + // NOTE: The adapter should not return from Terminate + // until it has completed all outstanding work items. + // The messaging engine will kill the adapter once it + // returns from Terminate + if (!this.initialized) + { + Trace.WriteLine("Adapter not initialized!","Base Adapter: Error" ); + throw new AdapterException(AdapterException.Error_NotInitialized); + } + + this.transportProxy = null; + } + + protected virtual void HandlerPropertyBagLoaded () + { + // let any derived classes know the property bag has now been loaded + } + + // IPersistPropertyBag + public void GetClassID (out Guid classid) { classid = this.clsid; } + public void InitNew () { } + public void Load (IPropertyBag pb, int pErrorLog) + { + this.handlerPropertyBag = pb; + HandlerPropertyBagLoaded(); + } + public void Save (IPropertyBag pb, bool fClearDirty, bool fSaveAllProperties) { } + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AdapterException.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AdapterException.cs new file mode 100644 index 00000000..e0c70537 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AdapterException.cs @@ -0,0 +1,57 @@ +//--------------------------------------------------------------------- +// File: AdapterException.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: Adapter exception class +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Runtime.Serialization; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + public class AdapterException : ApplicationException + { + // Error messages... + public static string Error_AlreadyInitialized = "The Adapter was initialize more than once."; + public static string Error_NotInitialized = "Termiante was called on the uninitialized adapter."; + public static string Error_EndPointCreation = "Unable to create endpoint location URI:{0}"; + public static string Error_NoAdapterConfig = "No adapter configuration XML was found on the configuration when one was expected."; + public static string Error_NoSuchProperty = "The required property:{0} was not found on adapter configuration XML."; + public static string Error_UnInitialized = "The Adapter has not been initialized."; + public static string Error_EndPointAlreadyExists = "The endpoint:{0} already exists."; + public static string Error_EndPointCreateFailed = "Unable to create the endpoint for location URI:{0}."; + public static string Error_EndPointNotExists = "The endpoint {0} does not exist."; + public static string Error_ErrorThresholdExceeded = "The error threshold has been exceeded, the receive location:{0} will be shutdown"; + + public AdapterException () { } + + public AdapterException (string msg) : base(msg) { } + + public AdapterException (Exception inner) : base(String.Empty, inner) { } + + public AdapterException (string msg, Exception e) : base(msg, e) { } + + protected AdapterException (SerializationInfo info, StreamingContext context) : base(info, context) { } + } +} + diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AdapterTransaction.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AdapterTransaction.cs new file mode 100644 index 00000000..3e3e6c2a --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AdapterTransaction.cs @@ -0,0 +1,132 @@ +//--------------------------------------------------------------------- +// File: IAdapterTransaction.cs +// +// Summary: Utilities for MSMQC adapter. +// +//--------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- +using System; +using System.Diagnostics; +using System.EnterpriseServices; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + public interface IAdapterTransaction : IDisposable + { + void Commit(); + void Abort(); + bool IsDTCTransaction { get; } + ITransaction Transaction { get; } + Microsoft.BizTalk.TransportProxy.Interop.IBTDTCCommitConfirm DTCCommitConfirm { get; set; } + } + + public class BYOTTransaction : IAdapterTransaction + { + public enum TxState { Pending, Aborted, Committed }; + private TxState currentState = TxState.Pending; + + private ITransaction tx = null; + private Microsoft.BizTalk.TransportProxy.Interop.IBTDTCCommitConfirm commitConfirm = null; + private static ITransactionDispenser txnDispenser = new ITransactionDispenser(); + private static IWrapByot byot = new IWrapByot(); + + public BYOTTransaction() + { + // NOTE: The transaction isolation level is set to Serializable due to a W2K issue. + // For W2K3 ReadCommitted is suffiecient and will give better performance. + this.tx = (ITransaction)txnDispenser.GetTransaction(null, 0, (int)System.Data.IsolationLevel.Serializable); + } + + public BYOTTransaction( ITransaction transaction ) + { + this.tx = transaction; + } + + public TxState TransactionState + { + get { return currentState; } + } + + public object CreateInstance( System.Guid guid ) + { + // Create instance will create a new serviced component with this transaction + return byot.CreateInstance( this.tx, guid ); + } + + #region IAdapterTransaction Members + + public void Commit() + { + if ( TxState.Pending == this.currentState ) + { + try + { + this.tx.Commit( 0, 1, 0 ); + this.currentState = TxState.Committed; + this.commitConfirm.DTCCommitConfirm( this.tx, true ); + } + catch( Exception e ) + { + EventLog.WriteEntry( "MSMQC", "Commit failed. Exception:\n " + e.Message, EventLogEntryType.Error ); + this.currentState = TxState.Aborted; + this.commitConfirm.DTCCommitConfirm( this.tx, false ); + } + } + } + + public void Abort() + { + if ( TxState.Pending == this.currentState ) + { + try + { + BOID boid = new BOID(); + boid.rgb = null; + this.tx.Abort( ref boid, 0, 0 ); + } + finally + { + lock( this ) + { + if ( null != this.commitConfirm ) + { + this.commitConfirm.DTCCommitConfirm( this.tx, false ); + } + } + } + + this.currentState = TxState.Aborted; + } + } + + public bool IsDTCTransaction + { + get { return true; } + } + + public ITransaction Transaction + { + get { return this.tx; } + } + + public Microsoft.BizTalk.TransportProxy.Interop.IBTDTCCommitConfirm DTCCommitConfirm + { + get { return this.commitConfirm; } + set { this.commitConfirm = value; } + } + + #endregion + + public void Dispose() + { + this.tx = null; + } + + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AsyncBatchedTransmitter.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AsyncBatchedTransmitter.cs new file mode 100644 index 00000000..8f73f3e5 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AsyncBatchedTransmitter.cs @@ -0,0 +1,125 @@ +//--------------------------------------------------------------------- +// File: AsyncBatchedTransmitter.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: Base implementation for a batched aware send adapter, the +// messages are sent a-sync, meaning that they will be sent on the +// adapters thread and not on the engines thread. This is the recomended +// approach for performance reasons +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Diagnostics; +using Microsoft.BizTalk.Component.Interop; +using Microsoft.BizTalk.TransportProxy.Interop; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + /// + /// Summary description for Transmitter. + /// + public class AsyncBatchedTransmitter : + Adapter, + IBTBatchTransmitter + { + private Type batchType; + protected IThreadPool threadPool; + + private ControlledTermination control; + + protected AsyncBatchedTransmitter ( + string name, + string version, + string description, + string transportType, + Guid clsid, + string propertyNamespace, + Type batchType) + : base( + name, + version, + description, + transportType, + clsid, + propertyNamespace) + { + this.batchType = batchType; + this.control = new ControlledTermination(); + InitializeThreadPool(); + } + + protected virtual int MaxBatchSize + { + get { return 1; } + } + + public IThreadPool ThreadPool + { + get { return threadPool; } + } + + // IBTBatchTransmitter + public IBTTransmitterBatch GetBatch () + { + Trace.WriteLine("AsyncBatchedTransmitter.GetBatch() called","Base Adapter: Info" ); + + object[] args = new object[4]; + args[0] = this.MaxBatchSize; + args[1] = this.PropertyNamespace; + args[2] = this.TransportProxy; + args[3] = this; + + IBTTransmitterBatch batch = (IBTTransmitterBatch)Activator.CreateInstance(this.batchType, args); + + return batch; + } + + public override void Terminate () + { + Trace.WriteLine("AsyncBatchedTransmitter.Terminate() called","Base Adapter: Info" ); + + // Block until we are done... + this.control.Terminate(); + base.Terminate(); + + if ( null != threadPool ) + threadPool.Stop(); + + GC.Collect(); + GC.WaitForPendingFinalizers(); + } + + public bool Enter () + { + return this.control.Enter(); + } + + public void Leave () + { + this.control.Leave(); + } + + public virtual void InitializeThreadPool() + { + } + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AsyncTransmitter.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AsyncTransmitter.cs new file mode 100644 index 00000000..edc5bfe1 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AsyncTransmitter.cs @@ -0,0 +1,104 @@ +//--------------------------------------------------------------------- +// File: AsyncTransmitter.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: Base implementation for a non-batch aware send adapter, the +// messages are sent a-sync, meaning that they will be sent on the +// adapters thread and not on the engines thread. This is the recomended +// approach for performance reasons +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Diagnostics; +using Microsoft.BizTalk.Component.Interop; +using Microsoft.BizTalk.Message.Interop; +using Microsoft.BizTalk.TransportProxy.Interop; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + /// + /// Summary description for Transmitter. + /// + public abstract class AsyncTransmitter : Adapter, IBTTransmitter + { + protected IThreadPool threadPool; + private ControlledTermination control; + + protected AsyncTransmitter + ( string name, string version, string description, string transportType, + Guid clsid, string propertyNamespace ) + : base( name, version, description, transportType, clsid, propertyNamespace ) + { + this.control = new ControlledTermination(); + InitializeThreadPool(); + } + + public IThreadPool ThreadPool + { + get { return threadPool; } + } + + public abstract void EnQueueWorkItem(IBaseMessage msg); + public abstract void InitializeThreadPool(); + + // IBTTransmitter + public bool TransmitMessage(IBaseMessage msg) + { + Trace.WriteLine("AsyncTransmitter.TransmitMessage() called","Base Adapter: Info" ); + + EnQueueWorkItem(msg); + + // Note: returning false indicates to the messaging engine + // that the adapter is taking responsibility for deleting the + // message once sent as well as handling any failures while + // transmitting. This is refered to as sending the message + // asynchronously since we are not using the messaging engines + // thread. + return false; + } + + public override void Terminate () + { + Trace.WriteLine("AsyncTransmitter.Terminate() called","Base Adapter: Info" ); + + // Block until we are done... + this.control.Terminate(); + base.Terminate(); + + if ( null != threadPool ) + threadPool.Stop(); + + GC.Collect(); + GC.WaitForPendingFinalizers(); + } + + public bool Enter () + { + return this.control.Enter(); + } + + public void Leave () + { + this.control.Leave(); + } + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AsyncTransmitterBatch.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AsyncTransmitterBatch.cs new file mode 100644 index 00000000..5b74eeed --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/AsyncTransmitterBatch.cs @@ -0,0 +1,122 @@ +//--------------------------------------------------------------------- +// File: AsyncTransmitterBatch.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: Base implementation for a batch to be used by a batch +// aware send adapter +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Collections; +using System.Xml; +using System.Diagnostics; +using Microsoft.BizTalk.TransportProxy.Interop; +using Microsoft.BizTalk.Component.Interop; +using Microsoft.BizTalk.Message.Interop; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + /// + /// AsyncTransmitterBatch batch + /// + /// + public class AsyncTransmitterBatch : IThreadpoolWorkItem, IBTTransmitterBatch + { + private int maxBatchSize; + private string propertyNamespace; + protected IBTTransportProxy transportProxy; + protected AsyncBatchedTransmitter asyncTransmitter; + private ArrayList messages; + protected ConfigProperties.CreateProperties createProperties; + + public ArrayList Messages + { + get { return messages; } + } + + public AsyncTransmitterBatch (int maxBatchSize, string propertyNamespace, IBTTransportProxy transportProxy, AsyncBatchedTransmitter asyncTransmitter) + { + this.maxBatchSize = maxBatchSize; + this.propertyNamespace = propertyNamespace; + this.transportProxy = transportProxy; + this.asyncTransmitter = asyncTransmitter; + this.createProperties = createProperties; + this.messages = new ArrayList(); + } + + // IBTTransmitterBatch + public object BeginBatch (out int maxBatchSize) + { + Trace.WriteLine(string.Format("AsyncTransmitter.BeginBatch( maxBatchSize:{0} ) called", this.maxBatchSize),"Base Adapter: Info" ); + + maxBatchSize = this.maxBatchSize; + return null; + } + + // Just build a list of messages for this batch - return false means we are asynchronous + public bool TransmitMessage (IBaseMessage message) + { + Trace.WriteLine("AsyncTransmitter.TransmitMessage() called", "Base Adapter: Info" ); + + TransmitterMessage msg = new TransmitterMessage(message, propertyNamespace, createProperties); + this.messages.Add(msg); + return false; + } + + public void Clear () + { + Trace.WriteLine("AsyncTransmitter.Clear() called", "Base Adapter: Info" ); + + this.messages.Clear(); + } + + public void Done (IBTDTCCommitConfirm commitConfirm) + { + Trace.WriteLine("AsyncTransmitter.Done() called", "Base Adapter: Info" ); + + // this call blocks an EPM Terminate call while we still have work to complete + this.asyncTransmitter.Enter(); + + asyncTransmitter.ThreadPool.AddItem(this); + } + + public bool HandleFailedBatch() + { + // If this batch faield we need to resubmit for future transmission. Note, + // the StandardTransmitBatchHandler will do the right thing if there are not + // enough retries, no backup transports etc + StandardTransmitBatchHandler btsBatch = new StandardTransmitBatchHandler( transportProxy, null ); + + foreach( TransmitterMessage msg in Messages ) + { + btsBatch.Resubmit( msg.Message, null ); + } + + BatchResult br = btsBatch.Done( null ); + return br.BatchSucceeded; + } + + public virtual void ProcessWorkItem () + { + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BTSTicket.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BTSTicket.cs new file mode 100644 index 00000000..2dc7f925 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BTSTicket.cs @@ -0,0 +1,59 @@ +//--------------------------------------------------------------------- +// File: BTSTicket.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Runtime.InteropServices; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + // only include those flags that apply to these interfaces + // see ssoflags.idl + + internal enum BTSTicketFlags + { + SSO_FLAG_NONE = 0x00000000, + SSO_FLAG_REFRESH = 0x00000001, + }; + + [ComImport] + [TypeLibType(TypeLibTypeFlags.FCanCreate)] + [ClassInterface(ClassInterfaceType.None)] + [Guid("8DA848D0-E703-4043-9AF7-C569AC1F4507")] + internal class BTSTicket + { + } + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsDual)] + [Guid("54596C7F-D343-4F20-BF7A-0722C5DA1F7D")] + [CoClass(typeof(BTSTicket))] + internal interface IBTSTicket + { + string[] ValidateAndRedeemTicket( + [In, MarshalAs(UnmanagedType.IUnknown)] object message, + string applicationName, + int flags, + out string externalUserName); + }; +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BatchAsyncResult.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BatchAsyncResult.cs new file mode 100644 index 00000000..1a70b294 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BatchAsyncResult.cs @@ -0,0 +1,86 @@ +//--------------------------------------------------------------------- +// File: BatchAsyncResult.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: Implementation of IAsyncResult to be used in the batch +// handler classes +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Threading; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + /// + /// Summary description for BatchAsyncResult. + /// + public class BatchAsyncResult : IAsyncResult + { + private bool isCompleted = false; + private AutoResetEvent waitHandle = new AutoResetEvent(false); + private object state = null; + private BatchResult batchResult = null; + + public BatchAsyncResult(object state) + { + this.state = state; + } + + public BatchResult BatchStatus + { + get { return this.batchResult; } + set { this.batchResult = value; } + } + + #region IAsyncResult + + // IAsyncResult.IsCompleted + public bool IsCompleted + { + get { return this.isCompleted; } + } + + // IAsyncResult.AsyncWaitHandle + public WaitHandle AsyncWaitHandle + { + get + { + return this.waitHandle; + } + } + + // IAsyncResult.AsyncState + public Object AsyncState + { + get { return this.state; } + } + + // IAsyncResult.CompletedSynchronously + public bool CompletedSynchronously + { + get { return false; } + } + + #endregion // IAsyncResult + + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BatchResult.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BatchResult.cs new file mode 100644 index 00000000..b5bd092f --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BatchResult.cs @@ -0,0 +1,92 @@ +//--------------------------------------------------------------------- +// File: BatchResult.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: Implementation of IAsyncResult to be used in the batch +// handler classes +// +// Description: This class holds the outcome of a batch of work submitted +// to a bacth handler class +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Collections; +using System.Threading; +using System.Runtime.InteropServices; +using Microsoft.BizTalk.TransportProxy.Interop; +using Microsoft.BizTalk.Message.Interop; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + /// + /// Summary description for BatchResult. + /// + public class BatchResult + { + private ArrayList successArray = new ArrayList(); + private ArrayList failedArray = new ArrayList(); + private bool batchSucceeded = false; + private IBTDTCCommitConfirm dtcCommitConfirm = null; + private BYOTTransaction transaction = null; + + public BatchResult(bool batchSucceeded, IBTDTCCommitConfirm dtcCommitConfirm, BYOTTransaction transaction, ArrayList successArray, ArrayList failedArray) + { + this.successArray = successArray; + this.dtcCommitConfirm = dtcCommitConfirm; + this.transaction = transaction; + this.failedArray = failedArray; + this.batchSucceeded = batchSucceeded; + } + + public bool BatchSucceeded + { + get + { + if ( null == this.transaction ) + return this.batchSucceeded; + else + { + // If we were doing transactions, we were only successful if we committed the transaction... + if ( this.batchSucceeded && BYOTTransaction.TxState.Committed == this.transaction.TransactionState ) + return this.batchSucceeded; + else + return false; + } + } + } + + public IBTDTCCommitConfirm DTCCommitConfirm + { + get { return this.dtcCommitConfirm; } + } + + public ArrayList SuccessBatchMsgArray + { + get { return this.successArray; } + } + + public ArrayList FailedBatchMsgArray + { + get { return this.failedArray; } + } + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BatchState.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BatchState.cs new file mode 100644 index 00000000..8fd24f96 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/BatchState.cs @@ -0,0 +1,104 @@ +//--------------------------------------------------------------------- +// File: BatchState.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0 +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Collections; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + public class BatchState + { + private ArrayList submit; + private ArrayList delete; + private ArrayList resubmit; + private ArrayList moveToSuspendQ; + private ArrayList moveToNextTransport; + private ArrayList submitRequest; + private ArrayList cancelRequestForResponse; + + public ArrayList Submit + { + get + { + if (null == submit) + submit = new ArrayList(); + return submit; + } + } + public ArrayList Delete + { + get + { + if (null == delete) + delete = new ArrayList(); + return delete; + } + } + public ArrayList Resubmit + { + get + { + if (null == resubmit) + resubmit = new ArrayList(); + return resubmit; + } + } + public ArrayList MoveToSuspendQ + { + get + { + if (null == moveToSuspendQ) + moveToSuspendQ = new ArrayList(); + return moveToSuspendQ; + } + } + public ArrayList MoveToNextTransport + { + get + { + if (null == moveToNextTransport) + moveToNextTransport = new ArrayList(); + return moveToNextTransport; + } + } + public ArrayList SubmitRequest + { + get + { + if (null == submitRequest) + submitRequest = new ArrayList(); + return submitRequest; + } + } + public ArrayList CancelRequestForResponse + { + get + { + if (null == cancelRequestForResponse) + cancelRequestForResponse = new ArrayList(); + return cancelRequestForResponse; + } + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ConfigProperties.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ConfigProperties.cs new file mode 100644 index 00000000..8b7a39db --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ConfigProperties.cs @@ -0,0 +1,178 @@ +//--------------------------------------------------------------------- +// File: ConfigProperties.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: Base implementation for an adapters configuration properties +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Xml; +using System.Text; +using Microsoft.BizTalk.Component.Interop; +using Microsoft.BizTalk.Message.Interop; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + /// + /// Summary description for EndPoint. + /// + public class ConfigProperties + { + private string uri; + public delegate ConfigProperties CreateProperties(string uri); + + public ConfigProperties(IBaseMessage msg) + { + SystemMessageContext smc = new SystemMessageContext(msg.Context); + this.uri = smc.InboundTransportLocation; + } + + public ConfigProperties(string uri) + { + this.uri = uri; + } + + public virtual void LocationConfiguration (XmlDocument configDOM) + { + } + + public virtual void UpdateUriForDynamicSend() + { + } + + public string Uri + { + set { this.uri = value; } + get { return this.uri; } + } + + + // Various useful helper functions + public static XmlDocument ExtractConfigDomImpl (IPropertyBag pConfig, bool required) + { + object obj = null; + pConfig.Read("AdapterConfig", out obj, 0); + if (!required && null == obj) + return null; + if (null == obj) + throw new AdapterException(AdapterException.Error_NoAdapterConfig); + + XmlDocument configDom = new XmlDocument(); + + string adapterConfig = (string)obj; + configDom.LoadXml(adapterConfig); + + return configDom; + } + + public static XmlDocument ExtractConfigDom (IPropertyBag pConfig) + { + return ExtractConfigDomImpl(pConfig, true); + } + + public static XmlDocument IfExistsExtractConfigDom (IPropertyBag pConfig) + { + return ExtractConfigDomImpl(pConfig, false); + } + + public static string ExtractImpl (XmlDocument document, string path, bool required) + { + XmlNode node = document.SelectSingleNode(path); + if (!required && null == node) + return String.Empty; + if (null == node) + throw new AdapterException(string.Format(AdapterException.Error_NoSuchProperty,path)); + return node.InnerText; + } + + public static string Extract (XmlDocument document, string path) + { + return ExtractImpl(document, path, true); + } + + public static string IfExistsExtract (XmlDocument document, string path) + { + return ExtractImpl(document, path, false); + } + + public static int ExtractInt (XmlDocument document, string path) + { + string s = Extract(document, path); + return int.Parse(s); + } + + public static int IfExistsExtractInt (XmlDocument document, string path) + { + string s = IfExistsExtract(document, path); + if (0 == s.Length) + return 0; + return int.Parse(s); + } + + public static long ExtractLong (XmlDocument document, string path) + { + string s = Extract(document, path); + return long.Parse(s); + } + + public static long IfExistsExtractLong (XmlDocument document, string path) + { + string s = IfExistsExtract(document, path); + if (0 == s.Length) + return 0; + return long.Parse(s); + } + + public static bool ExtractBool (XmlDocument document, string path) + { + string s = Extract(document, path); + return bool.Parse(s); + } + + public static bool IfExistsExtractBool (XmlDocument document, string path) + { + string s = IfExistsExtract(document, path); + if (0 == s.Length) + return false; + return bool.Parse(s); + } + + public static string CreateFileName (IBaseMessage message, string uri) + { + string uriNew = ReplaceMessageID(message, uri); + + return uriNew; + } + + private static string ReplaceMessageID (IBaseMessage message, string uri) + { + Guid msgId = message.MessageID; + + string res = uri.Replace("%MessageID%", msgId.ToString()); + if ( res != null ) + return res; + else + return uri; + } + } +} + diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ControlledTermination.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ControlledTermination.cs new file mode 100644 index 00000000..b108e426 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ControlledTermination.cs @@ -0,0 +1,113 @@ +//--------------------------------------------------------------------- +// File: ControlledTermination.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: This class is used to keep count of work in flight, an +// adapter should not return from terminate if it has work outstanding +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Diagnostics; +using System.Threading; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + public class ControlledTermination + { + private AutoResetEvent e = new AutoResetEvent(true); + private int activityCount = 0; + private bool terminate = false; + + // to be called at the start of the activity + // returns false if terminate has been called + public bool Enter () + { + Trace.WriteLine("ControlledTermination.Enter() called", "Base Adapter: Info" ); + + try + { + lock (this) + { + if (true == this.terminate) + return false; + } + this.e.Reset(); + lock (this) + { + this.activityCount++; + } + return true; + } + finally + { + Trace.WriteLine("ControlledTermination.Enter() leaving", "Base Adapter: Info" ); + } + } + + // to be called at the end of the activity + public void Leave () + { + Trace.WriteLine("ControlledTermination.Leave() called", "Base Adapter: Info" ); + + lock (this) + { + this.activityCount--; + + if (this.activityCount == 0) + this.e.Set(); + } + + Trace.WriteLine("ControlledTermination.Leave() leaving", "Base Adapter: Info" ); + } + + // this method blocks waiting for any activity to complete + public void Terminate () + { + Trace.WriteLine("ControlledTermination.Terminate() called", "Base Adapter: Info" ); + + bool result; + + lock (this) + { + this.terminate = true; + result = (this.activityCount == 0); + } + if (!result) + { + this.e.WaitOne(); + } + + Trace.WriteLine("ControlledTermination.Terminate() leaving", "Base Adapter: Info" ); + } + + public bool TerminateCalled + { + get + { + lock (this) + { + return this.terminate; + } + } + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/IManageEndpoints.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/IManageEndpoints.cs new file mode 100644 index 00000000..547fb787 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/IManageEndpoints.cs @@ -0,0 +1,39 @@ +//--------------------------------------------------------------------- +// File: IManageEndpoints.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + + public interface IManageEndpoints + { + void Remove (string uri); + + bool Enter (); + void Leave (); + bool TerminateCalled { get; } + } + +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/IThreadpoolWorkItem.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/IThreadpoolWorkItem.cs new file mode 100644 index 00000000..b6b4f262 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/IThreadpoolWorkItem.cs @@ -0,0 +1,38 @@ +//--------------------------------------------------------------------- +// File: IThreadpoolWorkItem.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using Microsoft.BizTalk.Message.Interop; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + + public delegate void EnQueueAdapterWorkItem(IBaseMessage msg); + + public interface IThreadpoolWorkItem + { + void ProcessWorkItem (); + } + +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/NativeCalls.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/NativeCalls.cs new file mode 100644 index 00000000..18664f64 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/NativeCalls.cs @@ -0,0 +1,113 @@ +//--------------------------------------------------------------------- +// File: NativeCalls.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: Native call wrappers +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Collections; +using System.Threading; +using System.Text; +using System.Runtime.InteropServices; +using SD = System.Diagnostics; +using Microsoft.BizTalk.Message.Interop; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + // + // Wrapper for a couple of native calls. + // + public class NativeCalls + { + + [DllImport("kernel32.dll",EntryPoint="GetCurrentProcess")] + private static extern IntPtr GetCurrentProcess_Native(); + + public static IntPtr GetCurrentProcess() + { + return GetCurrentProcess_Native(); + } + + [DllImport("kernel32.dll",EntryPoint="GetProcessAffinityMask")] + private static extern bool GetProcessAffinityMask_Native + ( + IntPtr hProcess, + out uint procMask, + out uint systemMask + ); + + [DllImport("kernel32.dll")] + internal static extern UInt32 GetTempFileName + ( + string path, + string prefix, + UInt32 unique, + StringBuilder name + ); + + [DllImport("kernel32.dll")] + internal static extern IntPtr CreateFile + ( + string name, + UInt32 accessMode, + UInt32 shareMode, + IntPtr security, + UInt32 createMode, + UInt32 flags, + IntPtr template + ); + + public static bool GetProcessAffinityMask + ( + IntPtr hProcess, + out uint procMask, + out uint systemMask + ) + { + return GetProcessAffinityMask_Native + ( + hProcess, + out procMask, + out systemMask + ); + } + + public static int GetNumberOfProcessors() + { + uint procMask, systemMask; + + IntPtr hProc = GetCurrentProcess(); + if (!GetProcessAffinityMask( hProc, out procMask, out systemMask)) + throw new Exception("GetProcessAffinityMask"); + + int procs = 0; + while (procMask != 0) + { + if ((1 & procMask) != 0) + procs++; + procMask >>= 1; + } + return procs; + } + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ODBCAdapter.snk b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ODBCAdapter.snk new file mode 100644 index 0000000000000000000000000000000000000000..0d564ea32858712121e1a4107e9400b9222978b6 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097ln4vQ4k&*q7xIBtACM>^uMjNyP06TNf zDH+G}B9=JY*p#EM9E0?3_%Po57I03rNK(JD11In*3z%gxEcNcc^74h!Kn5rDJNL=1 zbtGWj3vI;cA|lhHEdReXS{NEG?rA(|$tK(`)-GssxzFmqLt}vM(~?oFv<3+oO6^9#QW*Pa@HeX6wRhNdY$yq{w5ftPw(CN& zKAXY%q^8m^B;R`9d|lwb=Oh93Wqi$X^#H9MA@(hNj*=~9So3peD*%N+tOOlYx`2~_ zm^da99t?`XY8BSdN*J;1=SO1j-hYTMjc{@OpS7}{8NZWa=(9cbV>?Abk(%@ zsbbMvj=FE`YbF|;xvTV(62C2&1$A7 z;}@t^2T1c>ax;46MSn&1E3RmsB=%Jzw2lGcI5?&7@%TJctkTR_b3QKPNI`a%ff` + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {6EF6BB4C-9417-4CAE-990D-49F1F368284B} + Library + Properties + ODBCBaseAdapter + ODBCBaseAdapter + v4.0 + 512 + + + + + + + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + + + ODBCAdapter.snk + + + + False + ..\..\..\..\..\..\Program Files (x86)\Microsoft BizTalk Server 2010\Microsoft.BizTalk.GlobalPropertySchemas.dll + + + False + ..\..\..\..\..\..\Program Files (x86)\Microsoft BizTalk Server 2010\Microsoft.BizTalk.Interop.TransportProxy.dll + + + False + ..\..\..\..\..\..\Program Files (x86)\Microsoft BizTalk Server 2010\Microsoft.BizTalk.Pipeline.dll + + + False + ..\..\..\..\..\..\Program Files (x86)\Microsoft BizTalk Server 2010\Microsoft.XLANGs.BaseTypes.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CALL "%25VS100COMNTOOLS%25vsvars32.bat" +gacutil.exe /i "$(TargetPath)" + + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/Properties/AssemblyInfo.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..69bb12d8 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BasaeAdapter")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("BasaeAdapter")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2011")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("83333f6f-0c68-4630-9675-1cf1ea6e84c4")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/Receiver.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/Receiver.cs new file mode 100644 index 00000000..0d51aaed --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/Receiver.cs @@ -0,0 +1,185 @@ +//--------------------------------------------------------------------- +// File: Receiver.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: Base implementation for a receive adapter +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Diagnostics; +using System.Collections; +using Microsoft.BizTalk.Component.Interop; +using Microsoft.BizTalk.TransportProxy.Interop; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + /// + /// Abstract base class for receiver adapters. Provides stock implementations of + /// core interfaces needed to comply with receiver adapter contract. + /// (1) This class is actually a Singleton. That is there will only ever be one + /// instance of it created however many locations of this type are actually defined. + /// (2) Individual locations are identified by a URI, the derived class must provide + /// the Type name and this class acts as a Factory using the .NET Activator + /// (3) It is legal to have messages from different locations submitted in a single + /// batch and this may be an important optimization. And this is fundamentally why + /// the Receiver is a singleton. + /// + public abstract class Receiver : Adapter, IBTTransportConfig, IManageEndpoints + { + // core member data + private Hashtable endpoints; + private Type endpointType; + + private ControlledTermination control; + + protected Receiver ( + string name, + string version, + string description, + string transportType, + Guid clsid, + string propertyNamespace, + Type endpointType) + : base( + name, + version, + description, + transportType, + clsid, + propertyNamespace) + { + this.endpointType = endpointType; + this.control = new ControlledTermination(); + } + + // IBTTransportConfig + public void AddReceiveEndpoint (string bstrURL, IPropertyBag pConfig, IPropertyBag pBizTalkConfig) + { + Trace.WriteLine(string.Format("Receiver.AddReceiveEndpoint( bstrURL:{0} ) called", bstrURL), "Base Adapter: Info" ); + + try + { + if (!this.Initialized) + throw new AdapterException(AdapterException.Error_UnInitialized); + + if (this.endpoints.Contains(bstrURL)) + throw new AdapterException(string.Format(AdapterException.Error_EndPointAlreadyExists,bstrURL)); + + ReceiverEndpoint endpoint = (ReceiverEndpoint)Activator.CreateInstance(this.endpointType); + + if (null == endpoint) + throw new AdapterException(string.Format(AdapterException.Error_EndPointCreateFailed, bstrURL)); + + endpoint.Initialize(bstrURL, pConfig, pBizTalkConfig, this.HandlerPropertyBag, this.TransportProxy, this.TransportType, this.PropertyNamespace, (IManageEndpoints)this); + + this.endpoints[bstrURL] = endpoint; + } + catch (AdapterException exception) + { + Trace.WriteLine(string.Format("Exception caught in ControlledTermination.AddReceiveEndpoint(): {0}", exception), "Base Adapter: Error" ); + + this.TransportProxy.SetErrorInfo(exception); + throw exception; + } + } + + public void UpdateEndpointConfig (string bstrURL, IPropertyBag pConfig, IPropertyBag pBizTalkConfig) + { + Trace.WriteLine(string.Format("Receiver.UpdateEndpointConfig( bstrURL:{0} ) called", bstrURL), "Base Adapter: Info" ); + + if (!this.Initialized) + throw new AdapterException(AdapterException.Error_UnInitialized); + + ReceiverEndpoint endpoint = (ReceiverEndpoint)this.endpoints[bstrURL]; + + if (null == endpoint) + throw new AdapterException(string.Format(AdapterException.Error_EndPointNotExists,bstrURL)); + + // delegate the update call to the endpoint instance itself + endpoint.Update(pConfig, pBizTalkConfig, this.HandlerPropertyBag); + } + + public void RemoveReceiveEndpoint (string bstrURL) + { + Trace.WriteLine(string.Format("Receiver.RemoveReceiveEndpoint( bstrURL:{0} ) called", bstrURL), "Base Adapter: Info" ); + + if (!this.Initialized) + throw new AdapterException(AdapterException.Error_UnInitialized); + + ReceiverEndpoint endpoint = (ReceiverEndpoint)this.endpoints[bstrURL]; + + if (null == endpoint) + return; + + this.Remove(bstrURL); + endpoint.Remove(); + } + + // IBTransportControl + public override void Initialize (IBTTransportProxy transportProxy) + { + Trace.WriteLine("Receiver.Initialize() called", "Base Adapter: Info" ); + + base.Initialize(transportProxy); + this.endpoints = new Hashtable(); + } + + public override void Terminate () + { + Trace.WriteLine("Receiver.Terminate() called", "Base Adapter: Info" ); + + // Block until we are done... + this.control.Terminate(); + + base.Terminate(); + foreach (ReceiverEndpoint endpoint in this.endpoints.Values) + endpoint.Remove(); + + this.endpoints.Clear(); + this.endpoints = null; + + GC.Collect(); + GC.WaitForPendingFinalizers(); + } + + // IManageEndpoints + public void Remove (string uri) + { + this.endpoints.Remove(uri); + } + + public bool Enter () + { + return this.control.Enter(); + } + + public void Leave () + { + this.control.Leave(); + } + + public bool TerminateCalled + { + get { return this.control.TerminateCalled; } + } + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ReceiverEndpoint.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ReceiverEndpoint.cs new file mode 100644 index 00000000..225df51f --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ReceiverEndpoint.cs @@ -0,0 +1,42 @@ +//--------------------------------------------------------------------- +// File: ReceiverEndpoint.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: Abstractio class for a receiver's endpoint +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using Microsoft.BizTalk.Component.Interop; +using Microsoft.BizTalk.TransportProxy.Interop; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + /// + /// Base class for end point configurations - a home for contains various helper functions. + /// + public abstract class ReceiverEndpoint + { + public abstract void Initialize (string uri, IPropertyBag config, IPropertyBag bizTalkConfig, IPropertyBag handlerPropertyBag, IBTTransportProxy transportProxy, string transportType, string propertyNamespace, IManageEndpoints manageEndpoints); + public abstract void Update (IPropertyBag config, IPropertyBag bizTalkConfig, IPropertyBag handlerPropertyBag); + public virtual void Remove () { } + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/SSOResult.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/SSOResult.cs new file mode 100644 index 00000000..b74e39b1 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/SSOResult.cs @@ -0,0 +1,68 @@ +//--------------------------------------------------------------------- +// File: SSOResult.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using Microsoft.BizTalk.Message.Interop; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + /// + /// SSOResult + /// + /// + public class SSOResult + { + private string userName; + private string[] result; + + public SSOResult (IBaseMessage message, string affiliateApplication) + { + // SSO Results + string userName = null; + string[] result = null; + + // Ask SSO to redeem the ticket + // Redeem the sso ticket in the context with the affiliate application name + IBTSTicket ticket = new IBTSTicket(); + // Validate and redeem the ticket + result = ticket.ValidateAndRedeemTicket( + message, + affiliateApplication, + 0, + out userName); + + this.userName = userName; + this.result = result; + } + + public string UserName + { + get { return userName; } + } + public string[] Result + { + get { return result; } + } + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/StandardReceiveBatchHandler.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/StandardReceiveBatchHandler.cs new file mode 100644 index 00000000..a60e6742 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/StandardReceiveBatchHandler.cs @@ -0,0 +1,316 @@ +//--------------------------------------------------------------------- +// File: StandardReceiveBatchHandler.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: Batch helper class to to be used by a receive adapter, +// handles batch errors in the standard mannor +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Collections; +using System.Threading; +using System.Diagnostics; +using System.Runtime.InteropServices; +using Microsoft.BizTalk.TransportProxy.Interop; +using Microsoft.BizTalk.Message.Interop; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + /// + /// This class handles the failure modes of a receivers batch, it performes the + /// recomended recovery policy for all the possible types of failures for a + /// receive batch. + /// In summary our policy is: + /// (1) on a submit failure we move the message to the suspend queue + /// (2) on suspend failure we there is nothing we can do, so we pass the + /// error back to the client + /// (3) register delegates to handle various events + /// Otherwise: + /// + public class StandardReceiveBatchHandler + { + protected StandardReceiveBatch batch = null; + protected IBTTransportProxy transportProxy = null; + protected ArrayList successfulMsgArray = new ArrayList(); + protected ArrayList failedMsgArray = new ArrayList(); + protected BYOTTransaction transaction = null; + protected bool suspendOnError = true; + protected bool blockOnDone = false; + protected AutoResetEvent doneEvent = new AutoResetEvent(false); + protected uint numberIterations = 3; + protected bool batchSucceeded = false; + protected BatchAsyncResult asyncResult = null; + protected AsyncCallback asyncCb = null; + protected IBTDTCCommitConfirm dtcCommitConfirm = null; + protected bool autoCommitTx = false; + + // Adapter client code may register the following types of delegates + // to take action on these events... + #region Client Delegates + + private AboutToSuspendMessageEvent aboutToSuspendMsgCallBack; + private MessageSubmittedSuccessfullyEvent messageSubmittedSuccessfullyEvent; + + public delegate void AboutToSuspendMessageEvent (IBaseMessage message, object userData, out IBaseMessage msgToSuspend); + public delegate void MessageSubmittedSuccessfullyEvent (IBaseMessage message, Int32 hrStatus, object userData); + public delegate void BatchCompleteEvent(ArrayList successfulMsgArray, ArrayList failedMsgArray); + + public MessageSubmittedSuccessfullyEvent MessageSubmittedSuccessfullyCallBack + { + set { this.messageSubmittedSuccessfullyEvent = value; } + } + + public AboutToSuspendMessageEvent AboutToSuspendMessageEventCallBack + { + set + { + this.aboutToSuspendMsgCallBack = value; + this.batch.AboutToSuspendMessageEventCallBack = this.aboutToSuspendMsgCallBack; + } + } + + #endregion // Client Delegates + + public StandardReceiveBatchHandler(IBTTransportProxy transportProxy, AboutToSuspendMessageEvent aboutToSuspendMessageCallback) + { + this.transportProxy = transportProxy; + this.batch = new StandardReceiveBatch(this.transportProxy, new StandardReceiveBatch.BatchCompleteEvent(BatchComplete), this.suspendOnError); + } + + public StandardReceiveBatchHandler(IBTTransportProxy transportProxy, AboutToSuspendMessageEvent aboutToSuspendMessageCallback, bool suspendOnError, uint numberIterations) + { + this.transportProxy = transportProxy; + this.suspendOnError = suspendOnError; + this.numberIterations = numberIterations; + this.batch = new StandardReceiveBatch(this.transportProxy, new StandardReceiveBatch.BatchCompleteEvent(BatchComplete), this.suspendOnError); + } + + public void SubmitMessage(IBaseMessage message, object userData) + { + Trace.WriteLine("StandardReceiveBatchHandler.SubmitMessage() called", "Base Adapter: Info" ); + + this.batch.Batch.SubmitMessage(message, userData); + } + + public void MoveToSuspendQ (IBaseMessage message, object userData) + { + Trace.WriteLine("StandardReceiveBatchHandler.MoveToSuspendQ() called", "Base Adapter: Info" ); + + this.batch.Batch.MoveToSuspendQ(message, userData); + } + + public BatchResult Done (BYOTTransaction transaction) + { + Trace.WriteLine("StandardReceiveBatchHandler.Done() called", "Base Adapter: Info" ); + + IAsyncResult ar = BeginDone( transaction, null, null); + return EndDone(ar); + } + + public IAsyncResult BeginDone(BYOTTransaction transaction, AsyncCallback cb, Object asyncState) + { + Trace.WriteLine("StandardReceiveBatchHandler.BeginDone() called", "Base Adapter: Info" ); + + this.asyncResult = new BatchAsyncResult(asyncState); + this.transaction = transaction; + this.asyncCb = cb; + this.dtcCommitConfirm = this.batch.Batch.Done( ((null != transaction) ? transaction.Transaction : null) ); + if ( null != this.transaction ) + this.transaction.DTCCommitConfirm = this.dtcCommitConfirm; + + return this.asyncResult; + } + + public BatchResult EndDone(IAsyncResult ar) + { + Trace.WriteLine("StandardReceiveBatchHandler.EndDone() called", "Base Adapter: Info" ); + + this.doneEvent.WaitOne(); + + return ((BatchAsyncResult)ar).BatchStatus; + } + + public void BatchComplete(bool batchSucceeded, StandardReceiveBatch filteredBatch, ArrayList successArray, ArrayList failedArray, object cookie) + { + Trace.WriteLine(string.Format("StandardReceiveBatchHandler.BatchComplete( batchSucceeded:{0} ) called", batchSucceeded), "Base Adapter: Info" ); + + try + { + this.numberIterations--; + this.batchSucceeded = batchSucceeded; + + // If the batch failed we need commit the filtered batch. + // Note: if we are using a DTC transaction we should not retry the batch + // since the transaction needs to be aborted inorder to undo any work done + // against the Message Box + if ( !batchSucceeded && (null != filteredBatch) && (this.numberIterations > 0) && (null == this.dtcCommitConfirm) ) + { + filteredBatch.Batch.Done(this.transaction); + return; + } + else + { + // Call back the client to notify it of the outcome so it can clean up the data + // received from the wire... + this.successfulMsgArray = successArray; + this.failedMsgArray = failedArray; + + if ( batchSucceeded && this.autoCommitTx && null != this.transaction ) + { + this.transaction.Commit(); + } + } + } + finally + { + this.asyncResult.BatchStatus = new BatchResult(this.batchSucceeded, this.dtcCommitConfirm, (((null != this.transaction) && (this.autoCommitTx)) ? this.transaction : null), this.successfulMsgArray, this.failedMsgArray); + + if ( null != this.asyncCb ) + this.asyncCb(this.asyncResult); + + this.doneEvent.Set(); + } + } + } + + public class StandardReceiveBatch + { + private Batch batch; + private bool batchSucceeded = true; + private bool suspendOnError = true; + private IBTTransportProxy transportProxy; + private BatchCompleteEvent batchComplete; + private ArrayList successArray = new ArrayList(); + private ArrayList failedArray = new ArrayList(); + private StandardReceiveBatch filteredBatch; + private StandardReceiveBatchHandler.AboutToSuspendMessageEvent aboutToSuspendMsgEvent; + + public delegate void BatchCompleteEvent(bool batchSucceeded, StandardReceiveBatch filteredBatch, ArrayList _successArray, ArrayList _failedArray, object cookie); + + public Batch Batch + { + set { this.batch = value; } + get { return this.batch; } + } + + public StandardReceiveBatchHandler.AboutToSuspendMessageEvent AboutToSuspendMessageEventCallBack + { + set { this.aboutToSuspendMsgEvent = value; } + } + + public StandardReceiveBatch(IBTTransportProxy transportProxy, BatchCompleteEvent batchComplete, bool suspendOnError) + { + this.transportProxy = transportProxy; + this.batch = new Batch(this.transportProxy, null, true); + this.batchComplete = batchComplete; + this.suspendOnError = suspendOnError; + SetCallbacks(); + } + + private void SetCallbacks() + { + this.batch.StartBatchCompleteCallBack = new Batch.StartBatchCompleteEvent(StartBatchComplete); + this.batch.SubmitSuccessCallBack = new Batch.SubmitSuccessEvent(SubmitSuccess); + this.batch.SubmitFailureCallBack = new Batch.SubmitFailureEvent(SubmitFailure); + this.batch.MoveToSuspendQFailureCallBack = new Batch.MoveToSuspendQFailureEvent(MoveToSuspendQFailure); + this.batch.MoveToSuspendQSuccessCallBack = new Batch.MoveToSuspendQSuccessEvent(MoveToSuspendQSuccess); + this.batch.EndBatchCompleteCallBack = new Batch.EndBatchCompleteEvent(EndBatchComplete); + } + + public void StartBatchComplete(Int32 hrStatus) + { + if ( hrStatus < 0 ) + { + this.batchSucceeded = false; + this.filteredBatch = new StandardReceiveBatch( this.transportProxy, this.batchComplete, this.suspendOnError); + } + } + + public void SubmitSuccess(IBaseMessage message, Int32 hrStatus, object userData) + { + this.successArray.Add(new BatchMessage(message, userData, BatchOperationType.Submit)); + + if ( !this.batchSucceeded ) + this.filteredBatch.Batch.SubmitMessage(message, userData); + } + + public void SubmitFailure(IBaseMessage message, Int32 hrStatus, object userData) + { + if ( this.suspendOnError ) + { + IBaseMessage msgToSuspend; + + if ( null != this.aboutToSuspendMsgEvent ) + this.aboutToSuspendMsgEvent(message, userData, out msgToSuspend); + else + msgToSuspend = message; + + this.filteredBatch.Batch.MoveToSuspendQ(msgToSuspend, userData); + this.failedArray.Add(new BatchMessage(msgToSuspend, userData, BatchOperationType.Submit)); + } + else + { + this.failedArray.Add(new BatchMessage(message, userData, BatchOperationType.Submit)); + } + } + + public void MoveToSuspendQSuccess(IBaseMessage message, Int32 hrStatus, object userData) + { + this.successArray.Add(new BatchMessage(message, userData, BatchOperationType.MoveToSuspendQ)); + + if ( !this.batchSucceeded ) + { + IBaseMessage msgToSuspend; + + if ( null != this.aboutToSuspendMsgEvent ) + this.aboutToSuspendMsgEvent(message, userData, out msgToSuspend); + else + msgToSuspend = message; + + this.filteredBatch.Batch.MoveToSuspendQ(msgToSuspend, userData); + } + } + + public void MoveToSuspendQFailure(IBaseMessage message, Int32 hrStatus, object userData) + { + IBaseMessage msgToSuspend; + + if ( null != this.aboutToSuspendMsgEvent ) + this.aboutToSuspendMsgEvent(message, userData, out msgToSuspend); + else + msgToSuspend = message; + + this.filteredBatch.Batch.MoveToSuspendQ(msgToSuspend, userData); + + this.failedArray.Add(new BatchMessage(message, userData, BatchOperationType.MoveToSuspendQ)); + } + + public void EndBatchComplete(object cookie) + { + if ( null != this.batchComplete ) + { + this.batchComplete( this.batchSucceeded, this.filteredBatch, this.successArray, this.failedArray, cookie ); + } + } + } +} + diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/StandardRequestResponseHandler.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/StandardRequestResponseHandler.cs new file mode 100644 index 00000000..41a9708b --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/StandardRequestResponseHandler.cs @@ -0,0 +1,149 @@ +//--------------------------------------------------------------------- +// File: StandardRequestResponseHandler.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: Batch helper class to to be used by a receive adapter +// performing two-way receives, handles batch errors in the standard mannor. +// This class does not handle multiple request-responses in the same +// batches, better performance would be possible if it did +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Collections; +using System.Threading; +using System.Diagnostics; +using System.Runtime.InteropServices; +using Microsoft.BizTalk.TransportProxy.Interop; +using Microsoft.BizTalk.Message.Interop; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + /// + /// This class handles request-response message exchanges. It + /// is designed to only handle a single request-response pair + /// + public class StandardRequestResponseHandler : IBTTransmitter + { + private IBaseMessage responseMsg = null; + private AutoResetEvent requestCompleted = new AutoResetEvent(false); + private AutoResetEvent responseReady = new AutoResetEvent(false); + private bool requestSubmitted = false; + private bool requestSuccessful = false; + private IBTTransportProxy transportProxy = null; + private bool isDirty = false; + + public StandardRequestResponseHandler(IBTTransportProxy transportProxy) + { + this.transportProxy = transportProxy; + } + + public void Initialize(IBTTransportProxy transportProxy) + { + // Stub implementation.. + } + public void Terminate() + { + // Stub implementation.. + } + + public bool TransmitMessage(IBaseMessage msg) + { + Trace.WriteLine("StandardRequestResponseHandler.TransmitMessage() called", "Base Adapter: Info" ); + + // Keep a reference to the response message... + this.responseMsg = msg; + this.responseReady.Set(); + + // Return false to indicate we will delete the response message + // since we are doing an asynchronous transmission... + return false; + } + + public IBaseMessage GetResponseMessage() + { + Trace.WriteLine("StandardRequestResponseHandler.GetResponseMessage() called", "Base Adapter: Info" ); + + // If the request was not submitted don't bother waiting... + if ( false == this.requestSubmitted ) + return null; + + // Wait for the request batch callback... + this.requestCompleted.WaitOne(); + + // If the request was successfully submitted we need to wait + // for the response message... + if ( this.requestSuccessful ) + { + this.responseReady.WaitOne(); + return this.responseMsg; + } + // Otherwise if the request message failed there will not be a repsonse, + // returning null indicates we failed + else + return null; + } + + public void ResponseMessageComplete() + { + Trace.WriteLine("StandardRequestResponseHandler.ResponseMessageComplete() called", "Base Adapter: Info" ); + + StandardTransmitBatchHandler th = new StandardTransmitBatchHandler(this.transportProxy, null); + th.DeleteMessage(this.responseMsg, null); + th.Done(null); + } + + public void SubmitRequestMessage(IBaseMessage requestMsg, object userData) + { + Trace.WriteLine("StandardRequestResponseHandler.SubmitRequestMessage() called", "Base Adapter: Info" ); + + // This implementation can only handle a single request-response pair. + // Ideally, this batch handler should deal with multiple request-response + // pairs for performance reasons + if ( isDirty ) + throw new ApplicationException("StandardRequestResponseHandler only handles a single request-response pair!"); + + isDirty = true; + + // Create a new Transport Proxy batch wrapper and initialize + Batch batch = new Batch(this.transportProxy, null, false); + batch.StartBatchCompleteCallBack = new Batch.StartBatchCompleteEvent(BatchComplete); + + string correlationToken = Guid.NewGuid().ToString(); + batch.SubmitRequestMessage(requestMsg, correlationToken, true, new DateTime(0), this, userData); + batch.Done(null); + this.requestSubmitted = true; + } + + public void BatchComplete(Int32 hrStatus) + { + Trace.WriteLine(string.Format("StandardRequestResponseHandler.BatchComplete( hrStatus:{0} ) called", hrStatus), "Base Adapter: Info" ); + + // If hrStatus is greater than or equal to zero, the request + // message was successfully submitted/persisted to the BizTalk store + if ( hrStatus >= 0 ) + this.requestSuccessful = true; + + this.requestCompleted.Set(); + } + } +} + diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/StandardTransmitBatchHandler.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/StandardTransmitBatchHandler.cs new file mode 100644 index 00000000..30c6e675 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/StandardTransmitBatchHandler.cs @@ -0,0 +1,454 @@ +//--------------------------------------------------------------------- +// File: StandardTransmitBatchHandler.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: Batch helper class to to be used by a send adapter, +// handles batch errors in the standard mannor. +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Collections; +using System.Threading; +using System.Diagnostics; +using System.Runtime.InteropServices; +using Microsoft.BizTalk.TransportProxy.Interop; +using Microsoft.BizTalk.Message.Interop; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + /// + /// This class handles the failure modes of a transmitters batch, it performes the + /// recomended recovery policy for all the possible types of failures for a + /// receive batch. + /// In summary our policy is: + /// (1) on a submit failure we move the message to the suspend queue + /// (2) on suspend failure we there is nothing we can do, so we pass the + /// error back to the client + /// (3) register delegates to handle various events + /// Otherwise: + /// + public class StandardTransmitBatchHandler + { + private StandardTransmitBatch batch = null; + private IBTTransportProxy transportProxy = null; + private ArrayList successfulMsgArray = new ArrayList(); + private ArrayList failedMsgArray = new ArrayList(); + private BYOTTransaction transaction = null; + private SolicitResponseCache solicitRespCache = new SolicitResponseCache(); + protected uint numberIterations = 3; + private AutoResetEvent doneEvent = new AutoResetEvent(false); + private bool batchSucceeded = false; + private BatchAsyncResult asyncResult = null; + private AsyncCallback asyncCb = null; + private IBTDTCCommitConfirm dtcCommitConfirm = null; + private bool autoCommitTx = false; + + // Adapter client code may register the following types of delegates + // to take action on these events... + #region Client Delegates + + private MessageSubmittedSuccessfullyEvent _messageSubmittedSuccessfullyEvent; + + public delegate void AboutToSuspendMessageEvent (IBaseMessage message, object userData, out IBaseMessage msgToSuspend); + public delegate void MessageSubmittedSuccessfullyEvent (IBaseMessage message, Int32 hrStatus, object userData); + public delegate void BatchCompleteEvent(ArrayList _successfulMsgArray, ArrayList _failedMsgArray); + + public MessageSubmittedSuccessfullyEvent MessageSubmittedSuccessfullyCallBack + { + set { _messageSubmittedSuccessfullyEvent = value; } + } + + #endregion // Client Delegates + + public StandardTransmitBatchHandler(IBTTransportProxy transportProxy, AboutToSuspendMessageEvent aboutToSuspendMessageCallback) + { + this.transportProxy = transportProxy; + this.batch = new StandardTransmitBatch(this.transportProxy, new StandardTransmitBatch.BatchCompleteEvent(BatchComplete), aboutToSuspendMessageCallback, this.solicitRespCache); + } + + public StandardTransmitBatchHandler(IBTTransportProxy transportProxy, bool autoCommitTx) + { + this.transportProxy = transportProxy; + this.autoCommitTx = autoCommitTx; + this.batch = new StandardTransmitBatch(this.transportProxy, new StandardTransmitBatch.BatchCompleteEvent(BatchComplete), null, this.solicitRespCache); + } + + public void MoveToSuspendQ(IBaseMessage message, object userData) + { + Trace.WriteLine("StandardTransmitBatchHandler.MoveToSuspendQ() called", "Base Adapter: Info" ); + + this.batch.Batch.MoveToSuspendQ(message, userData); + } + + public void DeleteMessage(IBaseMessage message, object userData) + { + Trace.WriteLine("StandardTransmitBatchHandler.DeleteMessage() called", "Base Adapter: Info" ); + + this.batch.Batch.DeleteMessage (message, userData); + } + + public void Resubmit(IBaseMessage message, object userData) + { + Trace.WriteLine("StandardTransmitBatchHandler.Resubmit() called", "Base Adapter: Info" ); + + ResubmitDetails rd = ResubmitDetails.GetResubmitDetails(message); + + if ( rd.RetryCount > 0 ) // If we have more retries available, we will retry + { + this.batch.Batch.Resubmit(message, rd.RedeliverAt, userData); + } + else // Otherwise we should move to the next transport + { + this.batch.Batch.MoveToNextTransport(message, userData); + } + } + + public void MoveToNextTransport(IBaseMessage message, object userData) + { + Trace.WriteLine("StandardTransmitBatchHandler.MoveToNextTransport() called", "Base Adapter: Info" ); + + this.batch.Batch.MoveToNextTransport(message, userData); + } + + public void SubmitResponseMessage(IBaseMessage solicitMsgSent, IBaseMessage responseMsgToSubmit, object userData) + { + Trace.WriteLine("StandardTransmitBatchHandler.SubmitResponseMessage() called", "Base Adapter: Info" ); + + this.solicitRespCache.Register(solicitMsgSent, responseMsgToSubmit); + this.batch.Batch.SubmitResponseMessage(solicitMsgSent, responseMsgToSubmit, userData); + } + + public BatchResult Done (BYOTTransaction transaction) + { + Trace.WriteLine("StandardTransmitBatchHandler.Done() called", "Base Adapter: Info" ); + + IAsyncResult ar = BeginDone( transaction, null, null); + return EndDone(ar); + } + + public IAsyncResult BeginDone(BYOTTransaction transaction, AsyncCallback cb, Object asyncState) + { + Trace.WriteLine("StandardTransmitBatchHandler.BeginDone() called", "Base Adapter: Info" ); + + this.asyncResult = new BatchAsyncResult(asyncState); + this.transaction = transaction; + this.asyncCb = cb; + this.dtcCommitConfirm = this.batch.Batch.Done( ((null != transaction) ? transaction.Transaction : null) ); + if ( null != this.transaction ) + this.transaction.DTCCommitConfirm = this.dtcCommitConfirm; + + return this.asyncResult; + } + + public BatchResult EndDone(IAsyncResult ar) + { + Trace.WriteLine("StandardTransmitBatchHandler.EndDone() called", "Base Adapter: Info" ); + + this.doneEvent.WaitOne(); + + return ((BatchAsyncResult)ar).BatchStatus; + } + + public void BatchComplete(bool batchSucceeded, StandardTransmitBatch filteredBatch, ArrayList successArray, ArrayList failedArray, object cookie) + { + Trace.WriteLine(string.Format("StandardTransmitBatchHandler.BatchComplete( batchSucceeded:{0} ) called", batchSucceeded), "Base Adapter: Info" ); + + try + { + this.numberIterations--; + this.batchSucceeded = batchSucceeded; + + // If the batch failed we need commit the filtered batch. + // Note: if we are using a DTC transaction we should not retry the batch + // since the transaction needs to be aborted inorder to undo any work done + // against the Message Box + if ( !batchSucceeded && (null != filteredBatch) && (this.numberIterations > 0) && (null == this.dtcCommitConfirm) ) + { + filteredBatch.Batch.Done(this.transaction); + return; + } + + // filteredBatch will be null if only suspend or delete message failed + // in which case we're done + if ( !batchSucceeded && (null == filteredBatch) ) + { + this.batchSucceeded = batchSucceeded; + this.successfulMsgArray = successArray; + } + else if ( batchSucceeded ) + { + this.successfulMsgArray = successArray; + this.failedMsgArray = failedArray; + + if ( this.autoCommitTx && null != this.transaction) + { + this.transaction.Commit(); + } + } + } + finally + { + this.asyncResult.BatchStatus = new BatchResult(this.batchSucceeded, this.dtcCommitConfirm, (((null != this.transaction) && (this.autoCommitTx)) ? this.transaction : null), this.successfulMsgArray, this.failedMsgArray); + + if ( null != this.asyncCb ) + this.asyncCb(this.asyncResult); + + this.doneEvent.Set(); + } + } + + private void UpdateMessageArrays(ArrayList successMsgArr, ArrayList failedMsgArr) + { + if ( null != successMsgArr ) + { + for ( int c = 0; c < successMsgArr.Count; c++ ) + this.successfulMsgArray.Add(successMsgArr[c]); + } + + if ( null != failedMsgArr ) + { + for ( int c = 0; c < failedMsgArr.Count; c++ ) + this.failedMsgArray.Add(failedMsgArr[c]); + } + } + } + + public class StandardTransmitBatch + { + private Batch batch; + private bool batchSucceeded = true; + private IBTTransportProxy transportProxy; + private BatchCompleteEvent batchComplete; + private ArrayList successArray = new ArrayList(); + private ArrayList failedArray = new ArrayList(); + private StandardTransmitBatch filteredBatch; + private StandardTransmitBatchHandler.AboutToSuspendMessageEvent aboutToSuspendMessageEvent; + private SolicitResponseCache solicitRespCache; + + public delegate void BatchCompleteEvent(bool batchSucceeded, StandardTransmitBatch filteredBatch, ArrayList successArray, ArrayList failedArray, object cookie); + + public Batch Batch + { + set { this.batch = value; } + get { return this.batch; } + } + + public StandardTransmitBatch(IBTTransportProxy transportProxy, BatchCompleteEvent batchComplete, StandardTransmitBatchHandler.AboutToSuspendMessageEvent aboutToSuspendMessageEvent, SolicitResponseCache solicitRespCache) + { + this.transportProxy = transportProxy; + this.batch = new Batch(this.transportProxy, null, true); + this.batchComplete = batchComplete; + this.aboutToSuspendMessageEvent = aboutToSuspendMessageEvent; + this.solicitRespCache = solicitRespCache; + SetCallbacks(); + } + + private void SetCallbacks() + { + // Set batch start delegate... + this.batch.StartBatchCompleteCallBack = new Batch.StartBatchCompleteEvent(StartBatchComplete); + + // Set operation delegates... + this.batch.SubmitSuccessCallBack = new Batch.SubmitSuccessEvent(SubmitResponseSuccess); + this.batch.SubmitFailureCallBack = new Batch.SubmitFailureEvent(SubmitResponseFailure); + this.batch.DeleteSuccessCallBack = new Batch.DeleteSuccessEvent(DeleteSuccess); + this.batch.DeleteFailureCallBack = new Batch.DeleteFailureEvent(DeleteFailure); + this.batch.MoveToNextTransportSuccessCallBack = new Batch.MoveToNextTransportSuccessEvent(MoveToNextTransportSuccess); + this.batch.MoveToNextTransportFailureCallBack = new Batch.MoveToNextTransportFailureEvent(MoveToNextTransportFailure); + this.batch.ResubmitSuccessCallBack = new Batch.ResubmitSuccessEvent(ResubmitSuccess); + this.batch.ResubmitFailureCallBack = new Batch.ResubmitFailureEvent(ResubmitFailure); + this.batch.MoveToSuspendQFailureCallBack = new Batch.MoveToSuspendQFailureEvent(MoveToSuspendQFailure); + this.batch.MoveToSuspendQSuccessCallBack = new Batch.MoveToSuspendQSuccessEvent(MoveToSuspendQSuccess); + + // Set batch end delegate... + this.batch.EndBatchCompleteCallBack = new Batch.EndBatchCompleteEvent(EndBatchComplete); + } + + public void StartBatchComplete(Int32 hrStatus) + { + if ( hrStatus < 0 ) + { + this.batchSucceeded = false; + this.filteredBatch = new StandardTransmitBatch( this.transportProxy, this.batchComplete, this.aboutToSuspendMessageEvent, this.solicitRespCache); + } + } + + public void SubmitResponseSuccess(IBaseMessage solicitMessage, Int32 hrStatus, object userData) + { + IBaseMessage responseMessage = this.solicitRespCache.GetResponseMessage(solicitMessage); + + this.successArray.Add(new BatchMessage(responseMessage, userData, BatchOperationType.Submit)); + + if ( !this.batchSucceeded ) + this.filteredBatch.Batch.SubmitResponseMessage(solicitMessage, responseMessage, userData); + } + + public void SubmitResponseFailure(IBaseMessage solicitMessage, Int32 hrStatus, object userData) + { + IBaseMessage responseMessage = this.solicitRespCache.GetResponseMessage(solicitMessage); + IBaseMessage msgToSuspend; + + if ( null != this.aboutToSuspendMessageEvent ) + this.aboutToSuspendMessageEvent(responseMessage, userData, out msgToSuspend); + else + msgToSuspend = responseMessage; + + this.failedArray.Add(new BatchMessage(msgToSuspend, userData, BatchOperationType.Submit)); + this.filteredBatch.Batch.MoveToSuspendQ(msgToSuspend, userData); + } + + public void MoveToSuspendQSuccess(IBaseMessage message, Int32 hrStatus, object userData) + { + this.successArray.Add(new BatchMessage(message, userData, BatchOperationType.MoveToSuspendQ)); + + if ( !this.batchSucceeded ) + { + IBaseMessage msgToSuspend; + + if ( null != this.aboutToSuspendMessageEvent ) + this.aboutToSuspendMessageEvent(message, userData, out msgToSuspend); + else + msgToSuspend = message; + + this.successArray.Add(new BatchMessage(msgToSuspend, userData, BatchOperationType.Submit)); + this.filteredBatch.Batch.MoveToSuspendQ(msgToSuspend, userData); + } + } + + public void MoveToSuspendQFailure(IBaseMessage message, Int32 hrStatus, object userData) + { + // If delete message fails, there is nothing to do. This could result + // in the message being sent twice, though for non-transacted adapters + // there is no guarentee against that anyway + this.failedArray.Add(new BatchMessage(message, userData, BatchOperationType.MoveToSuspendQ)); + } + + public void DeleteSuccess(IBaseMessage message, Int32 hrStatus, object userData) + { + this.successArray.Add(new BatchMessage(message, userData, BatchOperationType.Delete)); + + if ( !this.batchSucceeded ) + this.filteredBatch.Batch.DeleteMessage(message, userData); + } + + public void DeleteFailure(IBaseMessage message, Int32 hrStatus, object userData) + { + // If delete message fails, there is nothing to do. This could result + // in the message being sent twice, though for non-transacted adapters + // there is no guarentee against that anyway + this.failedArray.Add(new BatchMessage(message, userData, BatchOperationType.Delete)); + } + + public void ResubmitSuccess(IBaseMessage message, Int32 hrStatus, object userData) + { + this.successArray.Add(new BatchMessage(message, userData, BatchOperationType.Resubmit)); + + if ( !this.batchSucceeded ) + { + ResubmitDetails rd = ResubmitDetails.GetResubmitDetails(message); + this.filteredBatch.Batch.Resubmit(message, rd.RedeliverAt, userData); + } + } + + public void ResubmitFailure(IBaseMessage message, Int32 hrStatus, object userData) + { + // If resubmit fails, give the backup transport a shot + this.filteredBatch.Batch.MoveToNextTransport(message, userData); + } + + public void MoveToNextTransportSuccess(IBaseMessage message, Int32 hrStatus, object userData) + { + this.successArray.Add(new BatchMessage(message, userData, BatchOperationType.MoveToNextTransport)); + + if ( !this.batchSucceeded ) + this.filteredBatch.Batch.MoveToNextTransport(message, userData); + } + + public void MoveToNextTransportFailure(IBaseMessage message, Int32 hrStatus, object userData) + { + // If the move the the backup transport fails, suspend the message + MoveToSuspendQSuccess(message, hrStatus, userData); + } + + public void EndBatchComplete(object cookie) + { + if ( null != this.batchComplete ) + { + this.batchComplete( this.batchSucceeded, this.filteredBatch, this.successArray, this.failedArray, cookie ); + } + } + } + + /// + /// Helper class the get the messages' resubmit details + /// + public class ResubmitDetails + { + private int retryCount; + private DateTime redeliverAt; + + public ResubmitDetails() {} + + public int RetryCount + { + set { this.retryCount = value; } + get { return this.retryCount; } + } + + public DateTime RedeliverAt + { + set { this.redeliverAt = value; } + get { return this.redeliverAt; } + } + + public static ResubmitDetails GetResubmitDetails(IBaseMessage msg) + { + ResubmitDetails rd = new ResubmitDetails(); + + SystemMessageContext context = new SystemMessageContext(msg.Context); + + rd.RedeliverAt = DateTime.Now.AddMinutes(context.RetryInterval); + rd.RetryCount = context.RetryCount; + + return rd; + } + } + + public class SolicitResponseCache + { + private Hashtable cache = new Hashtable(); + + public void Register(IBaseMessage solicitMessage, IBaseMessage responseMessage) + { + Guid id = solicitMessage.MessageID; + this.cache.Add(id, responseMessage); + } + + public IBaseMessage GetResponseMessage(IBaseMessage solicitMessage) + { + Guid id = solicitMessage.MessageID; + IBaseMessage responseMessage = (IBaseMessage)this.cache[id]; + return responseMessage; + } + } +} + diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/TaskScheduler.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/TaskScheduler.cs new file mode 100644 index 00000000..4eb6a3a4 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/TaskScheduler.cs @@ -0,0 +1,182 @@ +//--------------------------------------------------------------------- +// File: TaskScheduler.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: Simple task scheduler class, usefull for polling receive +// adapters +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Collections; +using System.Threading; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + /// + /// A Task is a unit of scheduled work for the TaskScheduler. + /// + internal abstract class Task : IDisposable + { + protected string uri; + protected TimerCallback onPerformTask; + protected Timer taskScheduler; + protected int dueTime; + protected int period; + + public Timer TaskScheduler + { + get { return this.taskScheduler; } + } + + public void Dispose() + { + this.taskScheduler.Dispose(); + } + + public abstract void Renew(); + } + + internal class PeriodicTask : Task + { + public PeriodicTask(string uri, object state, int interval, TimerCallback onPerformTask) + { + this.uri = uri; + this.onPerformTask = onPerformTask; + this.dueTime = interval * 1000; + this.period = interval * 1000; + this.taskScheduler = new Timer( this.onPerformTask, state, this.dueTime, this.period ); + } + + public override void Renew() {} + } + + internal class SingularTask : Task + { + public SingularTask(string uri, object state, int interval, TimerCallback onPerformTask) + { + this.uri = uri; + this.onPerformTask = onPerformTask; + this.dueTime = interval * 1000; + this.taskScheduler = new Timer( this.onPerformTask, state, this.dueTime, Timeout.Infinite ); + } + + public override void Renew() + { + this.taskScheduler.Change( this.dueTime, Timeout.Infinite ); + } + } + + /// + /// The TaskScheduler manages Task to be performed by adapters. The + /// Adapter may update or remove the Task after initially adding it. + /// + public class TaskScheduler + { + private Hashtable tasks; + + public TaskScheduler() + { + this.tasks = new Hashtable(); + } + + public void Stop() + { + lock(this.tasks) + { + for ( int c = 0; c < this.tasks.Count; c++ ) + { + Task task = (Task)this.tasks[c]; + task.Dispose(); + } + this.tasks.Clear(); + } + } + + public void AddNewSingularTask(string uri, object state, int interval, TimerCallback onPerformTask) + { + lock(this.tasks) + { + Task newTask = new SingularTask(uri, state, interval, onPerformTask); + this.tasks.Add(uri, newTask); + } + } + + public void AddNewPeriodicTask(string uri, object state, int interval, TimerCallback onPerformTask) + { + lock(this.tasks) + { + Task newTask = new PeriodicTask(uri, state, interval, onPerformTask); + this.tasks.Add(uri, newTask); + } + } + + public void RemoveTask(string uri) + { + lock(this.tasks) + { + _RemoveTask(uri); + } + } + + public void UpdateSingularTask(string uri, object state, int interval, TimerCallback onPerformTask) + { + lock(this.tasks) + { + _RemoveTask(uri); + Task newTask = new SingularTask(uri, state, interval, onPerformTask); + this.tasks.Add(uri, newTask); + } + } + + public void UpdatePeriodicTask(string uri, object state, int interval, TimerCallback onPerformTask) + { + lock(this.tasks) + { + _RemoveTask(uri); + Task newTask = new PeriodicTask(uri, state, interval, onPerformTask); + this.tasks.Add(uri, newTask); + } + } + + public void RenewTask( string uri ) + { + lock( this.tasks ) + { + Task task = (Task)this.tasks[uri]; + if ( null != task ) + { + task.Renew(); + } + } + } + + private void _RemoveTask(string uri) + { + Task task = (Task)this.tasks[uri]; + if ( null != task ) + { + this.tasks.Remove(uri); + task.Dispose(); + } + } + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ThreadPool.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ThreadPool.cs new file mode 100644 index 00000000..0b293483 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ThreadPool.cs @@ -0,0 +1,65 @@ +//--------------------------------------------------------------------- +// File: ThreadPool.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: Threadpool, thin wrapper over the CLR thread pool +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Collections; +using System.Threading; +using System.Diagnostics; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + public interface IThreadPool + { + void Initialize(); + void Stop(); + void AddItem(IThreadpoolWorkItem workItem); + } + + /// + /// Generic ThreadPool, work items must implement IThreadPool. + /// + public class ThreadPool : IThreadPool + { + public void Initialize() + { + } + + public void Stop() + { + } + + public void AddItem(IThreadpoolWorkItem workItem) + { + System.Threading.ThreadPool.QueueUserWorkItem( new WaitCallback(WorkerThreadThunk), workItem ); + } + + private void WorkerThreadThunk(object state) + { + IThreadpoolWorkItem workItem = (IThreadpoolWorkItem)state; + workItem.ProcessWorkItem(); + } + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/TransactionDispenser.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/TransactionDispenser.cs new file mode 100644 index 00000000..ac8df74c --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/TransactionDispenser.cs @@ -0,0 +1,87 @@ +//--------------------------------------------------------------------- +// File: TransactionDispenser.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: This class wraps a component that houses BYOT in a COM+ +// library application. There is a bug Win2K (as far as SP3) that BYOT +// will AV if used outside of a COM+ application. The safest route until +// a fix is created is to wrap a separate component that sits in COM+ +// and will delegate the calls to BYOT, hence this component. +// +// The code also contains the transaction dispenser that wraps the +// DtcGetTransactionDispenserEx call. There is currently no way in managed +// code to create a new transaction, so must use interop to enable this +// at this time. +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Runtime.InteropServices; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + + public sealed class TransactionMgmtIIDs + { + public const string CLSID_TransactionDisperserImpl = "30C1F639-A3A6-4E0A-879D-0B15020754C6"; + public const string IID_ITransactionDisperserImpl = "B051713B-736D-408D-8E0C-9C04EDE5A16C"; + public const string CLSID_WrapByot = "273D684A-6250-4F41-8281-DECE6711BD2D"; + public const string IID_IWrapByot = "846E5A00-9660-4443-B402-64FF4C722095"; + } + + [ComImport] + [Guid(TransactionMgmtIIDs.CLSID_WrapByot)] + [ClassInterface(ClassInterfaceType.None)] + public class WrapByot {}; + + [ComImport()] + [Guid(TransactionMgmtIIDs.IID_IWrapByot)] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [CoClass(typeof(WrapByot))] + public interface IWrapByot + { + [return: MarshalAs(UnmanagedType.IUnknown)] + object CreateInstance([MarshalAs(UnmanagedType.IUnknown)] object txn, Guid type); + } + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsDual)] + [Guid(TransactionMgmtIIDs.IID_ITransactionDisperserImpl)] + [CoClass(typeof(TransactionDispenser))] + public interface ITransactionDispenser + { + [return: MarshalAs(UnmanagedType.IUnknown)] + object GetTransaction + ( + [MarshalAs(UnmanagedType.BStr)] + string transactionName, + int timeOut, + int isolationLevel + ); + } + + [ComImport] + [ClassInterface(ClassInterfaceType.None)] + [Guid(TransactionMgmtIIDs.CLSID_TransactionDisperserImpl)] + public class TransactionDispenser + { + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/TransmitterMessage.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/TransmitterMessage.cs new file mode 100644 index 00000000..7f193bb3 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/TransmitterMessage.cs @@ -0,0 +1,115 @@ +//--------------------------------------------------------------------- +// File: TransmitterMessage.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: This class wraps a message to be transmitted, retrieving +// the configuration form the message context +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Xml; +using Microsoft.BizTalk.Message.Interop; +using Microsoft.BizTalk.Component.Interop; +using Microsoft.XLANGs.BaseTypes; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + /// + /// Summary description for TransmitterMessage + /// + public class TransmitterMessage + { + private IBaseMessage message; + private ConfigProperties properties; + private string propertyNamespace; + private SystemMessageContext context; + private string uri; + private bool portIsTwoWay = false; + private ConfigProperties.CreateProperties createProperties; + private static readonly PropertyBase IsSolicitResponseProperty = new BTS.IsSolicitResponse(); + + public virtual ConfigProperties CreateProperties() {return null;} + + public TransmitterMessage(IBaseMessage message, string propertyNamespace, ConfigProperties.CreateProperties createProperties) + { + this.message = message; + this.propertyNamespace = propertyNamespace; + + this.context = new SystemMessageContext(this.message.Context); + this.uri = this.context.OutboundTransportLocation; + // NOTE: the system context property IsSolicitResponse indicates whether the + // port is one way or two way... + object obj = this.message.Context.Read(IsSolicitResponseProperty.Name.Name, IsSolicitResponseProperty.Name.Namespace); + if ( null != obj ) + this.portIsTwoWay = (bool)obj; + + this.createProperties = createProperties; + } + + public IBaseMessage Message + { + set { this.message = value; } + get { return this.message; } + } + + public ConfigProperties Properties + { + get + { + if ( null == this.properties ) + LoadConfiguration(); + + return this.properties; + } + } + + public bool PortIsTwoWay + { + get { return this.portIsTwoWay; } + } + + private void LoadConfiguration() + { + XmlDocument locationConfigDom = null; + + // get the adapter configuration off the message + string config = (string)this.message.Context.Read("AdapterConfig", this.propertyNamespace); + + // the config can be null all that means is that we are doing a dynamic send + if (null != config) + { + locationConfigDom = new XmlDocument(); + locationConfigDom.LoadXml(config); + + // For Dynamic Sends the destination is taken from the outboundLocation URI + this.properties = this.createProperties(this.uri); + + if (null != locationConfigDom) + { + // For Dynamic Sends the Location config can be null + // Location properties - possibly override some handler properties + this.properties.LocationConfiguration(locationConfigDom); + } + } + } + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/VirtualStream.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/VirtualStream.cs new file mode 100644 index 00000000..45597f38 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/VirtualStream.cs @@ -0,0 +1,243 @@ +//--------------------------------------------------------------------- +// File: VirtualStream.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.IO; +using System.Text; +using System.Runtime.InteropServices; + + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + /// + /// Summary description for VirtualStream. + /// + public class VirtualStream : Stream, IDisposable + { + private Stream stream; + private bool isDisposed = false; + private bool isInMemory = true; + private int threshholdSize; + private const int THRESHOLD_MAX = 1*1024*1024; // 1MB max size + private const int defaultSize = 10240; // 10K default size + + public VirtualStream() : this(defaultSize) + { + } + + public VirtualStream(int buffer) + { + this.stream = new MemoryStream(buffer); + this.threshholdSize = THRESHOLD_MAX; + } + + // Stream Properties... + #region Stream Properties + + override public bool CanRead + { + get {return this.stream.CanRead;} + } + + override public bool CanWrite + { + get {return this.stream.CanWrite;} + } + + override public bool CanSeek + { + get {return this.stream.CanSeek;} + } + + override public long Length + { + get {return this.stream.Length;} + } + + override public long Position + { + get {return this.stream.Position;} + set {this.stream.Seek(value, SeekOrigin.Begin);} + } + + #endregion // Stream Properties + + // Stream Methods... + #region Stream Methods + + override public void Close() + { + if(!this.isDisposed) + { + GC.SuppressFinalize(this); + Cleanup(); + } + } + + override public void Flush() + { + ThrowIfDisposed(); + this.stream.Flush(); + } + + override public int Read(byte[] buffer, int offset, int count) + { + ThrowIfDisposed(); + + return this.stream.Read(buffer, offset, count); + } + + override public long Seek(long offset, SeekOrigin origin) + { + ThrowIfDisposed(); + + return this.stream.Seek(offset, origin); + } + + override public void SetLength(long length) + { + ThrowIfDisposed(); + + if ( (length > this.threshholdSize) && this.isInMemory ) + { + lock (this) + { + // The stream is currently in memory, the new write will tip + // it over the limit. Switching to persisted stream... + if ( (length > this.threshholdSize) && this.isInMemory ) + { + // Create the persisted stream... + Stream persistedStream = CreatePersistentStream(); + + // Copy the contents of the memory stream into the persisted + CopyStreamContent((MemoryStream)this.stream, persistedStream); + + // Switch over the streams... + this.stream = persistedStream; + this.isInMemory = false; + } + + this.stream.SetLength(length); + } + } + else + this.stream.SetLength(length); + } + + override public void Write(byte[] buffer, int offset, int count) + { + ThrowIfDisposed(); + + if ( ((count + this.stream.Position) > this.threshholdSize) && this.isInMemory ) + { + lock (this) + { + // The stream is currently in memory, the new write will tip + // it over the limit. Switching to persisted stream... + if ( ((count + this.stream.Position) > this.threshholdSize) && this.isInMemory ) + { + // Create the persisted stream... + Stream persistedStream = CreatePersistentStream(); + + // Copy the contents of the memory stream into the persisted + CopyStreamContent((MemoryStream)this.stream, persistedStream); + + // Switch over the streams... + this.stream = persistedStream; + this.isInMemory = false; + } + + this.stream.Write (buffer, offset, count); + } + } + else + this.stream.Write (buffer, offset, count); + } + + #endregion // Stream Methods + + #region IDisposable Interface + + public void Dispose() + { + Close(); + } + + #endregion // IDisposable Interface + + private void ThrowIfDisposed() + { + if(this.isDisposed || (this.stream == null)) + throw new ObjectDisposedException("VirtualStream"); + } + + private void Cleanup() + { + if(!this.isDisposed) + { + this.isDisposed = true; + if(null != this.stream) + { + this.stream.Close(); + this.stream = null; + } + } + } + + private void CopyStreamContent(MemoryStream source, Stream dest) + { + long currentPosition = source.Position; + + // Optimization + if (source.Length < int.MaxValue) + { + dest.Write(source.GetBuffer(), 0, (int) source.Length); + } + else + { + source.Position = 0; + byte[] tempBuffer = new Byte[this.threshholdSize]; + int read = 0; + + while ((read = source.Read(tempBuffer, 0, this.threshholdSize)) != 0) + dest.Write(tempBuffer, 0, read); + } + + dest.Position = currentPosition; + } + + public static Stream CreatePersistentStream() + { + StringBuilder name = new StringBuilder(256); + IntPtr handle; + if(0 == NativeCalls.GetTempFileName(Path.GetTempPath(), "VSTMP", 0, name)) + throw new ApplicationException("GetTempFileName Failed."); + handle = NativeCalls.CreateFile(name.ToString(), (UInt32)FileAccess.ReadWrite, 0, IntPtr.Zero, (UInt32)FileMode.Create, 0x04000100, IntPtr.Zero); + + if(IntPtr.Zero == handle) + throw new ApplicationException("CreateFile Failed."); + return new FileStream(handle, FileAccess.ReadWrite); + } + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/batch.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/batch.cs new file mode 100644 index 00000000..cec0cb72 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/batch.cs @@ -0,0 +1,620 @@ +//--------------------------------------------------------------------- +// File: Batch.cs +// +// Summary: Implementation of an adapter framework sample adapter. +// This class constitutes one of the BaseAdapter classes, which, are +// a set of generic re-usable set of classes to help adapter writers. +// +// Sample: Base Adapter Class Library v1.0.1 +// +// Description: The Batch class is an abstraction over the Transport Proxy +// batch, it's main beneffit is to process the outcome of a given bacth +// and fire delegates letting a client handle different failured/successfull +// operations within a batch +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- + +using System; +using System.Collections; +using System.Diagnostics; +using System.Runtime.InteropServices; +using Microsoft.BizTalk.TransportProxy.Interop; +using Microsoft.BizTalk.Message.Interop; + +namespace Microsoft.Samples.BizTalk.Adapters.BaseAdapter +{ + public class BatchMessage + { + private IBaseMessage message; + private object userData; + private string correlationToken; + private BatchOperationType operationType; + + public BatchMessage (IBaseMessage message, object userData, BatchOperationType oppType) + { + this.message = message; + this.userData = userData; + this.operationType = oppType; + } + + public BatchMessage (string correlationToken, object userData, BatchOperationType oppType) + { + this.correlationToken = correlationToken; + this.userData = userData; + this.operationType = oppType; + } + + public IBaseMessage Message + { + get { return this.message; } + } + public object UserData + { + get { return this.userData; } + } + public string CorrelationToken + { + get { return this.correlationToken; } + } + public BatchOperationType OperationType + { + get { return this.operationType; } + } + } + + /// + /// This class completely wraps the calls to a transportProxy batch. It does this so it can keep + /// a trail of the messages that were submitted to that batch. As it has this it can then tie the + /// async batch callback to a series of virtual function calls - all parameterized with the correct + /// assocaited message object. Derived classes can then decide what they want to do in each case. + /// + public class Batch : IBTBatchCallBack + { + private Int32 hrStatus; + + public bool OverallSuccess + { + get { return (this.hrStatus >= 0); } + } + + // IBTBatchCallBack + public void BatchComplete (Int32 hrStatus, Int16 nOpCount, BTBatchOperationStatus[] pOperationStatus, System.Object vCallbackCookie) + { + Trace.WriteLine(string.Format("Batch.BatchComplete( hrStatus:{0} ) called", hrStatus), "Base Adapter: Info" ); + + this.hrStatus = hrStatus; + + StartBatchComplete(hrStatus); + + // nothing at all failed in this batch so we are done + if (hrStatus < 0 || this.verbose) + { + StartProcessOpperations(); + + foreach (BTBatchOperationStatus status in pOperationStatus) + { + if (status.Status >= 0 && !this.verbose) + continue; + + switch (status.OperationType) + { + case BatchOperationType.Submit: + { + for (int i=0; i + /// This class encapsulates the typical behavior we want in a Transmit Adapter running asynchronously. + /// In summary our policy is: + /// (1) on a resubmit failure Move to the next transport + /// (2) on a move to next transport failure move to the suspend queue + /// Otherwise: + /// TODO: we should use SetErrorInfo on the transportProxy to log the error appropriately + /// +/* + public class TypicalAsyncTransmitResponseBatch : Batch + { + public delegate void AllWorkDoneDelegate (); + + private AllWorkDoneDelegate allWorkDoneDelegate; + + public TypicalAsyncTransmitResponseBatch (IBTTransportProxy transportProxy, AllWorkDoneDelegate allWorkDoneDelegate) : base(transportProxy, false) + { + this.allWorkDoneDelegate = allWorkDoneDelegate; + } + protected override void StartProcessOpperations () + { + this.batch = new TypicalAsyncTransmitResponseBatch(this.TransportProxy, this.allWorkDoneDelegate); + this.allWorkDoneDelegate = null; + } + protected override void EndProcessOpperations () + { + this.batch.Done(null); + } + protected override void EndBatchComplete (object cookie) + { + if (null != this.allWorkDoneDelegate) + this.allWorkDoneDelegate(); + } + protected override void ResubmitFailure (IBaseMessage message, Int32 hrStatus, object userData) + { + this.batch.MoveToNextTransport(message); + } + protected override void MoveToNextTransportFailure (IBaseMessage message, Int32 hrStatus, object userData) + { + this.batch.MoveToSuspendQ(message); + } + private Batch batch; + } + */ +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BizTalk ODBC Adapter 2010.sln b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BizTalk ODBC Adapter 2010.sln new file mode 100644 index 00000000..12fce06b --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BizTalk ODBC Adapter 2010.sln @@ -0,0 +1,104 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D4E0CF37-CC4A-40BE-A66C-D9AF9331FC75}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ODBCTransmitAdapter", "Adapter\Run-Time\ODBCTransmit\ODBCTransmitAdapter.csproj", "{6ED3D08A-2369-441B-BE6F-AF06A94B4674}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ODBCSchemaWizard", "ODBCSchemaWizard\ODBCSchemaWizard.csproj", "{3BCB956F-E5FB-4D40-9090-8E44E92C5353}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestHarness", "TestHarness\TestHarness.csproj", "{21B99320-0A35-4B38-B876-C090D198795E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ODBCQueryProcessor", "ODBCQueryProcessor\ODBCQueryProcessor.csproj", "{516F27B0-23E4-4704-9A86-A5064769522A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdapterManagement", "Adapter\Design-Time\AdapterManagement.csproj", "{CD29DF32-44FE-4CC6-A43E-01A74B25B9E3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ODBCDriverPrompt", "ODBCDriverPrompt\ODBCDriverPrompt.csproj", "{F25132D9-07AA-4B41-90AD-828E54704692}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ODBCReceiveAdapter", "Adapter\Run-Time\ODBCReceive\ODBCReceiveAdapter.csproj", "{16B6C5EF-0B60-4D90-9A79-69B1CADA756A}" +EndProject +Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Install", "Install\Install.vdproj", "{B63CC6F2-407F-4724-81EB-7A0B7C722C0B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ODBCBaseAdapter", "BaseAdapter\ODBCBaseAdapter.csproj", "{6EF6BB4C-9417-4CAE-990D-49F1F368284B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Deployment|Any CPU = Deployment|Any CPU + Development|Any CPU = Development|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6ED3D08A-2369-441B-BE6F-AF06A94B4674}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6ED3D08A-2369-441B-BE6F-AF06A94B4674}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6ED3D08A-2369-441B-BE6F-AF06A94B4674}.Deployment|Any CPU.ActiveCfg = Debug|Any CPU + {6ED3D08A-2369-441B-BE6F-AF06A94B4674}.Deployment|Any CPU.Build.0 = Debug|Any CPU + {6ED3D08A-2369-441B-BE6F-AF06A94B4674}.Development|Any CPU.ActiveCfg = Debug|Any CPU + {6ED3D08A-2369-441B-BE6F-AF06A94B4674}.Development|Any CPU.Build.0 = Debug|Any CPU + {6ED3D08A-2369-441B-BE6F-AF06A94B4674}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6ED3D08A-2369-441B-BE6F-AF06A94B4674}.Release|Any CPU.Build.0 = Release|Any CPU + {3BCB956F-E5FB-4D40-9090-8E44E92C5353}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3BCB956F-E5FB-4D40-9090-8E44E92C5353}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3BCB956F-E5FB-4D40-9090-8E44E92C5353}.Deployment|Any CPU.ActiveCfg = Debug|Any CPU + {3BCB956F-E5FB-4D40-9090-8E44E92C5353}.Deployment|Any CPU.Build.0 = Debug|Any CPU + {3BCB956F-E5FB-4D40-9090-8E44E92C5353}.Development|Any CPU.ActiveCfg = Debug|Any CPU + {3BCB956F-E5FB-4D40-9090-8E44E92C5353}.Development|Any CPU.Build.0 = Debug|Any CPU + {3BCB956F-E5FB-4D40-9090-8E44E92C5353}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3BCB956F-E5FB-4D40-9090-8E44E92C5353}.Release|Any CPU.Build.0 = Release|Any CPU + {21B99320-0A35-4B38-B876-C090D198795E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21B99320-0A35-4B38-B876-C090D198795E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21B99320-0A35-4B38-B876-C090D198795E}.Deployment|Any CPU.ActiveCfg = Debug|Any CPU + {21B99320-0A35-4B38-B876-C090D198795E}.Deployment|Any CPU.Build.0 = Debug|Any CPU + {21B99320-0A35-4B38-B876-C090D198795E}.Development|Any CPU.ActiveCfg = Debug|Any CPU + {21B99320-0A35-4B38-B876-C090D198795E}.Development|Any CPU.Build.0 = Debug|Any CPU + {21B99320-0A35-4B38-B876-C090D198795E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21B99320-0A35-4B38-B876-C090D198795E}.Release|Any CPU.Build.0 = Release|Any CPU + {516F27B0-23E4-4704-9A86-A5064769522A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {516F27B0-23E4-4704-9A86-A5064769522A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {516F27B0-23E4-4704-9A86-A5064769522A}.Deployment|Any CPU.ActiveCfg = Debug|Any CPU + {516F27B0-23E4-4704-9A86-A5064769522A}.Deployment|Any CPU.Build.0 = Debug|Any CPU + {516F27B0-23E4-4704-9A86-A5064769522A}.Development|Any CPU.ActiveCfg = Debug|Any CPU + {516F27B0-23E4-4704-9A86-A5064769522A}.Development|Any CPU.Build.0 = Debug|Any CPU + {516F27B0-23E4-4704-9A86-A5064769522A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {516F27B0-23E4-4704-9A86-A5064769522A}.Release|Any CPU.Build.0 = Release|Any CPU + {CD29DF32-44FE-4CC6-A43E-01A74B25B9E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CD29DF32-44FE-4CC6-A43E-01A74B25B9E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CD29DF32-44FE-4CC6-A43E-01A74B25B9E3}.Deployment|Any CPU.ActiveCfg = Debug|Any CPU + {CD29DF32-44FE-4CC6-A43E-01A74B25B9E3}.Deployment|Any CPU.Build.0 = Debug|Any CPU + {CD29DF32-44FE-4CC6-A43E-01A74B25B9E3}.Development|Any CPU.ActiveCfg = Debug|Any CPU + {CD29DF32-44FE-4CC6-A43E-01A74B25B9E3}.Development|Any CPU.Build.0 = Debug|Any CPU + {CD29DF32-44FE-4CC6-A43E-01A74B25B9E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CD29DF32-44FE-4CC6-A43E-01A74B25B9E3}.Release|Any CPU.Build.0 = Release|Any CPU + {F25132D9-07AA-4B41-90AD-828E54704692}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F25132D9-07AA-4B41-90AD-828E54704692}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F25132D9-07AA-4B41-90AD-828E54704692}.Deployment|Any CPU.ActiveCfg = Debug|Any CPU + {F25132D9-07AA-4B41-90AD-828E54704692}.Deployment|Any CPU.Build.0 = Debug|Any CPU + {F25132D9-07AA-4B41-90AD-828E54704692}.Development|Any CPU.ActiveCfg = Debug|Any CPU + {F25132D9-07AA-4B41-90AD-828E54704692}.Development|Any CPU.Build.0 = Debug|Any CPU + {F25132D9-07AA-4B41-90AD-828E54704692}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F25132D9-07AA-4B41-90AD-828E54704692}.Release|Any CPU.Build.0 = Release|Any CPU + {16B6C5EF-0B60-4D90-9A79-69B1CADA756A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {16B6C5EF-0B60-4D90-9A79-69B1CADA756A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {16B6C5EF-0B60-4D90-9A79-69B1CADA756A}.Deployment|Any CPU.ActiveCfg = Debug|Any CPU + {16B6C5EF-0B60-4D90-9A79-69B1CADA756A}.Deployment|Any CPU.Build.0 = Debug|Any CPU + {16B6C5EF-0B60-4D90-9A79-69B1CADA756A}.Development|Any CPU.ActiveCfg = Debug|Any CPU + {16B6C5EF-0B60-4D90-9A79-69B1CADA756A}.Development|Any CPU.Build.0 = Debug|Any CPU + {16B6C5EF-0B60-4D90-9A79-69B1CADA756A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {16B6C5EF-0B60-4D90-9A79-69B1CADA756A}.Release|Any CPU.Build.0 = Release|Any CPU + {B63CC6F2-407F-4724-81EB-7A0B7C722C0B}.Debug|Any CPU.ActiveCfg = Debug + {B63CC6F2-407F-4724-81EB-7A0B7C722C0B}.Deployment|Any CPU.ActiveCfg = Debug + {B63CC6F2-407F-4724-81EB-7A0B7C722C0B}.Development|Any CPU.ActiveCfg = Debug + {B63CC6F2-407F-4724-81EB-7A0B7C722C0B}.Release|Any CPU.ActiveCfg = Release + {B63CC6F2-407F-4724-81EB-7A0B7C722C0B}.Release|Any CPU.Build.0 = Release + {6EF6BB4C-9417-4CAE-990D-49F1F368284B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6EF6BB4C-9417-4CAE-990D-49F1F368284B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6EF6BB4C-9417-4CAE-990D-49F1F368284B}.Deployment|Any CPU.ActiveCfg = Debug|Any CPU + {6EF6BB4C-9417-4CAE-990D-49F1F368284B}.Deployment|Any CPU.Build.0 = Debug|Any CPU + {6EF6BB4C-9417-4CAE-990D-49F1F368284B}.Development|Any CPU.ActiveCfg = Debug|Any CPU + {6EF6BB4C-9417-4CAE-990D-49F1F368284B}.Development|Any CPU.Build.0 = Debug|Any CPU + {6EF6BB4C-9417-4CAE-990D-49F1F368284B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6EF6BB4C-9417-4CAE-990D-49F1F368284B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Install/Install.vdproj b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Install/Install.vdproj new file mode 100644 index 00000000..c733d92d --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Install/Install.vdproj @@ -0,0 +1,4332 @@ +"DeployProject" +{ +"VSVersion" = "3:800" +"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" +"IsWebType" = "8:FALSE" +"ProjectName" = "8:Install" +"LanguageId" = "3:1033" +"CodePage" = "3:1252" +"UILanguageId" = "3:1033" +"SccProjectName" = "8:" +"SccLocalPath" = "8:" +"SccAuxPath" = "8:" +"SccProvider" = "8:" + "Hierarchy" + { + "Entry" + { + "MsmKey" = "8:_0193BE204960905334B4854F8253A81D" + "OwnerKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0193BE204960905334B4854F8253A81D" + "OwnerKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0193BE204960905334B4854F8253A81D" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0193BE204960905334B4854F8253A81D" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0193BE204960905334B4854F8253A81D" + "OwnerKey" = "8:_19AB21EAD8C3456FB43BF82BD1B051DA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0193BE204960905334B4854F8253A81D" + "OwnerKey" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0193BE204960905334B4854F8253A81D" + "OwnerKey" = "8:_837C0EA009C6435583E218E4E8D61C43" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0193BE204960905334B4854F8253A81D" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0193BE204960905334B4854F8253A81D" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0193BE204960905334B4854F8253A81D" + "OwnerKey" = "8:_12E217D3323A4946B35E7C2003FABA90" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0193BE204960905334B4854F8253A81D" + "OwnerKey" = "8:_27A9884B868840F9858D3ECF956B4289" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0193BE204960905334B4854F8253A81D" + "OwnerKey" = "8:_7C7E25C04552496696C81A549F4566AD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0193BE204960905334B4854F8253A81D" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0193BE204960905334B4854F8253A81D" + "OwnerKey" = "8:_2B092EC13E797658F99B663CA349E6C6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0193BE204960905334B4854F8253A81D" + "OwnerKey" = "8:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_078D95776C5A454089034ACCCC658380" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0F190CF5DCA7BBE4C329D271D107EB5A" + "OwnerKey" = "8:_27A9884B868840F9858D3ECF956B4289" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0F190CF5DCA7BBE4C329D271D107EB5A" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0F190CF5DCA7BBE4C329D271D107EB5A" + "OwnerKey" = "8:_3CEB98B33E64F4C9936AD0625B13DAC8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0F190CF5DCA7BBE4C329D271D107EB5A" + "OwnerKey" = "8:_7C7E25C04552496696C81A549F4566AD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0F190CF5DCA7BBE4C329D271D107EB5A" + "OwnerKey" = "8:_837C0EA009C6435583E218E4E8D61C43" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0F190CF5DCA7BBE4C329D271D107EB5A" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0F190CF5DCA7BBE4C329D271D107EB5A" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_0F190CF5DCA7BBE4C329D271D107EB5A" + "OwnerKey" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_123E25EA3E19B1C0F1E5412355EDBC2E" + "OwnerKey" = "8:_FEC488E5088EC06A8854698D21C8B0A6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_123E25EA3E19B1C0F1E5412355EDBC2E" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_123E25EA3E19B1C0F1E5412355EDBC2E" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_123E25EA3E19B1C0F1E5412355EDBC2E" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_123E25EA3E19B1C0F1E5412355EDBC2E" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_12E217D3323A4946B35E7C2003FABA90" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + "OwnerKey" = "8:_FEC488E5088EC06A8854698D21C8B0A6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_19AB21EAD8C3456FB43BF82BD1B051DA" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1AC19D6BAD25497981F990F0F23C763E" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_1BBE68A140384312AC8E0D130DA3D1A2" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_23D13C78F433A87429F5BE963A69B4CA" + "OwnerKey" = "8:_FEC488E5088EC06A8854698D21C8B0A6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_23D13C78F433A87429F5BE963A69B4CA" + "OwnerKey" = "8:_123E25EA3E19B1C0F1E5412355EDBC2E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_23D13C78F433A87429F5BE963A69B4CA" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_23D13C78F433A87429F5BE963A69B4CA" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_23D13C78F433A87429F5BE963A69B4CA" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_23D13C78F433A87429F5BE963A69B4CA" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_27A9884B868840F9858D3ECF956B4289" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2915DBA08C1181C739BFA3F877BE467B" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2915DBA08C1181C739BFA3F877BE467B" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2915DBA08C1181C739BFA3F877BE467B" + "OwnerKey" = "8:_19AB21EAD8C3456FB43BF82BD1B051DA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2915DBA08C1181C739BFA3F877BE467B" + "OwnerKey" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2915DBA08C1181C739BFA3F877BE467B" + "OwnerKey" = "8:_837C0EA009C6435583E218E4E8D61C43" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2915DBA08C1181C739BFA3F877BE467B" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2915DBA08C1181C739BFA3F877BE467B" + "OwnerKey" = "8:_12E217D3323A4946B35E7C2003FABA90" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2915DBA08C1181C739BFA3F877BE467B" + "OwnerKey" = "8:_27A9884B868840F9858D3ECF956B4289" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2915DBA08C1181C739BFA3F877BE467B" + "OwnerKey" = "8:_7C7E25C04552496696C81A549F4566AD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2915DBA08C1181C739BFA3F877BE467B" + "OwnerKey" = "8:_0F190CF5DCA7BBE4C329D271D107EB5A" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2B092EC13E797658F99B663CA349E6C6" + "OwnerKey" = "8:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2B092EC13E797658F99B663CA349E6C6" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2B092EC13E797658F99B663CA349E6C6" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2B092EC13E797658F99B663CA349E6C6" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2B092EC13E797658F99B663CA349E6C6" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2CD1F1C87A585BA8A15208C3405334C8" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2CD1F1C87A585BA8A15208C3405334C8" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2CD1F1C87A585BA8A15208C3405334C8" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_333327DE3B07DC8128F97CFE85C680F3" + "OwnerKey" = "8:_796FD57A229CE7E724EB6AE69A7BD0F8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_333327DE3B07DC8128F97CFE85C680F3" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_333327DE3B07DC8128F97CFE85C680F3" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3B0B56BD1CE67AB0F07034CC3BEDD477" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3B0B56BD1CE67AB0F07034CC3BEDD477" + "OwnerKey" = "8:_2CD1F1C87A585BA8A15208C3405334C8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3B0B56BD1CE67AB0F07034CC3BEDD477" + "OwnerKey" = "8:_542199B9FA1340818D3C1816761919C7" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3B0B56BD1CE67AB0F07034CC3BEDD477" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3B0B56BD1CE67AB0F07034CC3BEDD477" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3B0B56BD1CE67AB0F07034CC3BEDD477" + "OwnerKey" = "8:_ABA3D3EACC8E4D5EAA0FD7E70EF106D0" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3CEB98B33E64F4C9936AD0625B13DAC8" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3CEB98B33E64F4C9936AD0625B13DAC8" + "OwnerKey" = "8:_7C7E25C04552496696C81A549F4566AD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3CEB98B33E64F4C9936AD0625B13DAC8" + "OwnerKey" = "8:_837C0EA009C6435583E218E4E8D61C43" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3CEB98B33E64F4C9936AD0625B13DAC8" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3CEB98B33E64F4C9936AD0625B13DAC8" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3E323F44761E4296A53D99323CD54AB2" + "OwnerKey" = "8:_333327DE3B07DC8128F97CFE85C680F3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3E323F44761E4296A53D99323CD54AB2" + "OwnerKey" = "8:_796FD57A229CE7E724EB6AE69A7BD0F8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3E323F44761E4296A53D99323CD54AB2" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_3E323F44761E4296A53D99323CD54AB2" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_4A7F2FFC6E2431C0C5AD38BF5090B0CB" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_4A7F2FFC6E2431C0C5AD38BF5090B0CB" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_4A7F2FFC6E2431C0C5AD38BF5090B0CB" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_4A7F2FFC6E2431C0C5AD38BF5090B0CB" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_4A7F2FFC6E2431C0C5AD38BF5090B0CB" + "OwnerKey" = "8:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_542199B9FA1340818D3C1816761919C7" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_69FC3E10E702922EA1A7CACCE8CCD778" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_69FC3E10E702922EA1A7CACCE8CCD778" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_69FC3E10E702922EA1A7CACCE8CCD778" + "OwnerKey" = "8:_333327DE3B07DC8128F97CFE85C680F3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_69FC3E10E702922EA1A7CACCE8CCD778" + "OwnerKey" = "8:_796FD57A229CE7E724EB6AE69A7BD0F8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_6FD7E44A131BC6BA5FCD8FCF8E941E72" + "OwnerKey" = "8:_FEC488E5088EC06A8854698D21C8B0A6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_6FD7E44A131BC6BA5FCD8FCF8E941E72" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_6FD7E44A131BC6BA5FCD8FCF8E941E72" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_6FD7E44A131BC6BA5FCD8FCF8E941E72" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_6FD7E44A131BC6BA5FCD8FCF8E941E72" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_78B2CEE29937646F24363A16777F1240" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_78B2CEE29937646F24363A16777F1240" + "OwnerKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_78B2CEE29937646F24363A16777F1240" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_78B2CEE29937646F24363A16777F1240" + "OwnerKey" = "8:_19AB21EAD8C3456FB43BF82BD1B051DA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_78B2CEE29937646F24363A16777F1240" + "OwnerKey" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_78B2CEE29937646F24363A16777F1240" + "OwnerKey" = "8:_837C0EA009C6435583E218E4E8D61C43" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_78B2CEE29937646F24363A16777F1240" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_78B2CEE29937646F24363A16777F1240" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_78B2CEE29937646F24363A16777F1240" + "OwnerKey" = "8:_12E217D3323A4946B35E7C2003FABA90" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_78B2CEE29937646F24363A16777F1240" + "OwnerKey" = "8:_27A9884B868840F9858D3ECF956B4289" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_78B2CEE29937646F24363A16777F1240" + "OwnerKey" = "8:_7C7E25C04552496696C81A549F4566AD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_78B2CEE29937646F24363A16777F1240" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_796FD57A229CE7E724EB6AE69A7BD0F8" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_796FD57A229CE7E724EB6AE69A7BD0F8" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_7C7E25C04552496696C81A549F4566AD" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_80EB1D36530C36E6CD2F8F5214898BFA" + "OwnerKey" = "8:_FEC488E5088EC06A8854698D21C8B0A6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_80EB1D36530C36E6CD2F8F5214898BFA" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_80EB1D36530C36E6CD2F8F5214898BFA" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_80EB1D36530C36E6CD2F8F5214898BFA" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_80EB1D36530C36E6CD2F8F5214898BFA" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_837C0EA009C6435583E218E4E8D61C43" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_84EC3A53DF515F5C74BEE25AFBC27C6A" + "OwnerKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_84EC3A53DF515F5C74BEE25AFBC27C6A" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_84EC3A53DF515F5C74BEE25AFBC27C6A" + "OwnerKey" = "8:_6FD7E44A131BC6BA5FCD8FCF8E941E72" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_84EC3A53DF515F5C74BEE25AFBC27C6A" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_84EC3A53DF515F5C74BEE25AFBC27C6A" + "OwnerKey" = "8:_19AB21EAD8C3456FB43BF82BD1B051DA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_84EC3A53DF515F5C74BEE25AFBC27C6A" + "OwnerKey" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_84EC3A53DF515F5C74BEE25AFBC27C6A" + "OwnerKey" = "8:_837C0EA009C6435583E218E4E8D61C43" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_84EC3A53DF515F5C74BEE25AFBC27C6A" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_84EC3A53DF515F5C74BEE25AFBC27C6A" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_84EC3A53DF515F5C74BEE25AFBC27C6A" + "OwnerKey" = "8:_12E217D3323A4946B35E7C2003FABA90" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_84EC3A53DF515F5C74BEE25AFBC27C6A" + "OwnerKey" = "8:_27A9884B868840F9858D3ECF956B4289" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_84EC3A53DF515F5C74BEE25AFBC27C6A" + "OwnerKey" = "8:_7C7E25C04552496696C81A549F4566AD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_84EC3A53DF515F5C74BEE25AFBC27C6A" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + "OwnerKey" = "8:_0193BE204960905334B4854F8253A81D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + "OwnerKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + "OwnerKey" = "8:_19AB21EAD8C3456FB43BF82BD1B051DA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + "OwnerKey" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + "OwnerKey" = "8:_837C0EA009C6435583E218E4E8D61C43" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + "OwnerKey" = "8:_12E217D3323A4946B35E7C2003FABA90" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + "OwnerKey" = "8:_27A9884B868840F9858D3ECF956B4289" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + "OwnerKey" = "8:_7C7E25C04552496696C81A549F4566AD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_A4216CD9E1DE39734E77DE7F4FF7F242" + "OwnerKey" = "8:_796FD57A229CE7E724EB6AE69A7BD0F8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_A4216CD9E1DE39734E77DE7F4FF7F242" + "OwnerKey" = "8:_333327DE3B07DC8128F97CFE85C680F3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_A4216CD9E1DE39734E77DE7F4FF7F242" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_A4216CD9E1DE39734E77DE7F4FF7F242" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_ABA3D3EACC8E4D5EAA0FD7E70EF106D0" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AC786888A5534E82D59D0693BA259CFD" + "OwnerKey" = "8:_796FD57A229CE7E724EB6AE69A7BD0F8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AC786888A5534E82D59D0693BA259CFD" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AC786888A5534E82D59D0693BA259CFD" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_78B2CEE29937646F24363A16777F1240" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_23D13C78F433A87429F5BE963A69B4CA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_FEC488E5088EC06A8854698D21C8B0A6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_796FD57A229CE7E724EB6AE69A7BD0F8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_19AB21EAD8C3456FB43BF82BD1B051DA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_837C0EA009C6435583E218E4E8D61C43" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_12E217D3323A4946B35E7C2003FABA90" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_27A9884B868840F9858D3ECF956B4289" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_7C7E25C04552496696C81A549F4566AD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_B5FC0F02F298172973F811F32D7B1B4B" + "OwnerKey" = "8:_FEC488E5088EC06A8854698D21C8B0A6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_B5FC0F02F298172973F811F32D7B1B4B" + "OwnerKey" = "8:_6FD7E44A131BC6BA5FCD8FCF8E941E72" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_B5FC0F02F298172973F811F32D7B1B4B" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_B5FC0F02F298172973F811F32D7B1B4B" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_B5FC0F02F298172973F811F32D7B1B4B" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_B5FC0F02F298172973F811F32D7B1B4B" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C0B9306A71E944CBF75AEAF7CC3EAC6B" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C0B9306A71E944CBF75AEAF7CC3EAC6B" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C0B9306A71E944CBF75AEAF7CC3EAC6B" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C0B9306A71E944CBF75AEAF7CC3EAC6B" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C0B9306A71E944CBF75AEAF7CC3EAC6B" + "OwnerKey" = "8:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C46210393B76C6C64A1911813001C637" + "OwnerKey" = "8:_69FC3E10E702922EA1A7CACCE8CCD778" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_2915DBA08C1181C739BFA3F877BE467B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_CB1C00E60B5A25DB2DD85B5DA58469E3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_796FD57A229CE7E724EB6AE69A7BD0F8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_23D13C78F433A87429F5BE963A69B4CA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_19AB21EAD8C3456FB43BF82BD1B051DA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_837C0EA009C6435583E218E4E8D61C43" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_12E217D3323A4946B35E7C2003FABA90" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_27A9884B868840F9858D3ECF956B4289" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_7C7E25C04552496696C81A549F4566AD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "OwnerKey" = "8:_0F190CF5DCA7BBE4C329D271D107EB5A" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CA9663F4AD4FCF8B323204D4ED387E87" + "OwnerKey" = "8:_78B2CEE29937646F24363A16777F1240" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CA9663F4AD4FCF8B323204D4ED387E87" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CA9663F4AD4FCF8B323204D4ED387E87" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CA9663F4AD4FCF8B323204D4ED387E87" + "OwnerKey" = "8:_19AB21EAD8C3456FB43BF82BD1B051DA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CA9663F4AD4FCF8B323204D4ED387E87" + "OwnerKey" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CA9663F4AD4FCF8B323204D4ED387E87" + "OwnerKey" = "8:_837C0EA009C6435583E218E4E8D61C43" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CA9663F4AD4FCF8B323204D4ED387E87" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CA9663F4AD4FCF8B323204D4ED387E87" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CA9663F4AD4FCF8B323204D4ED387E87" + "OwnerKey" = "8:_12E217D3323A4946B35E7C2003FABA90" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CA9663F4AD4FCF8B323204D4ED387E87" + "OwnerKey" = "8:_27A9884B868840F9858D3ECF956B4289" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CA9663F4AD4FCF8B323204D4ED387E87" + "OwnerKey" = "8:_7C7E25C04552496696C81A549F4566AD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CA9663F4AD4FCF8B323204D4ED387E87" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CB1C00E60B5A25DB2DD85B5DA58469E3" + "OwnerKey" = "8:_23D13C78F433A87429F5BE963A69B4CA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CB1C00E60B5A25DB2DD85B5DA58469E3" + "OwnerKey" = "8:_FEC488E5088EC06A8854698D21C8B0A6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CB1C00E60B5A25DB2DD85B5DA58469E3" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CB1C00E60B5A25DB2DD85B5DA58469E3" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CB1C00E60B5A25DB2DD85B5DA58469E3" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CB1C00E60B5A25DB2DD85B5DA58469E3" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_CB1C00E60B5A25DB2DD85B5DA58469E3" + "OwnerKey" = "8:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_19AB21EAD8C3456FB43BF82BD1B051DA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_837C0EA009C6435583E218E4E8D61C43" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_12E217D3323A4946B35E7C2003FABA90" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_27A9884B868840F9858D3ECF956B4289" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_7C7E25C04552496696C81A549F4566AD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_2B092EC13E797658F99B663CA349E6C6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "OwnerKey" = "8:_0F190CF5DCA7BBE4C329D271D107EB5A" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DAEF40376642A0288038EFDFDAA075EE" + "OwnerKey" = "8:_69FC3E10E702922EA1A7CACCE8CCD778" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DAEF40376642A0288038EFDFDAA075EE" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DAEF40376642A0288038EFDFDAA075EE" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "OwnerKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "OwnerKey" = "8:_6FD7E44A131BC6BA5FCD8FCF8E941E72" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "OwnerKey" = "8:_19AB21EAD8C3456FB43BF82BD1B051DA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "OwnerKey" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "OwnerKey" = "8:_837C0EA009C6435583E218E4E8D61C43" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "OwnerKey" = "8:_12E217D3323A4946B35E7C2003FABA90" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "OwnerKey" = "8:_27A9884B868840F9858D3ECF956B4289" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "OwnerKey" = "8:_7C7E25C04552496696C81A549F4566AD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "OwnerKey" = "8:_2B092EC13E797658F99B663CA349E6C6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "OwnerKey" = "8:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E73319DBA3103E80973C2846D5755E15" + "OwnerKey" = "8:_6FD7E44A131BC6BA5FCD8FCF8E941E72" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E73319DBA3103E80973C2846D5755E15" + "OwnerKey" = "8:_FEC488E5088EC06A8854698D21C8B0A6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E73319DBA3103E80973C2846D5755E15" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E73319DBA3103E80973C2846D5755E15" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E73319DBA3103E80973C2846D5755E15" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E73319DBA3103E80973C2846D5755E15" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "OwnerKey" = "8:_19AB21EAD8C3456FB43BF82BD1B051DA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "OwnerKey" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "OwnerKey" = "8:_837C0EA009C6435583E218E4E8D61C43" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "OwnerKey" = "8:_12E217D3323A4946B35E7C2003FABA90" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "OwnerKey" = "8:_27A9884B868840F9858D3ECF956B4289" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "OwnerKey" = "8:_7C7E25C04552496696C81A549F4566AD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "OwnerKey" = "8:_2B092EC13E797658F99B663CA349E6C6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "OwnerKey" = "8:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "OwnerKey" = "8:_0F190CF5DCA7BBE4C329D271D107EB5A" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FEC488E5088EC06A8854698D21C8B0A6" + "OwnerKey" = "8:_796FD57A229CE7E724EB6AE69A7BD0F8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FEC488E5088EC06A8854698D21C8B0A6" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FEC488E5088EC06A8854698D21C8B0A6" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FEC488E5088EC06A8854698D21C8B0A6" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_FEC488E5088EC06A8854698D21C8B0A6" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_3B0B56BD1CE67AB0F07034CC3BEDD477" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_2CD1F1C87A585BA8A15208C3405334C8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_DAEF40376642A0288038EFDFDAA075EE" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_69FC3E10E702922EA1A7CACCE8CCD778" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_2B092EC13E797658F99B663CA349E6C6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_078D95776C5A454089034ACCCC658380" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_12E217D3323A4946B35E7C2003FABA90" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_19AB21EAD8C3456FB43BF82BD1B051DA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_1AC19D6BAD25497981F990F0F23C763E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_1BBE68A140384312AC8E0D130DA3D1A2" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_0F190CF5DCA7BBE4C329D271D107EB5A" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_27A9884B868840F9858D3ECF956B4289" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_542199B9FA1340818D3C1816761919C7" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_3CEB98B33E64F4C9936AD0625B13DAC8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_7C7E25C04552496696C81A549F4566AD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_837C0EA009C6435583E218E4E8D61C43" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_8646CF2171E44BF3A78C9F4EAF8B68CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_ABA3D3EACC8E4D5EAA0FD7E70EF106D0" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_BC507284ED9445BD914954D5C18F75CF" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_CADB28F898F44B34B55BFDBD008082B4" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_0193BE204960905334B4854F8253A81D" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_123E25EA3E19B1C0F1E5412355EDBC2E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_23D13C78F433A87429F5BE963A69B4CA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_2915DBA08C1181C739BFA3F877BE467B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_333327DE3B07DC8128F97CFE85C680F3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_3E323F44761E4296A53D99323CD54AB2" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_4A7F2FFC6E2431C0C5AD38BF5090B0CB" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_6FD7E44A131BC6BA5FCD8FCF8E941E72" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_78B2CEE29937646F24363A16777F1240" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_796FD57A229CE7E724EB6AE69A7BD0F8" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_80EB1D36530C36E6CD2F8F5214898BFA" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_84EC3A53DF515F5C74BEE25AFBC27C6A" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_A4216CD9E1DE39734E77DE7F4FF7F242" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_AC786888A5534E82D59D0693BA259CFD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_B5FC0F02F298172973F811F32D7B1B4B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_C0B9306A71E944CBF75AEAF7CC3EAC6B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_C4DB1E2CE4A106DB3BE1781738B3F20E" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_CA9663F4AD4FCF8B323204D4ED387E87" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_CB1C00E60B5A25DB2DD85B5DA58469E3" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_D5DCA0B07F7B34F252B9B96679612940" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_DD76E7B096F522BBB5991051663B34FD" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_E73319DBA3103E80973C2846D5755E15" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_FE7B4AB50C0AE85DA166772EE93E4674" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_UNDEFINED" + "OwnerKey" = "8:_FEC488E5088EC06A8854698D21C8B0A6" + "MsmSig" = "8:_UNDEFINED" + } + } + "Configurations" + { + "Debug" + { + "DisplayName" = "8:Debug" + "IsDebugOnly" = "11:TRUE" + "IsReleaseOnly" = "11:FALSE" + "OutputFilename" = "8:Debug\\BizTalkODBCAdapter2010Debug.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:TRUE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + "Items" + { + } + } + } + "Release" + { + "DisplayName" = "8:Release" + "IsDebugOnly" = "11:FALSE" + "IsReleaseOnly" = "11:TRUE" + "OutputFilename" = "8:Release\\BizTalkODBCAdapter2010.msi" + "PackageFilesAs" = "3:2" + "PackageFileSize" = "3:-2147483648" + "CabType" = "3:1" + "Compression" = "3:2" + "SignOutput" = "11:FALSE" + "CertificateFile" = "8:" + "PrivateKeyFile" = "8:" + "TimeStampServer" = "8:" + "InstallerBootstrapper" = "3:2" + "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" + { + "Enabled" = "11:TRUE" + "PromptEnabled" = "11:TRUE" + "PrerequisitesLocation" = "2:1" + "Url" = "8:" + "ComponentsUrl" = "8:" + "Items" + { + } + } + } + } + "Deployable" + { + "CustomAction" + { + "{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_4AA323C2EBBC4E8485BC5E848E8AE227" + { + "Name" = "8:Primary output from ODBCQueryProcessor (Active)" + "Condition" = "8:" + "Object" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "FileType" = "3:1" + "InstallAction" = "3:4" + "Arguments" = "8:" + "EntryPoint" = "8:" + "Sequence" = "3:1" + "Identifier" = "8:_BD2C6F12_7569_439F_9229_7E148F049B52" + "InstallerClass" = "11:TRUE" + "CustomActionData" = "8:" + } + "{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_800095F4D2014EE9973958074AB924EE" + { + "Name" = "8:Primary output from ODBCQueryProcessor (Active)" + "Condition" = "8:" + "Object" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "FileType" = "3:1" + "InstallAction" = "3:1" + "Arguments" = "8:" + "EntryPoint" = "8:" + "Sequence" = "3:1" + "Identifier" = "8:_18180C4C_FE92_4CCA_AE45_2A66966C6ECF" + "InstallerClass" = "11:TRUE" + "CustomActionData" = "8:" + } + "{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_E040B27C057B465484681955FBDAB36A" + { + "Name" = "8:Primary output from ODBCQueryProcessor (Active)" + "Condition" = "8:" + "Object" = "8:_E8BA589AE9754D4D81A6E22AAB39330D" + "FileType" = "3:1" + "InstallAction" = "3:2" + "Arguments" = "8:" + "EntryPoint" = "8:" + "Sequence" = "3:1" + "Identifier" = "8:_9D0CDD17_23EC_40DE_96B5_E03055210E25" + "InstallerClass" = "11:TRUE" + "CustomActionData" = "8:" + } + } + "DefaultFeature" + { + "Name" = "8:DefaultFeature" + "Title" = "8:" + "Description" = "8:" + } + "ExternalPersistence" + { + "LaunchCondition" + { + "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_07EE1C7583584DA6AE953A41AABEB945" + { + "Name" = "8:.NET Framework" + "Message" = "8:[VSDNETMSG]" + "FrameworkVersion" = "8:.NETFramework,Version=v4.0" + "AllowLaterVersions" = "11:FALSE" + "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=9832" + } + } + } + "File" + { + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_0193BE204960905334B4854F8253A81D" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.Streaming, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_0193BE204960905334B4854F8253A81D" + { + "Name" = "8:Microsoft.BizTalk.Streaming.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.Streaming.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_0F190CF5DCA7BBE4C329D271D107EB5A" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:ODBCBaseAdapter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0ad1f077efbaab97, processorArchitecture=MSIL" + "ScatterAssemblies" + { + } + "SourcePath" = "8:ODBCBaseAdapter.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_123E25EA3E19B1C0F1E5412355EDBC2E" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.Tracking.BasicTypes, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_123E25EA3E19B1C0F1E5412355EDBC2E" + { + "Name" = "8:Microsoft.BizTalk.Tracking.BasicTypes.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.Tracking.BasicTypes.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_1923F21CB9AC639D9BFE3A5D3EDC7BA8" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Microsoft.XLANGs.BizTalk.Engine, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + } + "SourcePath" = "8:Microsoft.XLANGs.BizTalk.Engine.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_23D13C78F433A87429F5BE963A69B4CA" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.CachingService, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_23D13C78F433A87429F5BE963A69B4CA" + { + "Name" = "8:Microsoft.BizTalk.CachingService.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.CachingService.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_2915DBA08C1181C739BFA3F877BE467B" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.Interop.TransportProxy, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_2915DBA08C1181C739BFA3F877BE467B" + { + "Name" = "8:Microsoft.BizTalk.Interop.TransportProxy.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.Interop.TransportProxy.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_2B092EC13E797658F99B663CA349E6C6" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Microsoft.XLANGs.Engine, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + } + "SourcePath" = "8:Microsoft.XLANGs.Engine.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_2CD1F1C87A585BA8A15208C3405334C8" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:ODBCSchemaWizard, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0ad1f077efbaab97, processorArchitecture=MSIL" + "ScatterAssemblies" + { + } + "SourcePath" = "8:ODBCSchemaWizard.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_333327DE3B07DC8128F97CFE85C680F3" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.ObjectModel, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_333327DE3B07DC8128F97CFE85C680F3" + { + "Name" = "8:Microsoft.BizTalk.ObjectModel.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.ObjectModel.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3B0B56BD1CE67AB0F07034CC3BEDD477" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:ODBCDriverPrompt, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0ad1f077efbaab97, processorArchitecture=MSIL" + "ScatterAssemblies" + { + } + "SourcePath" = "8:ODBCDriverPrompt.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3CEB98B33E64F4C9936AD0625B13DAC8" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:ODBCQueryProcessor, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0ad1f077efbaab97, processorArchitecture=MSIL" + "ScatterAssemblies" + { + } + "SourcePath" = "8:ODBCQueryProcessor.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3E323F44761E4296A53D99323CD54AB2" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.TypeSystem, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_3E323F44761E4296A53D99323CD54AB2" + { + "Name" = "8:Microsoft.BizTalk.TypeSystem.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.TypeSystem.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_4A7F2FFC6E2431C0C5AD38BF5090B0CB" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.Security.SSPI, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=x86" + "ScatterAssemblies" + { + "_4A7F2FFC6E2431C0C5AD38BF5090B0CB" + { + "Name" = "8:Microsoft.BizTalk.Security.SSPI.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.Security.SSPI.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_69FC3E10E702922EA1A7CACCE8CCD778" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:EnvDTE, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "ScatterAssemblies" + { + } + "SourcePath" = "8:EnvDTE.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_6FD7E44A131BC6BA5FCD8FCF8E941E72" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.RuleEngineExtensions, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_6FD7E44A131BC6BA5FCD8FCF8E941E72" + { + "Name" = "8:Microsoft.BizTalk.RuleEngineExtensions.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.RuleEngineExtensions.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_78B2CEE29937646F24363A16777F1240" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.CommonSettings, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_78B2CEE29937646F24363A16777F1240" + { + "Name" = "8:Microsoft.BizTalk.CommonSettings.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.CommonSettings.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_796FD57A229CE7E724EB6AE69A7BD0F8" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.Adapter.Framework, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_796FD57A229CE7E724EB6AE69A7BD0F8" + { + "Name" = "8:Microsoft.BizTalk.Adapter.Framework.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.Adapter.Framework.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_80EB1D36530C36E6CD2F8F5214898BFA" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.MSIManager, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_80EB1D36530C36E6CD2F8F5214898BFA" + { + "Name" = "8:Microsoft.BizTalk.MSIManager.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.MSIManager.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_84EC3A53DF515F5C74BEE25AFBC27C6A" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.Bam.EventObservation, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_84EC3A53DF515F5C74BEE25AFBC27C6A" + { + "Name" = "8:Microsoft.BizTalk.Bam.EventObservation.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.Bam.EventObservation.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.XPathReader, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_8F6DDE1E3CEC73425D9AD4A613B7F0B0" + { + "Name" = "8:Microsoft.BizTalk.XPathReader.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.XPathReader.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A4216CD9E1DE39734E77DE7F4FF7F242" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.IMS, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_A4216CD9E1DE39734E77DE7F4FF7F242" + { + "Name" = "8:Microsoft.BizTalk.IMS.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.IMS.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_AC786888A5534E82D59D0693BA259CFD" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.Databases, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_AC786888A5534E82D59D0693BA259CFD" + { + "Name" = "8:Microsoft.BizTalk.Databases.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.Databases.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.Tracing, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_AD79ABB10FB8C3AF4C3BB7DE32B092DE" + { + "Name" = "8:Microsoft.BizTalk.Tracing.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.Tracing.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_B5FC0F02F298172973F811F32D7B1B4B" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.BtsDbVersion, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_B5FC0F02F298172973F811F32D7B1B4B" + { + "Name" = "8:Microsoft.BizTalk.BtsDbVersion.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.BtsDbVersion.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C0B9306A71E944CBF75AEAF7CC3EAC6B" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.XLANGs.BizTalk.ProcessInterface, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_C0B9306A71E944CBF75AEAF7CC3EAC6B" + { + "Name" = "8:Microsoft.XLANGs.BizTalk.ProcessInterface.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.XLANGs.BizTalk.ProcessInterface.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_C46210393B76C6C64A1911813001C637" + { + "SourcePath" = "8:dte80a.olb" + "TargetName" = "8:dte80a.olb" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_C4DB1E2CE4A106DB3BE1781738B3F20E" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.Pipeline, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_C4DB1E2CE4A106DB3BE1781738B3F20E" + { + "Name" = "8:Microsoft.BizTalk.Pipeline.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.Pipeline.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CA9663F4AD4FCF8B323204D4ED387E87" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.SqmFramework, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_CA9663F4AD4FCF8B323204D4ED387E87" + { + "Name" = "8:Microsoft.BizTalk.SqmFramework.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.SqmFramework.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_CB1C00E60B5A25DB2DD85B5DA58469E3" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.Interop.Agent, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_CB1C00E60B5A25DB2DD85B5DA58469E3" + { + "Name" = "8:Microsoft.BizTalk.Interop.Agent.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.Interop.Agent.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D5DCA0B07F7B34F252B9B96679612940" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.XLANGs.BaseTypes, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_D5DCA0B07F7B34F252B9B96679612940" + { + "Name" = "8:Microsoft.XLANGs.BaseTypes.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.XLANGs.BaseTypes.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DAEF40376642A0288038EFDFDAA075EE" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:stdole, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" + "ScatterAssemblies" + { + } + "SourcePath" = "8:stdole.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DD76E7B096F522BBB5991051663B34FD" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.XLANGs.RuntimeTypes, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_DD76E7B096F522BBB5991051663B34FD" + { + "Name" = "8:Microsoft.XLANGs.RuntimeTypes.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.XLANGs.RuntimeTypes.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_E73319DBA3103E80973C2846D5755E15" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.RuleEngine, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_E73319DBA3103E80973C2846D5755E15" + { + "Name" = "8:Microsoft.RuleEngine.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.RuleEngine.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_FE7B4AB50C0AE85DA166772EE93E4674" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.GlobalPropertySchemas, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_FE7B4AB50C0AE85DA166772EE93E4674" + { + "Name" = "8:Microsoft.BizTalk.GlobalPropertySchemas.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.GlobalPropertySchemas.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_FEC488E5088EC06A8854698D21C8B0A6" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:TRUE" + "AssemblyAsmDisplayName" = "8:Microsoft.BizTalk.ExplorerOM, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" + "ScatterAssemblies" + { + "_FEC488E5088EC06A8854698D21C8B0A6" + { + "Name" = "8:Microsoft.BizTalk.ExplorerOM.dll" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Microsoft.BizTalk.ExplorerOM.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:TRUE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + } + "FileType" + { + } + "Folder" + { + "{3C67513D-01DD-4637-8A68-80971EB9504F}:_079E1DB4B6F845BAB181AEEFE92B9CFF" + { + "DefaultLocation" = "8:C:\\Program Files\\BizTalk Adapter for ODBC" + "Name" = "8:#1925" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:TARGETDIR" + "Folders" + { + } + } + "{C7E34266-2C30-44B9-A9A3-4E394ABD6E18}:_A8ED5FC1A2C147A099C161688C2F31FF" + { + "Name" = "8:#1927" + "AlwaysCreate" = "11:FALSE" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Property" = "8:GAC" + "Folders" + { + } + } + } + "LaunchCondition" + { + } + "Locator" + { + "{CF66B7F7-B7DA-4B08-A67A-233430638C9C}:_BBFAE06FEC3842C79A7E5CCA59FAA3AA" + { + "Name" = "8:BizTalk Install Folder" + "Root" = "2:1" + "RegKey" = "8:SOFTWARE\\Microsoft\\BizTalk Server\\3.0" + "Value" = "8:InstallPath" + "Property" = "8:BIZTALKINSTALLFOLDER" + } + } + "MsiBootstrapper" + { + "LangId" = "3:1033" + "RequiresElevation" = "11:FALSE" + } + "Product" + { + "Name" = "8:Microsoft Visual Studio" + "ProductName" = "8:BizTalk ODBC Adapter" + "ProductCode" = "8:{211A1DBF-9C0E-4FC2-8943-92085FB479F4}" + "PackageCode" = "8:{0D00289B-71DC-4CE7-B0A2-6FAD81C4F9CB}" + "UpgradeCode" = "8:{0B5BAE97-9C05-41A5-89CC-27E8C45B54B2}" + "AspNetVersion" = "8:4.0.30319.0" + "RestartWWWService" = "11:FALSE" + "RemovePreviousVersions" = "11:FALSE" + "DetectNewerInstalledVersion" = "11:TRUE" + "InstallAllUsers" = "11:TRUE" + "ProductVersion" = "8:1.0.0" + "Manufacturer" = "8:Community" + "ARPHELPTELEPHONE" = "8:" + "ARPHELPLINK" = "8:" + "Title" = "8:BizTalk ODBDC Adapter" + "Subject" = "8:" + "ARPCONTACT" = "8:Community" + "Keywords" = "8:" + "ARPCOMMENTS" = "8:BizTalk ODBC Adapter" + "ARPURLINFOABOUT" = "8:" + "ARPPRODUCTICON" = "8:" + "ARPIconIndex" = "3:0" + "SearchPath" = "8:" + "UseSystemSearchPath" = "11:TRUE" + "TargetPlatform" = "3:0" + "PreBuildEvent" = "8:" + "PostBuildEvent" = "8:" + "RunPostBuildEvent" = "3:0" + } + "Registry" + { + "HKLM" + { + "Keys" + { + } + } + "HKCU" + { + "Keys" + { + } + } + "HKCR" + { + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_25BB50F90506471081D62060BA9F70B5" + { + "Name" = "8:CLSID" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_1E9056796E274E2F970184F712C1BD6E" + { + "Name" = "8:{8d285509-9e4a-4702-a8df-821e0f937d2b}" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_1DE8B25AC2BB4829A1932EF2FE1AA55B" + { + "Name" = "8:Implemented Categories" + "Condition" = "8:" + "AlwaysCreate" = "11:TRUE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_B43A3A96764E4485A47176DDFA0D49CA" + { + "Name" = "8:{7F46FC3E-3C2C-405B-A47F-8D17942BA8F9}" + "Condition" = "8:" + "AlwaysCreate" = "11:TRUE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + } + } + } + "Values" + { + } + } + "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_5440913016DA489886E420BA795658A3" + { + "Name" = "8:BizTalk" + "Condition" = "8:" + "AlwaysCreate" = "11:FALSE" + "DeleteAtUninstall" = "11:FALSE" + "Transitive" = "11:FALSE" + "Keys" + { + } + "Values" + { + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_01044C7F7B9747138561EB6B05CA9E4C" + { + "Name" = "8:TransmitLocation_PageProv" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:{2DE93EE6-CB01-4007-93E9-C3D71689A282}" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_03A2F7DD11EC4D91B9BF6401BD9B2D90" + { + "Name" = "8:SendHandlerPropertiesXML" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_19C0EC81862A40DDB67B2C9DB7F665C7" + { + "Name" = "8:SendLocationPropertiesXML" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_200F043FD484411794FF661AEDA1C1A5" + { + "Name" = "8:Constraints" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:3" + "Value" = "3:81163" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_2DE01D5318F64087BBB272D0264108AE" + { + "Name" = "8:OutboundProtocol_PageProv" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:{2DE93EE6-CB01-4007-93E9-C3D71689A283}" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_39EC4DC56AD640AFB1640E97314F16D8" + { + "Name" = "8:OutboundEngineCLSID" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:{884c48a8-0856-409a-bafa-344257874914}" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_556FAD87C251483FA873861EC038548C" + { + "Name" = "8:ReceiveLocationPropertiesXML" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_5A5922C4ECA54A36AF0F7566DDE670ED" + { + "Name" = "8:AliasesXML" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:ODBC://" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_6042C49571474615BE12F76C19086ABE" + { + "Name" = "8:InboundTypeName" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:Microsoft.BizTalk.Adapters.ODBC.RunTime.ODBCReceiveAdapter.ODBCReceiver, ODBCAdapterManagement, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0ad1f077efbaab97, processorArchitecture=MSIL" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_76A082327612414F8F7A8C45CD75BA07" + { + "Name" = "8:InboundEngineCLSID" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:{4b7d3786-5519-45e5-93e1-7ecfcd918c85}" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_8F743D6852364BB58537137BB6B4B06D" + { + "Name" = "8:" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:BizTalk" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_A35EE9459B614047B0A3137ADDAD97FF" + { + "Name" = "8:ReceiveHandlerPropertiesXML" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_C23E4CC440614FD0BBF7210F4B73F2C0" + { + "Name" = "8:PropertyNameSpace" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:http://schemas.microsoft.com/ODBC" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_DD4BFEB4A43D4A9AA941AAB889FB9468" + { + "Name" = "8:TransPortType" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:ODBC" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_E89FF30A6F094DEBBBF50B4423F86DB1" + { + "Name" = "8:InboundProtocol_PageProv" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:{2DE93EE6-CB01-4007-93E9-C3D71689A281}" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_ECB51173DA214BFC8262046002344CE3" + { + "Name" = "8:OutboundTypeName" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:Microsoft.BizTalk.Adapters.ODBC.RunTime.ODBCTransmitAdapter.ODBCTransmitter, ODBCAdapterManagement, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0ad1f077efbaab97, processorArchitecture=MSIL" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_F100F8A3FCA54C2191BAF4D69168F570" + { + "Name" = "8:ReceiveLocation_PageProv" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:{2DE93EE6-CB01-4007-93E9-C3D71689A280}" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_FB4A4E5BD710429BB73A4CCF3D9AECCE" + { + "Name" = "8:AdapterMgmtTypeName" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:Microsoft.BizTalk.Adapters.ODBC.ODBCDesignTime.AdapterManagement, ODBCAdapterManagement, Version=1.2.0.0, Culture=neutral, PublicKeyToken=0ad1f077efbaab97, processorArchitecture=MSIL" + } + } + } + } + "Values" + { + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_BD8239BDF5154DD3A1BED6C3AE4C1D9C" + { + "Name" = "8:AppID" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:{ea74dc63-3c08-40a1-8737-d68ccaa0130f}" + } + "{ADCFDA98-8FDD-45E4-90BC-E3D20B029870}:_D051537D844B49FB9ED2F54805A14398" + { + "Name" = "8:" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "ValueTypes" = "3:1" + "Value" = "8:Community BizTalk ODBC Adapter" + } + } + } + } + "Values" + { + } + } + } + } + "HKU" + { + "Keys" + { + } + } + "HKPU" + { + "Keys" + { + } + } + } + "Sequences" + { + } + "Shortcut" + { + } + "UserInterface" + { + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_1122453C7E1F402D8D7C1F87C9A93B76" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdUserInterface.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_26546C3E4D6343A9BDE4A07940DC937A" + { + "Name" = "8:#1901" + "Sequence" = "3:2" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_CD6799840BAD4B9DACD6E9F9334B31B2" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_3BC2F22FD243423A8BF23688BBAA0224" + { + "Name" = "8:#1900" + "Sequence" = "3:2" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_00352C7B64564A739C6B8DBFF5951458" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_939D8F75CEDA41E28A59DE2FF01C7830" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A9FA406F0E044E1BB5EF537AF6011529" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_5A9C72CCD892467AA2B6716737B849B9" + { + "Name" = "8:#1902" + "Sequence" = "3:2" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_D8DD5FFE52D24932AD776C11E2DF3D44" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_66EBA3A03DDD4DBDBA5787577084C53D" + { + "UseDynamicProperties" = "11:FALSE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdBasicDialogs.wim" + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_7CECD9CFCF654EDD8A9520BB85652F4F" + { + "Name" = "8:#1901" + "Sequence" = "3:1" + "Attributes" = "3:2" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_2F582CCE66BC494AB47E7B9AF96DD1D8" + { + "Sequence" = "3:100" + "DisplayName" = "8:Progress" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdProgressDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "ShowProgress" + { + "Name" = "8:ShowProgress" + "DisplayName" = "8:#1009" + "Description" = "8:#1109" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:1" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_E87C635E0BEE443499D2444EAD319F15" + { + "Name" = "8:#1902" + "Sequence" = "3:1" + "Attributes" = "3:3" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_166325E9201F40CE8504A2100B738478" + { + "Sequence" = "3:100" + "DisplayName" = "8:Finished" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFinishedDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "UpdateText" + { + "Name" = "8:UpdateText" + "DisplayName" = "8:#1058" + "Description" = "8:#1158" + "Type" = "3:15" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1258" + "DefaultValue" = "8:#1258" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_EEDE30F05E3E48369E4D5B6A0DFB7A6A" + { + "Name" = "8:#1900" + "Sequence" = "3:1" + "Attributes" = "3:1" + "Dialogs" + { + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_223228F358E04A98BF78D66C7C7B3F2D" + { + "Sequence" = "3:200" + "DisplayName" = "8:Installation Folder" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdFolderDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "InstallAllUsersVisible" + { + "Name" = "8:InstallAllUsersVisible" + "DisplayName" = "8:#1059" + "Description" = "8:#1159" + "Type" = "3:5" + "ContextData" = "8:1;True=1;False=0" + "Attributes" = "3:0" + "Setting" = "3:0" + "Value" = "3:0" + "DefaultValue" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_3BB45EA187024D508108A82BAA9F50A4" + { + "Sequence" = "3:100" + "DisplayName" = "8:Welcome" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdWelcomeDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + "CopyrightWarning" + { + "Name" = "8:CopyrightWarning" + "DisplayName" = "8:#1002" + "Description" = "8:#1102" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1202" + "DefaultValue" = "8:#1202" + "UsePlugInResources" = "11:TRUE" + } + "Welcome" + { + "Name" = "8:Welcome" + "DisplayName" = "8:#1003" + "Description" = "8:#1103" + "Type" = "3:3" + "ContextData" = "8:" + "Attributes" = "3:0" + "Setting" = "3:1" + "Value" = "8:#1203" + "DefaultValue" = "8:#1203" + "UsePlugInResources" = "11:TRUE" + } + } + } + "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_4D6B684E851F493087453115DE83BD11" + { + "Sequence" = "3:300" + "DisplayName" = "8:Confirm Installation" + "UseDynamicProperties" = "11:TRUE" + "IsDependency" = "11:FALSE" + "SourcePath" = "8:\\VsdConfirmDlg.wid" + "Properties" + { + "BannerBitmap" + { + "Name" = "8:BannerBitmap" + "DisplayName" = "8:#1001" + "Description" = "8:#1101" + "Type" = "3:8" + "ContextData" = "8:Bitmap" + "Attributes" = "3:4" + "Setting" = "3:1" + "UsePlugInResources" = "11:TRUE" + } + } + } + } + } + } + "MergeModule" + { + } + "ProjectOutput" + { + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_078D95776C5A454089034ACCCC658380" + { + "SourcePath" = "8:..\\Adapter\\Design-Time\\obj\\Release\\ODBCAdapterManagement.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{CD29DF32-44FE-4CC6-A43E-01A74B25B9E3}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_12E217D3323A4946B35E7C2003FABA90" + { + "SourcePath" = "8:..\\BaseAdapter\\obj\\Release\\ODBCBaseAdapter.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_A8ED5FC1A2C147A099C161688C2F31FF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{6EF6BB4C-9417-4CAE-990D-49F1F368284B}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_19AB21EAD8C3456FB43BF82BD1B051DA" + { + "SourcePath" = "8:..\\BaseAdapter\\obj\\Release\\ODBCBaseAdapter.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{6EF6BB4C-9417-4CAE-990D-49F1F368284B}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_1AC19D6BAD25497981F990F0F23C763E" + { + "SourcePath" = "8:..\\ODBCDriverPrompt\\obj\\Release\\ODBCDriverPrompt.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_A8ED5FC1A2C147A099C161688C2F31FF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{F25132D9-07AA-4B41-90AD-828E54704692}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_1BBE68A140384312AC8E0D130DA3D1A2" + { + "SourcePath" = "8:..\\ODBCDriverPrompt\\obj\\Release\\ODBCDriverPrompt.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{F25132D9-07AA-4B41-90AD-828E54704692}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_27A9884B868840F9858D3ECF956B4289" + { + "SourcePath" = "8:..\\ODBCQueryProcessor\\obj\\Release\\ODBCQueryProcessor.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_A8ED5FC1A2C147A099C161688C2F31FF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{516F27B0-23E4-4704-9A86-A5064769522A}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_542199B9FA1340818D3C1816761919C7" + { + "SourcePath" = "8:..\\ODBCSchemaWizard\\obj\\Release\\ODBCSchemaWizard.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_A8ED5FC1A2C147A099C161688C2F31FF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{3BCB956F-E5FB-4D40-9090-8E44E92C5353}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_5B7EA5B25E2743E5B85DCB503B5FFBBD" + { + "SourcePath" = "8:..\\TestHarness\\obj\\Release\\Microsoft.BizTalk.Adapters.ODBC.TestHarness.exe" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{21B99320-0A35-4B38-B876-C090D198795E}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_7C7E25C04552496696C81A549F4566AD" + { + "SourcePath" = "8:..\\Adapter\\Run-Time\\ODBCReceive\\obj\\Release\\ODBCReceiveAdapter.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_A8ED5FC1A2C147A099C161688C2F31FF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{16B6C5EF-0B60-4D90-9A79-69B1CADA756A}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_837C0EA009C6435583E218E4E8D61C43" + { + "SourcePath" = "8:..\\Adapter\\Run-Time\\ODBCReceive\\obj\\Release\\ODBCReceiveAdapter.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{16B6C5EF-0B60-4D90-9A79-69B1CADA756A}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_8646CF2171E44BF3A78C9F4EAF8B68CF" + { + "SourcePath" = "8:..\\Adapter\\Design-Time\\obj\\Release\\ODBCAdapterManagement.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_A8ED5FC1A2C147A099C161688C2F31FF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{CD29DF32-44FE-4CC6-A43E-01A74B25B9E3}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_ABA3D3EACC8E4D5EAA0FD7E70EF106D0" + { + "SourcePath" = "8:..\\ODBCSchemaWizard\\obj\\Release\\ODBCSchemaWizard.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{3BCB956F-E5FB-4D40-9090-8E44E92C5353}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_BC507284ED9445BD914954D5C18F75CF" + { + "SourcePath" = "8:..\\Adapter\\Run-Time\\ODBCTransmit\\obj\\Release\\ODBCTransmitAdapter.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{6ED3D08A-2369-441B-BE6F-AF06A94B4674}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_CADB28F898F44B34B55BFDBD008082B4" + { + "SourcePath" = "8:..\\Adapter\\Run-Time\\ODBCTransmit\\obj\\Release\\ODBCTransmitAdapter.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_A8ED5FC1A2C147A099C161688C2F31FF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{6ED3D08A-2369-441B-BE6F-AF06A94B4674}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_E8BA589AE9754D4D81A6E22AAB39330D" + { + "SourcePath" = "8:..\\ODBCQueryProcessor\\obj\\Release\\ODBCQueryProcessor.dll" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_079E1DB4B6F845BAB181AEEFE92B9CFF" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:FALSE" + "IsolateTo" = "8:" + "ProjectOutputGroupRegister" = "3:1" + "OutputConfiguration" = "8:" + "OutputGroupCanonicalName" = "8:Built" + "OutputProjectGuid" = "8:{516F27B0-23E4-4704-9A86-A5064769522A}" + "ShowKeyOutput" = "11:TRUE" + "ExcludeFilters" + { + } + } + } + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/AssemblyInfo.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/AssemblyInfo.cs new file mode 100644 index 00000000..3ee1df2f --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/AssemblyInfo.cs @@ -0,0 +1,16 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: AssemblyTitle( "BizTalk Server 2006 ODBC Adapter" )] +[assembly: AssemblyDescription( "BizTalk Server 2006 ODBC Adapter" )] +[assembly: AssemblyConfiguration( "" )] +[assembly: AssemblyCompany( "Microsoft Corporation" )] +[assembly: AssemblyProduct( "Microsoft BizTalk Server 2006" )] +[assembly: AssemblyCopyright( "Copyright (C) 2006 Microsoft Corporation. All rights reserved." )] +[assembly: AssemblyTrademark( "" )] +[assembly: AssemblyCulture( "" )] + +[assembly: AssemblyVersion( "1.2.0.0" )] + +[assembly: AssemblyDelaySign( false )] +[assembly: AssemblyKeyName( "" )] \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCAdapter.snk b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCAdapter.snk new file mode 100644 index 0000000000000000000000000000000000000000..0d564ea32858712121e1a4107e9400b9222978b6 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097ln4vQ4k&*q7xIBtACM>^uMjNyP06TNf zDH+G}B9=JY*p#EM9E0?3_%Po57I03rNK(JD11In*3z%gxEcNcc^74h!Kn5rDJNL=1 zbtGWj3vI;cA|lhHEdReXS{NEG?rA(|$tK(`)-GssxzFmqLt}vM(~?oFv<3+oO6^9#QW*Pa@HeX6wRhNdY$yq{w5ftPw(CN& zKAXY%q^8m^B;R`9d|lwb=Oh93Wqi$X^#H9MA@(hNj*=~9So3peD*%N+tOOlYx`2~_ zm^da99t?`XY8BSdN*J;1=SO1j-hYTMjc{@OpS7}{8NZWa=(9cbV>?Abk(%@ zsbbMvj=FE`YbF|;xvTV(62C2&1$A7 z;}@t^2T1c>ax;46MSn&1E3RmsB=%Jzw2lGcI5?&7@%TJctkTR_b3QKPNI`a%ff` + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if ( disposing ) + { + if ( components != null ) + { + components.Dispose( ); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent( ) + { + this.cmdCancel = new System.Windows.Forms.Button( ); + this.chkIncludeUID = new System.Windows.Forms.CheckBox( ); + this.Label1 = new System.Windows.Forms.Label( ); + this.cmdNewDSN = new System.Windows.Forms.Button( ); + this.cmdOK = new System.Windows.Forms.Button( ); + this.lstDSNs = new System.Windows.Forms.ListBox( ); + this.SuspendLayout( ); + // + // cmdCancel + // + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.Location = new System.Drawing.Point( 308, 64 ); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size( 104, 24 ); + this.cmdCancel.TabIndex = 11; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.Click += new System.EventHandler( this.cmdCancel_Click ); + // + // chkIncludeUID + // + this.chkIncludeUID.Checked = true; + this.chkIncludeUID.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkIncludeUID.Location = new System.Drawing.Point( 8, 185 ); + this.chkIncludeUID.Name = "chkIncludeUID"; + this.chkIncludeUID.Size = new System.Drawing.Size( 288, 16 ); + this.chkIncludeUID.TabIndex = 10; + this.chkIncludeUID.Text = "Include UserID and Password"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point( 8, 8 ); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size( 408, 16 ); + this.Label1.TabIndex = 9; + this.Label1.Text = "Please select a data source name"; + // + // cmdNewDSN + // + this.cmdNewDSN.Location = new System.Drawing.Point( 308, 155 ); + this.cmdNewDSN.Name = "cmdNewDSN"; + this.cmdNewDSN.Size = new System.Drawing.Size( 104, 24 ); + this.cmdNewDSN.TabIndex = 8; + this.cmdNewDSN.Text = "New DSN..."; + this.cmdNewDSN.Click += new System.EventHandler( this.cmdNewDSN_Click ); + // + // cmdOK + // + this.cmdOK.Location = new System.Drawing.Point( 308, 32 ); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size( 104, 24 ); + this.cmdOK.TabIndex = 7; + this.cmdOK.Text = "OK"; + this.cmdOK.Click += new System.EventHandler( this.cmdOK_Click ); + // + // lstDSNs + // + this.lstDSNs.Location = new System.Drawing.Point( 8, 32 ); + this.lstDSNs.Name = "lstDSNs"; + this.lstDSNs.Size = new System.Drawing.Size( 288, 147 ); + this.lstDSNs.TabIndex = 6; + // + // ODBCDriverDialog + // + this.AcceptButton = this.cmdOK; + this.AutoScaleBaseSize = new System.Drawing.Size( 5, 14 ); + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size( 424, 206 ); + this.Controls.Add( this.cmdCancel ); + this.Controls.Add( this.chkIncludeUID ); + this.Controls.Add( this.Label1 ); + this.Controls.Add( this.cmdNewDSN ); + this.Controls.Add( this.cmdOK ); + this.Controls.Add( this.lstDSNs ); + this.Font = new System.Drawing.Font( "Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( ( byte )( 0 ) ) ); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ODBCDriverDialog"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Choose Data Source"; + this.Load += new System.EventHandler( this.ODBCDriverDialog_Load ); + this.ResumeLayout( false ); + + } + #endregion + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main( ) + { + Application.Run( new ODBCDriverDialog( ) ); + } + + private void cmdOK_Click( object sender, System.EventArgs e ) + { + if ( lstDSNs.SelectedIndex == -1 ) + { + MessageBox.Show( "Please select a database connection", "ODBC Driver Selection" ); + } + else + { + if ( chkIncludeUID.Checked ) + { + PasswordDialog frmCredentials = new PasswordDialog( ); + if ( frmCredentials.ShowDialog( ) == DialogResult.OK ) + { + this.ConnectionString = "DSN=" + lstDSNs.SelectedItem + ";UID=" + frmCredentials.UserID + ";PWD=" + frmCredentials.Password; + this.DialogResult = DialogResult.OK; + this.Close( ); + } + else + { + this.ConnectionString = "DSN=" + lstDSNs.SelectedItem; + this.DialogResult = DialogResult.OK; + this.Close( ); + } + } + else + { + this.ConnectionString = "DSN=" + lstDSNs.SelectedItem; + this.DialogResult = DialogResult.OK; + this.Close( ); + } + } + + } + + private void cmdCancel_Click( object sender, System.EventArgs e ) + { + this.DialogResult = DialogResult.Cancel; + this.Close( ); + } + + private void cmdNewDSN_Click( object sender, System.EventArgs e ) + { + //'----------------------------------------------------------------------------------- + //'DESCRIPTION : Opens up system odbc dialog box, e.g: C:\Windows\system32\odbcad32.exe + //' Crude but works! + //'----------------------------------------------------------------------------------- + + string strErMsg = "Failed to open system ODBC dialogue box"; + string strPath = Environment.SystemDirectory + "\\odbcad32.exe"; + //Process proDSN; + //Dim ipHandle As IntPtr + + try + { + //'open up the system dsn dialog and wait until it exits: + System.Diagnostics.Process.Start( strPath ).WaitForExit( ); + LoadList( ); + } + catch ( Exception ex ) + { + //'possible exceptions include security violation or bust windows box: + MessageBox.Show( "Error was: " + ex.Message, strErMsg, MessageBoxButtons.OK, MessageBoxIcon.Error ); + } + } + + private void ODBCDriverDialog_Load( object sender, System.EventArgs e ) + { + LoadList( ); + } + + private void LoadList( ) + { + ODBCHelper objODBCHelper = new ODBCHelper( ); + ArrayList strDSNs; + + try + { + //Get a new list of dsn instances + strDSNs = objODBCHelper.GetDSNList( ); + + lstDSNs.Items.Clear( ); + + if ( strDSNs != null && strDSNs.Count != 0 ) + { + foreach ( string dsn in strDSNs ) + { + lstDSNs.Items.Add( dsn.ToString( ) ); + } + } + } + catch ( Exception ex ) + { + MessageBox.Show( ex.Message, "Unexpected Error Loading DSN List", MessageBoxButtons.OK, MessageBoxIcon.Error ); + } + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverDialog.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverDialog.resx new file mode 100644 index 00000000..19dc0dd8 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverPrompt.csproj b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverPrompt.csproj new file mode 100644 index 00000000..6c73a56c --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverPrompt.csproj @@ -0,0 +1,182 @@ + + + + Local + 9.0.30729 + 2.0 + {F25132D9-07AA-4B41-90AD-828E54704692} + Debug + AnyCPU + + + + + ODBCDriverPrompt + ODBCAdapter.snk + JScript + Grid + IE50 + false + Library + ODBCDriverPrompt + OnBuildSuccess + + + + + + + true + 3.5 + + + + + + + + + false + v4.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + AllRules.ruleset + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + AllRules.ruleset + + + + System + + + System.Data + + + System.Drawing + + + System.Windows.Forms + + + System.XML + + + + + + Form + + + Code + + + Code + + + Form + + + ODBCDriverDialog.cs + Designer + + + PasswordDialog.cs + Designer + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + + + CALL "%25VS100COMNTOOLS%25vsvars32.bat" +gacutil.exe /i "$(TargetPath)" + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverUI.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverUI.cs new file mode 100644 index 00000000..8ef8257d --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverUI.cs @@ -0,0 +1,19 @@ +using System; + +namespace ODBCDriverPrompt +{ + public class ODBCDriverUI + { + public ODBCDriverUI( ) { } + + public string GetDSN( ) + { + ODBCDriverDialog frmObj = new ODBCDriverDialog( ); + + if ( frmObj.ShowDialog( ) == System.Windows.Forms.DialogResult.OK ) + return frmObj.ConnectionString; + else + return null; + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCHelper.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCHelper.cs new file mode 100644 index 00000000..460f48b4 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCHelper.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections; + +using Microsoft.Win32; + +namespace ODBCDriverPrompt +{ + public class ODBCHelper + { + public ODBCHelper( ) { } + + private const string ODBC_LOC_IN_REGISTRY = "SOFTWARE\\ODBC\\"; + private const string ODBC_INI_LOC_IN_REGISTRY = ODBC_LOC_IN_REGISTRY + "ODBC.INI\\"; + private const string DSN_LOC_IN_REGISTRY = ODBC_INI_LOC_IN_REGISTRY + "ODBC Data Sources\\"; + private const string ODBCINST_INI_LOC_IN_REGISTRY = ODBC_LOC_IN_REGISTRY + "ODBCINST.INI\\"; + private const string ODBC_DRIVERS_LOC_IN_REGISTRY = ODBCINST_INI_LOC_IN_REGISTRY + "ODBC Drivers\\"; + + public ArrayList GetDSNList( ) + { + //'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + //'DESCRIPTION : Returns an array of strings each containing + //' a DSN name found in the registry. + //'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + //RegistryKey userBaseKey; //= new RegistryKey(); + //RegistryKey localMacineBaseKey; //= RegistryKey(); + ArrayList lstDSN = new ArrayList( ); + RegistryKey keyDsnNames; + string[ ] dsnNames = null; + ArrayList regKeys = new ArrayList( ); + + regKeys.Add( Registry.CurrentUser ); + regKeys.Add( Registry.LocalMachine ); + + //userBaseKey = ; + //localMacineBaseKey = Registry.LocalMachine; + + // '#1 Get a list of all DSN entries defined in DSN_LOC_IN_REGISTRY for each basekey + + foreach ( RegistryKey regKey in regKeys ) + { + keyDsnNames = OpenComplexSubKey( regKey, DSN_LOC_IN_REGISTRY, false ); + + if ( keyDsnNames != null ) + { + dsnNames = keyDsnNames.GetValueNames( ); + } + + if ( dsnNames != null ) + { + // 'Foreach DSN entry in the DSN_LOC_IN_REGISTRY, goto the + //'add the dsn name to the array + foreach ( string dsnName in dsnNames ) + { + if ( dsnName != null ) + { + lstDSN.Add( dsnName ); + } + } + } + + //FIXED BY RODOLFO + if ( keyDsnNames != null ) + keyDsnNames.Close( ); + } + + return lstDSN; + + } + + private RegistryKey OpenComplexSubKey( RegistryKey baseKey, string strComplexKey, bool writable ) + { + //'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + //'DESCRIPTION : Returns the registry key given the key string + //' and base location + //'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + int iPrevLoc = 0; + int iCurrLoc = 0; + string strSubKey = strComplexKey; + RegistryKey keyFinal = baseKey; + + if ( baseKey == null ) + return null; + + if ( strComplexKey == null ) + return keyFinal; + + //'and get all the characters upto "\\" from the start of search + //'point (iPrevLoc) as the keyString. Open a key out of string + //'keyString. + + while ( iCurrLoc != -1 ) + { + iCurrLoc = strComplexKey.IndexOf( "\\\\", iPrevLoc ); + + if ( iCurrLoc != -1 ) + { + strSubKey = strComplexKey.Substring( iPrevLoc, ( iCurrLoc - iPrevLoc ) ); + iPrevLoc = iCurrLoc + 2; + } + else + { + strSubKey = strComplexKey.Substring( iPrevLoc ); + } + + if ( !strSubKey.Equals( String.Empty ) ) + { + keyFinal = keyFinal.OpenSubKey( strSubKey, writable ); + } + } + + return keyFinal; + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/PasswordDialog.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/PasswordDialog.cs new file mode 100644 index 00000000..5b13a385 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/PasswordDialog.cs @@ -0,0 +1,185 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; + +namespace ODBCDriverPrompt +{ + public class PasswordDialog : System.Windows.Forms.Form + { + internal System.Windows.Forms.Label Label3; + internal System.Windows.Forms.Label Label2; + internal System.Windows.Forms.Label Label1; + internal System.Windows.Forms.Button cmdCancel; + internal System.Windows.Forms.TextBox txtUserID; + internal System.Windows.Forms.TextBox txtConfirmPwd; + internal System.Windows.Forms.Button cmdOK; + internal System.Windows.Forms.TextBox txtPassword; + + private System.ComponentModel.Container components = null; + + public string UserID = ""; + public string Password = ""; + + public PasswordDialog( ) + { + Application.EnableVisualStyles( ); + + InitializeComponent( ); + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if ( disposing ) + { + if ( components != null ) + { + components.Dispose( ); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent( ) + { + this.Label3 = new System.Windows.Forms.Label( ); + this.Label2 = new System.Windows.Forms.Label( ); + this.Label1 = new System.Windows.Forms.Label( ); + this.cmdCancel = new System.Windows.Forms.Button( ); + this.txtUserID = new System.Windows.Forms.TextBox( ); + this.txtConfirmPwd = new System.Windows.Forms.TextBox( ); + this.cmdOK = new System.Windows.Forms.Button( ); + this.txtPassword = new System.Windows.Forms.TextBox( ); + this.SuspendLayout( ); + // + // Label3 + // + this.Label3.Location = new System.Drawing.Point( 8, 8 ); + this.Label3.Name = "Label3"; + this.Label3.Size = new System.Drawing.Size( 168, 16 ); + this.Label3.TabIndex = 0; + this.Label3.Text = "User ID"; + // + // Label2 + // + this.Label2.Location = new System.Drawing.Point( 8, 104 ); + this.Label2.Name = "Label2"; + this.Label2.Size = new System.Drawing.Size( 144, 16 ); + this.Label2.TabIndex = 4; + this.Label2.Text = "Confirm Password"; + // + // Label1 + // + this.Label1.Location = new System.Drawing.Point( 8, 56 ); + this.Label1.Name = "Label1"; + this.Label1.Size = new System.Drawing.Size( 152, 16 ); + this.Label1.TabIndex = 2; + this.Label1.Text = "Password"; + // + // cmdCancel + // + this.cmdCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cmdCancel.Location = new System.Drawing.Point( 232, 56 ); + this.cmdCancel.Name = "cmdCancel"; + this.cmdCancel.Size = new System.Drawing.Size( 80, 24 ); + this.cmdCancel.TabIndex = 7; + this.cmdCancel.Text = "Cancel"; + this.cmdCancel.Click += new System.EventHandler( this.cmdCancel_Click ); + // + // txtUserID + // + this.txtUserID.Location = new System.Drawing.Point( 8, 24 ); + this.txtUserID.Name = "txtUserID"; + this.txtUserID.Size = new System.Drawing.Size( 208, 21 ); + this.txtUserID.TabIndex = 1; + // + // txtConfirmPwd + // + this.txtConfirmPwd.Location = new System.Drawing.Point( 8, 120 ); + this.txtConfirmPwd.Name = "txtConfirmPwd"; + this.txtConfirmPwd.PasswordChar = '*'; + this.txtConfirmPwd.Size = new System.Drawing.Size( 208, 21 ); + this.txtConfirmPwd.TabIndex = 5; + // + // cmdOK + // + this.cmdOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.cmdOK.Location = new System.Drawing.Point( 232, 24 ); + this.cmdOK.Name = "cmdOK"; + this.cmdOK.Size = new System.Drawing.Size( 80, 23 ); + this.cmdOK.TabIndex = 6; + this.cmdOK.Text = "OK"; + this.cmdOK.Click += new System.EventHandler( this.cmdOK_Click ); + // + // txtPassword + // + this.txtPassword.Location = new System.Drawing.Point( 8, 72 ); + this.txtPassword.Name = "txtPassword"; + this.txtPassword.PasswordChar = '*'; + this.txtPassword.Size = new System.Drawing.Size( 208, 21 ); + this.txtPassword.TabIndex = 3; + // + // PasswordDialog + // + this.AcceptButton = this.cmdOK; + this.AutoScaleBaseSize = new System.Drawing.Size( 5, 14 ); + this.CancelButton = this.cmdCancel; + this.ClientSize = new System.Drawing.Size( 324, 153 ); + this.ControlBox = false; + this.Controls.Add( this.Label3 ); + this.Controls.Add( this.Label2 ); + this.Controls.Add( this.Label1 ); + this.Controls.Add( this.cmdCancel ); + this.Controls.Add( this.txtUserID ); + this.Controls.Add( this.txtConfirmPwd ); + this.Controls.Add( this.txtPassword ); + this.Controls.Add( this.cmdOK ); + this.Font = new System.Drawing.Font( "Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( ( byte )( 0 ) ) ); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "PasswordDialog"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Password Dialog"; + this.ResumeLayout( false ); + this.PerformLayout( ); + + } + #endregion + + private void cmdOK_Click( object sender, System.EventArgs e ) + { + if ( txtPassword.Text == txtConfirmPwd.Text ) + { + this.Password = txtPassword.Text.ToString( ); + this.UserID = txtUserID.Text; + + txtPassword.Text = ""; + txtConfirmPwd.Text = ""; + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close( ); + } + else + { + MessageBox.Show( "Passwords do not match please try again" ); + } + } + + private void cmdCancel_Click( object sender, System.EventArgs e ) + { + this.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Close( ); + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/PasswordDialog.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/PasswordDialog.resx new file mode 100644 index 00000000..19dc0dd8 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/PasswordDialog.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/AssemblyInfo.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/AssemblyInfo.cs new file mode 100644 index 00000000..3ee1df2f --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/AssemblyInfo.cs @@ -0,0 +1,16 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: AssemblyTitle( "BizTalk Server 2006 ODBC Adapter" )] +[assembly: AssemblyDescription( "BizTalk Server 2006 ODBC Adapter" )] +[assembly: AssemblyConfiguration( "" )] +[assembly: AssemblyCompany( "Microsoft Corporation" )] +[assembly: AssemblyProduct( "Microsoft BizTalk Server 2006" )] +[assembly: AssemblyCopyright( "Copyright (C) 2006 Microsoft Corporation. All rights reserved." )] +[assembly: AssemblyTrademark( "" )] +[assembly: AssemblyCulture( "" )] + +[assembly: AssemblyVersion( "1.2.0.0" )] + +[assembly: AssemblyDelaySign( false )] +[assembly: AssemblyKeyName( "" )] \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/BTSODBCQueryEngine.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/BTSODBCQueryEngine.cs new file mode 100644 index 00000000..8684be52 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/BTSODBCQueryEngine.cs @@ -0,0 +1,684 @@ +//--------------------------------------------------------------------- +// File: BTSODBCQueryEngine.cs +// +// Summary: Implementation of an adapter framework sample adapter using the ODBC provider for ADO.NET. +// +// Sample: Adapter framework runtime adapter. +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- +using System; +using System.Data.Odbc; +using System.Xml; +using System.Xml.Schema; +using System.IO; +using System.Data; +using System.Text; +using System.Diagnostics; +using System.Configuration.Install; + +using Microsoft.Samples.BizTalk.Adapters.BaseAdapter; + +namespace Microsoft.BizTalk.Adapters.ODBC +{ + public class BTSODBCQueryEngine + { + public bool ODBCTransaction = false; + private string _strNamespace = ""; + + private string _strDocumentRootNode = ""; + private OdbcConnection _OdbcConnection = new OdbcConnection(); + private OdbcTransaction _OdbcTransaction; + private bool _OutParametersExist = false; + + //Performance Counters + //private PerformanceCounter _MessageCounter = new PerformanceCounter( ); + //private PerformanceCounter _ErrorCounter = new PerformanceCounter( ); + //private PerformanceCounter _ConnectionCounter = new PerformanceCounter( ); + //private PerformanceCounter _MessagesPerSecond = new PerformanceCounter( ); + + public bool RequestResponseProcess = false; // Need to know if we should send a response message as part of a send port + public bool ReceivePort = false; // Need to know if we are a receive port if so we don't want to send message if nothing is returned + + public string ConnectionString + { + set + { + _OdbcConnection.ConnectionString = value; + } + } + + public string Namespace + { + set + { + _strNamespace = value; + } + } + + public string RootNode + { + get + { + return _strDocumentRootNode; + } + set + { + _strDocumentRootNode = value; + } + } + + public void BeginTransaction( System.Data.IsolationLevel IsolationLevel ) + { + System.Diagnostics.Trace.WriteLine("BizTalk ODBC Adapter::BTSODBCQueryEngine::BeginTransaction()"); + _OdbcConnection.Open( ); + _OdbcTransaction = _OdbcConnection.BeginTransaction( IsolationLevel ); + } + + public void Commit( ) + { + _OdbcTransaction.Commit( ); + } + + public void Close( ) + { + _OdbcConnection.Close( ); + } + + public void Rollback( ) + { + _OdbcTransaction.Rollback( ); + } + + public BTSODBCQueryEngine( ) + { + //Create PerfCounters if they don't already exist + //initialize our perf counters + //_MessageCounter.CategoryName = "BtsOdbcQueryEngine"; + //_MessageCounter.CounterName = "MessageCount"; + //_MessageCounter.ReadOnly = false; + + //_MessagesPerSecond.CategoryName = "BtsOdbcQueryEngine"; + //_MessagesPerSecond.CounterName = "MessagesPerSecond"; + //_MessagesPerSecond.ReadOnly = false; + + //_ConnectionCounter.CategoryName = "BtsOdbcQueryEngine"; + //_ConnectionCounter.CounterName = "DbConnectionCount"; + //_ConnectionCounter.ReadOnly = false; + + //_ErrorCounter.CategoryName = "BtsOdbcQueryEngine"; + //_ErrorCounter.CounterName = "ErrorCount"; + //_ErrorCounter.ReadOnly = false; + + //Create an event handler for the _OdbcConnection object + _OdbcConnection.StateChange += new StateChangeEventHandler( _OdbcConnection_StateChange ); + } + + private OdbcCommand CreateODBCCommandFromSchema( string QuerySchema ) + { + System.Diagnostics.Trace.WriteLine("BizTalk ODBC Adapter::BTSODBCQueryEngine::CreateODBCCommandFromSchema()"); + StringReader sr = new StringReader( QuerySchema ); + OdbcCommand odbcCmd = new OdbcCommand( ); + XmlSchema xsdQueryConfiguration = XmlSchema.Read( sr, null ); + + foreach ( object item in xsdQueryConfiguration.Items ) + { + if ( item is XmlSchemaAnnotation ) // Then we are at the section of the schema containing + { // the odbc query spec + XmlSchemaAnnotation xsAnnotation = ( XmlSchemaAnnotation )item; + XmlSchemaAppInfo xsAppInfo = ( XmlSchemaAppInfo )xsAnnotation.Items[ 0 ]; + XmlNode[ ] xmlNodesQueryInfo = xsAppInfo.Markup; + + // Create our new command object for query processing + odbcCmd.CommandText = xmlNodesQueryInfo[ 1 ].InnerText; + + //Get the root node name for the response document from the schema + _strDocumentRootNode = xmlNodesQueryInfo[ 2 ].InnerText; + + // pull the output documents namespace from the schema. + _strNamespace = xmlNodesQueryInfo[ 3 ].InnerText + "/" + _strDocumentRootNode; + } + if ( item is XmlSchemaElement ) // Root Section of the schema + { + try + { + XmlSchemaComplexType xsComplex = ( XmlSchemaComplexType )( ( XmlSchemaElement )item ).SchemaType; + XmlSchemaSequence xsSeq = ( XmlSchemaSequence )xsComplex.Particle; + + // Now we're down to the parameters section of the schema! + XmlSchemaElement xsParamsElement = ( XmlSchemaElement )xsSeq.Items[ 0 ]; + XmlSchemaComplexType xsCT = ( XmlSchemaComplexType )xsParamsElement.SchemaType; + + // IMPORTANT NOTE: If for some reason they change the order of the params in the + // schmema and/or the document being processes then the results will be wrong + // as there is no way to map the data to the correct element of the query + // remember our SQL looks like SELECT * FROM CUSTOMER WHERE CUSTOMERID = ? + + //NOTE: if statement added to account for possiblity that we have not have command parameters + if ( !( xsCT == null ) ) + { + foreach ( XmlSchemaAttribute xsAttParams in xsCT.Attributes ) + { + OdbcParameter queryParam = new OdbcParameter( ); + + queryParam.ParameterName = "@" + xsAttParams.Name; + + //Now get all of the meta data from the parameter + XmlSchemaAppInfo xsParamInfo = ( XmlSchemaAppInfo )xsAttParams.Annotation.Items[ 0 ]; + XmlNode[ ] xmlParamInfo = xsParamInfo.Markup; + + queryParam.OdbcType = ConvertStringDataTypeToODBC( xmlParamInfo[ 0 ].InnerText ); + queryParam.Direction = ConverStrToParamDir( xmlParamInfo[ 1 ].InnerText ); + + if ( System.Convert.ToInt32( xmlParamInfo[ 2 ].InnerText ) > 0 ) + queryParam.Size = System.Convert.ToInt32( xmlParamInfo[ 2 ].InnerText ); + + odbcCmd.Parameters.Add( queryParam ); + //Add CommandTimeout + odbcCmd.CommandTimeout = 60; + System.Diagnostics.Trace.WriteLine(string.Format("BizTalk ODBC Adapter::BTSODBCQueryEngine::CreateODBCCommandFromSchema()::QueryParam-->{0}", queryParam.ParameterName.ToString())); + } + } + } + catch { } + } + } + + return odbcCmd; + } + + public VirtualStream BTSExecuteODBCCallFromSQL( string SQL ) + { + try + { + System.Diagnostics.Trace.WriteLine("BizTalk ODBC Adapter::BTSODBCQueryEngine::BTSExecuteODBCCallFromSQL()"); + //_MessagesPerSecond.Increment( ); + //_MessageCounter.Increment( ); + + OdbcCommand odbcCmd = new OdbcCommand( ); + odbcCmd.Connection = _OdbcConnection; + odbcCmd.CommandText = SQL; + odbcCmd.CommandType = CommandType.Text; + //Add CommandTimeout + odbcCmd.CommandTimeout = 60; + + + return ODBCCommandProcessing( odbcCmd, null ); + } + catch ( Exception ex ) + { + //_ErrorCounter.Increment( ); + throw ex; + } + } + + public VirtualStream BTSExecuteODBCCallFromSchema( XmlTextReader xStreamPayload, string QuerySchema ) + { + try + { + //_MessagesPerSecond.Increment( ); + //_MessageCounter.Increment( ); + + OdbcCommand odbcCmd = CreateODBCCommandFromSchema( QuerySchema ); + return ODBCCommandProcessing( odbcCmd, xStreamPayload ); + } + catch ( Exception ex ) + { + //_ErrorCounter.Increment( ); + throw ex; + } + } + + //implements the same function as ExecuteDataSetCommand except uses a DataReader and XmlTextWriter to generate output + private bool ExecuteDataReaderCommand( ref XmlTextWriter resultXml, OdbcCommand odbcCmd ) + { + System.Diagnostics.Trace.WriteLine("BizTalk ODBC Adapter::BTSODBCQueryEngine::ExecuteDataReaderCommand()"); + OdbcDataReader dr; + bool bHasResults = false; + + resultXml.Formatting = System.Xml.Formatting.Indented; + + try + { + //Open the connection and get the data reader + odbcCmd.Connection = _OdbcConnection; + + if (_OdbcConnection.State != ConnectionState.Open) + odbcCmd.Connection.Open(); + + if (_OdbcTransaction != null) + odbcCmd.Transaction = _OdbcTransaction; + //Add CommandTimeout + odbcCmd.CommandTimeout = 60; + + //Trace out command + string cmdSQL = odbcCmd.CommandText; + System.Diagnostics.Trace.WriteLine(string.Format("BizTalk ODBC Adapter::BTSODBCQueryEngine::ExecuteDataReaderCommand()::Command to be executed-->{0}", cmdSQL)); + + + dr = odbcCmd.ExecuteReader(); + + int tableCount = 0; + do + { + while (dr.Read()) + { + bHasResults = true; + //Write Record Element + if (tableCount == 0) + resultXml.WriteStartElement("Table"); + else + resultXml.WriteStartElement("Table" + tableCount); + + //Fill RowData + for (int i = 0; i <= dr.FieldCount - 1; i++) + { + resultXml.WriteStartElement(XmlConvert.EncodeName(dr.GetName(i))); + + //handle BLOB fields. We want to stream BLOB data 64K at a time to + //avoid pounding the server + if (dr.GetValue(i).GetType() == System.Type.GetType("System.Byte[]")) + { + byte[] buff = new byte[65536]; + int bufferSize = 65536; + long retval = 0; + + int startIndex = 0; + + retval = dr.GetBytes(i, startIndex, buff, 0, bufferSize); + + // Continue reading and writing while there are bytes beyond the size of the buffer. + while (retval == bufferSize) + { + resultXml.WriteBase64(buff, 0, bufferSize); + resultXml.Flush(); + + // Reposition the start index to the end of the last buffer and fill the buffer. + startIndex += bufferSize; + retval = dr.GetBytes(i, startIndex, buff, 0, bufferSize); + } + + // Write the remaining buffer. + resultXml.WriteBase64(buff, 0, (int)retval - 1); + resultXml.Flush(); + } + else //Non-BLOB data types + { + resultXml.WriteString(System.Convert.ToString(dr.GetValue(i))); + } + resultXml.WriteEndElement(); + resultXml.Flush(); + } + + //Close the Record Element + resultXml.WriteEndElement(); + resultXml.Flush(); + } + + tableCount += 1; + } + while (dr.NextResult()); + + dr.Close(); + + //Now add the out parameters + if (_OutParametersExist) + AddSPParameters(odbcCmd, ref resultXml); + return bHasResults; + } + //catch (Exception ex) + //{ + // System.Diagnostics.Trace.WriteLine(string.Format("BizTalk ODBC Adapter::BTSODBCQueryEngine::ExecuteDataReaderCommand()::Exception Caught-->{0}", ex.Message.ToString())); + // return false; + // //throw ex; + //} + finally + { + if (odbcCmd.Connection.State != ConnectionState.Closed) + { + odbcCmd.Connection.Close(); + } + } + } + + private VirtualStream ODBCCommandProcessing( OdbcCommand odbcCmd, XmlTextReader xtrReader ) + { + System.Diagnostics.Trace.WriteLine("BizTalk ODBC Adapter::BTSODBCQueryEngine::ODBCCommandProcessing()"); + VirtualStream Output = null; + VirtualStream WorkingStream = new VirtualStream( ); + + XmlTextWriter resultXml = new XmlTextWriter( WorkingStream, null ); + + bool CmdComplete = false; + bool isInputProcessed = false; + bool hasInputParams = false; + + //Determine if there are input parameters + for ( int i = 0; i < odbcCmd.Parameters.Count; i++ ) + { + ParameterDirection dir = odbcCmd.Parameters[ i ].Direction; + + if ( dir == ParameterDirection.Input || + dir == ParameterDirection.InputOutput ) + hasInputParams = true; + } + + //Generate the root element + resultXml.WriteStartElement( "ns0", _strDocumentRootNode, _strNamespace ); + + UnicodeEncoding Unicode = new UnicodeEncoding( ); + + // Handle the situation where we don't have parameters but still want to process the query + if ( xtrReader != null && odbcCmd.Parameters.Count > 0 ) + { + while ( xtrReader.Read( ) ) + { + //we're only interested in those elements that have attributes... + if ( xtrReader.NodeType == XmlNodeType.Element && xtrReader.HasAttributes ) + { + #region Build Command from XML Attributes + //iterate through the attributes--check if the names match any of our parameters + for ( int attCnt = 0; attCnt < xtrReader.AttributeCount; attCnt++ ) + { + xtrReader.MoveToAttribute( attCnt ); + + for ( int cnt = 0; cnt < odbcCmd.Parameters.Count; cnt++ ) + { + #region ODBC Parameters + if ( xtrReader.Name == odbcCmd.Parameters[ cnt ].ParameterName.Replace( "@", "" ) ) + { + if ( odbcCmd.Parameters[ cnt ].Direction != ParameterDirection.Input ) + { + //we need to add output parameters to our response + _OutParametersExist = true; + } + + //Pass in values for input parameters + if ( odbcCmd.Parameters[ cnt ].Direction != ParameterDirection.ReturnValue && + odbcCmd.Parameters[ cnt ].Direction != ParameterDirection.Output ) + { + #region ODBC Type Converstion + //Convert input parameter to the correct data type + switch ( odbcCmd.Parameters[ cnt ].OdbcType.ToString( ) ) + { + case "BigInt": + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToInt64( xtrReader.Value ); + break; + case "Binary": //Expects that we are receiving the data in the form of a Base64 string + odbcCmd.Parameters[ cnt ].Value = System.Convert.FromBase64String( xtrReader.Value ); + break; + case "Bit": + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToBoolean( xtrReader.Value ); + break; + case "Text": + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToString( xtrReader.Value ); + break; + case "DateTime": + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToDateTime( xtrReader.Value ); + break; + case "Numeric": + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToDecimal( xtrReader.Value ); + break; + case "Double": + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToDouble( xtrReader.Value ); + break; + case "Int": + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToInt32( xtrReader.Value ); + break; + case "Real": + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToDouble( xtrReader.Value ); + break; + case "SmallInt": + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToInt16( xtrReader.Value ); + break; + case "TinyInt": + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToByte( xtrReader.Value ); + break; + case "UniqueIdentiflier": + System.Guid unqId = new Guid( xtrReader.Value ); + odbcCmd.Parameters[ cnt ].Value = unqId; + break; + case "Char": //FIX THIS NEEDS TO SUPPORT ARRAYS + odbcCmd.Parameters[ cnt ].Value = xtrReader.Value; + break; + case "Date": // THIS IS A BEST GUESS + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToDateTime( xtrReader.Value ); + break; + case "Decimal": + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToDecimal( xtrReader.Value ); + break; + case "Image": //TODO: Is this a Base64 encoding too? + odbcCmd.Parameters[ cnt ].Value = System.Convert.FromBase64String( xtrReader.Value ); + break; + case "NChar": + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToString( xtrReader.Value ); + break; + case "NText": + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToString( xtrReader.Value ); + break; + case "NVarChar": + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToString( xtrReader.Value ); + break; + case "SmallDateTime": // BEST GUESS + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToDateTime( xtrReader.Value ); + break; + case "Time": // BEST GUESS + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToDateTime( xtrReader.Value ); + break; + case "Timestamp": + odbcCmd.Parameters[ cnt ].Value = Unicode.GetBytes( xtrReader.Value ); + break; + case "VarBinary": //Assumes data comes in as a Base64 string + odbcCmd.Parameters[ cnt ].Value = System.Convert.FromBase64String( xtrReader.Value ); + break; + case "VarChar": + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToString( xtrReader.Value ); + break; + default: + odbcCmd.Parameters[ cnt ].Value = System.Convert.ToDateTime( xtrReader.Value ); + break; + } + #endregion + + isInputProcessed = true; + } + } + #endregion + } + + } + #endregion + + // Now that the Command object has been populated execute the query and get the results + try + { + //determine if input parameters have been processed. + CmdComplete = ( !hasInputParams || ( hasInputParams && isInputProcessed ) ); + + //Call to the DataReader-based implementation + if ( CmdComplete ) + { + ExecuteDataReaderCommand( ref resultXml, odbcCmd ); + Output = WorkingStream; + CmdComplete = false; + } + } + catch ( Exception e ) + { + throw e; + } + //Ensure that the reader returns to the parent element once it's finished processing all of the attributes + xtrReader.MoveToElement( ); + } + } + } + else // This is a query from a receive port OR We're dealing with + // a no input values send port. These DO NOT have a input document + { + try + { + //Did the query return any results. If it did not we don't want + //to send back an empty document + if ( ExecuteDataReaderCommand( ref resultXml, odbcCmd ) ) + { + Output = WorkingStream; + } + else + { + Output = null; + } + CmdComplete = true; + } + catch ( Exception e ) + { + throw new Exception( "Receive Port query processing failed: " + e.Message + " " + e.InnerException ); + } + } + + //close the root element + resultXml.WriteEndElement( ); + resultXml.Flush( ); + + return Output; + } + + // This function exists to remove the + // from the input documents. It appears that in some cases this creates a problem + // for the XMLDOM + private string CleanDocument( string msgIn ) + { + if ( msgIn.StartsWith( "", 1 ) + 2 ); + } + return msgIn; + } + + //overloaded to accomodate XmlTextWriter input in lieu of dataset data. + private void AddSPParameters( OdbcCommand odbcCmd, ref XmlTextWriter xtw ) + { + xtw.WriteStartElement( "OutParameters" ); + for ( int i = 0; i < odbcCmd.Parameters.Count; i++ ) + { + if ( odbcCmd.Parameters[ i ].Direction != ParameterDirection.Input ) + { + xtw.WriteStartAttribute( odbcCmd.Parameters[ i ].ParameterName.Replace( "@", "" ), "" ); + if ( odbcCmd.Parameters[ i ].OdbcType == OdbcType.Binary || + odbcCmd.Parameters[ i ].OdbcType == OdbcType.Image || + odbcCmd.Parameters[ i ].OdbcType == OdbcType.VarBinary ) + { + byte[ ] buffer = ( byte[ ] )odbcCmd.Parameters[ i ].Value; //Cast it as a byte array + xtw.WriteBase64( buffer, 0, buffer.Length ); + } + else + { + xtw.WriteString( odbcCmd.Parameters[ i ].Value.ToString( ) ); + } + xtw.WriteEndAttribute( ); + xtw.Flush( ); + } + } + xtw.WriteEndElement( ); + xtw.Flush( ); + } + + private ParameterDirection ConverStrToParamDir( string sParamDir ) + { + switch ( sParamDir ) + { + case "Input": + return ParameterDirection.Input; + case "Output": + return ParameterDirection.Output; + case "InputOutput": + return ParameterDirection.InputOutput; + case "ReturnValue": + return ParameterDirection.ReturnValue; + default: + return ParameterDirection.Input; + } + } + + private OdbcType ConvertStringDataTypeToODBC( string sType ) + { + switch ( sType ) + { + case "BigInt": + return OdbcType.BigInt; + case "Binary": // Also could be IMAGE + return OdbcType.Binary; + case "Bit": + return OdbcType.Bit; + case "Text": // Could also be NCHAR, NTEXT, NVARCHAR + return OdbcType.Text; + case "DateTime": + return OdbcType.DateTime; + case "Numeric": // Could also be DECIMAL, + return OdbcType.Numeric; + case "Double": + return OdbcType.Double; + case "Int": + return OdbcType.Int; + case "Real": + return OdbcType.Real; + case "SmallInt": + return OdbcType.SmallInt; + case "TinyInt": + return OdbcType.TinyInt; + case "UniqueIdentifier": + return OdbcType.UniqueIdentifier; + case "Char": + return OdbcType.Char; + case "Date": + return OdbcType.Date; + case "Decimal": + return OdbcType.Decimal; + case "Image": + return OdbcType.Image; + case "NChar": + return OdbcType.NChar; + case "NText": + return OdbcType.NText; + case "NVarChar": + return OdbcType.NVarChar; + case "SmallDateTime": + return OdbcType.SmallDateTime; + case "Time": + return OdbcType.Time; + case "Timestamp": + return OdbcType.Timestamp; + case "VarBinary": + return OdbcType.VarBinary; + case "VarChar": + return OdbcType.VarChar; + default: + return OdbcType.Text; + } + } + + private void _OdbcConnection_StateChange( object sender, StateChangeEventArgs e ) + { + if ( e.CurrentState == ConnectionState.Open ) + { + //_ConnectionCounter.Increment( ); + } + else if ( e.CurrentState == ConnectionState.Closed ) + { + //_ConnectionCounter.Decrement( ); + } + + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCAdapter.snk b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCAdapter.snk new file mode 100644 index 0000000000000000000000000000000000000000..0d564ea32858712121e1a4107e9400b9222978b6 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097ln4vQ4k&*q7xIBtACM>^uMjNyP06TNf zDH+G}B9=JY*p#EM9E0?3_%Po57I03rNK(JD11In*3z%gxEcNcc^74h!Kn5rDJNL=1 zbtGWj3vI;cA|lhHEdReXS{NEG?rA(|$tK(`)-GssxzFmqLt}vM(~?oFv<3+oO6^9#QW*Pa@HeX6wRhNdY$yq{w5ftPw(CN& zKAXY%q^8m^B;R`9d|lwb=Oh93Wqi$X^#H9MA@(hNj*=~9So3peD*%N+tOOlYx`2~_ zm^da99t?`XY8BSdN*J;1=SO1j-hYTMjc{@OpS7}{8NZWa=(9cbV>?Abk(%@ zsbbMvj=FE`YbF|;xvTV(62C2&1$A7 z;}@t^2T1c>ax;46MSn&1E3RmsB=%Jzw2lGcI5?&7@%TJctkTR_b3QKPNI`a%ff` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCQueryProcessor.csproj b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCQueryProcessor.csproj new file mode 100644 index 00000000..5a39ac69 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCQueryProcessor.csproj @@ -0,0 +1,177 @@ + + + + Local + 9.0.30729 + 2.0 + {516F27B0-23E4-4704-9A86-A5064769522A} + Debug + AnyCPU + + + + + ODBCQueryProcessor + ODBCAdapter.snk + JScript + Grid + IE50 + false + Library + Microsoft.BizTalk.Adapters.ODBC + OnBuildSuccess + + + + + + + true + 3.5 + + + + + + + + + false + v4.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + AllRules.ruleset + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + AllRules.ruleset + + + + System + + + + System.Data + + + System.XML + + + + + Code + + + Code + + + Component + + + + + + + + Designer + ODBCPerformanceCounterInstaller.cs + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + {6EF6BB4C-9417-4CAE-990D-49F1F368284B} + ODBCBaseAdapter + + + + + + + CALL "%25VS100COMNTOOLS%25vsvars32.bat" +gacutil.exe /i "$(TargetPath)" + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ADOCommandOverride.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ADOCommandOverride.cs new file mode 100644 index 00000000..a1e5b09b --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ADOCommandOverride.cs @@ -0,0 +1,514 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; + +namespace Microsoft.BizTalk.Adapters.ODBC.SchemaWizard +{ + public class ADOCommandOverride : System.Windows.Forms.Form + { + private ListViewItem _lvSelectedItem; + private System.Windows.Forms.Button cmdClose; + private System.Windows.Forms.Button cmdTest; + private System.Windows.Forms.Button cmdApplyADO; + + //Vars used to communicate with the parent class ODBCSchemaHelper + public System.Data.Odbc.OdbcCommand ADOCommand; + public ODBCSchemaHelper ParentClass = null; + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox txtSampleData; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Button cmdApply; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cboDirection; + private System.Windows.Forms.ComboBox cboDataType; + private System.Windows.Forms.TextBox txtParamName; + private System.Windows.Forms.ListView lvQueryParameters; + private System.Windows.Forms.ColumnHeader Parameter; + public System.Windows.Forms.ColumnHeader DataType; + private System.Windows.Forms.ColumnHeader Direction; + private System.Windows.Forms.ColumnHeader SampleData; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox txtReqSchema; + private System.Windows.Forms.TextBox txtRespSchema; + private System.Windows.Forms.TextBox txtQueryResults; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.ColumnHeader SizeCol; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.TextBox txtSize; + + private System.ComponentModel.Container components = null; + + public ADOCommandOverride( ) + { + Application.EnableVisualStyles( ); + + InitializeComponent( ); + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if ( disposing ) + { + if ( components != null ) + { + components.Dispose( ); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent( ) + { + this.cmdClose = new System.Windows.Forms.Button( ); + this.cmdTest = new System.Windows.Forms.Button( ); + this.cmdApplyADO = new System.Windows.Forms.Button( ); + this.groupBox1 = new System.Windows.Forms.GroupBox( ); + this.txtSize = new System.Windows.Forms.TextBox( ); + this.label8 = new System.Windows.Forms.Label( ); + this.txtSampleData = new System.Windows.Forms.TextBox( ); + this.label4 = new System.Windows.Forms.Label( ); + this.cmdApply = new System.Windows.Forms.Button( ); + this.label3 = new System.Windows.Forms.Label( ); + this.label2 = new System.Windows.Forms.Label( ); + this.label1 = new System.Windows.Forms.Label( ); + this.cboDirection = new System.Windows.Forms.ComboBox( ); + this.cboDataType = new System.Windows.Forms.ComboBox( ); + this.txtParamName = new System.Windows.Forms.TextBox( ); + this.lvQueryParameters = new System.Windows.Forms.ListView( ); + this.Parameter = new System.Windows.Forms.ColumnHeader( ); + this.DataType = new System.Windows.Forms.ColumnHeader( ); + this.SizeCol = new System.Windows.Forms.ColumnHeader( ); + this.Direction = new System.Windows.Forms.ColumnHeader( ); + this.SampleData = new System.Windows.Forms.ColumnHeader( ); + this.groupBox2 = new System.Windows.Forms.GroupBox( ); + this.label7 = new System.Windows.Forms.Label( ); + this.label6 = new System.Windows.Forms.Label( ); + this.label5 = new System.Windows.Forms.Label( ); + this.txtQueryResults = new System.Windows.Forms.TextBox( ); + this.txtRespSchema = new System.Windows.Forms.TextBox( ); + this.txtReqSchema = new System.Windows.Forms.TextBox( ); + this.groupBox1.SuspendLayout( ); + this.groupBox2.SuspendLayout( ); + this.SuspendLayout( ); + // + // cmdClose + // + this.cmdClose.Location = new System.Drawing.Point( 502, 76 ); + this.cmdClose.Name = "cmdClose"; + this.cmdClose.Size = new System.Drawing.Size( 104, 24 ); + this.cmdClose.TabIndex = 10; + this.cmdClose.Text = "Close"; + this.cmdClose.Click += new System.EventHandler( this.cmdClose_Click ); + // + // cmdTest + // + this.cmdTest.Location = new System.Drawing.Point( 502, 12 ); + this.cmdTest.Name = "cmdTest"; + this.cmdTest.Size = new System.Drawing.Size( 104, 24 ); + this.cmdTest.TabIndex = 11; + this.cmdTest.Text = "Test Query"; + this.cmdTest.Click += new System.EventHandler( this.cmdTest_Click ); + // + // cmdApplyADO + // + this.cmdApplyADO.AccessibleName = ""; + this.cmdApplyADO.Location = new System.Drawing.Point( 502, 44 ); + this.cmdApplyADO.Name = "cmdApplyADO"; + this.cmdApplyADO.Size = new System.Drawing.Size( 104, 24 ); + this.cmdApplyADO.TabIndex = 12; + this.cmdApplyADO.Text = "Update Command"; + this.cmdApplyADO.Click += new System.EventHandler( this.cmdApplyADO_Click ); + // + // groupBox1 + // + this.groupBox1.Controls.Add( this.txtSize ); + this.groupBox1.Controls.Add( this.label8 ); + this.groupBox1.Controls.Add( this.txtSampleData ); + this.groupBox1.Controls.Add( this.label4 ); + this.groupBox1.Controls.Add( this.cmdApply ); + this.groupBox1.Controls.Add( this.label3 ); + this.groupBox1.Controls.Add( this.label2 ); + this.groupBox1.Controls.Add( this.label1 ); + this.groupBox1.Controls.Add( this.cboDirection ); + this.groupBox1.Controls.Add( this.cboDataType ); + this.groupBox1.Controls.Add( this.txtParamName ); + this.groupBox1.Controls.Add( this.lvQueryParameters ); + this.groupBox1.Location = new System.Drawing.Point( 8, 10 ); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size( 488, 224 ); + this.groupBox1.TabIndex = 13; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "ADO.NET Command Parameters"; + // + // txtSize + // + this.txtSize.Location = new System.Drawing.Point( 160, 192 ); + this.txtSize.Name = "txtSize"; + this.txtSize.Size = new System.Drawing.Size( 56, 21 ); + this.txtSize.TabIndex = 21; + // + // label8 + // + this.label8.Location = new System.Drawing.Point( 160, 176 ); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size( 48, 16 ); + this.label8.TabIndex = 20; + this.label8.Text = "Size"; + // + // txtSampleData + // + this.txtSampleData.Location = new System.Drawing.Point( 176, 144 ); + this.txtSampleData.Name = "txtSampleData"; + this.txtSampleData.Size = new System.Drawing.Size( 200, 21 ); + this.txtSampleData.TabIndex = 19; + // + // label4 + // + this.label4.Location = new System.Drawing.Point( 176, 128 ); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size( 104, 16 ); + this.label4.TabIndex = 18; + this.label4.Text = "Sample Data"; + // + // cmdApply + // + this.cmdApply.Location = new System.Drawing.Point( 392, 144 ); + this.cmdApply.Name = "cmdApply"; + this.cmdApply.Size = new System.Drawing.Size( 80, 24 ); + this.cmdApply.TabIndex = 17; + this.cmdApply.Text = "Apply"; + this.cmdApply.Click += new System.EventHandler( this.cmdApply_Click ); + // + // label3 + // + this.label3.Location = new System.Drawing.Point( 264, 176 ); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size( 104, 16 ); + this.label3.TabIndex = 16; + this.label3.Text = "Direction"; + // + // label2 + // + this.label2.Location = new System.Drawing.Point( 4, 174 ); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size( 104, 16 ); + this.label2.TabIndex = 15; + this.label2.Text = "Data Type:"; + // + // label1 + // + this.label1.Location = new System.Drawing.Point( 4, 126 ); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size( 128, 16 ); + this.label1.TabIndex = 14; + this.label1.Text = "Parameter Name:"; + // + // cboDirection + // + this.cboDirection.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboDirection.Items.AddRange( new object[ ] { + "ReturnValue", + "Input", + "Output", + "InputOutput"} ); + this.cboDirection.Location = new System.Drawing.Point( 264, 192 ); + this.cboDirection.Name = "cboDirection"; + this.cboDirection.Size = new System.Drawing.Size( 112, 21 ); + this.cboDirection.TabIndex = 13; + // + // cboDataType + // + this.cboDataType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboDataType.Items.AddRange( new object[ ] { + "BigInt", + "Binary", + "Bit", + "Text", + "DateTime", + "Numeric", + "Double", + "Int", + "Real", + "SmallInt", + "TinyInt", + "UniqueIdentifier", + "Char", + "Date", + "Decimal", + "Image", + "NChar", + "NText", + "NVarChar", + "SmallDateTime", + "Time", + "Timestamp", + "VarBinary", + "VarChar"} ); + this.cboDataType.Location = new System.Drawing.Point( 4, 192 ); + this.cboDataType.Name = "cboDataType"; + this.cboDataType.Size = new System.Drawing.Size( 132, 21 ); + this.cboDataType.TabIndex = 12; + // + // txtParamName + // + this.txtParamName.Location = new System.Drawing.Point( 4, 144 ); + this.txtParamName.Name = "txtParamName"; + this.txtParamName.Size = new System.Drawing.Size( 160, 21 ); + this.txtParamName.TabIndex = 11; + // + // lvQueryParameters + // + this.lvQueryParameters.Columns.AddRange( new System.Windows.Forms.ColumnHeader[ ] { + this.Parameter, + this.DataType, + this.SizeCol, + this.Direction, + this.SampleData} ); + this.lvQueryParameters.FullRowSelect = true; + this.lvQueryParameters.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.lvQueryParameters.LabelEdit = true; + this.lvQueryParameters.Location = new System.Drawing.Point( 4, 22 ); + this.lvQueryParameters.MultiSelect = false; + this.lvQueryParameters.Name = "lvQueryParameters"; + this.lvQueryParameters.Size = new System.Drawing.Size( 476, 88 ); + this.lvQueryParameters.TabIndex = 10; + this.lvQueryParameters.UseCompatibleStateImageBehavior = false; + this.lvQueryParameters.View = System.Windows.Forms.View.Details; + this.lvQueryParameters.SelectedIndexChanged += new System.EventHandler( this.lvQueryParameters_SelectedIndexChanged ); + // + // Parameter + // + this.Parameter.Text = "Parameter"; + this.Parameter.Width = 150; + // + // DataType + // + this.DataType.Text = "Data Type"; + this.DataType.Width = 80; + // + // SizeCol + // + this.SizeCol.Text = "Size"; + this.SizeCol.Width = 40; + // + // Direction + // + this.Direction.Text = "Direction"; + this.Direction.Width = 80; + // + // SampleData + // + this.SampleData.Text = "Sample Data"; + this.SampleData.Width = 120; + // + // groupBox2 + // + this.groupBox2.Controls.Add( this.label7 ); + this.groupBox2.Controls.Add( this.label6 ); + this.groupBox2.Controls.Add( this.label5 ); + this.groupBox2.Controls.Add( this.txtQueryResults ); + this.groupBox2.Controls.Add( this.txtRespSchema ); + this.groupBox2.Controls.Add( this.txtReqSchema ); + this.groupBox2.Location = new System.Drawing.Point( 8, 240 ); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size( 568, 240 ); + this.groupBox2.TabIndex = 14; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Test Results"; + // + // label7 + // + this.label7.Location = new System.Drawing.Point( 384, 16 ); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size( 112, 16 ); + this.label7.TabIndex = 5; + this.label7.Text = "Query Results"; + // + // label6 + // + this.label6.Location = new System.Drawing.Point( 192, 16 ); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size( 112, 16 ); + this.label6.TabIndex = 4; + this.label6.Text = "Output Schema"; + // + // label5 + // + this.label5.Location = new System.Drawing.Point( 8, 16 ); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size( 128, 16 ); + this.label5.TabIndex = 3; + this.label5.Text = "Input Schema"; + // + // txtQueryResults + // + this.txtQueryResults.Location = new System.Drawing.Point( 376, 32 ); + this.txtQueryResults.Multiline = true; + this.txtQueryResults.Name = "txtQueryResults"; + this.txtQueryResults.ReadOnly = true; + this.txtQueryResults.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.txtQueryResults.Size = new System.Drawing.Size( 184, 200 ); + this.txtQueryResults.TabIndex = 2; + // + // txtRespSchema + // + this.txtRespSchema.Location = new System.Drawing.Point( 192, 32 ); + this.txtRespSchema.Multiline = true; + this.txtRespSchema.Name = "txtRespSchema"; + this.txtRespSchema.ReadOnly = true; + this.txtRespSchema.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.txtRespSchema.Size = new System.Drawing.Size( 184, 200 ); + this.txtRespSchema.TabIndex = 1; + // + // txtReqSchema + // + this.txtReqSchema.Location = new System.Drawing.Point( 8, 32 ); + this.txtReqSchema.Multiline = true; + this.txtReqSchema.Name = "txtReqSchema"; + this.txtReqSchema.ReadOnly = true; + this.txtReqSchema.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.txtReqSchema.Size = new System.Drawing.Size( 184, 200 ); + this.txtReqSchema.TabIndex = 0; + // + // ADOCommandOverride + // + this.AutoScaleBaseSize = new System.Drawing.Size( 5, 14 ); + this.ClientSize = new System.Drawing.Size( 613, 485 ); + this.ControlBox = false; + this.Controls.Add( this.groupBox2 ); + this.Controls.Add( this.groupBox1 ); + this.Controls.Add( this.cmdApplyADO ); + this.Controls.Add( this.cmdTest ); + this.Controls.Add( this.cmdClose ); + this.Font = new System.Drawing.Font( "Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( ( byte )( 0 ) ) ); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "ADOCommandOverride"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "BizTalk ODBC Adapter Query Processor Override"; + this.Load += new System.EventHandler( this.ADOCommandOverride_Load ); + this.groupBox1.ResumeLayout( false ); + this.groupBox1.PerformLayout( ); + this.groupBox2.ResumeLayout( false ); + this.groupBox2.PerformLayout( ); + this.ResumeLayout( false ); + + } + #endregion + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main( ) + { + Application.Run( new ADOCommandOverride( ) ); + } + + private void ADOCommandOverride_Load( object sender, System.EventArgs e ) + { + foreach ( System.Data.Odbc.OdbcParameter param in ADOCommand.Parameters ) + { + ListViewItem lvItem = lvQueryParameters.Items.Add( param.ParameterName ); + lvItem.SubItems.Add( param.OdbcType.ToString( ) ); + lvItem.SubItems.Add( param.Size.ToString( ) ); + lvItem.SubItems.Add( param.Direction.ToString( ) ); + lvItem.SubItems.Add( "" ); + } + } + + private void cmdTest_Click( object sender, System.EventArgs e ) + { + try + { + txtReqSchema.Text = ParentClass.ExtractODBCParametersSchema( ADOCommand ); + txtRespSchema.Text = ParentClass.GenerateOutputSchema( ADOCommand ); + + // Add any output param values to the query results dialog + txtQueryResults.Text = ""; + foreach ( System.Data.Odbc.OdbcParameter param in ADOCommand.Parameters ) + { + if ( param.Direction != System.Data.ParameterDirection.Input ) + { + txtQueryResults.Text += param.ParameterName + ": " + param.Value.ToString( ) + "\r\n"; + } + } + txtQueryResults.Text += ParentClass.QueryOutput; + } + catch ( Exception ex ) + { + txtQueryResults.Text = ex.Message + " " + ex.InnerException; + } + } + + private void cmdClose_Click( object sender, System.EventArgs e ) + { + this.ParentClass = null; + this.Hide( ); + } + + private void lvQueryParameters_SelectedIndexChanged( object sender, System.EventArgs e ) + { + if ( lvQueryParameters.SelectedItems.Count > 0 ) + { + _lvSelectedItem = lvQueryParameters.SelectedItems[ 0 ];// Items[lvQueryParameters.SelectedIndices[0]]; + txtParamName.Text = _lvSelectedItem.Text; + cboDataType.SelectedIndex = cboDataType.FindString( _lvSelectedItem.SubItems[ 1 ].Text ); + cboDirection.SelectedIndex = cboDirection.FindString( _lvSelectedItem.SubItems[ 3 ].Text );//_lvSelectedItem.SubItems[2].Text; + txtSize.Text = _lvSelectedItem.SubItems[ 2 ].Text; + txtSampleData.Text = _lvSelectedItem.SubItems[ 4 ].Text; + } + } + + private void cmdApply_Click( object sender, System.EventArgs e ) + { + _lvSelectedItem.Text = txtParamName.Text; + _lvSelectedItem.SubItems[ 1 ].Text = cboDataType.SelectedItem.ToString( ); + _lvSelectedItem.SubItems[ 3 ].Text = cboDirection.SelectedItem.ToString( ); + _lvSelectedItem.SubItems[ 2 ].Text = txtSize.Text; + _lvSelectedItem.SubItems[ 4 ].Text = txtSampleData.Text; + } + + private void cmdApplyADO_Click( object sender, System.EventArgs e ) + { + int lvcount = 0; + foreach ( System.Data.Odbc.OdbcParameter param in ADOCommand.Parameters ) + { + ListViewItem lvItem = lvQueryParameters.Items[ lvcount ]; + param.ParameterName = lvItem.Text; + + param.OdbcType = ( System.Data.Odbc.OdbcType )Enum.Parse( typeof( System.Data.Odbc.OdbcType ), lvItem.SubItems[ 1 ].Text, true ); + param.Direction = ( System.Data.ParameterDirection )Enum.Parse( typeof( System.Data.ParameterDirection ), lvItem.SubItems[ 3 ].Text, true ); + param.Value = lvItem.SubItems[ 4 ].Text; + + //Only modify size only if theres a value present. //WE DO NOT WANT + //to set the value to 0 as this will really mess with the command processing + if ( lvItem.SubItems[ 2 ].Text != "0" ) + { + param.Size = Convert.ToInt16( lvItem.SubItems[ 2 ].Text ); + } + + lvcount++; + //lvItem.SubItems.Add(param.OdbcType.ToString() ); + //lvItem.SubItems.Add(param.Direction.ToString()); + //lvItem.SubItems.Add(""); + } + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ADOCommandOverride.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ADOCommandOverride.resx new file mode 100644 index 00000000..19dc0dd8 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ADOCommandOverride.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/AssemblyInfo.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/AssemblyInfo.cs new file mode 100644 index 00000000..3ee1df2f --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/AssemblyInfo.cs @@ -0,0 +1,16 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: AssemblyTitle( "BizTalk Server 2006 ODBC Adapter" )] +[assembly: AssemblyDescription( "BizTalk Server 2006 ODBC Adapter" )] +[assembly: AssemblyConfiguration( "" )] +[assembly: AssemblyCompany( "Microsoft Corporation" )] +[assembly: AssemblyProduct( "Microsoft BizTalk Server 2006" )] +[assembly: AssemblyCopyright( "Copyright (C) 2006 Microsoft Corporation. All rights reserved." )] +[assembly: AssemblyTrademark( "" )] +[assembly: AssemblyCulture( "" )] + +[assembly: AssemblyVersion( "1.2.0.0" )] + +[assembly: AssemblyDelaySign( false )] +[assembly: AssemblyKeyName( "" )] \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/BTSODBCQueryEngine.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/BTSODBCQueryEngine.cs new file mode 100644 index 00000000..e93d57e9 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/BTSODBCQueryEngine.cs @@ -0,0 +1,358 @@ +using System; +using System.Data.Odbc; +using System.Xml; +using System.Xml.Schema; +using System.IO; +using System.Data; +using System.Text; + +namespace Microsoft.BizTalk.Adapters.ODBC.SchemaWizard +{ + /// + /// Summary description for BTSODBCQueryEngine. + /// + public class BTSODBCQueryEngine + { + public string ODBCConnectionString = ""; + public bool ODBCTransaction = false; + + public string DocumentRootNode =""; + public string Namespace = ""; + +#if(DEBUG) + public string DebugOutLocation = ""; +#endif + + public BTSODBCQueryEngine() + { + // + // TODO: Add constructor logic here + // + } + + private OdbcCommand CreateODBCCommandFromSchema(string QuerySchema) + { + StringReader sr = new StringReader(QuerySchema); + OdbcCommand odbcCmd = new OdbcCommand(); + XmlSchema xsdQueryConfiguration = XmlSchema.Read(sr,null); + + foreach(object item in xsdQueryConfiguration.Items) + { + if(item is XmlSchemaAnnotation) // Then we are at the section of the schema containing + { // the odbc query spec + XmlSchemaAnnotation xsAnnotation = (XmlSchemaAnnotation)item; + XmlSchemaAppInfo xsAppInfo = (XmlSchemaAppInfo)xsAnnotation.Items[0]; + XmlNode[] xmlNodesQueryInfo = xsAppInfo.Markup; + + // Create our new command object for query processing + odbcCmd.CommandText = xmlNodesQueryInfo[1].InnerText; + + //HACK TO ADDRESS OUT PARAMETERS FOR SP FIX THIS +// OdbcParameter outParam = new OdbcParameter(); +// outParam.Direction= ParameterDirection.ReturnValue; +// outParam.Size = 10; // THIS DOES MATTER FIX THIS: +// odbcCmd.Parameters.Add(outParam); + + } + if(item is XmlSchemaElement) // Query Parameters Section of the schema + { + XmlSchemaElement xsParamsElement = (XmlSchemaElement)item; + XmlSchemaComplexType xsCT = (XmlSchemaComplexType)xsParamsElement.SchemaType; + // IMPORTANT NOTE: If for some reason they change the order of the params in the + // schmema and/or the document being processes then the results will be wrong + // as there is no way to map the data to the correct element of the query + // remember our SQL looks like SELECT * FROM CUSTOMER WHERE CUSTOMERID = ? + foreach(XmlSchemaAttribute xsAttParams in xsCT.Attributes) + { + OdbcParameter queryParam = new OdbcParameter(); + + queryParam.ParameterName = "@" + xsAttParams.Name; + + //Now get all of the meta data from the parameter + XmlSchemaAppInfo xsParamInfo = (XmlSchemaAppInfo)xsAttParams.Annotation.Items[0]; + XmlNode[] xmlParamInfo = xsParamInfo.Markup; + + queryParam.OdbcType = ConvertStringDataTypeToODBC(xmlParamInfo[0].InnerText); + queryParam.Direction = ConverStrToParamDir(xmlParamInfo[1].InnerText); + + if(System.Convert.ToInt32(xmlParamInfo[2].InnerText) > 0) + queryParam.Size = System.Convert.ToInt32(xmlParamInfo[2].InnerText); + + odbcCmd.Parameters.Add(queryParam); + } + } + + } + + return odbcCmd; + } + /* + * SIMULATES BTS CODE EXECUTION FOR MESSGAE PROCESSING + */ + public string BTSExecuteODBCCall(string BTSDocument, string QuerySchema) + { + OdbcCommand odbcCmd = CreateODBCCommandFromSchema(QuerySchema); + odbcCmd.Connection = new OdbcConnection(ODBCConnectionString); + string Output = ""; + bool bOutputParametersInQuery = false; + OdbcTransaction localDBTransaction = null; + + XmlDocument xmlDoc = new XmlDocument(); + + XmlNamespaceManager xmlNSM = new XmlNamespaceManager(xmlDoc.NameTable); + + // WARNING: Should be converted to stream code I would suggest. + xmlDoc.LoadXml(BTSDocument); + + // Need to lookup the NS prefix for the payload section of the schema. + // Concerned that the root node will not always know what the NS is for our playload + // section of the document + // WARNING: Possible issue below + XmlNode root = xmlDoc.FirstChild; + + string sNSPrefix = root.GetPrefixOfNamespace(Namespace); + xmlNSM.AddNamespace(sNSPrefix, Namespace); + + // Now lets get the payload section of the document and process the queries + XmlNodeList xmlNL = xmlDoc.SelectNodes("/" + sNSPrefix + ":" + DocumentRootNode, xmlNSM); + + UnicodeEncoding Unicode = new UnicodeEncoding(); + + foreach(XmlNode xmlN in xmlNL) + { + int xmlInboudMsgAttribCnt = 0; + //WE NEED TO SKIP THIS FIRST ELEMENT WHICH IS THE ReturnValue + for(int cnt = 0; cnt < odbcCmd.Parameters.Count; cnt++) + { + if(odbcCmd.Parameters[cnt].Direction == ParameterDirection.ReturnValue + || odbcCmd.Parameters[cnt].Direction == ParameterDirection.Output + ||odbcCmd.Parameters[cnt].Direction == ParameterDirection.InputOutput) + { + // Add a flag so we know that we need to add out parameters to our ouput xml document + bOutputParametersInQuery = true; + } + + //WE also need to check if this is an input or output value + if(odbcCmd.Parameters[cnt].Direction != ParameterDirection.ReturnValue && odbcCmd.Parameters[cnt].Direction != ParameterDirection.Output) + { + + // Even though the command object has some capabilities to perform + // data type conversions, we still need to manually convert many of them. + // So insted of picking and choosing we are just going to convert them all! + switch(odbcCmd.Parameters[cnt].OdbcType.ToString()) + { + case "BigInt": + odbcCmd.Parameters[cnt].Value = System.Convert.ToInt64(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Binary": + odbcCmd.Parameters[cnt].Value = Unicode.GetBytes(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Bit": + odbcCmd.Parameters[cnt].Value = System.Convert.ToBoolean(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Text": + odbcCmd.Parameters[cnt].Value = System.Convert.ToString(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "DateTime": + odbcCmd.Parameters[cnt].Value = System.Convert.ToDateTime(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Numeric": + odbcCmd.Parameters[cnt].Value = System.Convert.ToDecimal(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Double": + odbcCmd.Parameters[cnt].Value = System.Convert.ToDouble(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Int": + odbcCmd.Parameters[cnt].Value = System.Convert.ToInt32(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Real": + odbcCmd.Parameters[cnt].Value = System.Convert.ToDouble(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "SmallInt": + odbcCmd.Parameters[cnt].Value = System.Convert.ToInt16(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "TinyInt": + odbcCmd.Parameters[cnt].Value = System.Convert.ToByte(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "UniqueIdentifier": //FIX THIS: Need to do something else! + odbcCmd.Parameters[cnt].Value = System.Convert.ToString(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Char" : //FIX THIS NEEDS TO SUPPORT ARRAYS + odbcCmd.Parameters[cnt].Value = System.Convert.ToString(xmlN.Attributes[xmlInboudMsgAttribCnt].Value);//.ToCharArray(); + break; + case "Date": // THIS IS A BEST GUESS + odbcCmd.Parameters[cnt].Value = System.Convert.ToDateTime(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Decimal": + odbcCmd.Parameters[cnt].Value = System.Convert.ToDecimal(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Image": + odbcCmd.Parameters[cnt].Value = Unicode.GetBytes(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "NChar": + odbcCmd.Parameters[cnt].Value = System.Convert.ToString(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "NText": + odbcCmd.Parameters[cnt].Value = System.Convert.ToString(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "NVarChar": + odbcCmd.Parameters[cnt].Value = System.Convert.ToString(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "SmallDateTime": // BEST GUESS + odbcCmd.Parameters[cnt].Value = System.Convert.ToDateTime(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Time": // BEST GUESS + odbcCmd.Parameters[cnt].Value = System.Convert.ToDateTime(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Timestamp": + odbcCmd.Parameters[cnt].Value = Unicode.GetBytes(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "VarBinary": //FIX THIS + odbcCmd.Parameters[cnt].Value = Unicode.GetBytes(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "VarChar": + odbcCmd.Parameters[cnt].Value = System.Convert.ToString(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + default: + odbcCmd.Parameters[cnt].Value = System.Convert.ToDateTime(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + + } + xmlInboudMsgAttribCnt ++; + } + } + + try + { + // HERE we actually execute the query against the target database + // We're leveraging ADO.NET to do alot of the heave lifting so it can deal with + // generateing the XML output for us + OdbcDataAdapter odbcAdapter = new OdbcDataAdapter(); + + //================================ BEGIN TRANSACTION =================================== + if(ODBCTransaction) // Do we need to enlist the operation in a transaction + localDBTransaction = odbcCmd.Connection.BeginTransaction (); + + odbcAdapter.SelectCommand = odbcCmd; + + DataSet ds = new DataSet(); + odbcAdapter.Fill(ds); + Output = ds.GetXml(); +#if(DEBUG)// write output to a specified file + if(DebugOutLocation != null) + { + ds.WriteXml("C:\\TEMP\\ADAPTEROUT.XML"); + } +#endif + // =============================== END TRANSACTION ======================================= + if(ODBCTransaction) // Do we need to complete a transcation + localDBTransaction.Commit(); + } + catch(Exception e) + { + try + { + if(ODBCTransaction) + { + // ======================= ROLLBACK TRANSACTION ================================== + localDBTransaction.Rollback(); + } + } + catch (Exception ex) + { + + } + + } + + + //Once we have the return data set and its corrisponding XML we need to add any outparameter + //values to the end of that XML document + + + + + } + + + return Output; + } + private ParameterDirection ConverStrToParamDir(string sParamDir) + { + switch(sParamDir) + { + case "Input": + return ParameterDirection.Input; + case "Output": + return ParameterDirection.Output; + case "InputOutput": + return ParameterDirection.InputOutput; + case "ReturnValue": + return ParameterDirection.ReturnValue; + default: + return ParameterDirection.Input; + + } + + + } + private OdbcType ConvertStringDataTypeToODBC(string sType) + { + switch(sType) + { + case "BigInt": + return OdbcType.BigInt; + case "Binary": // Also could be IMAGE + return OdbcType.Binary; + case "Bit": + return OdbcType.Bit; + case "Text": // Could also be NCHAR, NTEXT, NVARCHAR + return OdbcType.Text; + case "DateTime": + return OdbcType.DateTime; + case "Numeric": // Could also be DECIMAL, + return OdbcType.Numeric; + case "Double": + return OdbcType.Double; + case "Int": + return OdbcType.Int; + case "Real": + return OdbcType.Real; + case "SmallInt": + return OdbcType.SmallInt; + case "TinyInt": + return OdbcType.TinyInt; + case "UniqueIdentifier": + return OdbcType.UniqueIdentifier; + case "Char" : + return OdbcType.Char; + case "Date": + return OdbcType.Date; + case "Decimal": + return OdbcType.Decimal; + case "Image": + return OdbcType.Image; + case "NChar": + return OdbcType.NChar; + case "NText": + return OdbcType.NText; + case "NVarChar": + return OdbcType.NVarChar; + case "SmallDateTime": + return OdbcType.SmallDateTime; + case "Time": + return OdbcType.Time; + case "Timestamp": + return OdbcType.Timestamp; + case "VarBinary": + return OdbcType.VarBinary; + case "VarChar": + return OdbcType.VarChar; + default: + return OdbcType.Text; + } + + } + + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/Form1.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/Form1.cs new file mode 100644 index 00000000..d8e760bf --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/Form1.cs @@ -0,0 +1,59 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; + +namespace Microsoft.BizTalk.Adapter.ODBC.SchemaWizard +{ + /// + /// Summary description for Form1. + /// + public class Form1 : System.Windows.Forms.Form + { + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public Form1() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.Size = new System.Drawing.Size(300,300); + this.Text = "Form1"; + } + #endregion + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/Form1.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/Form1.resx new file mode 100644 index 00000000..3f337e08 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/Form1.resx @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ODBCAdapter.snk b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ODBCAdapter.snk new file mode 100644 index 0000000000000000000000000000000000000000..0d564ea32858712121e1a4107e9400b9222978b6 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097ln4vQ4k&*q7xIBtACM>^uMjNyP06TNf zDH+G}B9=JY*p#EM9E0?3_%Po57I03rNK(JD11In*3z%gxEcNcc^74h!Kn5rDJNL=1 zbtGWj3vI;cA|lhHEdReXS{NEG?rA(|$tK(`)-GssxzFmqLt}vM(~?oFv<3+oO6^9#QW*Pa@HeX6wRhNdY$yq{w5ftPw(CN& zKAXY%q^8m^B;R`9d|lwb=Oh93Wqi$X^#H9MA@(hNj*=~9So3peD*%N+tOOlYx`2~_ zm^da99t?`XY8BSdN*J;1=SO1j-hYTMjc{@OpS7}{8NZWa=(9cbV>?Abk(%@ zsbbMvj=FE`YbF|;xvTV(62C2&1$A7 z;}@t^2T1c>ax;46MSn&1E3RmsB=%Jzw2lGcI5?&7@%TJctkTR_b3QKPNI`a%ff` + // + // SELECT * FROM DEMO WHERE DEI = @DEI + // SELECT * FROM DEMO WHERE DEI = ? + // ResponseDocRootName + // http://ResponseNS + // + // + + XmlSchemaAnnotation xsAnnotation = new XmlSchemaAnnotation( ); + XmlSchemaAppInfo xsAppInfo = new XmlSchemaAppInfo( ); + + // AppInfo class uses an array of nodes to contain config data + // so we need to use the XMLDOM to create these nodes + XmlDocument xmlWorkingDoc = new XmlDocument( ); + + XmlNode[ ] xmlNodeAdapterConfig = new XmlNode[ 4 ]; + + // Save out the query with parameter information + xmlNodeAdapterConfig[ 0 ] = xmlWorkingDoc.CreateNode( XmlNodeType.Element, "msbtsodbc", "SQLCMD", "http://schemas.microsoft.com/BizTalk/2003" ); + xmlNodeAdapterConfig[ 0 ].InnerText = _strScript; + + // Save out generic query with ODBC escape sequence + xmlNodeAdapterConfig[ 1 ] = xmlWorkingDoc.CreateNode( XmlNodeType.Element, "msbtsodbc", "ODBCCMD", "http://schemas.microsoft.com/BizTalk/2003" ); + xmlNodeAdapterConfig[ 1 ].InnerText = ProcessedCommandScript; + + // Save out root node name for the response document generated by this query + xmlNodeAdapterConfig[ 2 ] = xmlWorkingDoc.CreateNode( XmlNodeType.Element, "msbtsodbc", "ResponseRootName", "http://schemas.microsoft.com/BizTalk/2003" ); + xmlNodeAdapterConfig[ 2 ].InnerText = _strOutputRoot; + + // Save out root node name for the response document generated by this query + xmlNodeAdapterConfig[ 3 ] = xmlWorkingDoc.CreateNode( XmlNodeType.Element, "msbtsodbc", "ResponseNS", "http://schemas.microsoft.com/BizTalk/2003" ); + xmlNodeAdapterConfig[ 3 ].InnerText = _strTargetNamespace; + + xsAppInfo.Markup = xmlNodeAdapterConfig; + xsAnnotation.Items.Add( xsAppInfo ); + + return xsAnnotation; + } + + public string ExtractODBCParametersSchema( OdbcCommand odbcCmd ) + { + //First check to see if there are any input parameters + //if not we may only need to genterate a response schema! + _HasInputParameters = false; + + // if(odbcCmd.Parameters.Count == 0) + // { + // return null; + // } + // else + // { + XmlSchema xsBTSInboundMsg = new XmlSchema( ); + XmlSchemaAnnotation xsAnnotation; + XmlSchemaAppInfo xsAppInfo; + // AppInfo class uses an array of nodes to contain config data + // so we need to use the XMLDOM to create these nodes + XmlDocument xmlWorkingDoc = new XmlDocument( ); + XmlNode[ ] xmlNodeAdapterConfig; + + xsBTSInboundMsg.AttributeFormDefault = XmlSchemaForm.Unqualified; + xsBTSInboundMsg.ElementFormDefault = XmlSchemaForm.Qualified; + + xsBTSInboundMsg.TargetNamespace = _strTargetNamespace + "/" + _strInputRoot; //"http://ODBCADAPTERTEST.com"; //FIX THIS: needs to be a parameter + xsBTSInboundMsg.Namespaces.Add( "msbtsodbc", "http://schemas.microsoft.com/BizTalk/2003" ); + + // Write the configuration to the schema + xsBTSInboundMsg.Items.Add( AdapterHeaderAnnotationSection( odbcCmd.CommandText ) ); + + //==================== QUERY PARAMETERS SCHEMA SECTION ==================== + XmlSchemaElement xsQueryRoot = new XmlSchemaElement( ); + //Setup document root + xsQueryRoot.Name = _strInputRoot; + + xsBTSInboundMsg.Items.Add( xsQueryRoot ); + + if ( odbcCmd.Parameters.Count > 0 ) + { + // + XmlSchemaComplexType xsRepeatingComplexType = new XmlSchemaComplexType( ); + + xsQueryRoot.SchemaType = xsRepeatingComplexType; // + + XmlSchemaElement xsElementParameters = new XmlSchemaElement( ); + + XmlSchemaSequence xsSeq = new XmlSchemaSequence( ); + xsSeq.Items.Add( xsElementParameters ); + + //Setup the repeating section of the query + xsElementParameters.Name = "QueryParameters"; + xsElementParameters.MaxOccursString = "unbounded"; + xsElementParameters.MinOccursString = "1"; + + XmlSchemaComplexType xsComplexType = new XmlSchemaComplexType( ); + + xsRepeatingComplexType.Particle = ( XmlSchemaParticle )xsSeq; // + + xsElementParameters.SchemaType = xsComplexType; // + + // Loop through the parameter section of the command object and create a + // schema attribute for each + //Loop throught the ODBC Command object looking for in parameters + foreach ( OdbcParameter odbcParam in odbcCmd.Parameters ) + { + XmlSchemaAttribute xsAttribute = new XmlSchemaAttribute( ); + xsAttribute.Name = odbcParam.ParameterName.Replace( "@", "" ); + xsAttribute.SchemaTypeName = ConvertODBCDataTypeToXMLDataType( odbcParam.OdbcType.ToString( ) ); + + // SAVE Out the meta data for this parameter in an appinfo section of the schema + // this is done to deal with the name space problems we run into etx with special + // attributes + xsAnnotation = new XmlSchemaAnnotation( ); // These vars were already define earlier + xsAppInfo = new XmlSchemaAppInfo( ); + + // AppInfo class uses an array of nodes to contain config data + // so we need to use the XMLDOM to create these nodes + xmlWorkingDoc = new XmlDocument( ); + + xmlNodeAdapterConfig = new XmlNode[ 3 ]; + + // Save out ODBC data type for parameter + xmlNodeAdapterConfig[ 0 ] = xmlWorkingDoc.CreateNode( XmlNodeType.Element, "msbtsdbc", "ParamType", "http://schemas.microsoft.com/BizTalk/2003" ); + xmlNodeAdapterConfig[ 0 ].InnerText = odbcParam.OdbcType.ToString( ); + + // Save out the parameter direction + xmlNodeAdapterConfig[ 1 ] = xmlWorkingDoc.CreateNode( XmlNodeType.Element, "msbtsodbc", "ParamDir", "http://schemas.microsoft.com/BizTalk/2003" ); + xmlNodeAdapterConfig[ 1 ].InnerText = odbcParam.Direction.ToString( ); + + // Save out the parameters data lenght + xmlNodeAdapterConfig[ 2 ] = xmlWorkingDoc.CreateNode( XmlNodeType.Element, "msbtsodbc", "ParamSize", "http://schemas.microsoft.com/BizTalk/2003" ); + xmlNodeAdapterConfig[ 2 ].InnerText = odbcParam.Size.ToString( ); + + // Write the configuration to the schema + xsAttribute.Annotation = xsAnnotation; + xsAnnotation.Items.Add( xsAppInfo ); + xsAppInfo.Markup = xmlNodeAdapterConfig; + + xsComplexType.Attributes.Add( xsAttribute ); // + + if ( odbcParam.Direction == ParameterDirection.Input || odbcParam.Direction == ParameterDirection.InputOutput ) + _HasInputParameters = true; + + // + // etc... + } + } + // Get the schema string + StringBuilder sb = new StringBuilder( ); + StringWriter sw = new StringWriter( sb ); + xsBTSInboundMsg.Write( sw ); + + string sReturnSchema = sb.ToString( ); + + return sReturnSchema; + //} + } + + /* + * This function exists as the ODBC provider in .NET does not like + * named parameters as part of database calls. So we will convert + * the command parameters collection and command text into a generic SQL + * statement. + */ + public string BuildSQLSPCommandString( OdbcCommand odbcCmd ) + { + //bool bReturnVal = false; // Need to know this as some SP's do not return these + string sSQLCommand = ""; //{ @RC = CALL StoredProc(@Param1, @Param2)} + // This will be used to mapping to the XML + // durning transmission + + string sGenericSPEscapeSequence = ""; //{ ? = CALL StoredProc(?, ?)} + // This will be the actual call made by the + // ODBC command object for the transmission + + // The first parameter in the parameters collection normally + // maintains the return value + + sSQLCommand = "{"; + sGenericSPEscapeSequence = "{"; + + if ( odbcCmd.Parameters.Count > 0 && odbcCmd.Parameters[ 0 ].Direction == System.Data.ParameterDirection.ReturnValue ) + { + sSQLCommand += odbcCmd.Parameters[ 0 ].ParameterName + " = "; + sGenericSPEscapeSequence += "? ="; + //bReturnVal = true; + } + + //Embed the sp execute statement + sSQLCommand += "CALL " + odbcCmd.CommandText; + sGenericSPEscapeSequence += "CALL " + odbcCmd.CommandText; + + //Now we loop thru the remaining parameters and build the SP statement + for ( int cnt = 0; cnt < odbcCmd.Parameters.Count; cnt++ ) + { + if ( cnt == 0 ) + { + //Set up for input parameters section of SP + sSQLCommand += "("; + sGenericSPEscapeSequence += "("; + } + + if ( odbcCmd.Parameters[ cnt ].Direction != ParameterDirection.ReturnValue ) + { + sSQLCommand += odbcCmd.Parameters[ cnt ].ParameterName; + sGenericSPEscapeSequence += "?"; + } + + // Do we have another parameter after this parameter? If so we need to build an additional parameters + if ( ( cnt + 1 ) < odbcCmd.Parameters.Count && + odbcCmd.Parameters[ cnt ].Direction != ParameterDirection.ReturnValue ) + { + sSQLCommand += ","; + sGenericSPEscapeSequence += ","; + } + + //Finish up the formating for the parameters if this is the last param + if ( ( cnt + 1 ) == odbcCmd.Parameters.Count ) + { + //Set up for input parameters section of SP + sSQLCommand += ")"; + sGenericSPEscapeSequence += ")"; + } + } + + //Complete the statement syntax + sSQLCommand += "}"; + sGenericSPEscapeSequence += "}"; + + //FIXED BY RODOLFO + sGenericSPEscapeSequence = sGenericSPEscapeSequence.Replace( "()", "" ); + + _strGeneratedScript = sGenericSPEscapeSequence; + + return sGenericSPEscapeSequence; + } + + public OdbcCommand GenerateODBCCommandFromSP( string sql ) + { + //To resove the parameters for a given SP we need a live connection + OdbcConnection odbcCon = new OdbcConnection( _strDBConnection ); + OdbcCommand odbcCmd = new OdbcCommand( sql, odbcCon ); + UnicodeEncoding Unicode = new UnicodeEncoding( ); + + odbcCmd.CommandType = CommandType.StoredProcedure; + + odbcCon.Open( ); + + //Have the ODBC Namespace resolve the parameters + OdbcCommandBuilder.DeriveParameters( odbcCmd ); + + odbcCon.Close( ); + + //Now we'll loop thur the parameters set some bogus test data + foreach ( OdbcParameter odbcParam in odbcCmd.Parameters ) + { + switch ( odbcParam.OdbcType.ToString( ) ) + { + case "BigInt": + odbcParam.Value = System.Convert.ToInt64( "1" ); + break; + case "Binary": + odbcParam.Value = Unicode.GetBytes( "1" ); + break; + case "Bit": + odbcParam.Value = System.Convert.ToBoolean( "true" ); + break; + case "Text": + odbcParam.Value = System.Convert.ToString( "1" ); + break; + case "DateTime": + odbcParam.Value = System.Convert.ToDateTime( "1/1/2000" ); + break; + case "Numeric": + odbcParam.Value = System.Convert.ToDecimal( "1" ); + break; + case "Double": + odbcParam.Value = System.Convert.ToDouble( "1" ); + break; + case "Int": + odbcParam.Value = System.Convert.ToInt32( "1" ); + break; + case "Real": + odbcParam.Value = System.Convert.ToDouble( "1" ); + break; + case "SmallInt": + odbcParam.Value = System.Convert.ToInt16( "1" ); + break; + case "TinyInt": + odbcParam.Value = System.Convert.ToByte( "1" ); + break; + case "UniqueIdentifier": //FIX THIS: Need to do something else! + odbcParam.Value = Guid.NewGuid( );// System.Convert.ToString("1"); + break; + case "Char": //FIX THIS NEEDS TO SUPPORT ARRAYS + odbcParam.Value = System.Convert.ToString( "1" );//.ToCharArray(); + break; + case "Date": // THIS IS A BEST GUESS + odbcParam.Value = System.Convert.ToDateTime( "1/1/2000" ); + break; + case "Decimal": + odbcParam.Value = System.Convert.ToDecimal( "1" ); + break; + case "Image": + odbcParam.Value = Unicode.GetBytes( "1" ); + break; + case "NChar": + odbcParam.Value = System.Convert.ToString( "1" ); + break; + case "NText": + odbcParam.Value = System.Convert.ToString( "1" ); + break; + case "NVarChar": + odbcParam.Value = System.Convert.ToString( "1" ); + break; + case "SmallDateTime": // BEST GUESS + odbcParam.Value = System.Convert.ToDateTime( "1/1/2000" ); + break; + case "Time": // BEST GUESS + odbcParam.Value = System.Convert.ToDateTime( "1/1/2000" ); + break; + case "Timestamp": + odbcParam.Value = Unicode.GetBytes( "1" ); + break; + case "VarBinary": //FIX THIS + odbcParam.Value = Unicode.GetBytes( "1" ); + break; + case "VarChar": + odbcParam.Value = System.Convert.ToString( "1" ); + break; + default: + odbcParam.Value = System.Convert.ToDateTime( "1" ); + break; + + } + } + + // Now we need to process the command and generate a generic escape sequence for the SQL + // the ODBC provider does NOT like named parameters + odbcCmd.CommandText = BuildSQLSPCommandString( odbcCmd ); + + return odbcCmd; + } + + public OdbcCommand GenerateODBCCommandFromSQL( string sql ) + { + int iParamStartIndex = 0; + int iParamEndIndex = 1; + int iParamSize = 0; + string sParameterName = ""; + + // We need to conver the SQL sytax that the user provided to something + // that the ODBC namespace can handle: + // FROM: + // SELECT * FROM CUSTOMERS WHERER CUSTOMERID = @CUSTOMERID + // TO: + // SELECT * FROM CUSTOMERS WHERE CUSTOMERID = ? + // Thats what will be contained in the sODBCSQLEscapeSequence + string sODBCSQLEscapeSequence = sql; + + //Get rid of the \r\n stuff and convert is to normal whitespace + //or we will end up with missing text + sql = sql.Replace( "\r\n", " " ); + + OdbcConnection odbcCon = new OdbcConnection( _strDBConnection ); + OdbcCommand dbCmdODBC = new OdbcCommand( ); + dbCmdODBC.Connection = odbcCon; + dbCmdODBC.CommandType = CommandType.Text; + + // Prep the command to deal with no spaces between commands etc + // (@VALUE1,@VALUE2) + sql = sql.Replace( ",", " ," ); + sql = sql.Replace( "(", " (" ); + sql = sql.Replace( ")", " )" ); + + do + { + //Now we need to shread the SQL the user provided us with to pull out + //the parameters. These will be used to build in the input schema + // V + // SELECT * FROM CUSTOMERS WHERE CUSTOMERID = @CUSTOMERID AND..... + iParamStartIndex = sql.IndexOf( "@", iParamEndIndex ); + + //If we run out of parameters get out of the loop + if ( iParamStartIndex == -1 ) + break; + //++++++ NEED TO ADD A SECTION OF TYPE OF QUERY UPDATE, SQL SP etc + // V + // SELECT * FROM CUSTOMERS WHERE CUSTOMERID = @CUSTOMERID AND..... + iParamEndIndex = sql.IndexOf( " ", iParamStartIndex ); + + //We could be at the end of the string so we need to check + if ( iParamEndIndex == -1 ) + iParamEndIndex = sql.Length; + + //Figure out how big the parameter term is so we only extract it from the string + iParamSize = iParamEndIndex - iParamStartIndex; + sParameterName = sql.Substring( iParamStartIndex, iParamSize ); + + // ========================= Process Parameters ======================= + //Add a new parameter to our command object + OdbcParameter odbcParam = new OdbcParameter( ); + + odbcParam.ParameterName = sParameterName; + odbcParam.Value = "1"; + odbcParam.Direction = ParameterDirection.Input; + //odbcParam.DbType = CANT DETERMINE THIS!!! + + dbCmdODBC.Parameters.Add( odbcParam ); + + //====================== Setup Generic Command SQL ==================== + sODBCSQLEscapeSequence = sODBCSQLEscapeSequence.Replace( sParameterName, "?" ); + } + while ( iParamEndIndex != sql.Length ); + + //Now set the command objects command text to our generic SQL + dbCmdODBC.CommandText = sODBCSQLEscapeSequence; + + //Publish it up to the class level as a property + _strGeneratedScript = sODBCSQLEscapeSequence; + + return dbCmdODBC; + } + + public string GenerateOutputSchema( OdbcCommand odbcCmd ) + { + bool bOutParamsFound = false; + try + { + // Call the command to get the output schema + OdbcDataAdapter OdbcAdapter = new OdbcDataAdapter( ); + + // Need to call a transaction to prevent writes during the generation + // of an output schema. + // We want to wrap this call in a transaction that we don't commit + odbcCmd.Connection.Open( ); + OdbcTransaction odbcTrans = odbcCmd.Connection.BeginTransaction( ); + + odbcCmd.Transaction = odbcTrans; + + OdbcAdapter.SelectCommand = odbcCmd; + + DataSet custDS = new DataSet( _strOutputRoot ); + + //Load the data set to get the output schema + OdbcAdapter.Fill( custDS ); + + // Throw away any junk we may have written + + //odbcTrans.Rollback(); //WARNING: These have been commited out as during testing some of the + // open source DBs fail to implement transaction correctly. Most commercial DBS + // will roll these transaction back if we fail to call Commit. So in most cases + // we should be golden + //odbcCmd.Transaction.Rollback(); + + // Save the query Output for testing purposed + _QueryProcessingOutPut = custDS.GetXml( ); + + odbcCmd.Connection.Close( ); + + string xsResultsSchema = custDS.GetXmlSchema( ); + + //Now we need to extend the schema + StringReader sr = new StringReader( xsResultsSchema ); + //Load the data set schema into the XML Schema Objects + XmlSchema xsdQueryConfiguration = XmlSchema.Read( sr, null ); + + //Add target namespace + //.DOC added to the name to prevent a collision between the ns ID and the root note name generated + // by the dataset. + xsdQueryConfiguration.TargetNamespace = _strTargetNamespace + "/" + _strOutputRoot; + xsdQueryConfiguration.Id = _strOutputRoot + "Schema"; + + //Now we need to disect the XSD from the data set so we can add our SP + //Parameters. The first element in the schema is an elemement + // xsd:element + XmlSchemaElement xsParentElement = ( XmlSchemaElement )xsdQueryConfiguration.Items[ 0 ]; + + //Next get the complex type + //xsd:ComplexType + XmlSchemaComplexType xsParentComplexType = ( XmlSchemaComplexType )xsParentElement.SchemaType; + + //Next get the choice + //xsd:Choice + XmlSchemaChoice xsParentChoice = ( XmlSchemaChoice )xsParentComplexType.Particle; + + //Now we can insert the new SP parameters section into the + //choice selection + + //include any output parameters that are include + //Now we add a section for the return value and out parameters + //==================== QUERY PARAMETERS SCHEMA SECTION ==================== + + XmlSchemaElement xsElementParameters = new XmlSchemaElement( ); + xsElementParameters.Name = "OutParameters"; + + XmlSchemaComplexType xsComplexType = new XmlSchemaComplexType( ); + + xsElementParameters.SchemaType = xsComplexType; // + + // Loop through the parameter section of the command object and create a + // schema attribute for each + //Loop throught the ODBC Command object looking for in parameters + foreach ( OdbcParameter odbcParam in odbcCmd.Parameters ) + { + // We only want to create elements for out bound parameters since this is the + // adapters output schema + if ( odbcParam.Direction != ParameterDirection.Input ) + { + bOutParamsFound = true; + XmlSchemaAttribute xsAttribute = new XmlSchemaAttribute( ); + xsAttribute.Name = odbcParam.ParameterName.Replace( "@", "" ); + xsAttribute.SchemaTypeName = ConvertODBCDataTypeToXMLDataType( odbcParam.OdbcType.ToString( ) ); + xsComplexType.Attributes.Add( xsAttribute ); // + } + } + + // See if we need to add the out parameters section to the schema + if ( bOutParamsFound ) + { + xsParentChoice.Items.Add( xsElementParameters ); // + } + + //Check to see if this is a receive port. If it is we need to add the adapter meta data to the header + //of the schema. + if ( _portType == PortType.Receive ) + { + XmlSchemaObject objTmp = xsdQueryConfiguration.Items[ 0 ]; + //Hack to force the header infor to be at the top of the schema + xsdQueryConfiguration.Items.RemoveAt( 0 ); + xsdQueryConfiguration.Items.Add( AdapterHeaderAnnotationSection( odbcCmd.CommandText ) ); + xsdQueryConfiguration.Items.Add( objTmp ); + } + + // Get the schema string + StringBuilder sb = new StringBuilder( ); + StringWriter sw = new StringWriter( sb ); + xsdQueryConfiguration.Write( sw ); + + string sReturnSchema = sb.ToString( ); + + return sReturnSchema; + } + catch ( Exception e ) + { + if ( odbcCmd.Connection.State == ConnectionState.Open ) + odbcCmd.Connection.Close( ); + + throw new Exception( "Error Occured while attempting to generate the output schema for the query: " + e.Message ); + } + } + + private XmlQualifiedName ConvertODBCDataTypeToXMLDataType( string ODBCDataType ) + { + switch ( ODBCDataType ) + { + case "BigInt": + return new XmlQualifiedName( "long", "http://www.w3.org/2001/XMLSchema" ); + case "Binary": + return new XmlQualifiedName( "base64Binary", "http://www.w3.org/2001/XMLSchema" ); + case "Bit": + return new XmlQualifiedName( "boolean", "http://www.w3.org/2001/XMLSchema" ); + case "Char": + return new XmlQualifiedName( "string", "http://www.w3.org/2001/XMLSchema" ); + case "DateTime": + return new XmlQualifiedName( "dateTime", "http://www.w3.org/2001/XMLSchema" ); + case "Decimal": + return new XmlQualifiedName( "decimal", "http://www.w3.org/2001/XMLSchema" ); + case "Double": + return new XmlQualifiedName( "double", "http://www.w3.org/2001/XMLSchema" ); + case "Image": + return new XmlQualifiedName( "base64Binary", "http://www.w3.org/2001/XMLSchema" ); + case "Int": + return new XmlQualifiedName( "int", "http://www.w3.org/2001/XMLSchema" ); + case "NChar": + return new XmlQualifiedName( "string", "http://www.w3.org/2001/XMLSchema" ); + case "NText": + return new XmlQualifiedName( "string", "http://www.w3.org/2001/XMLSchema" ); + case "Numeric": + return new XmlQualifiedName( "decimal", "http://www.w3.org/2001/XMLSchema" ); + case "NVarChar": + return new XmlQualifiedName( "string", "http://www.w3.org/2001/XMLSchema" ); + case "Real": + return new XmlQualifiedName( "float", "http://www.w3.org/2001/XMLSchema" ); + case "SmallInt": + return new XmlQualifiedName( "short", "http://www.w3.org/2001/XMLSchema" ); + case "Text": + return new XmlQualifiedName( "string", "http://www.w3.org/2001/XMLSchema" ); + case "TinyInt": + return new XmlQualifiedName( "unsignedByte", "http://www.w3.org/2001/XMLSchema" ); + case "UniqueIdentifier"://FIX THIS + return new XmlQualifiedName( "long", "http://www.w3.org/2001/XMLSchema" ); + case "VarBinary": + return new XmlQualifiedName( "base64Binary", "http://www.w3.org/2001/XMLSchema" ); + case "VarChar": + return new XmlQualifiedName( "string", "http://www.w3.org/2001/XMLSchema" ); + default: + return new XmlQualifiedName( "string", "http://www.w3.org/2001/XMLSchema" ); + } + } + + public bool CreateBizTalkSchema( ) + { + OdbcCommand OdbcCmd; + OdbcConnection OdbcCon = new OdbcConnection( _strDBConnection ); + + if ( QueryCommandType == AdapterCommandType.SQL ) + { + OdbcCmd = this.GenerateODBCCommandFromSQL( _strScript ); + //If they want to modify the command then we present the user with a dialog + //that will allow them to override out default command settings. This is done + //to help addess data type and testing issues with different databases + if ( _ModifyCommand ) + { + ADOCommandOverride test = new ADOCommandOverride( ); + test.ADOCommand = OdbcCmd; + test.ParentClass = this; + test.ShowDialog( ); + } + } + else + { + OdbcCmd = this.GenerateODBCCommandFromSP( _strScript ); + } + + InputSchema = ExtractODBCParametersSchema( OdbcCmd ); + + //Only call the output schema functions if we need an output schema + if ( this._StatementType != AdapterStatementType.Input ) + { + OutputSchema = GenerateOutputSchema( OdbcCmd ); + } + + return true; + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ODBCSchemaWizard.csproj b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ODBCSchemaWizard.csproj new file mode 100644 index 00000000..417e3d9f --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ODBCSchemaWizard.csproj @@ -0,0 +1,243 @@ + + + + Local + 9.0.30729 + 2.0 + {3BCB956F-E5FB-4D40-9090-8E44E92C5353} + Debug + AnyCPU + + + + + ODBCSchemaWizard + ODBCAdapter.snk + JScript + Grid + IE50 + false + Library + Microsoft.BizTalk.Adapter.ODBC.SchemaWizard + OnBuildSuccess + + + + + + + true + 3.5 + + + + + + + + + false + v4.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + AllRules.ruleset + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + AllRules.ruleset + + + + System + + + System.Data + + + System.Drawing + + + System.Windows.Forms + + + System.XML + + + + + Form + + + Code + + + Code + + + UserControl + + + Code + + + UserControl + + + UserControl + + + Form + + + UserControl + + + UserControl + + + UserControl + + + Form + + + UserControl + + + ADOCommandOverride.cs + Designer + + + ADOParameters.cs + + + DBConnection.cs + + + FinishDisplay.cs + + + ODBCAdapterWizardForm.cs + Designer + + + QueryEditor.cs + Designer + + + QueryType.cs + + + SchemaMetaData.cs + + + WizardForm.cs + Designer + + + WizardUserControl.cs + Designer + + + + + + + {F25132D9-07AA-4B41-90AD-828E54704692} + ODBCDriverPrompt + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + + + CALL "%25VS100COMNTOOLS%25vsvars32.bat" +gacutil.exe /i "$(TargetPath)" + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/TestCases.xls b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/TestCases.xls new file mode 100644 index 0000000000000000000000000000000000000000..c86fa9f80aad355e1e00fc16b53116dc6d81fc38 GIT binary patch literal 14336 zcmeHOeQX>@6@Po*X;Rm|G$wIkckQ&qcH&@CHwlE)S85k5HJ?sNDh$r$ZY`VGKI?pe z1{L8#`(G;+wG#YM2~{dIX%MukC<37<5r_||RZ*l0@gd|Q_zwwDfkdUY=J$KEyLY>{ zR|QbThjv!8Gw(NV=Dm6IW^QJ8?-#FjtUmoh*Xt4rcS=&;Sz9NW2HZlv%cI)`tumfa35!WPx=#3}hxP_uleK_UBiSO^UoO33)zs6?c)}BTmVZY!o?ODOcuaD)v2d zi&) zz<$&g)H{_ZDBojx@6&r5?v{K{>-<`g55l{D2L81#K2BE``9a#cOR6#_MVXiPuCyn$ zP15o{k-l5|rtIyzwr?LkpxLP*C3;f5n1|Z}<)1w6ls^?@>XWQ=H!|%W4z>fjC$&Rz z(ii4xYE4-W%Aml4)3(YPG@4D@2YkTQuMz4S>Qk~XZTF;h%K$Dk&{%iSZmc$F2WpJV zE-8dXLYYPpZuJm~W=2QrqW8*9j96W?$L&k61EHGRjjzmwgZ|??T}~Pv1s55wdS(!lMAv3{h=zJH3ts36p6XOTq1FcPHT+F@K7_k+ zM_jx~uG>x%p6?Cn)Et9r<(70bn1F$d(>z4nRoOAgwebQa6@ z(Mq+p0b32HROHx#=|s60@&r5A3VfCw#|-9pUC+{1Z%bqwYjD;9iE6xGU+<{YX26zIE|0 z*AAUIIy$ZRpyE6A{v}0Lz~hD6Fs9hO$U`W(nxZVK^kwCKSnp5M+rVMzMQ$&wj+z|P z`@ox%FKB0B!glJEQkwN%+EAwxY_)+-f$ujr)XOv2w@kFv=`6M=;?k06Q<1cUXfJXJ z`U&%TtbkMBB*ZW}O&Gm0%!l!8!q~?!UpfNgIVa2qU4gYxJaw_D3#}dIc z(SyuM!cZ1C=|P4{fTHghDhY~SW2h7;`i7ynbEj8a);1|`v)c={)+HQuYL$fEomwXe z*_{n|(#KQC(IeP$5)vD!3@CbrDa*=MpQ4^d4t3xv+=(lpoGG+pWU(ISXI*kiB^bQ1 z^%V5qigT8c#eUaYPX}60`>nHwX>FbDrL|@D+)$0Jr?qwVgmpM(UCPCAu4|eJ*of9M zw#%pt&qkD4w-HL`RhZZ*J(uD#jU(V16Ma`$sHgoPHLZiql;eDor`nOvuWg)#>+vG|Qn|@SjQE z!B1`4;#wFCRDJc4ufOr;k=gc3U&+bN9WVZB7}&QEIhR;oK;+uVKRh&7s#caOGc|ksfs!+CM&rAg zSD$_3$5sL5E06#5Bfop{Czd-ZK;jTvAhtkkf!G4E1!4=t7KkknTOhVTY=PJUu?1oa z&;qT_|2(HBUVG)Wr*>~`f8wh+|L=P9+hf4eA@Et=OVhh9;h%FFXAhtkkf!G4E1!4=t7KkknTOhW;zhwcQXL)|* z85ghR^)m&2>R`ToGym=3X9_$X^DNHy`TUNAXMCRL`QIPD^XHkK@9+7w2G8|8`}4~_ zmcNb2G!FlL7C0^yTs5&}To#d5ta9`SlbKf*_nTKS4;;vSO(@818#h@OP> zs+`5wIMm~8knuVw{0qpJPd%=qin2V!&zBI=GAZX|0asD`J^?Gts7^#``0q~zNbArK o`J6+XKi4at&&qW2AW6#@B$QMKM@QhF(`Wy`(0}bZCojT309eLP + /// Validator class handles validation for connection string, root element name and target namespace + /// + public class Validator + { + public static void ValidateXlangKeyword( string input ) + { + #region Reserved Xlang Keywords + + string[ ] reservedXlangKeywords = { "activate", + "atomic", + "body", + "call", + "catch", + "checked", + "compensate", + "compensation", + "construct", + "correlation", + "correlationtype", + "delay", + "dynamic", + "else", + "exceptions", + "exec", + "exists", + "false", + "if", + "implements", + "initialize", + "internal", + "link", + "listen", + "longrunning", + "message", + "messagetype", + "method", + "module", + "new", + "null", + "oneway", + "out", + "parallel", + "port", + "porttype", + "private", + "public", + "receive", + "ref", + "request", + "requestresponse", + "response", + "scope", + "send", + "service", + "servicelink", + "servicelinktype", + "source", + "succeeded", + "suppressfailure", + "suspend", + "target", + "task", + "terminate", + "throw", + "timeout", + "transaction", + "transform", + "true", + "unchecked", + "until", + "uses", + "using", + "while", + "xpath", + }; + + #endregion + + for ( int i = 0; i < reservedXlangKeywords.Length; i++ ) + if ( input == reservedXlangKeywords[ i ] ) + throw new SqlValidationException( "You are using a BizTalk reserver word as part of you naming convention" ); + } + + public static void ValidateRootElementName( string input ) + { + char[ ] invalidChars = { '>', '<', '\'', '\"', '&', ':' }; + if ( input.IndexOfAny( invalidChars ) >= 0 ) + throw new SqlValidationException( "You are using invalid characters in your root element name" ); + ValidateXlangKeyword( input ); + } + + public static void ValidateTargetNamespace( string input ) + { + XmlSchema xs = new XmlSchema( ); + xs.TargetNamespace = input; + + XmlSchemaSet xsSet = new XmlSchemaSet( ); + xsSet.ValidationEventHandler += new ValidationEventHandler( ValidationHandler ); + xsSet.Add( xs ); + xsSet.Compile( ); + + ValidateXlangKeyword( input ); + } + + public static void ValidationHandler( object sender, ValidationEventArgs args ) + { + throw new SqlValidationException( "Validation Error: " + "\n" + args.Message ); + } + + public static void ValidateConnectionString( string input ) + { + if ( input.Length == 0 ) + throw new SqlValidationException( "Connection string validation error" ); + + /* + OleDbConnection myConnection = null; + try + { + myConnection = new OleDbConnection(input); + myConnection.Open(); + myConnection.Close(); + } + catch(Exception e) + { + throw new SqlValidationException(ODBCResourceHandler.GetResourceString("ValidationConnectionError")+" "+e.Message); + } + finally + { + if (myConnection != null) + myConnection.Close(); + } + */ + } + } + + [Serializable( )] + public class SqlValidationException : Exception + { + public SqlValidationException( ) { } + + public SqlValidationException( string s, Exception e ) : base( s, e ) { } + + protected SqlValidationException( SerializationInfo si, StreamingContext sc ) : base( si, sc ) { } + + public SqlValidationException( string errorMsg ) : base( errorMsg ) + { + this.Source = "ODBC Adapter Admin"; + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardLogo.JPG b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardLogo.JPG new file mode 100644 index 0000000000000000000000000000000000000000..e568f6c189876e9341dbbe6432998bbdea7fb035 GIT binary patch literal 1850 zcmbW!X;hPE76 zh-4xFfk1$7WetF1fGeP=pa55pSA@gi2!x^%60L$%Rz_;5s%=B-XzK3N(bU$~Gun&Q zGuUIOt!->)vd7X2kH_m`9lo*0?b~aO$89ZvAP@+oGE!YdMIEQFt&jVk3;Y#8DFS%F z778%{_@4!lgTmw$;ED((W!XT(c0djSh04L8^71g4Y&uc) z4!}_Is`^$g3Tj@*;0EW=xJzmG6%F^-JjHnTE*e>Xcbf()i*RYH9ulMd;X%Wo%^z*v#)<(aA^3=$f#gK_-=A)S~T;1>Eox* z%PXsEV#$^Z0zm)4`Xc)e7fR-mgTbIM_?8PI7b`nZ6ii;Cv%y;K|m3A261-q8EXn)H7I~e2tl6`^w%QXrhp%B^UK~Vq!Se^KlhX37) z{)Au^(5knz_wGHiTu8S8zOxNu5RQOqte4&_`h|K{Xuo`?4Bu@qBgma(YNZI{UbwM8u$oOSKIn3Rn&*X<%~EKahW-!h8|xZ|v8>UL0`t^SL|E{MRFCK@Oba^v{o$F+ zb2AC^SvncbUYaj|nhN3wHwcRsJ&#NW@)ovTeJxdbGhdQis`#n2hd-A&TQWCP-TC@a zXV#$B-8DBGi)RPv?H48YW+oCnmso0>5d^=%`Y{XC9!*1@Ig_=^HzxWd2pn_iaZdh4 zC5F#d`OBtx7zj*McCBO_2`4{}IX%&S%xW#3l)10dZI(w7S2_`L2IFuaB@vr$qYGZS z%LYuit8G_#s4;=M**nDi>8YwsdwB&fo?@oK;A2X!2s>0v?B5KtOf_>dn~6NlMz`vb>w^0@@pYS;bm7>B7YH9f565`LQ=`Jw zJ2BHgo++w!%@tW-f;wp@kjTheM3UQ-d4tYTBD=P+CErH*NJ^%B&Ps6^_vigJNc-6~ z+V%SbmB?~+gXWpC_pF-1lnmm;w9zn;Ej=V<7wC@jwR~F!d=A$%s*+BPWj{%_v8%oQDG&=)EMi~v)QCaGt?M7(n_e4kMDwtv26LdjGC2w1om zWGSKHMt94x;`9TQzJS)$!%$+AmHAf%OA(38R-+Dsb{Qz}X_dF_z1A%$w;$+YRL5CM#Hyr7#c_TLHdi)Xp{>TdtWcjX^ zuK9%Y(|({d^;a2X&4p{)<*4Zc40s49`g7q!XKhYSc?3KO1bAb}1^(MJ>tkXmn$nV7 z_TJk&?8Ql6eOHWWR7?HuiQb7>)ZdH?nLNSv>k=vLPI(;NW3ZU%{&FhznkCUa$577} z=j^W&liJBN!52SxRq7o**$oflqd5ZQ-#}nGV_J&bOITwQ{{3oPwt@$NjKp>j2x+6g z?ns>Dl!$_oZhrdawzpXq`e2`@QSp@?cn?>dmypnV026LpX{eNe_5OQ*Y~lzw@&^W( BT$%s? literal 0 HcmV?d00001 diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ADOParameters.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ADOParameters.cs new file mode 100644 index 00000000..087c0f59 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ADOParameters.cs @@ -0,0 +1,273 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace Microsoft.BizTalk.Adapter.ODBC.SchemaWizard.WizardUI +{ + public class ADOParameters : Microsoft.BizTalk.Adapters.ODBC.SchemaWizard.WizardUserControl + { + private System.Windows.Forms.TextBox txtSize; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.TextBox txtSampleData; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Button cmdApply; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ComboBox cboDirection; + private System.Windows.Forms.ComboBox cboDataType; + private System.Windows.Forms.TextBox txtParamName; + private System.Windows.Forms.ListView lvQueryParameters; + private System.Windows.Forms.ColumnHeader Parameter; + public System.Windows.Forms.ColumnHeader DataType; + private System.Windows.Forms.ColumnHeader SizeCol; + private System.Windows.Forms.ColumnHeader Direction; + private System.Windows.Forms.ColumnHeader SampleData; + private System.Windows.Forms.Label label5; + private System.ComponentModel.IContainer components = null; + + public ADOParameters( ) + { + InitializeComponent( ); + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if ( disposing ) + { + if ( components != null ) + { + components.Dispose( ); + } + } + base.Dispose( disposing ); + } + + #region Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent( ) + { + this.txtSize = new System.Windows.Forms.TextBox( ); + this.label8 = new System.Windows.Forms.Label( ); + this.txtSampleData = new System.Windows.Forms.TextBox( ); + this.label4 = new System.Windows.Forms.Label( ); + this.cmdApply = new System.Windows.Forms.Button( ); + this.label3 = new System.Windows.Forms.Label( ); + this.label2 = new System.Windows.Forms.Label( ); + this.label1 = new System.Windows.Forms.Label( ); + this.cboDirection = new System.Windows.Forms.ComboBox( ); + this.cboDataType = new System.Windows.Forms.ComboBox( ); + this.txtParamName = new System.Windows.Forms.TextBox( ); + this.lvQueryParameters = new System.Windows.Forms.ListView( ); + this.Parameter = new System.Windows.Forms.ColumnHeader( ); + this.DataType = new System.Windows.Forms.ColumnHeader( ); + this.SizeCol = new System.Windows.Forms.ColumnHeader( ); + this.Direction = new System.Windows.Forms.ColumnHeader( ); + this.SampleData = new System.Windows.Forms.ColumnHeader( ); + this.label5 = new System.Windows.Forms.Label( ); + this.SuspendLayout( ); + // + // txtSize + // + this.txtSize.Location = new System.Drawing.Point( 160, 208 ); + this.txtSize.Name = "txtSize"; + this.txtSize.Size = new System.Drawing.Size( 56, 21 ); + this.txtSize.TabIndex = 33; + // + // label8 + // + this.label8.Location = new System.Drawing.Point( 160, 192 ); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size( 48, 16 ); + this.label8.TabIndex = 32; + this.label8.Text = "Size"; + // + // txtSampleData + // + this.txtSampleData.Location = new System.Drawing.Point( 176, 160 ); + this.txtSampleData.Name = "txtSampleData"; + this.txtSampleData.Size = new System.Drawing.Size( 200, 21 ); + this.txtSampleData.TabIndex = 31; + // + // label4 + // + this.label4.Location = new System.Drawing.Point( 176, 144 ); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size( 104, 16 ); + this.label4.TabIndex = 30; + this.label4.Text = "Sample Data"; + // + // cmdApply + // + this.cmdApply.Location = new System.Drawing.Point( 392, 160 ); + this.cmdApply.Name = "cmdApply"; + this.cmdApply.Size = new System.Drawing.Size( 80, 24 ); + this.cmdApply.TabIndex = 29; + this.cmdApply.Text = "Apply"; + this.cmdApply.Click += new System.EventHandler( this.cmdApply_Click ); + // + // label3 + // + this.label3.Location = new System.Drawing.Point( 264, 192 ); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size( 104, 16 ); + this.label3.TabIndex = 28; + this.label3.Text = "Direction"; + // + // label2 + // + this.label2.Location = new System.Drawing.Point( 8, 192 ); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size( 104, 16 ); + this.label2.TabIndex = 27; + this.label2.Text = "Data Type:"; + // + // label1 + // + this.label1.Location = new System.Drawing.Point( 8, 144 ); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size( 128, 16 ); + this.label1.TabIndex = 26; + this.label1.Text = "Parameter Name:"; + // + // cboDirection + // + this.cboDirection.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboDirection.Items.AddRange( new object[ ] { + "ReturnValue", + "Input", + "Output", + "InputOutput"} ); + this.cboDirection.Location = new System.Drawing.Point( 264, 208 ); + this.cboDirection.Name = "cboDirection"; + this.cboDirection.Size = new System.Drawing.Size( 112, 21 ); + this.cboDirection.TabIndex = 25; + // + // cboDataType + // + this.cboDataType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cboDataType.Items.AddRange( new object[ ] { + "BigInt", + "Binary", + "Bit", + "Text", + "DateTime", + "Numeric", + "Double", + "Int", + "Real", + "SmallInt", + "TinyInt", + "UniqueIdentifier", + "Char", + "Date", + "Decimal", + "Image", + "NChar", + "NText", + "NVarChar", + "SmallDateTime", + "Time", + "Timestamp", + "VarBinary", + "VarChar"} ); + this.cboDataType.Location = new System.Drawing.Point( 8, 208 ); + this.cboDataType.Name = "cboDataType"; + this.cboDataType.Size = new System.Drawing.Size( 132, 21 ); + this.cboDataType.TabIndex = 24; + // + // txtParamName + // + this.txtParamName.Location = new System.Drawing.Point( 8, 160 ); + this.txtParamName.Name = "txtParamName"; + this.txtParamName.Size = new System.Drawing.Size( 160, 21 ); + this.txtParamName.TabIndex = 23; + // + // lvQueryParameters + // + this.lvQueryParameters.Columns.AddRange( new System.Windows.Forms.ColumnHeader[ ] { + this.Parameter, + this.DataType, + this.SizeCol, + this.Direction, + this.SampleData} ); + this.lvQueryParameters.FullRowSelect = true; + this.lvQueryParameters.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.lvQueryParameters.LabelEdit = true; + this.lvQueryParameters.Location = new System.Drawing.Point( 8, 40 ); + this.lvQueryParameters.MultiSelect = false; + this.lvQueryParameters.Name = "lvQueryParameters"; + this.lvQueryParameters.Size = new System.Drawing.Size( 476, 88 ); + this.lvQueryParameters.TabIndex = 22; + this.lvQueryParameters.UseCompatibleStateImageBehavior = false; + this.lvQueryParameters.View = System.Windows.Forms.View.Details; + // + // Parameter + // + this.Parameter.Text = "Parameter"; + this.Parameter.Width = 150; + // + // DataType + // + this.DataType.Text = "Data Type"; + this.DataType.Width = 80; + // + // SizeCol + // + this.SizeCol.Text = "Size"; + this.SizeCol.Width = 40; + // + // Direction + // + this.Direction.Text = "Direction"; + this.Direction.Width = 80; + // + // SampleData + // + this.SampleData.Text = "Sample Data"; + this.SampleData.Width = 120; + // + // label5 + // + this.label5.Location = new System.Drawing.Point( 8, 16 ); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size( 216, 16 ); + this.label5.TabIndex = 34; + this.label5.Text = "Over ride ADO.NET faults and Test Query"; + // + // ADOParameters + // + this.Controls.Add( this.label5 ); + this.Controls.Add( this.txtSize ); + this.Controls.Add( this.label8 ); + this.Controls.Add( this.txtSampleData ); + this.Controls.Add( this.label4 ); + this.Controls.Add( this.cmdApply ); + this.Controls.Add( this.label3 ); + this.Controls.Add( this.label2 ); + this.Controls.Add( this.label1 ); + this.Controls.Add( this.cboDirection ); + this.Controls.Add( this.cboDataType ); + this.Controls.Add( this.txtParamName ); + this.Controls.Add( this.lvQueryParameters ); + this.Font = new System.Drawing.Font( "Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( ( byte )( 0 ) ) ); + this.Name = "ADOParameters"; + this.ResumeLayout( false ); + this.PerformLayout( ); + + } + #endregion + + private void cmdApply_Click( object sender, System.EventArgs e ) + { + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ADOParameters.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ADOParameters.resx new file mode 100644 index 00000000..19dc0dd8 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ADOParameters.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/DBConnection.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/DBConnection.cs new file mode 100644 index 00000000..e07e4ddd --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/DBConnection.cs @@ -0,0 +1,211 @@ +//--------------------------------------------------------------------- +// File: DBConnection.cs +// +// Summary: Implementation of an adapter framework sample adapter using the ODBC provider for ADO.NET. +// +// Sample: Adapter framework runtime adapter. +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; +using System.Data.Odbc; + +using ODBCDriverPrompt; + +namespace Microsoft.BizTalk.Adapters.ODBC.SchemaWizard +{ + public class DBConnectionUserControl : WizardUserControl + { + private System.Windows.Forms.Button cmdSet; + private System.Windows.Forms.Label lblConnectionStringPrompt; + private System.Windows.Forms.Label lblConnectionString; + private System.Windows.Forms.TextBox txtDBConnectionString; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + private string _sConnection = string.Empty; + + public DBConnectionUserControl( ) + { + InitializeComponent( ); + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if ( disposing ) + { + if ( components != null ) + { + components.Dispose( ); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent( ) + { + this.txtDBConnectionString = new System.Windows.Forms.TextBox( ); + this.cmdSet = new System.Windows.Forms.Button( ); + this.lblConnectionStringPrompt = new System.Windows.Forms.Label( ); + this.lblConnectionString = new System.Windows.Forms.Label( ); + this.SuspendLayout( ); + // + // txtDBConnectionString + // + this.txtDBConnectionString.Location = new System.Drawing.Point( 8, 88 ); + this.txtDBConnectionString.Multiline = true; + this.txtDBConnectionString.Name = "txtDBConnectionString"; + this.txtDBConnectionString.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtDBConnectionString.Size = new System.Drawing.Size( 480, 216 ); + this.txtDBConnectionString.TabIndex = 0; + // + // cmdSet + // + this.cmdSet.Location = new System.Drawing.Point( 392, 56 ); + this.cmdSet.Name = "cmdSet"; + this.cmdSet.Size = new System.Drawing.Size( 96, 24 ); + this.cmdSet.TabIndex = 1; + this.cmdSet.Text = "Set"; + this.cmdSet.Click += new System.EventHandler( this.button1_Click ); + // + // lblConnectionStringPrompt + // + this.lblConnectionStringPrompt.Location = new System.Drawing.Point( 8, 16 ); + this.lblConnectionStringPrompt.Name = "lblConnectionStringPrompt"; + this.lblConnectionStringPrompt.Size = new System.Drawing.Size( 480, 16 ); + this.lblConnectionStringPrompt.TabIndex = 2; + this.lblConnectionStringPrompt.Text = "To set the connection string, click set"; + // + // lblConnectionString + // + this.lblConnectionString.Location = new System.Drawing.Point( 8, 64 ); + this.lblConnectionString.Name = "lblConnectionString"; + this.lblConnectionString.Size = new System.Drawing.Size( 256, 16 ); + this.lblConnectionString.TabIndex = 3; + this.lblConnectionString.Text = "Connection string"; + // + // DBConnectionUserControl + // + this.BackColor = System.Drawing.SystemColors.Control; + this.Controls.Add( this.lblConnectionString ); + this.Controls.Add( this.lblConnectionStringPrompt ); + this.Controls.Add( this.cmdSet ); + this.Controls.Add( this.txtDBConnectionString ); + this.Font = new System.Drawing.Font( "Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( ( byte )( 0 ) ) ); + this.Name = "DBConnectionUserControl"; + this.Load += new System.EventHandler( this.DBConnectionUserControl_Load ); + this.ResumeLayout( false ); + this.PerformLayout( ); + + } + #endregion + + private void DBConnectionUserControl_Load( object sender, System.EventArgs e ) + { + } + + public override bool SavePageInfo( ) + { + OdbcConnection myConnection = null; + // _sConnection = txtDBConnectionString.Text; + try + { + myConnection = new OdbcConnection( _sConnection ); + myConnection.Open( ); + // Commented out as it seems some ODBC drives do not support these parameters + // if ( myConnection.Database == null || myConnection.Database.Length == 0) + // { + // myConnection.Close(); + // MessageBox.Show("Connection String failed validation","Connection Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + // return false; + // } + myConnection.Close( ); + } + catch ( System.Data.Odbc.OdbcException e ) + { + MessageBox.Show( "The database connection is invalid \n" + e.Message, "Connection Vaidation Error", MessageBoxButtons.OK, MessageBoxIcon.Error ); + return false; + } + finally + { + if ( myConnection != null ) + myConnection.Close( ); + } + + ( ( ODBCAdapterWizardForm )WizardParentForm ).strDBConnection = _sConnection; + + return true; + } + + public override void ProcessLoad( ) + { + // Connection string may have been initialized by selecting a port before launching the wizard. + _sConnection = ( ( ODBCAdapterWizardForm )WizardParentForm ).strDBConnection; + txtDBConnectionString.Text = SecurePassword( _sConnection ); + + if ( _sConnection.Length > 0 ) + { + WizardParentForm.NextButtonEnabled = true; + } + } + + private void button1_Click( object sender, System.EventArgs e ) + { + ODBCDriverUI DriverDialog = new ODBCDriverUI( ); + _sConnection = DriverDialog.GetDSN( ); + txtDBConnectionString.Text = SecurePassword( _sConnection ); + WizardParentForm.NextButtonEnabled = true; + } + + private string SecurePassword( string ConnectionString ) + { + if ( ConnectionString != "" ) + { + int iPasswordIndex = ConnectionString.IndexOf( "PWD=", 1 ); + + if ( iPasswordIndex > 0 ) + { + int iEndOfPassword = ConnectionString.IndexOf( ";", iPasswordIndex ); + + //Deal with the fact that we may not have a ; at the end of our statement + if ( iEndOfPassword < 0 ) + iEndOfPassword = ConnectionString.Length; + + string password = ConnectionString.Substring( iPasswordIndex + 4, iEndOfPassword - ( iPasswordIndex + 4 ) ); + + return ConnectionString.Replace( password, "*********" ); + } + else + return ConnectionString; + } + else + return ""; + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/DBConnection.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/DBConnection.resx new file mode 100644 index 00000000..19dc0dd8 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/DBConnection.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/FinishDisplay.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/FinishDisplay.cs new file mode 100644 index 00000000..bb168b99 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/FinishDisplay.cs @@ -0,0 +1,76 @@ +//--------------------------------------------------------------------- +// File: FinishDisplay.cs +// +// Summary: Implementation of an adapter framework sample adapter using the ODBC provider for ADO.NET. +// +// Sample: Adapter framework runtime adapter. +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; + +namespace Microsoft.BizTalk.Adapters.ODBC.SchemaWizard +{ + public class FinishDisplayUserControl : WizardUserControl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public FinishDisplayUserControl( ) + { + InitializeComponent( ); + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if ( disposing ) + { + if ( components != null ) + { + components.Dispose( ); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent( ) + { + this.SuspendLayout( ); + // + // FinishDisplayUserControl + // + this.Font = new System.Drawing.Font( "Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( ( byte )( 0 ) ) ); + this.Name = "FinishDisplayUserControl"; + this.ResumeLayout( false ); + + } + #endregion + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/FinishDisplay.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/FinishDisplay.resx new file mode 100644 index 00000000..19dc0dd8 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/FinishDisplay.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ODBCAdapterWizardForm.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ODBCAdapterWizardForm.cs new file mode 100644 index 00000000..d3c99282 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ODBCAdapterWizardForm.cs @@ -0,0 +1,474 @@ +//--------------------------------------------------------------------- +// File: ODBCAdapterWizardForm.cs +// +// Summary: Implementation of an adapter framework sample adapter using the ODBC provider for ADO.NET. +// +// Sample: Adapter framework runtime adapter. +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; + +using Microsoft.BizTalk.Adapters.ODBC.SchemaWizard; + +namespace Microsoft.BizTalk.Adapters.ODBC.SchemaWizard +{ + public class ODBCAdapterWizardForm : Microsoft.BizTalk.Adapters.ODBC.SchemaWizard.WizardForm + { + private System.ComponentModel.Container components = null; + + internal ODBCSchemaHelper _clsODBCCmdWizard = null; + + #region Properties + + public ODBCAdapterWizardForm( ) : base( ) + { + Application.EnableVisualStyles( ); + + _clsODBCCmdWizard = new ODBCSchemaHelper( ); + } + + public ODBCSchemaHelper.AdapterCommandType CommandType + { + get + { + return _clsODBCCmdWizard.QueryCommandType; + } + set + { + _clsODBCCmdWizard.QueryCommandType = value; + } + } + + public string strDBConnection + { + get + { + return _clsODBCCmdWizard.strDBConnection; + } + set + { + _clsODBCCmdWizard.strDBConnection = value; + } + } + + public string strInputSchema + { + get + { + return _clsODBCCmdWizard.InputSchema; + } + } + + public string strOutputSchema + { + get + { + return _clsODBCCmdWizard.OutputSchema; + } + } + public bool QueryHasInputParameters + { + get + { + return _clsODBCCmdWizard.InputParameter; + } + } + + public bool OverrideDefaultQueryProcessing + { + set + { + _clsODBCCmdWizard.OverrideQueryProcessing = value; + } + } + + public string strScript + { + get + { + return _clsODBCCmdWizard.strScript; + } + set + { + _clsODBCCmdWizard.strScript = value; + } + } + + public ODBCSchemaHelper.PortType portType + { + get + { + return _clsODBCCmdWizard.portType; + } + set + { + _clsODBCCmdWizard.portType = value; + } + } + + public string strInputRoot + { + get + { + return _clsODBCCmdWizard.strInputRoot; + } + set + { + _clsODBCCmdWizard.strInputRoot = value; + } + } + + public string strOutputRoot + { + get + { + return _clsODBCCmdWizard.strOutputRoot; + } + set + { + _clsODBCCmdWizard.strOutputRoot = value; + } + } + + public string strSPName + { + get + { + return _clsODBCCmdWizard.strSPName; + } + set + { + _clsODBCCmdWizard.strSPName = value; + } + } + + public string strTargetNamespace + { + get + { + return _clsODBCCmdWizard.strTargetNamespace; + } + set + { + _clsODBCCmdWizard.strTargetNamespace = value; + } + } + + public string strGeneratedScript + { + get + { + return _clsODBCCmdWizard.strGeneratedScript; + } + set + { + _clsODBCCmdWizard.strGeneratedScript = value; + } + } + + public string strWSDL + { + get + { + return _clsODBCCmdWizard.strWSDL; + } + set + { + _clsODBCCmdWizard.strWSDL = value; + } + } + + public ODBCSchemaHelper.AdapterStatementType StatementType + { + get + { + return _clsODBCCmdWizard.StatementType; + } + set + { + _clsODBCCmdWizard.StatementType = value; + } + } + + #endregion + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if ( disposing ) + { + if ( components != null ) + { + components.Dispose( ); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + + #endregion + + protected virtual void CreateDatabasePage( ) + { + buttonBack.Enabled = false; + + DBConnectionUserControl databaseControl = null; + foreach ( UserControl userControl in panelWizard.Controls ) + { + if ( userControl is DBConnectionUserControl ) + databaseControl = ( DBConnectionUserControl )userControl; + } + if ( null == databaseControl ) + databaseControl = new DBConnectionUserControl( ); + + lblTitle.Text = "Database Information"; + lblScript.Text = "Select the ODBC driver and connection string to be used to generate the BizTalk Schema"; + + SetNewPageProperties( ( WizardUserControl )databaseControl ); + } + + protected virtual void CreateRootPage( ) + { + buttonBack.Enabled = true; + + SchemaMetaDataUserControl rootControl = null; + foreach ( UserControl userControl in panelWizard.Controls ) + { + if ( userControl is SchemaMetaDataUserControl ) + rootControl = ( SchemaMetaDataUserControl )userControl; + } + if ( null == rootControl ) + rootControl = new SchemaMetaDataUserControl( ); + + lblTitle.Text = "Schema Information"; + lblScript.Text = "Specify the root name(s) and port type for the schema"; + + SetNewPageProperties( ( WizardUserControl )rootControl ); + } + + protected virtual void CreateStatementPage( ) + { + buttonNext.Enabled = false; + + QueryEditorUserControl statementControl = null; + foreach ( UserControl userControl in panelWizard.Controls ) + { + if ( userControl is QueryEditorUserControl ) + statementControl = ( QueryEditorUserControl )userControl; + } + if ( null == statementControl ) + statementControl = new QueryEditorUserControl( ); + + lblTitle.Text = "Statement Information"; + lblScript.Text = "Enter the statement to be executed by the ODBC transport"; + + SetNewPageProperties( ( WizardUserControl )statementControl ); + } + + protected virtual void CreateQueryTypePage( ) + { + buttonNext.Text = "Next >"; + + QueryTypeUserControl QueryTypeControl = null; + foreach ( UserControl userControl in panelWizard.Controls ) + { + if ( userControl is QueryTypeUserControl ) + QueryTypeControl = ( QueryTypeUserControl )userControl; + } + if ( null == QueryTypeControl ) + QueryTypeControl = new QueryTypeUserControl( ); + + lblTitle.Text = "Statement Type Information"; + lblScript.Text = "Select the type of statement to be excuted by the ODBC transport"; + + SetNewPageProperties( ( WizardUserControl )QueryTypeControl ); + } + + protected virtual void CreateFinishPage( ) + { + buttonNext.Text = "Finish"; + + FinishDisplayUserControl finishControl = null; + foreach ( UserControl userControl in panelWizard.Controls ) + { + if ( userControl is FinishDisplayUserControl ) + finishControl = ( FinishDisplayUserControl )userControl; + } + if ( null == finishControl ) + finishControl = new FinishDisplayUserControl( ); + + SetNewPageProperties( ( WizardUserControl )finishControl ); + } + + protected override void OnNext( object sender, System.EventArgs e ) + { + if ( _userControl == null ) + return; + + if ( _userControl.SavePageInfo( ) == false ) + { + _userControl.Select( ); + return; + } + + if ( _userControl is DBConnectionUserControl ) + { + CreateRootPage( ); + } + else if ( _userControl is SchemaMetaDataUserControl ) + { + CreateQueryTypePage( ); + } + else if ( _userControl is QueryTypeUserControl ) + { + CreateStatementPage( ); + } + else if ( _userControl is QueryEditorUserControl ) + { + CreateFinishPage( ); + } + else if ( _userControl is FinishDisplayUserControl ) + { + this.DialogResult = DialogResult.OK; + this.Close( ); + } + + _userControl.ProcessLoad( ); + _userControl.Show( ); + _userControl.SetSelect( ); + _userControl.Select( ); + + panelWizard.Invalidate( ); + panelWizard.Update( ); + + this.buttonBack.Enabled = true; + if ( buttonNext.Enabled ) + buttonNext.Focus( ); + + panelWizard.Invalidate( ); + panelWizard.Update( ); + } + + protected override void OnBack( object sender, System.EventArgs e ) + { + if ( _userControl == null ) + return; + + if ( _userControl.SavePageInfoWithoutValidation( ) == false ) + { + _userControl.Select( ); + return; + } + + if ( _userControl is SchemaMetaDataUserControl ) + { + CreateDatabasePage( ); + } + else if ( _userControl is QueryEditorUserControl ) + { + CreateQueryTypePage( ); + } + else if ( _userControl is QueryTypeUserControl ) + { + CreateRootPage( ); + } + else if ( _userControl is FinishDisplayUserControl ) + { + CreateStatementPage( ); + } + + _userControl.ProcessLoad( ); + _userControl.Show( ); + _userControl.SetSelect( ); + _userControl.Select( ); + + panelWizard.Invalidate( ); + panelWizard.Update( ); + + if ( buttonNext.Enabled ) + buttonNext.Focus( ); + this.buttonNext.Enabled = true; + + panelWizard.Invalidate( ); + panelWizard.Update( ); + } + + public void Start( ) + { + CreateDatabasePage( ); + _userControl.ProcessLoad( ); + this.buttonBack.Text = "< Back"; + this.buttonCancel.Text = "Cancel"; + this.buttonNext.Text = "Next >"; + } + + private void InitializeComponent( ) + { + ( ( System.ComponentModel.ISupportInitialize )( this.picGraphic ) ).BeginInit( ); + this.SuspendLayout( ); + // + // panelWizard + // + this.panelWizard.Location = new System.Drawing.Point( 0, 0 ); + this.panelWizard.Size = new System.Drawing.Size( 484, 312 ); + // + // buttonHelp + // + this.buttonHelp.Location = new System.Drawing.Point( 16, 336 ); + this.buttonHelp.Size = new System.Drawing.Size( 80, 23 ); + this.buttonHelp.Visible = true; + // + // buttonBack + // + this.buttonBack.Location = new System.Drawing.Point( 216, 336 ); + this.buttonBack.Size = new System.Drawing.Size( 80, 23 ); + // + // buttonNext + // + this.buttonNext.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonNext.Location = new System.Drawing.Point( 296, 328 ); + this.buttonNext.Size = new System.Drawing.Size( 80, 33 ); + // + // buttonCancel + // + this.buttonCancel.Location = new System.Drawing.Point( 384, 336 ); + this.buttonCancel.Size = new System.Drawing.Size( 80, 23 ); + // + // ODBCAdapterWizardForm + // + this.AutoScaleBaseSize = new System.Drawing.Size( 5, 14 ); + this.BackButtonEnabled = true; + this.ClientSize = new System.Drawing.Size( 478, 366 ); + this.Font = new System.Drawing.Font( "Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( ( byte )( 0 ) ) ); + this.Name = "ODBCAdapterWizardForm"; + this.NextButtonEnabled = true; + ( ( System.ComponentModel.ISupportInitialize )( this.picGraphic ) ).EndInit( ); + this.ResumeLayout( false ); + + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ODBCAdapterWizardForm.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ODBCAdapterWizardForm.resx new file mode 100644 index 00000000..19dc0dd8 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/ODBCAdapterWizardForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryEditor.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryEditor.cs new file mode 100644 index 00000000..07721539 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryEditor.cs @@ -0,0 +1,261 @@ +//--------------------------------------------------------------------- +// File: QueryEditor.cs +// +// Summary: Implementation of an adapter framework sample adapter using the ODBC provider for ADO.NET. +// +// Sample: Adapter framework runtime adapter. +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; + +namespace Microsoft.BizTalk.Adapters.ODBC.SchemaWizard +{ + public class QueryEditorUserControl : WizardUserControl + { + private System.Windows.Forms.TextBox txtRawSQL; + private System.Windows.Forms.Button cmdValidate; + private System.Windows.Forms.TextBox txtODBCCommand; + private System.Windows.Forms.Label lblQueryPrompt; + private System.Windows.Forms.Label lblCommandPrompt; + private System.Windows.Forms.RadioButton rdoNoResponse; + private System.Windows.Forms.RadioButton rdoResponse; + private System.Windows.Forms.Label lblQueryType; + private System.Windows.Forms.CheckBox chkOverRide; + + private System.ComponentModel.Container components = null; + + public QueryEditorUserControl( ) + { + InitializeComponent( ); + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if ( disposing ) + { + if ( components != null ) + { + components.Dispose( ); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent( ) + { + this.txtRawSQL = new System.Windows.Forms.TextBox( ); + this.cmdValidate = new System.Windows.Forms.Button( ); + this.txtODBCCommand = new System.Windows.Forms.TextBox( ); + this.lblQueryPrompt = new System.Windows.Forms.Label( ); + this.lblCommandPrompt = new System.Windows.Forms.Label( ); + this.rdoNoResponse = new System.Windows.Forms.RadioButton( ); + this.rdoResponse = new System.Windows.Forms.RadioButton( ); + this.lblQueryType = new System.Windows.Forms.Label( ); + this.chkOverRide = new System.Windows.Forms.CheckBox( ); + this.SuspendLayout( ); + // + // txtRawSQL + // + this.txtRawSQL.Location = new System.Drawing.Point( 10, 113 ); + this.txtRawSQL.Multiline = true; + this.txtRawSQL.Name = "txtRawSQL"; + this.txtRawSQL.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.txtRawSQL.Size = new System.Drawing.Size( 480, 128 ); + this.txtRawSQL.TabIndex = 4; + // + // cmdValidate + // + this.cmdValidate.Location = new System.Drawing.Point( 360, 30 ); + this.cmdValidate.Name = "cmdValidate"; + this.cmdValidate.Size = new System.Drawing.Size( 128, 32 ); + this.cmdValidate.TabIndex = 5; + this.cmdValidate.Text = "Generate"; + this.cmdValidate.Click += new System.EventHandler( this.cmdValidate_Click ); + // + // txtODBCCommand + // + this.txtODBCCommand.Location = new System.Drawing.Point( 12, 267 ); + this.txtODBCCommand.Multiline = true; + this.txtODBCCommand.Name = "txtODBCCommand"; + this.txtODBCCommand.ReadOnly = true; + this.txtODBCCommand.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtODBCCommand.Size = new System.Drawing.Size( 480, 34 ); + this.txtODBCCommand.TabIndex = 6; + // + // lblQueryPrompt + // + this.lblQueryPrompt.Location = new System.Drawing.Point( 10, 97 ); + this.lblQueryPrompt.Name = "lblQueryPrompt"; + this.lblQueryPrompt.Size = new System.Drawing.Size( 88, 14 ); + this.lblQueryPrompt.TabIndex = 7; + this.lblQueryPrompt.Text = "Query"; + // + // lblCommandPrompt + // + this.lblCommandPrompt.Location = new System.Drawing.Point( 9, 247 ); + this.lblCommandPrompt.Name = "lblCommandPrompt"; + this.lblCommandPrompt.Size = new System.Drawing.Size( 144, 16 ); + this.lblCommandPrompt.TabIndex = 8; + this.lblCommandPrompt.Text = "Processed Command"; + // + // rdoNoResponse + // + this.rdoNoResponse.Location = new System.Drawing.Point( 43, 68 ); + this.rdoNoResponse.Name = "rdoNoResponse"; + this.rdoNoResponse.Size = new System.Drawing.Size( 296, 17 ); + this.rdoNoResponse.TabIndex = 9; + this.rdoNoResponse.Text = "INSERT, UPDATE, DELETE (No response expected)"; + // + // rdoResponse + // + this.rdoResponse.Checked = true; + this.rdoResponse.Location = new System.Drawing.Point( 43, 45 ); + this.rdoResponse.Name = "rdoResponse"; + this.rdoResponse.Size = new System.Drawing.Size( 296, 17 ); + this.rdoResponse.TabIndex = 10; + this.rdoResponse.TabStop = true; + this.rdoResponse.Text = "SELECT or Compound (Response expected)"; + // + // lblQueryType + // + this.lblQueryType.Location = new System.Drawing.Point( 8, 16 ); + this.lblQueryType.Name = "lblQueryType"; + this.lblQueryType.Size = new System.Drawing.Size( 104, 17 ); + this.lblQueryType.TabIndex = 11; + this.lblQueryType.Text = "Query Type"; + // + // chkOverRide + // + this.chkOverRide.Location = new System.Drawing.Point( 292, 247 ); + this.chkOverRide.Name = "chkOverRide"; + this.chkOverRide.Size = new System.Drawing.Size( 196, 16 ); + this.chkOverRide.TabIndex = 12; + this.chkOverRide.Text = "Override default query processing"; + // + // QueryEditorUserControl + // + this.Controls.Add( this.chkOverRide ); + this.Controls.Add( this.lblQueryType ); + this.Controls.Add( this.rdoResponse ); + this.Controls.Add( this.rdoNoResponse ); + this.Controls.Add( this.lblCommandPrompt ); + this.Controls.Add( this.lblQueryPrompt ); + this.Controls.Add( this.txtODBCCommand ); + this.Controls.Add( this.cmdValidate ); + this.Controls.Add( this.txtRawSQL ); + this.Font = new System.Drawing.Font( "Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( ( byte )( 0 ) ) ); + this.Name = "QueryEditorUserControl"; + this.ResumeLayout( false ); + this.PerformLayout( ); + + } + + #endregion + + private void cmdValidate_Click( object sender, System.EventArgs e ) + { + if ( txtRawSQL.Text.Length > 0 ) + { + this.Cursor = Cursors.WaitCursor; + + try + { + //Only check this if the user is entering in raw SQL + if ( ( ( ODBCAdapterWizardForm )WizardParentForm ).CommandType == ODBCSchemaHelper.AdapterCommandType.SQL ) + { + //Make sure the adapter knows whether to generate a response shcema. If this is only + //Inserts, deletes and updates then we don't need a response document + if ( rdoResponse.Checked ) + ( ( ODBCAdapterWizardForm )WizardParentForm ).StatementType = ODBCSchemaHelper.AdapterStatementType.InputOutput; + else + ( ( ODBCAdapterWizardForm )WizardParentForm ).StatementType = ODBCSchemaHelper.AdapterStatementType.Input; + } + + ( ( ODBCAdapterWizardForm )WizardParentForm ).OverrideDefaultQueryProcessing = chkOverRide.Checked; + ( ( ODBCAdapterWizardForm )WizardParentForm ).strScript = txtRawSQL.Text; + txtODBCCommand.Text = ( ( ODBCAdapterWizardForm )WizardParentForm ).strGeneratedScript; + ( ( ODBCAdapterWizardForm )WizardParentForm ).NextButtonEnabled = true; + + // Now we need to validate that the user has not entered a query that will require input parameters + // for a receive port type. There is no way in this version of the code for the users to enter the + // input values for a receive port + if ( ( ( ODBCAdapterWizardForm )WizardParentForm ).QueryHasInputParameters && ( ( ODBCAdapterWizardForm )WizardParentForm ).portType == ODBCSchemaHelper.PortType.Receive ) + { + MessageBox.Show( "You cannot use a database query where input parameters would need to be generated in conjunction with a receive port type", "ODBC Schema Generation Wizard Validation Error" ); + ( ( ODBCAdapterWizardForm )WizardParentForm ).NextButtonEnabled = false; + } + + //((ODBCAdapterWizardForm)WizardParentForm)._clsODBCCmdWizard.CreateBizTalkSchema(); + + this.Cursor = Cursors.Default; + } + catch ( Exception ex ) + { + this.Cursor = Cursors.Default; + + MessageBox.Show( "An error occured processing the specified query: " + ex.Message, "Validation Error", MessageBoxButtons.OK ); + } + } + else + { + MessageBox.Show( "You must enter a query to be validated", "Validation Error", MessageBoxButtons.OK ); + } + } + + public override bool SavePageInfoWithoutValidation( ) + { + return base.SavePageInfoWithoutValidation( ); + } + + public override bool SavePageInfo( ) + { + return true; + } + + protected override void LoadPageInfo( ) + { + //Setup for display based on the type of query we are processing + if ( ( ( ODBCAdapterWizardForm )WizardParentForm ).CommandType == ODBCSchemaHelper.AdapterCommandType.SQL && ( ( ODBCAdapterWizardForm )WizardParentForm ).portType != ODBCSchemaHelper.PortType.Receive ) + { + rdoResponse.Visible = true; + rdoNoResponse.Visible = true; + lblQueryType.Visible = true; + chkOverRide.Visible = true; + } + else + { + rdoResponse.Visible = false; + rdoNoResponse.Visible = false; + lblQueryType.Visible = false; + chkOverRide.Visible = false; + } + base.LoadPageInfo( ); + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryEditor.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryEditor.resx new file mode 100644 index 00000000..19dc0dd8 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryEditor.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryType.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryType.cs new file mode 100644 index 00000000..ca380b9d --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryType.cs @@ -0,0 +1,126 @@ +//--------------------------------------------------------------------- +// File: QueryType.cs +// +// Summary: Implementation of an adapter framework sample adapter using the ODBC provider for ADO.NET. +// +// Sample: Adapter framework runtime adapter. +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; + +namespace Microsoft.BizTalk.Adapters.ODBC.SchemaWizard +{ + public class QueryTypeUserControl : WizardUserControl + { + private System.Windows.Forms.Label lblStatementType; + private System.Windows.Forms.RadioButton rdoSQL; + private System.Windows.Forms.RadioButton rdoStoredProc; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public QueryTypeUserControl( ) + { + InitializeComponent( ); + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if ( disposing ) + { + if ( components != null ) + { + components.Dispose( ); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent( ) + { + this.lblStatementType = new System.Windows.Forms.Label( ); + this.rdoSQL = new System.Windows.Forms.RadioButton( ); + this.rdoStoredProc = new System.Windows.Forms.RadioButton( ); + this.SuspendLayout( ); + // + // lblStatementType + // + this.lblStatementType.Location = new System.Drawing.Point( 16, 24 ); + this.lblStatementType.Name = "lblStatementType"; + this.lblStatementType.Size = new System.Drawing.Size( 448, 16 ); + this.lblStatementType.TabIndex = 0; + this.lblStatementType.Text = "Select type of statement"; + // + // rdoSQL + // + this.rdoSQL.Location = new System.Drawing.Point( 48, 99 ); + this.rdoSQL.Name = "rdoSQL"; + this.rdoSQL.Size = new System.Drawing.Size( 127, 27 ); + this.rdoSQL.TabIndex = 1; + this.rdoSQL.Text = "SQL Script"; + // + // rdoStoredProc + // + this.rdoStoredProc.Checked = true; + this.rdoStoredProc.Location = new System.Drawing.Point( 48, 61 ); + this.rdoStoredProc.Name = "rdoStoredProc"; + this.rdoStoredProc.Size = new System.Drawing.Size( 127, 22 ); + this.rdoStoredProc.TabIndex = 2; + this.rdoStoredProc.TabStop = true; + this.rdoStoredProc.Text = "Stored Procedure"; + // + // QueryTypeUserControl + // + this.Controls.Add( this.rdoStoredProc ); + this.Controls.Add( this.rdoSQL ); + this.Controls.Add( this.lblStatementType ); + this.Font = new System.Drawing.Font( "Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( ( byte )( 0 ) ) ); + this.Name = "QueryTypeUserControl"; + this.ResumeLayout( false ); + + } + #endregion + + public override bool SavePageInfoWithoutValidation( ) + { + return base.SavePageInfoWithoutValidation( ); + } + + public override bool SavePageInfo( ) + { + if ( rdoStoredProc.Checked ) + ( ( ODBCAdapterWizardForm )WizardParentForm ).CommandType = ODBCSchemaHelper.AdapterCommandType.StoredProcedure; + else + ( ( ODBCAdapterWizardForm )WizardParentForm ).CommandType = ODBCSchemaHelper.AdapterCommandType.SQL; + + return true; + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryType.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryType.resx new file mode 100644 index 00000000..19dc0dd8 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/QueryType.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/SchemaMetaData.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/SchemaMetaData.cs new file mode 100644 index 00000000..12453176 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/SchemaMetaData.cs @@ -0,0 +1,279 @@ +//--------------------------------------------------------------------- +// File: SchemaMetaData.cs +// +// Summary: Implementation of an adapter framework sample adapter using the ODBC provider for ADO.NET. +// +// Sample: Adapter framework runtime adapter. +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; + +namespace Microsoft.BizTalk.Adapters.ODBC.SchemaWizard +{ + public class SchemaMetaDataUserControl : WizardUserControl + { + private System.Windows.Forms.TextBox txtTargetNS; + private System.Windows.Forms.Label lblPortType; + private System.Windows.Forms.RadioButton rdoSendPort; + private System.Windows.Forms.RadioButton rdoReceivePort; + private System.Windows.Forms.Label lblTargetNSPrompt; + private System.Windows.Forms.Label lblRequestRootPrompt; + private System.Windows.Forms.TextBox txtRequestRootName; + private System.Windows.Forms.Label lblResponseRootName; + private System.Windows.Forms.TextBox txtResponseRootName; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public override bool SavePageInfoWithoutValidation( ) + { + return base.SavePageInfoWithoutValidation( ); + } + + public override bool SavePageInfo( ) + { + if ( txtTargetNS.Text.Length == 0 ) + { + MessageBox.Show( "You must enter a targetname space", "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Error ); + return false; + } + try + { + Validator.ValidateTargetNamespace( txtTargetNS.Text ); + } + catch ( SqlValidationException ex ) + { + MessageBox.Show( "An error occured while validating the name specified for the namespace \n" + ex.Message, "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Error ); + return false; + } + + if ( rdoReceivePort.Checked ) + { + if ( txtRequestRootName.Text.Length == 0 ) + { + MessageBox.Show( "You must enter a valid root element name for the response message.", "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Error ); + return false; + } + try + { + Validator.ValidateRootElementName( txtRequestRootName.Text ); + ( ( ODBCAdapterWizardForm )WizardParentForm ).strInputRoot = "ODBCQUERY"; + ( ( ODBCAdapterWizardForm )WizardParentForm ).strOutputRoot = txtRequestRootName.Text; + } + catch ( SqlValidationException ex ) + { + MessageBox.Show( ex.Message, "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Error ); + return false; + } + } + else if ( rdoSendPort.Checked ) + { + if ( rdoSendPort.Checked && ( txtRequestRootName.Text.Length == 0 || txtResponseRootName.Text.Length == 0 ) ) + { + MessageBox.Show( "You must enter a root node name for both the request and response messages.", "Schema data validation error", MessageBoxButtons.OK, MessageBoxIcon.Error ); + return false; + } + if ( txtRequestRootName.Text == txtResponseRootName.Text ) + { + MessageBox.Show( "The root node names for both elements must be different", "Schema data validation error", MessageBoxButtons.OK, MessageBoxIcon.Error ); + return false; + } + try + { + Validator.ValidateRootElementName( txtRequestRootName.Text ); + Validator.ValidateRootElementName( txtResponseRootName.Text ); + ( ( ODBCAdapterWizardForm )WizardParentForm ).strInputRoot = txtRequestRootName.Text; + ( ( ODBCAdapterWizardForm )WizardParentForm ).strOutputRoot = txtResponseRootName.Text; + } + catch ( SqlValidationException ex ) + { + MessageBox.Show( ex.Message, "Schema data validation error", MessageBoxButtons.OK, MessageBoxIcon.Error ); + return false; + } + } + + ( ( ODBCAdapterWizardForm )WizardParentForm ).strTargetNamespace = txtTargetNS.Text; + + if ( rdoReceivePort.Checked ) + ( ( ODBCAdapterWizardForm )WizardParentForm ).portType = ODBCSchemaHelper.PortType.Receive; + else if ( rdoSendPort.Checked ) + ( ( ODBCAdapterWizardForm )WizardParentForm ).portType = ODBCSchemaHelper.PortType.Send; + rdoReceivePort_CheckedChanged( null, null ); + + return true; + } + + public SchemaMetaDataUserControl( ) + { + InitializeComponent( ); + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if ( disposing ) + { + if ( components != null ) + { + components.Dispose( ); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent( ) + { + this.txtTargetNS = new System.Windows.Forms.TextBox( ); + this.lblPortType = new System.Windows.Forms.Label( ); + this.rdoSendPort = new System.Windows.Forms.RadioButton( ); + this.rdoReceivePort = new System.Windows.Forms.RadioButton( ); + this.lblTargetNSPrompt = new System.Windows.Forms.Label( ); + this.lblRequestRootPrompt = new System.Windows.Forms.Label( ); + this.txtRequestRootName = new System.Windows.Forms.TextBox( ); + this.lblResponseRootName = new System.Windows.Forms.Label( ); + this.txtResponseRootName = new System.Windows.Forms.TextBox( ); + this.SuspendLayout( ); + // + // txtTargetNS + // + this.txtTargetNS.Location = new System.Drawing.Point( 16, 40 ); + this.txtTargetNS.Name = "txtTargetNS"; + this.txtTargetNS.Size = new System.Drawing.Size( 464, 21 ); + this.txtTargetNS.TabIndex = 0; + // + // lblPortType + // + this.lblPortType.Location = new System.Drawing.Point( 24, 72 ); + this.lblPortType.Name = "lblPortType"; + this.lblPortType.Size = new System.Drawing.Size( 448, 16 ); + this.lblPortType.TabIndex = 1; + this.lblPortType.Text = "Select the port type:"; + // + // rdoSendPort + // + this.rdoSendPort.Location = new System.Drawing.Point( 48, 128 ); + this.rdoSendPort.Name = "rdoSendPort"; + this.rdoSendPort.Size = new System.Drawing.Size( 392, 16 ); + this.rdoSendPort.TabIndex = 2; + this.rdoSendPort.Text = "Send Port"; + // + // rdoReceivePort + // + this.rdoReceivePort.Checked = true; + this.rdoReceivePort.Location = new System.Drawing.Point( 48, 96 ); + this.rdoReceivePort.Name = "rdoReceivePort"; + this.rdoReceivePort.Size = new System.Drawing.Size( 392, 16 ); + this.rdoReceivePort.TabIndex = 3; + this.rdoReceivePort.TabStop = true; + this.rdoReceivePort.Text = "Receive Port"; + this.rdoReceivePort.CheckedChanged += new System.EventHandler( this.rdoReceivePort_CheckedChanged ); + // + // lblTargetNSPrompt + // + this.lblTargetNSPrompt.Location = new System.Drawing.Point( 16, 16 ); + this.lblTargetNSPrompt.Name = "lblTargetNSPrompt"; + this.lblTargetNSPrompt.Size = new System.Drawing.Size( 464, 16 ); + this.lblTargetNSPrompt.TabIndex = 4; + this.lblTargetNSPrompt.Text = "Target namespace (Example: http://DBReceiveProject)"; + // + // lblRequestRootPrompt + // + this.lblRequestRootPrompt.Location = new System.Drawing.Point( 16, 168 ); + this.lblRequestRootPrompt.Name = "lblRequestRootPrompt"; + this.lblRequestRootPrompt.Size = new System.Drawing.Size( 464, 16 ); + this.lblRequestRootPrompt.TabIndex = 6; + this.lblRequestRootPrompt.Text = "Response root element name"; + // + // txtRequestRootName + // + this.txtRequestRootName.Location = new System.Drawing.Point( 16, 192 ); + this.txtRequestRootName.Name = "txtRequestRootName"; + this.txtRequestRootName.Size = new System.Drawing.Size( 464, 21 ); + this.txtRequestRootName.TabIndex = 5; + // + // lblResponseRootName + // + this.lblResponseRootName.Location = new System.Drawing.Point( 16, 240 ); + this.lblResponseRootName.Name = "lblResponseRootName"; + this.lblResponseRootName.Size = new System.Drawing.Size( 464, 16 ); + this.lblResponseRootName.TabIndex = 8; + this.lblResponseRootName.Text = "Response root element name"; + this.lblResponseRootName.Visible = false; + // + // txtResponseRootName + // + this.txtResponseRootName.Location = new System.Drawing.Point( 16, 264 ); + this.txtResponseRootName.Name = "txtResponseRootName"; + this.txtResponseRootName.Size = new System.Drawing.Size( 464, 21 ); + this.txtResponseRootName.TabIndex = 7; + this.txtResponseRootName.Visible = false; + // + // SchemaMetaDataUserControl + // + this.Controls.Add( this.lblResponseRootName ); + this.Controls.Add( this.txtResponseRootName ); + this.Controls.Add( this.lblRequestRootPrompt ); + this.Controls.Add( this.txtRequestRootName ); + this.Controls.Add( this.lblTargetNSPrompt ); + this.Controls.Add( this.rdoReceivePort ); + this.Controls.Add( this.rdoSendPort ); + this.Controls.Add( this.lblPortType ); + this.Controls.Add( this.txtTargetNS ); + this.Font = new System.Drawing.Font( "Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( ( byte )( 0 ) ) ); + this.Name = "SchemaMetaDataUserControl"; + this.Load += new System.EventHandler( this.SchemaMetaDataUserControl_Load ); + this.ResumeLayout( false ); + this.PerformLayout( ); + + } + #endregion + + private void rdoReceivePort_CheckedChanged( object sender, System.EventArgs e ) + { + if ( rdoReceivePort.Checked ) + { + lblResponseRootName.Hide( ); + txtResponseRootName.Hide( ); + lblRequestRootPrompt.Text = "Response element root name"; + } + else + { + //this.labelInput.Text = ODBCResourceHandler.GetResourceString("RootInputLabelSend"); + //this.labelOutput.Text = ODBCResourceHandler.GetResourceString("RootOutputLabelSend"); + lblResponseRootName.Show( ); + txtResponseRootName.Show( ); + lblRequestRootPrompt.Text = "Request element root name"; + } + } + + private void SchemaMetaDataUserControl_Load( object sender, System.EventArgs e ) + { + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/SchemaMetaData.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/SchemaMetaData.resx new file mode 100644 index 00000000..19dc0dd8 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/SchemaMetaData.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardForm.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardForm.cs new file mode 100644 index 00000000..63621d98 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardForm.cs @@ -0,0 +1,330 @@ +//---------------------------------------------------------------------- +// +// WizardForm.cs +// +// Microsoft BizTalk Server +// Copyright (c) 1999-2002 Microsoft Corporation. All rights reserved. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +// WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. +// THE ENTIRE RISK OF USE OR RESULTS IN CONNECTION WITH THE USE OF THIS CODE +// AND INFORMATION REMAINS WITH THE USER. +// +//---------------------------------------------------------------------- + +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; + +namespace Microsoft.BizTalk.Adapters.ODBC.SchemaWizard +{ + public class WizardForm : System.Windows.Forms.Form + { + protected System.Windows.Forms.Panel panelWizard; + private System.Windows.Forms.GroupBox groupBoxFooter; + protected WizardUserControl _userControl = null; + private System.Windows.Forms.Panel panelFooter; + protected System.Windows.Forms.Button buttonHelp; + protected System.Windows.Forms.Button buttonBack; + protected System.Windows.Forms.Button buttonNext; + protected System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Panel panel1; + protected System.Windows.Forms.PictureBox picGraphic; + protected System.Windows.Forms.Label lblTitle; + protected System.Windows.Forms.Label lblScript; + private System.Windows.Forms.GroupBox groupBox1; + + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public WizardForm( ) + { + Application.EnableVisualStyles( ); + + InitializeComponent( ); + + //this.buttonHelp.Text = ODBCResourceHandler.GetResourceString("FormHelpButton"); + //this.buttonBack.Text = ODBCResourceHandler.GetResourceString("FormBackButton"); + //this.buttonNext.Text = ODBCResourceHandler.GetResourceString("FormNextButton"); + //this.buttonCancel.Text = ODBCResourceHandler.GetResourceString("FormCancelButton"); + //this.Text = ODBCResourceHandler.GetResourceString("FormTitle"); + } + + public bool BackButtonEnabled + { + get + { + return this.buttonBack.Enabled; + } + set + { + this.buttonBack.Enabled = value; + } + } + + public bool CancelButtonEnabled + { + get + { + return this.buttonCancel.Enabled; + } + set + { + this.buttonCancel.Enabled = value; + } + } + + public bool NextButtonEnabled + { + get + { + return this.buttonNext.Enabled; + } + set + { + this.buttonNext.Enabled = value; + } + } + + public string NextButtonText + { + get + { + return this.buttonNext.Text; + } + set + { + this.buttonNext.Text = value; + } + } + + public void PerformNextClick( ) + { + this.buttonNext.PerformClick( ); + } + + protected virtual void SetNewPageProperties( WizardUserControl newUserControl ) + { + SuspendLayout( ); + _userControl = newUserControl; + + newUserControl.Visible = true; + newUserControl.Anchor = AnchorStyles.Left; + newUserControl.Dock = DockStyle.Fill; + + //Force the UserControl to resize -- some of the user controls don't resize correctly. + float scaleRatioX = ( ( float )panelWizard.Width ) / ( ( float )newUserControl.Width ); + float scaleRatioY = ( ( float )panelWizard.Height ) / ( ( float )newUserControl.Height ); + SizeF factor = new SizeF( scaleRatioX, scaleRatioY ); + newUserControl.Scale( factor ); + + if ( !panelWizard.Controls.Contains( newUserControl ) ) + panelWizard.Controls.Add( ( UserControl )newUserControl ); + + foreach ( UserControl ctrl in panelWizard.Controls ) + { + if ( ctrl == newUserControl ) + ctrl.Visible = true; + else + ctrl.Visible = false; + } + + ResumeLayout( false ); + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if ( disposing ) + { + if ( components != null ) + { + components.Dispose( ); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent( ) + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager( typeof( WizardForm ) ); + this.panelWizard = new System.Windows.Forms.Panel( ); + this.buttonHelp = new System.Windows.Forms.Button( ); + this.buttonBack = new System.Windows.Forms.Button( ); + this.buttonNext = new System.Windows.Forms.Button( ); + this.buttonCancel = new System.Windows.Forms.Button( ); + this.panelFooter = new System.Windows.Forms.Panel( ); + this.groupBoxFooter = new System.Windows.Forms.GroupBox( ); + this.panel1 = new System.Windows.Forms.Panel( ); + this.lblScript = new System.Windows.Forms.Label( ); + this.lblTitle = new System.Windows.Forms.Label( ); + this.picGraphic = new System.Windows.Forms.PictureBox( ); + this.groupBox1 = new System.Windows.Forms.GroupBox( ); + this.panelFooter.SuspendLayout( ); + this.panel1.SuspendLayout( ); + ( ( System.ComponentModel.ISupportInitialize )( this.picGraphic ) ).BeginInit( ); + this.SuspendLayout( ); + // + // panelWizard + // + this.panelWizard.Location = new System.Drawing.Point( 0, 56 ); + this.panelWizard.Name = "panelWizard"; + this.panelWizard.Size = new System.Drawing.Size( 587, 345 ); + this.panelWizard.TabIndex = 0; + // + // buttonHelp + // + this.buttonHelp.Location = new System.Drawing.Point( 8, 8 ); + this.buttonHelp.Name = "buttonHelp"; + this.buttonHelp.Size = new System.Drawing.Size( 96, 24 ); + this.buttonHelp.TabIndex = 3; + this.buttonHelp.Visible = false; + // + // buttonBack + // + this.buttonBack.Enabled = false; + this.buttonBack.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonBack.Location = new System.Drawing.Point( 273, 8 ); + this.buttonBack.Name = "buttonBack"; + this.buttonBack.Size = new System.Drawing.Size( 96, 24 ); + this.buttonBack.TabIndex = 4; + this.buttonBack.Click += new System.EventHandler( this.OnBack ); + // + // buttonNext + // + this.buttonNext.Enabled = false; + this.buttonNext.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonNext.Location = new System.Drawing.Point( 377, 8 ); + this.buttonNext.Name = "buttonNext"; + this.buttonNext.Size = new System.Drawing.Size( 96, 24 ); + this.buttonNext.TabIndex = 5; + this.buttonNext.Click += new System.EventHandler( this.OnNext ); + // + // buttonCancel + // + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point( 481, 8 ); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size( 96, 24 ); + this.buttonCancel.TabIndex = 6; + this.buttonCancel.Click += new System.EventHandler( this.OnCancel ); + // + // panelFooter + // + this.panelFooter.Controls.Add( this.buttonHelp ); + this.panelFooter.Controls.Add( this.buttonBack ); + this.panelFooter.Controls.Add( this.buttonNext ); + this.panelFooter.Controls.Add( this.buttonCancel ); + this.panelFooter.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panelFooter.Location = new System.Drawing.Point( 0, 401 ); + this.panelFooter.Name = "panelFooter"; + this.panelFooter.Size = new System.Drawing.Size( 585, 40 ); + this.panelFooter.TabIndex = 2; + // + // groupBoxFooter + // + this.groupBoxFooter.Dock = System.Windows.Forms.DockStyle.Bottom; + this.groupBoxFooter.Location = new System.Drawing.Point( 0, 399 ); + this.groupBoxFooter.Name = "groupBoxFooter"; + this.groupBoxFooter.Size = new System.Drawing.Size( 585, 2 ); + this.groupBoxFooter.TabIndex = 1; + this.groupBoxFooter.TabStop = false; + // + // panel1 + // + this.panel1.BackColor = System.Drawing.Color.White; + this.panel1.Controls.Add( this.lblScript ); + this.panel1.Controls.Add( this.lblTitle ); + this.panel1.Controls.Add( this.picGraphic ); + this.panel1.Location = new System.Drawing.Point( 0, 0 ); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size( 587, 59 ); + this.panel1.TabIndex = 5; + // + // lblScript + // + this.lblScript.Location = new System.Drawing.Point( 16, 24 ); + this.lblScript.Name = "lblScript"; + this.lblScript.Size = new System.Drawing.Size( 400, 32 ); + this.lblScript.TabIndex = 2; + this.lblScript.Text = "lblScript"; + // + // lblTitle + // + this.lblTitle.Font = new System.Drawing.Font( "Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ( ( byte )( 0 ) ) ); + this.lblTitle.Location = new System.Drawing.Point( 8, 8 ); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size( 408, 16 ); + this.lblTitle.TabIndex = 1; + // + // picGraphic + // + this.picGraphic.Image = ( ( System.Drawing.Image )( resources.GetObject( "picGraphic.Image" ) ) ); + this.picGraphic.Location = new System.Drawing.Point( 528, 6 ); + this.picGraphic.Name = "picGraphic"; + this.picGraphic.Size = new System.Drawing.Size( 56, 47 ); + this.picGraphic.TabIndex = 0; + this.picGraphic.TabStop = false; + // + // groupBox1 + // + this.groupBox1.Location = new System.Drawing.Point( 0, 56 ); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size( 587, 3 ); + this.groupBox1.TabIndex = 6; + this.groupBox1.TabStop = false; + // + // WizardForm + // + this.AutoScaleBaseSize = new System.Drawing.Size( 5, 14 ); + this.ClientSize = new System.Drawing.Size( 585, 441 ); + this.Controls.Add( this.groupBox1 ); + this.Controls.Add( this.panelWizard ); + this.Controls.Add( this.groupBoxFooter ); + this.Controls.Add( this.panelFooter ); + this.Controls.Add( this.panel1 ); + this.Font = new System.Drawing.Font( "Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( ( byte )( 0 ) ) ); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "WizardForm"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "ODBC Transport Schema Generation"; + this.panelFooter.ResumeLayout( false ); + this.panel1.ResumeLayout( false ); + ( ( System.ComponentModel.ISupportInitialize )( this.picGraphic ) ).EndInit( ); + this.ResumeLayout( false ); + + } + #endregion + + protected virtual void OnCancel( object sender, System.EventArgs e ) + { + //((WizardUserControl)userControl).CleanUpOnCancel(); + + this.DialogResult = DialogResult.Cancel; + this.Close( ); + return; + } + + protected virtual void OnNext( object sender, System.EventArgs e ) { } + + protected virtual void OnBack( object sender, System.EventArgs e ) { } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardForm.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardForm.resx new file mode 100644 index 00000000..da363a81 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardForm.resx @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + + + /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwg + JC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy + MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAA0ADYDASIAAhEBAxEB/8QA + HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIh + MUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVW + V1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG + x8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF + BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV + YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOE + hYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq + 8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD34sB1NN8xf7w/MVi+IPEun6BJAl7NIjTKxRUiaQkDGfunjqOt + c2/jOPWbqDTNIunhmuWKG4njeMRDBJIy3J444xmonNQjzM3o4apWklFed+llu/kd1JOirneo/wCBD/Gv + PvEHieS41S3t7HU7uytwJVeeNU2SuCmArMxBAy2cY6jrV3X9I1awtLaztdcnktry4S2P2glnXdn+IEZU + 45FaUGpQ6ZZx6Xrulx2VuFEayIvmWr/j/D/wL865KtSc7w+Hz/4K2O6lhqcI86fO3eyW66Xs1q/Kz7nK + l9Ubn/hKNS/CSH/GgPqg6eJ9T/GSE/1rP1XVtNsvESwaI9wtipIlVHZ0Zv8AYUHOPoatDXbdug1A/S1n + /wDiq8z2lVtpSbt2bOLGYTH4eUeWPMpK69xX+as7P5nVeDLy+mv9StrvUZr1IooHQzbMqWMoP3P90daK + i8ESNcapqtx5VysZgt0Vp4XjyQ0pON5OfvD86K9nCuTorm3/AOCRWUlJcys7K+ltbLoUviBJs13Sv3mz + /Rp/49v8Uf8Atr/n17ReDre01K/1G2vFiuY3gj+SRg/8TdPnb+ddH4m8OprdxbTG+u7SS3R1U27KMhiC + c7j/ALI6VzMngImdJv7d1IyR/ccmHcv0O4EV3TrJ4Z0bNu9+lvz/AEIpUV9ZjXc0ly263Tu3fRW/E6OX + wtcR3NkLTUpPsNvcpOba4/ebdueEbqOvQ5roLxVaynVlDAxtkEZHSuYttR1fRrqytr2dNQtbiZYFmfak + qMemQrEMOOvFdYyh1KsMqRgiuOmo6pKx1YmVRuLnJNdGuv5O/rqeH+DdG1S91FNQsbYSR2jbmLyGMMf7 + qsO/+Sa9OsNWtbqcWsz3Fpe97a5Z0Y/7uXww+lOg0W+0KMJokySWgJP2G56DJydjjkfjmuR8deLRNanS + DpjwXXBlNyqkx+hQgn/vquGCWCpNt/5P0/r5HtVpPOMSlFadGnql5p7/AC9LnpcKFAckn6kn+ZNFV9JY + vo9kSxJNvGSScn7oor007q583OPLJx7FsjNN2e5/M/40+imSc94pDRW+n3OyR4ra+iml2AsVQZycfjWp + FqNrf6dJdWNzHMmwkPG2cHH6VZlOFPOPx/8ArivNPGB/s3XLOfT5xZSzxzGWSFlHmYKY3AyYP3j1/Xtz + VpOknU3R6ODpRxco4faWtn076/dv+BR0P4m6jZBY9VT7bDn/AFigLIPy4P6Vk+LNT0/W/FX2yK4dbOWO + MNJ5TFlwOflHeorWOG0UiOddx6sJVUn/AL5nFWPtAzn7T1/6eP8A7orw5Vqs4clR3R9pDD4ajXdajHlb + VtNtfKz/AK6Hp/hTXtN1e1e3064kl+xpGjeZEyEAggdev3T0orA+HL+ZqWsHfv8A3NsM793ebvvb+f4U + V72GqOpSUmfEZlQhQxUqcL20331SfZdz0CiiitzhEIz6/nWbqXh/TdWkikvI5neIMEZLmSMgNjI+Vh12 + j8qKKTSkrMunUnTlzQdn3RS/4QvQ/wDnlef+DC4/+Lo/4QvQ/wDnlef+DC4/+LooqPY0/wCVfcb/AF7F + f8/Jfey/pehafo7zPZRSK8wUSNJPJKSFzgfOxxjcenrRRRVpKKsjCpUnUlzTd33Z/9k= + + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardUserControl.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardUserControl.cs new file mode 100644 index 00000000..9187f340 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardUserControl.cs @@ -0,0 +1,123 @@ +//---------------------------------------------------------------------- +// +// WizardUserControl.cs +// +// Microsoft BizTalk Server +// Copyright (c) 1999-2002 Microsoft Corporation. All rights reserved. +// +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, +// WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE. +// THE ENTIRE RISK OF USE OR RESULTS IN CONNECTION WITH THE USE OF THIS CODE +// AND INFORMATION REMAINS WITH THE USER. +// +//---------------------------------------------------------------------- +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; + +namespace Microsoft.BizTalk.Adapters.ODBC.SchemaWizard +{ + public class WizardUserControl : System.Windows.Forms.UserControl + { + private WizardForm parentForm = null; + + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public WizardUserControl( ) + { + InitializeComponent( ); + } + + protected WizardForm WizardParentForm + { + get + { + if ( parentForm == null ) + parentForm = ( WizardForm )this.FindForm( ); + return parentForm; + } + } + + public virtual void ProcessLoad( ) + { + LoadPageInfo( ); + UpdateNextBackButton( ); + } + + public virtual bool SavePageInfo( ) + { + if ( !ValidatePageInput( ) ) + return false; + + return SavePageInfoWithoutValidation( ); + } + + public virtual bool SavePageInfoWithoutValidation( ) + { + return true; + } + + public virtual void CleanUpOnCancel( ) + { + } + + protected virtual bool ValidatePageInput( ) + { + return true; + } + + protected virtual void LoadPageInfo( ) + { + } + + protected virtual void UpdateNextBackButton( ) + { + } + + public virtual void SetSelect( ) + { + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if ( disposing ) + { + if ( components != null ) + { + components.Dispose( ); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent( ) + { + this.SuspendLayout( ); + // + // WizardUserControl + // + this.BackColor = System.Drawing.SystemColors.Control; + this.Font = new System.Drawing.Font( "Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( ( byte )( 0 ) ) ); + this.Name = "WizardUserControl"; + this.Size = new System.Drawing.Size( 497, 318 ); + this.ResumeLayout( false ); + + } + #endregion + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardUserControl.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardUserControl.resx new file mode 100644 index 00000000..19dc0dd8 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardUI/WizardUserControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/BizTalk ODBC Adapter.doc b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/BizTalk ODBC Adapter.doc new file mode 100644 index 0000000000000000000000000000000000000000..77bb0687725a0f290d71dd13e39be6bb93ec852c GIT binary patch literal 329216 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 z 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 literal 0 HcmV?d00001 diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/BizTalk ODBC Adapter.vsd b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/BizTalk ODBC Adapter.vsd new file mode 100644 index 0000000000000000000000000000000000000000..6f8a4168b7d9cb1767bd5970adf3cfb3584a57cd GIT binary patch literal 66048 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" +"ReceiveLocationPropertiesXML"="" +"SendHandlerPropertiesXML"="" +"SendLocationPropertiesXML"="" + +[HKEY_CLASSES_ROOT\CLSID\{8d285509-9e4a-4702-a8df-821e0f937d2b}\Implemented Categories] + +[HKEY_CLASSES_ROOT\CLSID\{8d285509-9e4a-4702-a8df-821e0f937d2b}\Implemented Categories\{7F46FC3E-3C2C-405B-A47F-8D17942BA8F9}] diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCAdapter.snk b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCAdapter.snk new file mode 100644 index 0000000000000000000000000000000000000000..0d564ea32858712121e1a4107e9400b9222978b6 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097ln4vQ4k&*q7xIBtACM>^uMjNyP06TNf zDH+G}B9=JY*p#EM9E0?3_%Po57I03rNK(JD11In*3z%gxEcNcc^74h!Kn5rDJNL=1 zbtGWj3vI;cA|lhHEdReXS{NEG?rA(|$tK(`)-GssxzFmqLt}vM(~?oFv<3+oO6^9#QW*Pa@HeX6wRhNdY$yq{w5ftPw(CN& zKAXY%q^8m^B;R`9d|lwb=Oh93Wqi$X^#H9MA@(hNj*=~9So3peD*%N+tOOlYx`2~_ zm^da99t?`XY8BSdN*J;1=SO1j-hYTMjc{@OpS7}{8NZWa=(9cbV>?Abk(%@ zsbbMvj=FE`YbF|;xvTV(62C2&1$A7 z;}@t^2T1c>ax;46MSn&1E3RmsB=%Jzw2lGcI5?&7@%TJctkTR_b3QKPNI`a%ff`&=X5}U+7voYJYy9hNpEJV%J667_ zwAt+LT+Ym#%RBFx`Tgrm`ZAKXjOB;Kl9ChYNRPHyCUPTpwAAVCQyWuH$w&Hc=C9Rj^4bPxoqakAh%9miznjA(OWd@JusX4 zSep`wJEDsimgweaeu1GCNqDhP4PXPNyoA+n_j#^gZM6U^oZpx zBeprzJ}<+l+?m@|xHfC|wJ&@$k!T#~^mWf&+X z0$sGtdW@F!^ofyhI%mmHisUA<=$!MOWOS1rdP>SMzhO5 z_sT@Brj~^4x^o_joE|o*ohfo@-!PtLPM@v)%#*?cHk&&Ob&MK4zJBv9h1e%w6ySai!sUydQwm> zaT&{=4w8A*dDLgE*Y>HO=aU%m@sNzbYUkr51K-Vf;}jN&h?rxLD{w!d&GJ`F&lP<` zWRxlN^yBl3=DHy~=k}G0?cA5gW*1K270X$ct9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/RosettaStoneTypeMappings.xls b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/RosettaStoneTypeMappings.xls new file mode 100644 index 0000000000000000000000000000000000000000..affb85d0375749025c472cf9d838d4e51646f6e9 GIT binary patch literal 15360 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 G|Nj7}txTr? literal 0 HcmV?d00001 diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/AssemblyInfo.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/AssemblyInfo.cs new file mode 100644 index 00000000..3ee1df2f --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/AssemblyInfo.cs @@ -0,0 +1,16 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: AssemblyTitle( "BizTalk Server 2006 ODBC Adapter" )] +[assembly: AssemblyDescription( "BizTalk Server 2006 ODBC Adapter" )] +[assembly: AssemblyConfiguration( "" )] +[assembly: AssemblyCompany( "Microsoft Corporation" )] +[assembly: AssemblyProduct( "Microsoft BizTalk Server 2006" )] +[assembly: AssemblyCopyright( "Copyright (C) 2006 Microsoft Corporation. All rights reserved." )] +[assembly: AssemblyTrademark( "" )] +[assembly: AssemblyCulture( "" )] + +[assembly: AssemblyVersion( "1.2.0.0" )] + +[assembly: AssemblyDelaySign( false )] +[assembly: AssemblyKeyName( "" )] \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/BTSODBCQueryEngine.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/BTSODBCQueryEngine.cs new file mode 100644 index 00000000..6235793f --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/BTSODBCQueryEngine.cs @@ -0,0 +1,358 @@ +using System; +using System.Data.Odbc; +using System.Xml; +using System.Xml.Schema; +using System.IO; +using System.Data; +using System.Text; + +namespace Microsoft.BizTalk.Adapters.ODBC +{ + ///

+ /// Summary description for BTSODBCQueryEngine. + /// + public class BTSODBCQueryEngine + { + public string ODBCConnectionString = ""; + public bool ODBCTransaction = false; + + public string DocumentRootNode =""; + public string Namespace = ""; + +#if(DEBUG) + public string DebugOutLocation = ""; +#endif + + public BTSODBCQueryEngine() + { + // + // TODO: Add constructor logic here + // + } + + private OdbcCommand CreateODBCCommandFromSchema(string QuerySchema) + { + StringReader sr = new StringReader(QuerySchema); + OdbcCommand odbcCmd = new OdbcCommand(); + XmlSchema xsdQueryConfiguration = XmlSchema.Read(sr,null); + + foreach(object item in xsdQueryConfiguration.Items) + { + if(item is XmlSchemaAnnotation) // Then we are at the section of the schema containing + { // the odbc query spec + XmlSchemaAnnotation xsAnnotation = (XmlSchemaAnnotation)item; + XmlSchemaAppInfo xsAppInfo = (XmlSchemaAppInfo)xsAnnotation.Items[0]; + XmlNode[] xmlNodesQueryInfo = xsAppInfo.Markup; + + // Create our new command object for query processing + odbcCmd.CommandText = xmlNodesQueryInfo[1].InnerText; + + //HACK TO ADDRESS OUT PARAMETERS FOR SP FIX THIS +// OdbcParameter outParam = new OdbcParameter(); +// outParam.Direction= ParameterDirection.ReturnValue; +// outParam.Size = 10; // THIS DOES MATTER FIX THIS: +// odbcCmd.Parameters.Add(outParam); + + } + if(item is XmlSchemaElement) // Query Parameters Section of the schema + { + XmlSchemaElement xsParamsElement = (XmlSchemaElement)item; + XmlSchemaComplexType xsCT = (XmlSchemaComplexType)xsParamsElement.SchemaType; + // IMPORTANT NOTE: If for some reason they change the order of the params in the + // schmema and/or the document being processes then the results will be wrong + // as there is no way to map the data to the correct element of the query + // remember our SQL looks like SELECT * FROM CUSTOMER WHERE CUSTOMERID = ? + foreach(XmlSchemaAttribute xsAttParams in xsCT.Attributes) + { + OdbcParameter queryParam = new OdbcParameter(); + + queryParam.ParameterName = "@" + xsAttParams.Name; + + //Now get all of the meta data from the parameter + XmlSchemaAppInfo xsParamInfo = (XmlSchemaAppInfo)xsAttParams.Annotation.Items[0]; + XmlNode[] xmlParamInfo = xsParamInfo.Markup; + + queryParam.OdbcType = ConvertStringDataTypeToODBC(xmlParamInfo[0].InnerText); + queryParam.Direction = ConverStrToParamDir(xmlParamInfo[1].InnerText); + + if(System.Convert.ToInt32(xmlParamInfo[2].InnerText) > 0) + queryParam.Size = System.Convert.ToInt32(xmlParamInfo[2].InnerText); + + odbcCmd.Parameters.Add(queryParam); + } + } + + } + + return odbcCmd; + } + /* + * SIMULATES BTS CODE EXECUTION FOR MESSGAE PROCESSING + */ + public string BTSExecuteODBCCall(string BTSDocument, string QuerySchema) + { + OdbcCommand odbcCmd = CreateODBCCommandFromSchema(QuerySchema); + odbcCmd.Connection = new OdbcConnection(ODBCConnectionString); + string Output = ""; + bool bOutputParametersInQuery = false; + OdbcTransaction localDBTransaction = null; + + XmlDocument xmlDoc = new XmlDocument(); + + XmlNamespaceManager xmlNSM = new XmlNamespaceManager(xmlDoc.NameTable); + + // WARNING: Should be converted to stream code I would suggest. + xmlDoc.LoadXml(BTSDocument); + + // Need to lookup the NS prefix for the payload section of the schema. + // Concerned that the root node will not always know what the NS is for our playload + // section of the document + // WARNING: Possible issue below + XmlNode root = xmlDoc.FirstChild; + + string sNSPrefix = root.GetPrefixOfNamespace(Namespace); + xmlNSM.AddNamespace(sNSPrefix, Namespace); + + // Now lets get the payload section of the document and process the queries + XmlNodeList xmlNL = xmlDoc.SelectNodes("/" + sNSPrefix + ":" + DocumentRootNode, xmlNSM); + + UnicodeEncoding Unicode = new UnicodeEncoding(); + + foreach(XmlNode xmlN in xmlNL) + { + int xmlInboudMsgAttribCnt = 0; + //WE NEED TO SKIP THIS FIRST ELEMENT WHICH IS THE ReturnValue + for(int cnt = 0; cnt < odbcCmd.Parameters.Count; cnt++) + { + if(odbcCmd.Parameters[cnt].Direction == ParameterDirection.ReturnValue + || odbcCmd.Parameters[cnt].Direction == ParameterDirection.Output + ||odbcCmd.Parameters[cnt].Direction == ParameterDirection.InputOutput) + { + // Add a flag so we know that we need to add out parameters to our ouput xml document + bOutputParametersInQuery = true; + } + + //WE also need to check if this is an input or output value + if(odbcCmd.Parameters[cnt].Direction != ParameterDirection.ReturnValue && odbcCmd.Parameters[cnt].Direction != ParameterDirection.Output) + { + + // Even though the command object has some capabilities to perform + // data type conversions, we still need to manually convert many of them. + // So insted of picking and choosing we are just going to convert them all! + switch(odbcCmd.Parameters[cnt].OdbcType.ToString()) + { + case "BigInt": + odbcCmd.Parameters[cnt].Value = System.Convert.ToInt64(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Binary": + odbcCmd.Parameters[cnt].Value = Unicode.GetBytes(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Bit": + odbcCmd.Parameters[cnt].Value = System.Convert.ToBoolean(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Text": + odbcCmd.Parameters[cnt].Value = System.Convert.ToString(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "DateTime": + odbcCmd.Parameters[cnt].Value = System.Convert.ToDateTime(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Numeric": + odbcCmd.Parameters[cnt].Value = System.Convert.ToDecimal(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Double": + odbcCmd.Parameters[cnt].Value = System.Convert.ToDouble(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Int": + odbcCmd.Parameters[cnt].Value = System.Convert.ToInt32(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Real": + odbcCmd.Parameters[cnt].Value = System.Convert.ToDouble(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "SmallInt": + odbcCmd.Parameters[cnt].Value = System.Convert.ToInt16(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "TinyInt": + odbcCmd.Parameters[cnt].Value = System.Convert.ToByte(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "UniqueIdentifier": //FIX THIS: Need to do something else! + odbcCmd.Parameters[cnt].Value = System.Convert.ToString(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Char" : //FIX THIS NEEDS TO SUPPORT ARRAYS + odbcCmd.Parameters[cnt].Value = System.Convert.ToString(xmlN.Attributes[xmlInboudMsgAttribCnt].Value);//.ToCharArray(); + break; + case "Date": // THIS IS A BEST GUESS + odbcCmd.Parameters[cnt].Value = System.Convert.ToDateTime(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Decimal": + odbcCmd.Parameters[cnt].Value = System.Convert.ToDecimal(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Image": + odbcCmd.Parameters[cnt].Value = Unicode.GetBytes(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "NChar": + odbcCmd.Parameters[cnt].Value = System.Convert.ToString(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "NText": + odbcCmd.Parameters[cnt].Value = System.Convert.ToString(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "NVarChar": + odbcCmd.Parameters[cnt].Value = System.Convert.ToString(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "SmallDateTime": // BEST GUESS + odbcCmd.Parameters[cnt].Value = System.Convert.ToDateTime(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Time": // BEST GUESS + odbcCmd.Parameters[cnt].Value = System.Convert.ToDateTime(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "Timestamp": + odbcCmd.Parameters[cnt].Value = Unicode.GetBytes(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "VarBinary": //FIX THIS + odbcCmd.Parameters[cnt].Value = Unicode.GetBytes(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + case "VarChar": + odbcCmd.Parameters[cnt].Value = System.Convert.ToString(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + default: + odbcCmd.Parameters[cnt].Value = System.Convert.ToDateTime(xmlN.Attributes[xmlInboudMsgAttribCnt].Value); + break; + + } + xmlInboudMsgAttribCnt ++; + } + } + + try + { + // HERE we actually execute the query against the target database + // We're leveraging ADO.NET to do alot of the heave lifting so it can deal with + // generateing the XML output for us + OdbcDataAdapter odbcAdapter = new OdbcDataAdapter(); + + //================================ BEGIN TRANSACTION =================================== + if(ODBCTransaction) // Do we need to enlist the operation in a transaction + localDBTransaction = odbcCmd.Connection.BeginTransaction (); + + odbcAdapter.SelectCommand = odbcCmd; + + DataSet ds = new DataSet(); + odbcAdapter.Fill(ds); + Output = ds.GetXml(); +#if(DEBUG)// write output to a specified file + if(DebugOutLocation != null) + { + ds.WriteXml("C:\\TEMP\\ADAPTEROUT.XML"); + } +#endif + // =============================== END TRANSACTION ======================================= + if(ODBCTransaction) // Do we need to complete a transcation + localDBTransaction.Commit(); + } + catch(Exception e) + { + try + { + if(ODBCTransaction) + { + // ======================= ROLLBACK TRANSACTION ================================== + localDBTransaction.Rollback(); + } + } + catch (Exception ex) + { + + } + + } + + + //Once we have the return data set and its corrisponding XML we need to add any outparameter + //values to the end of that XML document + + + + + } + + + return Output; + } + private ParameterDirection ConverStrToParamDir(string sParamDir) + { + switch(sParamDir) + { + case "Input": + return ParameterDirection.Input; + case "Output": + return ParameterDirection.Output; + case "InputOutput": + return ParameterDirection.InputOutput; + case "ReturnValue": + return ParameterDirection.ReturnValue; + default: + return ParameterDirection.Input; + + } + + + } + private OdbcType ConvertStringDataTypeToODBC(string sType) + { + switch(sType) + { + case "BigInt": + return OdbcType.BigInt; + case "Binary": // Also could be IMAGE + return OdbcType.Binary; + case "Bit": + return OdbcType.Bit; + case "Text": // Could also be NCHAR, NTEXT, NVARCHAR + return OdbcType.Text; + case "DateTime": + return OdbcType.DateTime; + case "Numeric": // Could also be DECIMAL, + return OdbcType.Numeric; + case "Double": + return OdbcType.Double; + case "Int": + return OdbcType.Int; + case "Real": + return OdbcType.Real; + case "SmallInt": + return OdbcType.SmallInt; + case "TinyInt": + return OdbcType.TinyInt; + case "UniqueIdentifier": + return OdbcType.UniqueIdentifier; + case "Char" : + return OdbcType.Char; + case "Date": + return OdbcType.Date; + case "Decimal": + return OdbcType.Decimal; + case "Image": + return OdbcType.Image; + case "NChar": + return OdbcType.NChar; + case "NText": + return OdbcType.NText; + case "NVarChar": + return OdbcType.NVarChar; + case "SmallDateTime": + return OdbcType.SmallDateTime; + case "Time": + return OdbcType.Time; + case "Timestamp": + return OdbcType.Timestamp; + case "VarBinary": + return OdbcType.VarBinary; + case "VarChar": + return OdbcType.VarChar; + default: + return OdbcType.Text; + } + + } + + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/ConnectionString.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/ConnectionString.cs new file mode 100644 index 00000000..6c37803a --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/ConnectionString.cs @@ -0,0 +1,141 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; + +namespace Microsoft.BizTalk.Adapters.ODBC +{ + /// + /// Summary description for QueryType. + /// + public class ConnectionString : System.Windows.Forms.UserControl + { + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button button4; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public ConnectionString() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + // TODO: Add any initialization after the InitializeComponent call + + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.button4 = new System.Windows.Forms.Button(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.button3 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label2 + // + this.label2.Location = new System.Drawing.Point(36, 44); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(152, 16); + this.label2.TabIndex = 13; + this.label2.Text = "Connection string:"; + // + // label1 + // + this.label1.Location = new System.Drawing.Point(36, 12); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(248, 16); + this.label1.TabIndex = 12; + this.label1.Text = "To set connection string, click set"; + // + // button4 + // + this.button4.Location = new System.Drawing.Point(396, 28); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(80, 24); + this.button4.TabIndex = 11; + this.button4.Text = "&Set"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(36, 68); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.ReadOnly = true; + this.textBox1.Size = new System.Drawing.Size(448, 168); + this.textBox1.TabIndex = 10; + this.textBox1.Text = ""; + // + // button3 + // + this.button3.Location = new System.Drawing.Point(396, 260); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(88, 24); + this.button3.TabIndex = 9; + this.button3.Text = "Finish"; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(300, 260); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(88, 24); + this.button2.TabIndex = 8; + this.button2.Text = "Next >"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(204, 260); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(88, 24); + this.button1.TabIndex = 7; + this.button1.Text = "< Bac&k"; + // + // ConnectionString + // + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.button4); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Name = "ConnectionString"; + this.Size = new System.Drawing.Size(520, 296); + this.ResumeLayout(false); + + } + #endregion + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/ConnectionString.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/ConnectionString.resx new file mode 100644 index 00000000..24776c7e --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/ConnectionString.resx @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + Private + + + False + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + False + + + True + + + True + + + ConnectionString + + + 80 + + + (Default) + + + False + + + Private + + + 8, 8 + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/MetaData.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/MetaData.cs new file mode 100644 index 00000000..ab769d24 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/MetaData.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Windows.Forms; + +namespace Microsoft.BizTalk.Adapters.ODBC +{ + /// + /// Summary description for MetaData. + /// + public class MetaData : System.Windows.Forms.UserControl + { + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.RadioButton radioButton1; + private System.Windows.Forms.RadioButton radioButton2; + private System.Windows.Forms.Label label4; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public MetaData() + { + // This call is required by the Windows.Forms Form Designer. + InitializeComponent(); + + // TODO: Add any initialization after the InitializeComponent call + + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Component Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.label2 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.button3 = new System.Windows.Forms.Button(); + this.button2 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.radioButton1 = new System.Windows.Forms.RadioButton(); + this.radioButton2 = new System.Windows.Forms.RadioButton(); + this.label4 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // label2 + // + this.label2.Location = new System.Drawing.Point(28, 40); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(152, 16); + this.label2.TabIndex = 20; + this.label2.Text = "Target Namespace:"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(32, 56); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(448, 24); + this.textBox1.TabIndex = 17; + this.textBox1.Text = ""; + // + // button3 + // + this.button3.Location = new System.Drawing.Point(388, 256); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(88, 24); + this.button3.TabIndex = 16; + this.button3.Text = "Finish"; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(292, 256); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(88, 24); + this.button2.TabIndex = 15; + this.button2.Text = "Next >"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(196, 256); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(88, 24); + this.button1.TabIndex = 14; + this.button1.Text = "< Bac&k"; + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(32, 200); + this.textBox2.Multiline = true; + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(448, 24); + this.textBox2.TabIndex = 21; + this.textBox2.Text = ""; + // + // label3 + // + this.label3.Location = new System.Drawing.Point(32, 184); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(168, 16); + this.label3.TabIndex = 22; + this.label3.Text = "Document root element name:"; + // + // radioButton1 + // + this.radioButton1.Location = new System.Drawing.Point(56, 112); + this.radioButton1.Name = "radioButton1"; + this.radioButton1.Size = new System.Drawing.Size(128, 24); + this.radioButton1.TabIndex = 23; + this.radioButton1.Text = "Receive"; + // + // radioButton2 + // + this.radioButton2.Location = new System.Drawing.Point(56, 136); + this.radioButton2.Name = "radioButton2"; + this.radioButton2.Size = new System.Drawing.Size(112, 24); + this.radioButton2.TabIndex = 24; + this.radioButton2.Text = "Send"; + // + // label4 + // + this.label4.Location = new System.Drawing.Point(32, 96); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(152, 16); + this.label4.TabIndex = 25; + this.label4.Text = "Select port type:"; + // + // MetaData + // + this.Controls.Add(this.label4); + this.Controls.Add(this.radioButton2); + this.Controls.Add(this.radioButton1); + this.Controls.Add(this.label3); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.label2); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.button3); + this.Controls.Add(this.button2); + this.Controls.Add(this.button1); + this.Name = "MetaData"; + this.Size = new System.Drawing.Size(504, 288); + this.ResumeLayout(false); + + } + #endregion + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/MetaData.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/MetaData.resx new file mode 100644 index 00000000..1982b393 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/MetaData.resx @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + Private + + + False + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + Private + + + Private + + + False + + + False + + + True + + + True + + + 80 + + + (Default) + + + False + + + Private + + + MetaData + + + 8, 8 + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/ODBCAdapter.snk b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/ODBCAdapter.snk new file mode 100644 index 0000000000000000000000000000000000000000..0d564ea32858712121e1a4107e9400b9222978b6 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097ln4vQ4k&*q7xIBtACM>^uMjNyP06TNf zDH+G}B9=JY*p#EM9E0?3_%Po57I03rNK(JD11In*3z%gxEcNcc^74h!Kn5rDJNL=1 zbtGWj3vI;cA|lhHEdReXS{NEG?rA(|$tK(`)-GssxzFmqLt}vM(~?oFv<3+oO6^9#QW*Pa@HeX6wRhNdY$yq{w5ftPw(CN& zKAXY%q^8m^B;R`9d|lwb=Oh93Wqi$X^#H9MA@(hNj*=~9So3peD*%N+tOOlYx`2~_ zm^da99t?`XY8BSdN*J;1=SO1j-hYTMjc{@OpS7}{8NZWa=(9cbV>?Abk(%@ zsbbMvj=FE`YbF|;xvTV(62C2&1$A7 z;}@t^2T1c>ax;46MSn&1E3RmsB=%Jzw2lGcI5?&7@%TJctkTR_b3QKPNI`a%ff` + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if ( disposing ) + { + if ( components != null ) + { + components.Dispose( ); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent( ) + { + this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog( ); + this.digOpenFile = new System.Windows.Forms.OpenFileDialog( ); + this.tabControl1 = new System.Windows.Forms.TabControl( ); + this.tpSchemaWizard = new System.Windows.Forms.TabPage( ); + this.label12 = new System.Windows.Forms.Label( ); + this.label11 = new System.Windows.Forms.Label( ); + this.label7 = new System.Windows.Forms.Label( ); + this.button1 = new System.Windows.Forms.Button( ); + this.txtOutputSchema = new System.Windows.Forms.TextBox( ); + this.label3 = new System.Windows.Forms.Label( ); + this.txtInputSchema = new System.Windows.Forms.TextBox( ); + this.label2 = new System.Windows.Forms.Label( ); + this.txtSQLStatement = new System.Windows.Forms.TextBox( ); + this.label4 = new System.Windows.Forms.Label( ); + this.label1 = new System.Windows.Forms.Label( ); + this.tpQueryEngine = new System.Windows.Forms.TabPage( ); + this.label8 = new System.Windows.Forms.Label( ); + this.txtQueryResults = new System.Windows.Forms.TextBox( ); + this.groupBox2 = new System.Windows.Forms.GroupBox( ); + this.label10 = new System.Windows.Forms.Label( ); + this.label5 = new System.Windows.Forms.Label( ); + this.txtIterations = new System.Windows.Forms.TextBox( ); + this.rdoSend = new System.Windows.Forms.RadioButton( ); + this.rdoReceive = new System.Windows.Forms.RadioButton( ); + this.btnConnection = new System.Windows.Forms.Button( ); + this.label9 = new System.Windows.Forms.Label( ); + this.txtConnectionString = new System.Windows.Forms.TextBox( ); + this.btnExecuteQuery = new System.Windows.Forms.Button( ); + this.btnInputInst = new System.Windows.Forms.Button( ); + this.btnSchemaName = new System.Windows.Forms.Button( ); + this.label6 = new System.Windows.Forms.Label( ); + this.txtInputInstanceName = new System.Windows.Forms.TextBox( ); + this.lblSchemaName = new System.Windows.Forms.Label( ); + this.txtInputSchemaLocation = new System.Windows.Forms.TextBox( ); + this.tabControl1.SuspendLayout( ); + this.tpSchemaWizard.SuspendLayout( ); + this.tpQueryEngine.SuspendLayout( ); + this.groupBox2.SuspendLayout( ); + this.SuspendLayout( ); + // + // tabControl1 + // + this.tabControl1.Controls.Add( this.tpSchemaWizard ); + this.tabControl1.Controls.Add( this.tpQueryEngine ); + this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl1.Location = new System.Drawing.Point( 0, 0 ); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + this.tabControl1.Size = new System.Drawing.Size( 744, 589 ); + this.tabControl1.TabIndex = 15; + // + // tpSchemaWizard + // + this.tpSchemaWizard.Controls.Add( this.label12 ); + this.tpSchemaWizard.Controls.Add( this.label11 ); + this.tpSchemaWizard.Controls.Add( this.label7 ); + this.tpSchemaWizard.Controls.Add( this.button1 ); + this.tpSchemaWizard.Controls.Add( this.txtOutputSchema ); + this.tpSchemaWizard.Controls.Add( this.label3 ); + this.tpSchemaWizard.Controls.Add( this.txtInputSchema ); + this.tpSchemaWizard.Controls.Add( this.label2 ); + this.tpSchemaWizard.Controls.Add( this.txtSQLStatement ); + this.tpSchemaWizard.Controls.Add( this.label4 ); + this.tpSchemaWizard.Controls.Add( this.label1 ); + this.tpSchemaWizard.Location = new System.Drawing.Point( 4, 22 ); + this.tpSchemaWizard.Name = "tpSchemaWizard"; + this.tpSchemaWizard.Size = new System.Drawing.Size( 736, 563 ); + this.tpSchemaWizard.TabIndex = 0; + this.tpSchemaWizard.Text = "Schema Wizard Test"; + // + // label12 + // + this.label12.Location = new System.Drawing.Point( 378, 116 ); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size( 167, 12 ); + this.label12.TabIndex = 27; + this.label12.Text = "Output Schema"; + // + // label11 + // + this.label11.Location = new System.Drawing.Point( 2, 114 ); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size( 256, 14 ); + this.label11.TabIndex = 26; + this.label11.Text = "Input Schema"; + // + // label7 + // + this.label7.Location = new System.Drawing.Point( 1, 37 ); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size( 151, 15 ); + this.label7.TabIndex = 25; + this.label7.Text = "ADO.NET Escape Sequence"; + // + // button1 + // + this.button1.Location = new System.Drawing.Point( 584, 8 ); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size( 144, 32 ); + this.button1.TabIndex = 24; + this.button1.Text = "Test ODBC Wizard"; + this.button1.Click += new System.EventHandler( this.button1_Click ); + // + // txtOutputSchema + // + this.txtOutputSchema.Location = new System.Drawing.Point( 376, 130 ); + this.txtOutputSchema.Multiline = true; + this.txtOutputSchema.Name = "txtOutputSchema"; + this.txtOutputSchema.ReadOnly = true; + this.txtOutputSchema.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtOutputSchema.Size = new System.Drawing.Size( 360, 430 ); + this.txtOutputSchema.TabIndex = 22; + // + // label3 + // + this.label3.Location = new System.Drawing.Point( 368, 232 ); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size( 136, 16 ); + this.label3.TabIndex = 23; + // + // txtInputSchema + // + this.txtInputSchema.AcceptsReturn = true; + this.txtInputSchema.AcceptsTab = true; + this.txtInputSchema.Location = new System.Drawing.Point( 0, 129 ); + this.txtInputSchema.Multiline = true; + this.txtInputSchema.Name = "txtInputSchema"; + this.txtInputSchema.ReadOnly = true; + this.txtInputSchema.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtInputSchema.Size = new System.Drawing.Size( 367, 431 ); + this.txtInputSchema.TabIndex = 20; + // + // label2 + // + this.label2.Location = new System.Drawing.Point( 0, 232 ); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size( 160, 16 ); + this.label2.TabIndex = 21; + // + // txtSQLStatement + // + this.txtSQLStatement.Location = new System.Drawing.Point( 1, 54 ); + this.txtSQLStatement.Multiline = true; + this.txtSQLStatement.Name = "txtSQLStatement"; + this.txtSQLStatement.ReadOnly = true; + this.txtSQLStatement.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtSQLStatement.Size = new System.Drawing.Size( 734, 53 ); + this.txtSQLStatement.TabIndex = 19; + // + // label4 + // + this.label4.Location = new System.Drawing.Point( 0, 152 ); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size( 168, 16 ); + this.label4.TabIndex = 18; + // + // label1 + // + this.label1.Location = new System.Drawing.Point( 2, 42 ); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size( 160, 16 ); + this.label1.TabIndex = 17; + // + // tpQueryEngine + // + this.tpQueryEngine.Controls.Add( this.label8 ); + this.tpQueryEngine.Controls.Add( this.txtQueryResults ); + this.tpQueryEngine.Controls.Add( this.groupBox2 ); + this.tpQueryEngine.Location = new System.Drawing.Point( 4, 22 ); + this.tpQueryEngine.Name = "tpQueryEngine"; + this.tpQueryEngine.Size = new System.Drawing.Size( 736, 563 ); + this.tpQueryEngine.TabIndex = 2; + this.tpQueryEngine.Text = "Query Engine Test"; + // + // label8 + // + this.label8.Location = new System.Drawing.Point( 0, 184 ); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size( 184, 16 ); + this.label8.TabIndex = 24; + this.label8.Text = "Query Results:"; + // + // txtQueryResults + // + this.txtQueryResults.Location = new System.Drawing.Point( 0, 200 ); + this.txtQueryResults.Multiline = true; + this.txtQueryResults.Name = "txtQueryResults"; + this.txtQueryResults.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtQueryResults.Size = new System.Drawing.Size( 736, 360 ); + this.txtQueryResults.TabIndex = 23; + // + // groupBox2 + // + this.groupBox2.Controls.Add( this.label10 ); + this.groupBox2.Controls.Add( this.label5 ); + this.groupBox2.Controls.Add( this.txtIterations ); + this.groupBox2.Controls.Add( this.rdoSend ); + this.groupBox2.Controls.Add( this.rdoReceive ); + this.groupBox2.Controls.Add( this.btnConnection ); + this.groupBox2.Controls.Add( this.label9 ); + this.groupBox2.Controls.Add( this.txtConnectionString ); + this.groupBox2.Controls.Add( this.btnExecuteQuery ); + this.groupBox2.Controls.Add( this.btnInputInst ); + this.groupBox2.Controls.Add( this.btnSchemaName ); + this.groupBox2.Controls.Add( this.label6 ); + this.groupBox2.Controls.Add( this.txtInputInstanceName ); + this.groupBox2.Controls.Add( this.lblSchemaName ); + this.groupBox2.Controls.Add( this.txtInputSchemaLocation ); + this.groupBox2.Location = new System.Drawing.Point( 8, 8 ); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size( 720, 160 ); + this.groupBox2.TabIndex = 22; + this.groupBox2.TabStop = false; + // + // label10 + // + this.label10.Location = new System.Drawing.Point( 567, 85 ); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size( 56, 16 ); + this.label10.TabIndex = 34; + this.label10.Text = "Iterations:"; + // + // label5 + // + this.label5.Location = new System.Drawing.Point( 16, 16 ); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size( 96, 16 ); + this.label5.TabIndex = 33; + this.label5.Text = "Query Direction"; + // + // txtIterations + // + this.txtIterations.Location = new System.Drawing.Point( 624, 80 ); + this.txtIterations.MaxLength = 4; + this.txtIterations.Name = "txtIterations"; + this.txtIterations.RightToLeft = System.Windows.Forms.RightToLeft.Yes; + this.txtIterations.Size = new System.Drawing.Size( 32, 21 ); + this.txtIterations.TabIndex = 32; + this.txtIterations.Text = "1"; + // + // rdoSend + // + this.rdoSend.Checked = true; + this.rdoSend.Location = new System.Drawing.Point( 24, 40 ); + this.rdoSend.Name = "rdoSend"; + this.rdoSend.Size = new System.Drawing.Size( 136, 16 ); + this.rdoSend.TabIndex = 31; + this.rdoSend.TabStop = true; + this.rdoSend.Text = "Send Query"; + this.rdoSend.CheckedChanged += new System.EventHandler( this.rdoSend_CheckedChanged ); + // + // rdoReceive + // + this.rdoReceive.Location = new System.Drawing.Point( 24, 64 ); + this.rdoReceive.Name = "rdoReceive"; + this.rdoReceive.Size = new System.Drawing.Size( 144, 16 ); + this.rdoReceive.TabIndex = 30; + this.rdoReceive.Text = "Receive Query"; + this.rdoReceive.CheckedChanged += new System.EventHandler( this.rdoReceive_CheckedChanged ); + // + // btnConnection + // + this.btnConnection.Location = new System.Drawing.Point( 504, 128 ); + this.btnConnection.Name = "btnConnection"; + this.btnConnection.Size = new System.Drawing.Size( 32, 24 ); + this.btnConnection.TabIndex = 29; + this.btnConnection.Text = "..."; + this.btnConnection.Click += new System.EventHandler( this.btnConnection_Click ); + // + // label9 + // + this.label9.Location = new System.Drawing.Point( 200, 112 ); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size( 200, 16 ); + this.label9.TabIndex = 28; + this.label9.Text = "Connection String:"; + // + // txtConnectionString + // + this.txtConnectionString.Location = new System.Drawing.Point( 200, 128 ); + this.txtConnectionString.Name = "txtConnectionString"; + this.txtConnectionString.Size = new System.Drawing.Size( 304, 21 ); + this.txtConnectionString.TabIndex = 27; + // + // btnExecuteQuery + // + this.btnExecuteQuery.Location = new System.Drawing.Point( 568, 24 ); + this.btnExecuteQuery.Name = "btnExecuteQuery"; + this.btnExecuteQuery.Size = new System.Drawing.Size( 136, 32 ); + this.btnExecuteQuery.TabIndex = 26; + this.btnExecuteQuery.Text = "Run Query"; + this.btnExecuteQuery.Click += new System.EventHandler( this.btnExecuteQuery_Click ); + // + // btnInputInst + // + this.btnInputInst.Location = new System.Drawing.Point( 504, 80 ); + this.btnInputInst.Name = "btnInputInst"; + this.btnInputInst.Size = new System.Drawing.Size( 32, 24 ); + this.btnInputInst.TabIndex = 25; + this.btnInputInst.Text = "..."; + this.btnInputInst.Click += new System.EventHandler( this.btnInputInst_Click ); + // + // btnSchemaName + // + this.btnSchemaName.Location = new System.Drawing.Point( 504, 32 ); + this.btnSchemaName.Name = "btnSchemaName"; + this.btnSchemaName.Size = new System.Drawing.Size( 32, 24 ); + this.btnSchemaName.TabIndex = 24; + this.btnSchemaName.Text = "..."; + this.btnSchemaName.Click += new System.EventHandler( this.btnSchemaName_Click ); + // + // label6 + // + this.label6.Location = new System.Drawing.Point( 200, 64 ); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size( 178, 16 ); + this.label6.TabIndex = 23; + this.label6.Text = "Input Instance Name:"; + // + // txtInputInstanceName + // + this.txtInputInstanceName.Location = new System.Drawing.Point( 200, 80 ); + this.txtInputInstanceName.Name = "txtInputInstanceName"; + this.txtInputInstanceName.Size = new System.Drawing.Size( 304, 21 ); + this.txtInputInstanceName.TabIndex = 22; + // + // lblSchemaName + // + this.lblSchemaName.Location = new System.Drawing.Point( 200, 16 ); + this.lblSchemaName.Name = "lblSchemaName"; + this.lblSchemaName.Size = new System.Drawing.Size( 151, 16 ); + this.lblSchemaName.TabIndex = 21; + this.lblSchemaName.Text = "Input Schema Name:"; + // + // txtInputSchemaLocation + // + this.txtInputSchemaLocation.Location = new System.Drawing.Point( 200, 32 ); + this.txtInputSchemaLocation.Name = "txtInputSchemaLocation"; + this.txtInputSchemaLocation.Size = new System.Drawing.Size( 304, 21 ); + this.txtInputSchemaLocation.TabIndex = 20; + // + // TestForm + // + this.AutoScaleBaseSize = new System.Drawing.Size( 5, 14 ); + this.ClientSize = new System.Drawing.Size( 744, 589 ); + this.Controls.Add( this.tabControl1 ); + this.Font = new System.Drawing.Font( "Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ( ( byte )( 0 ) ) ); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.Name = "TestForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "BizTalk ODBC Adapter Test Harness"; + this.tabControl1.ResumeLayout( false ); + this.tpSchemaWizard.ResumeLayout( false ); + this.tpSchemaWizard.PerformLayout( ); + this.tpQueryEngine.ResumeLayout( false ); + this.tpQueryEngine.PerformLayout( ); + this.groupBox2.ResumeLayout( false ); + this.groupBox2.PerformLayout( ); + this.ResumeLayout( false ); + + } + #endregion + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main( ) + { + Application.Run( new TestForm( ) ); + } + + private void button2_Click( object sender, System.EventArgs e ) + { + ODBCAdapterWizardForm x = new ODBCAdapterWizardForm( ); + x.Start( ); + x.ShowDialog( this ); + txtInputSchema.Text = x.strInputSchema; + txtOutputSchema.Text = x.strOutputSchema; + txtSQLStatement.Text = x.strGeneratedScript; + + BTSODBCQueryEngine queryEngine = new BTSODBCQueryEngine( ); + queryEngine.ConnectionString = x.strDBConnection; + + queryEngine.RootNode = x.strOutputRoot; + queryEngine.BeginTransaction( System.Data.IsolationLevel.ReadUncommitted ); + + queryEngine.BTSExecuteODBCCallFromSQL( x.strGeneratedScript ); + + queryEngine.Commit( ); + } + + private void btnSchemaName_Click( object sender, System.EventArgs e ) + { + digOpenFile.CheckFileExists = true; + digOpenFile.Filter = "Schema file (*.xsd)|*.xsd"; + DialogResult result = digOpenFile.ShowDialog( this ); + + if ( result == DialogResult.OK ) + { + txtInputSchemaLocation.Text = digOpenFile.FileName; + } + } + + private void btnExecuteQuery_Click( object sender, System.EventArgs e ) + { + //Validate a few things + if ( txtInputSchemaLocation.Text == "" ) + { + MessageBox.Show( "You must select a schema!", "ODBC Adapter Test Harness" ); + return; + } + else if ( txtConnectionString.Text == "" ) + { + MessageBox.Show( "You must select or enter and ODBC connection string!", "ODBC Adapter Test Harness" ); + return; + } + + if ( rdoSend.Checked ) + { + if ( txtInputInstanceName.Text == "" ) + { + MessageBox.Show( "You must select a XML input document that matches your selected schema", "ODBC Adapter Test Harness" ); + return; + } + } + + try + { + BTSODBCQueryEngine QueryEngine = new BTSODBCQueryEngine( ); + QueryEngine.ConnectionString = txtConnectionString.Text; + + XmlDocument xmlSchema = new XmlDocument( ); + xmlSchema.Load( txtInputSchemaLocation.Text ); + + int iterations = System.Convert.ToInt32( txtIterations.Text ); + + if ( rdoReceive.Checked ) + { + StringReader sr = new StringReader( xmlSchema.OuterXml ); + XmlSchema xsdQueryConfiguration = XmlSchema.Read( sr, null ); + + for ( int cnt = 0; cnt < iterations; cnt++ ) + { + QueryEngine.RootNode = GetFirstStatement( xsdQueryConfiguration, "ResponseRootName" ); + QueryEngine.Namespace = GetFirstStatement( xsdQueryConfiguration, "ResponseNS" ) + QueryEngine.RootNode; + + XmlTextReader xtr = new XmlTextReader( sr ); + + Stream str = ( Stream )QueryEngine.BTSExecuteODBCCallFromSQL( GetFirstStatement( xsdQueryConfiguration, "ODBCCMD" ) ); + str.Seek( 0, SeekOrigin.Begin ); + + StreamReader stReader = new StreamReader( str ); + txtQueryResults.Text = stReader.ReadToEnd( ); + } + } + else + { + StreamReader sr = new StreamReader( txtInputInstanceName.Text ); + + for ( int cnt = 0; cnt < iterations; cnt++ ) + { + + XmlTextReader xtr = new XmlTextReader( sr ); + + + Stream str = ( Stream )QueryEngine.BTSExecuteODBCCallFromSchema( xtr, xmlSchema.OuterXml ); + str.Seek( 0, SeekOrigin.Begin ); + + StreamReader stReader = new StreamReader( str ); + txtQueryResults.Text = stReader.ReadToEnd( ); + + } + + sr.Close( ); + } + + if ( txtQueryResults.Text == "" ) + txtQueryResults.Text = "No Results were Returned"; + else + MessageBox.Show( "Query Processing Complete!" ); + + } + catch ( Exception testex ) + { + MessageBox.Show( "Your tested failed: " + testex.Message + " " + testex.InnerException, "ODBC Adapter Test Harness" ); + } + } + + private void btnInputInst_Click( object sender, System.EventArgs e ) + { + digOpenFile.CheckFileExists = true; + digOpenFile.Filter = "Schema file (*.xml)|*.xml"; + DialogResult result = digOpenFile.ShowDialog( this ); + + if ( result == DialogResult.OK ) + { + txtInputInstanceName.Text = digOpenFile.FileName; + } + } + + private void btnConnection_Click( object sender, System.EventArgs e ) + { + ODBCDriverUI diODBCConnection = new ODBCDriverUI( ); + txtConnectionString.Text = diODBCConnection.GetDSN( ); + } + + private void rdoReceive_CheckedChanged( object sender, System.EventArgs e ) + { + lblSchemaName.Text = "Receive Schema Name"; + txtInputInstanceName.Enabled = false; + btnInputInst.Enabled = false; + } + + private void rdoSend_CheckedChanged( object sender, System.EventArgs e ) + { + lblSchemaName.Text = "Input Schema Name:"; + txtInputInstanceName.Enabled = true; + btnInputInst.Enabled = true; + } + + private string GetFirstStatement( XmlSchemaObject parent, string LocalName ) + { + if ( parent is XmlSchemaAppInfo ) + { + foreach ( XmlNode child in ( ( XmlSchemaAppInfo )parent ).Markup ) + { + if ( child.LocalName == LocalName ) + { + XmlAttribute att = child.Attributes[ "value" ]; + if ( null != child.InnerText ) + return child.InnerText; + } + } + return null; + } + else if ( parent is XmlSchema ) + foreach ( XmlSchemaObject child in ( ( XmlSchema )parent ).Items ) + { + string result = GetFirstStatement( child, LocalName ); + if ( result != null ) + return result; + } + else if ( parent is XmlSchemaAnnotation ) + foreach ( XmlSchemaObject child in ( ( XmlSchemaAnnotation )parent ).Items ) + { + string result = GetFirstStatement( child, LocalName ); + if ( result != null ) + return result; + } + return null; + } + + private void button1_Click( object sender, System.EventArgs e ) + { + try + { + ODBCAdapterWizardForm x = new ODBCAdapterWizardForm( ); + x.Start( ); + x.ShowDialog( this ); + txtInputSchema.Text = x.strInputSchema; + txtOutputSchema.Text = x.strOutputSchema; + txtSQLStatement.Text = x.strGeneratedScript; + } + catch ( Exception x ) + { + MessageBox.Show( x.Message ); + } + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/TestForm.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/TestForm.resx new file mode 100644 index 00000000..581f5319 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/TestForm.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 175, 17 + + + 119 + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/TestHarness.csproj b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/TestHarness.csproj new file mode 100644 index 00000000..575c2340 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/TestHarness.csproj @@ -0,0 +1,195 @@ + + + + Local + 9.0.30729 + 2.0 + {21B99320-0A35-4B38-B876-C090D198795E} + Debug + AnyCPU + + + + + Microsoft.BizTalk.Adapters.ODBC.TestHarness + ODBCAdapter.snk + JScript + Grid + IE50 + false + WinExe + Microsoft.BizTalk.Adapters.ODBC + OnBuildSuccess + + + + + + + true + 3.5 + + + + + + + + + false + v4.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + bin\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + AllRules.ruleset + + + bin\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + AllRules.ruleset + + + + System + + + + System.Data + + + System.Drawing + + + + System.Windows.Forms + + + System.XML + + + {6EF6BB4C-9417-4CAE-990D-49F1F368284B} + ODBCBaseAdapter + + + {F25132D9-07AA-4B41-90AD-828E54704692} + ODBCDriverPrompt + + + ODBCQueryProcessor + {516F27B0-23E4-4704-9A86-A5064769522A} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + ODBCSchemaWizard + {3BCB956F-E5FB-4D40-9090-8E44E92C5353} + {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + + + + + Code + + + Form + + + Code + + + TestForm.cs + Designer + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + + + + + + \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/Validator.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/Validator.cs new file mode 100644 index 00000000..86558392 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/Validator.cs @@ -0,0 +1,178 @@ +//--------------------------------------------------------------------- +// File: Validator.cs +// +// Summary: Implementation of an adapter framework sample adapter using the ODBC provider for ADO.NET. +// +// Sample: Adapter framework runtime adapter. +// +//--------------------------------------------------------------------- +// This file is part of the Microsoft BizTalk Server 2004 SDK +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// +// This source code is intended only as a supplement to Microsoft BizTalk +// Server 2004 release and/or on-line documentation. See these other +// materials for detailed information regarding Microsoft code samples. +// +// THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY +// KIND, WHETHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR +// PURPOSE. +//--------------------------------------------------------------------- +using System; +using System.Runtime.Serialization; +using System.Diagnostics; +using System.Xml.Schema; + +namespace Microsoft.BizTalk.Adapters.ODBC +{ + /// + /// Validator class handles validation for connection string, root element name and target namespace + /// + public class Validator + { + public static void ValidateXlangKeyword( string input ) + { + #region Reserved Xlang Keywords + + string[ ] reservedXlangKeywords = { "activate", + "atomic", + "body", + "call", + "catch", + "checked", + "compensate", + "compensation", + "construct", + "correlation", + "correlationtype", + "delay", + "dynamic", + "else", + "exceptions", + "exec", + "exists", + "false", + "if", + "implements", + "initialize", + "internal", + "link", + "listen", + "longrunning", + "message", + "messagetype", + "method", + "module", + "new", + "null", + "oneway", + "out", + "parallel", + "port", + "porttype", + "private", + "public", + "receive", + "ref", + "request", + "requestresponse", + "response", + "scope", + "send", + "service", + "servicelink", + "servicelinktype", + "source", + "succeeded", + "suppressfailure", + "suspend", + "target", + "task", + "terminate", + "throw", + "timeout", + "transaction", + "transform", + "true", + "unchecked", + "until", + "uses", + "using", + "while", + "xpath", + }; + + #endregion + + for ( int i = 0; i < reservedXlangKeywords.Length; i++ ) + if ( input == reservedXlangKeywords[ i ] ) + throw new SqlValidationException( "You are using a BizTalk reserver word as part of you naming convention" ); + } + + public static void ValidateRootElementName( string input ) + { + char[ ] invalidChars = { '>', '<', '\'', '\"', '&', ':' }; + if ( input.IndexOfAny( invalidChars ) >= 0 ) + throw new SqlValidationException( "You are using invalid characters in your root element name" ); + ValidateXlangKeyword( input ); + } + + public static void ValidateTargetNamespace( string input ) + { + XmlSchema xs = new XmlSchema( ); + xs.TargetNamespace = input; + + XmlSchemaSet xsSet = new XmlSchemaSet( ); + xsSet.ValidationEventHandler += new ValidationEventHandler( ValidationHandler ); + xsSet.Add( xs ); + xsSet.Compile( ); + + ValidateXlangKeyword( input ); + } + + public static void ValidationHandler( object sender, ValidationEventArgs args ) + { + throw new SqlValidationException( "Validation Error: " + "\n" + args.Message ); + } + + public static void ValidateConnectionString( string input ) + { + if ( input.Length == 0 ) + throw new SqlValidationException( "Connection string validation error" ); + + /* OleDbConnection myConnection = null; + try + { + myConnection = new OleDbConnection(input); + myConnection.Open(); + myConnection.Close(); + } + catch(Exception e) + { + throw new SqlValidationException(ODBCResourceHandler.GetResourceString("ValidationConnectionError")+" "+e.Message); + } + finally + { + if (myConnection != null) + myConnection.Close(); + } + */ + } + } + + [Serializable( )] + public class SqlValidationException : Exception + { + public SqlValidationException( ) { } + + public SqlValidationException( string s, Exception e ) : base( s, e ) { } + + protected SqlValidationException( SerializationInfo si, StreamingContext sc ) : base( si, sc ) { } + + public SqlValidationException( string errorMsg ) : base( errorMsg ) + { + this.Source = "ODBC Adapter Admin"; + } + } +} \ No newline at end of file diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/app.config b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/app.config new file mode 100644 index 00000000..e3656033 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/app.config @@ -0,0 +1,3 @@ + + + diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/odbcCommandHelper.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/odbcCommandHelper.cs new file mode 100644 index 00000000..1d790670 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/odbcCommandHelper.cs @@ -0,0 +1,636 @@ +using System; +using System.Data; +using System.Data.Odbc; +using System.Collections; +using System.Xml; +using System.Xml.Schema; +using System.IO; +using System.Text; + + +namespace Microsoft.BizTalk.Adapters.ODBC +{ + /// + /// Summary description for odbcCommandHelper. + /// + public class odbcCommandHelper + { + public odbcCommandHelper() + { + // + // TODO: Add constructor logic here + // + } + + public string InputSchema = ""; // FIX THIS: SHould be read only + public string OutputSchema = "";// FIX THIS: SHould be read only + public AdapterCommandType QueryCommandType = AdapterCommandType.SQL; + public AdapterStatementType QueryStatementType = AdapterStatementType.SELECT; + + public enum AdapterCommandType + { + SQL, + StoredProcedure + } + + public enum PortType + { + Receive, + Send + } + + public enum AdapterStatementType + { + INSERT, + UPDATE, + DELETE, + SELECT + } + + private string m_strDBConnection = string.Empty; + private string m_strScript = string.Empty; + private string m_strTableName = string.Empty; + private AdapterStatementType m_statementType = AdapterStatementType.SELECT; + private AdapterCommandType m_updateType;//FIX THIS + private PortType m_portType; + private string m_strInputRoot = string.Empty; + private string m_strOutputRoot = string.Empty; + private string m_strSPName = string.Empty; + private string m_strTargetNamespace = string.Empty; + private string m_strGeneratedScript = string.Empty; + private string m_strWSDL = string.Empty; + #region properties + + public string strDBConnection + { + get { return m_strDBConnection ; } + set { m_strDBConnection = value; } + } + + public string strScript + { + get { return m_strScript ; } + set { m_strScript = value; } + } + + public string strTableName + { + get { return m_strTableName ; } + set { m_strTableName = value; } + } + + public AdapterStatementType SQLScriptType + { + get { return m_statementType ; } + set { m_statementType = value; } + } + + public AdapterCommandType UpdategramType // FIX THIS: + { + get { return m_updateType ; } + set { m_updateType = value; } + } + + public PortType portType + { + get { return m_portType ; } + set { m_portType = value; } + } + + public string strInputRoot + { + get { return m_strInputRoot ; } + set { m_strInputRoot = value; } + } + + public string strOutputRoot + { + get { return m_strOutputRoot ; } + set { m_strOutputRoot = value; } + } + + public string strSPName + { + get { return m_strSPName ; } + set { m_strSPName = value; } + } + + public string strTargetNamespace + { + get { return m_strTargetNamespace ; } + set { m_strTargetNamespace = value; } + } + + public string strGeneratedScript + { + get { return m_strGeneratedScript ; } + set { m_strGeneratedScript = value; } + } + + public string strWSDL + { + get { return m_strWSDL; } + set { m_strWSDL = value; } + } +# endregion + + + public DataSet ExtractODBCParametersSchema(OdbcCommand odbcCmd, string SchemaElementName) + { + DataSet dsCommand = new DataSet("Command"); + DataTable dtParameters = new DataTable(SchemaElementName); + + //Loop throught the ODBC Command object looking for in parameters + foreach(OdbcParameter odbcParam in odbcCmd.Parameters) + { + + //Build a Data Set based on the parameters so we can let ADO.NET + //Take care of the type conversion between Database and XML + + //We are buiding the inbound schema so we don't want out parameters + if(odbcParam.Direction == ParameterDirection.Input || odbcParam.Direction == ParameterDirection.InputOutput) + { + DataColumn dcParameter = new DataColumn(odbcParam.ParameterName.Replace("@",""),Type.GetType("System.String"),"",MappingType.Attribute); + dtParameters.Columns.Add(dcParameter); + } + + } + + dsCommand.Tables.Add(dtParameters); + + //Get the parameters schema out of the data set + return dsCommand; + } + public string ExtractODBCParametersSchema(OdbcCommand odbcCmd) + { + XmlSchema xsBTSInboundMsg = new XmlSchema(); + + //Create a stringwriter for output + //FileStream file = new FileStream (FileName, FileMode.Create, FileAccess.ReadWrite); + //XmlTextWriter myXmlWriter = new XmlTextWriter (file, new UTF8Encoding()); + + // Setup schema formatting + //myXmlWriter.Formatting = Formatting.Indented; + //myXmlWriter.Indentation = 2; + + xsBTSInboundMsg.AttributeFormDefault = XmlSchemaForm.Unqualified; + xsBTSInboundMsg.ElementFormDefault = XmlSchemaForm.Qualified; + + xsBTSInboundMsg.TargetNamespace = m_strTargetNamespace; //"http://ODBCADAPTERTEST.com"; //FIX THIS: needs to be a parameter + xsBTSInboundMsg.Namespaces.Add("msbtsodbc", "http://schemas.microsoft.com/BizTalk/2003"); + //====================== SCHEMA ANNOTATION ================================ + // Create the Schema object necessary to contain the annotation info + // this section will contain the SQL statements that the adapter processes + + // + // + // SELECT * FROM DEMO WHERE DEI = @DEI + // SELECT * FROM DEMO WHERE DEI = ? + // + // + + XmlSchemaAnnotation xsAnnotation = new XmlSchemaAnnotation(); + XmlSchemaAppInfo xsAppInfo = new XmlSchemaAppInfo(); + + // AppInfo class uses an array of nodes to contain config data + // so we need to use the XMLDOM to create these nodes + XmlDocument xmlWorkingDoc = new XmlDocument(); + + XmlNode[] xmlNodeAdapterConfig = new XmlNode[2]; + + // Save out the query with parameter information + xmlNodeAdapterConfig[0] = xmlWorkingDoc.CreateNode(XmlNodeType.Element ,"msbtsodbc","SQLCMD","http://schemas.microsoft.com/BizTalk/2003"); + xmlNodeAdapterConfig[0].InnerText = m_strScript; + + // Save out generic query with ODBC escape sequence + xmlNodeAdapterConfig[1] = xmlWorkingDoc.CreateNode(XmlNodeType.Element ,"msbtsodbc","ODBCCMD","http://schemas.microsoft.com/BizTalk/2003"); + xmlNodeAdapterConfig[1].InnerText = odbcCmd.CommandText; + + // Write the configuration to the schema + xsBTSInboundMsg.Items.Add(xsAnnotation); + xsAnnotation.Items.Add(xsAppInfo); + xsAppInfo.Markup = xmlNodeAdapterConfig; + + //==================== QUERY PARAMETERS SCHEMA SECTION ==================== + + XmlSchemaElement xsElementParameters = new XmlSchemaElement(); + xsElementParameters.Name = m_strInputRoot; + + XmlSchemaComplexType xsComplexType = new XmlSchemaComplexType(); + + xsBTSInboundMsg.Items.Add(xsElementParameters); // + + xsElementParameters.SchemaType = xsComplexType; // + + // Loop through the parameter section of the command object and create a + // schema attribute for each + //Loop throught the ODBC Command object looking for in parameters + foreach(OdbcParameter odbcParam in odbcCmd.Parameters) + { + + XmlSchemaAttribute xsAttribute = new XmlSchemaAttribute(); + xsAttribute.Name = odbcParam.ParameterName.Replace("@",""); + xsAttribute.SchemaTypeName = ConvertODBCDataTypeToXMLDataType(odbcParam.OdbcType.ToString()); + + // SAVE Out the meta data for this parameter in an appinfo section of the schema + // this is done to deal with the name space problems we run into etx with special + // attributes + xsAnnotation = new XmlSchemaAnnotation(); // These vars were already define earlier + xsAppInfo = new XmlSchemaAppInfo(); + + // AppInfo class uses an array of nodes to contain config data + // so we need to use the XMLDOM to create these nodes + xmlWorkingDoc = new XmlDocument(); + + xmlNodeAdapterConfig = new XmlNode[3]; + + // Save out ODBC data type for parameter + xmlNodeAdapterConfig[0] = xmlWorkingDoc.CreateNode(XmlNodeType.Element ,"msbtsdbc","ParamType","http://schemas.microsoft.com/BizTalk/2003"); + xmlNodeAdapterConfig[0].InnerText = odbcParam.OdbcType.ToString(); + + // Save out the parameter direction + xmlNodeAdapterConfig[1] = xmlWorkingDoc.CreateNode(XmlNodeType.Element ,"msbtsodbc","ParamDir","http://schemas.microsoft.com/BizTalk/2003"); + xmlNodeAdapterConfig[1].InnerText = odbcParam.Direction.ToString(); + + // Save out the parameters data lenght + xmlNodeAdapterConfig[2] = xmlWorkingDoc.CreateNode(XmlNodeType.Element ,"msbtsodbc","ParamSize","http://schemas.microsoft.com/BizTalk/2003"); + xmlNodeAdapterConfig[2].InnerText = odbcParam.Size.ToString(); + + // Write the configuration to the schema + xsAttribute.Annotation = xsAnnotation; + xsAnnotation.Items.Add(xsAppInfo); + xsAppInfo.Markup = xmlNodeAdapterConfig; + + xsComplexType.Attributes.Add(xsAttribute); // + + // + // etc... + + + } + + // Save the schema to the provided file + //xsBTSInboundMsg.Write(myXmlWriter); + //file.Flush(); + //file.Close(); + + // Get the schema string + StringBuilder sb = new StringBuilder(); + StringWriter sw = new StringWriter(sb); + xsBTSInboundMsg.Write(sw); + + string sReturnSchema = sb.ToString(); + + return sReturnSchema; + } + + /* + * This function exists as the ODBC provider in .NET does not like + * named parameters as part of database calls. So we will convert + * the command parameters collection and command text into a generic SQL + * statement. + */ + public string BuildSQLSPCommandString(OdbcCommand odbcCmd) + { + string sSQLCommand = ""; //{ @RC = CALL StoredProc(@Param1, @Param2)} + // This will be used to mapping to the XML + // durning transmission + + string sGenericSPEscapeSequence = ""; //{ ? = CALL StoredProc(?, ?)} + // This will be the actual call made by the + // ODBC command object for the transmission + + // The first parameter in the parameters collection normally + // maintains the return value + sSQLCommand = "{" + odbcCmd.Parameters[0].ParameterName + " = "; + + sGenericSPEscapeSequence = "{? ="; + + //Embed the sp execute statement + sSQLCommand += "CALL " + odbcCmd.CommandText; + sGenericSPEscapeSequence += "CALL " + odbcCmd.CommandText; + + //Set up for input parameters section of SP + sSQLCommand += "("; + sGenericSPEscapeSequence += "("; + + //Now we loop thru the remaining parameters and build the SP statement + for(int cnt = 1;cnt < odbcCmd.Parameters.Count; cnt++ ) + { + sSQLCommand += odbcCmd.Parameters[cnt].ParameterName; + sGenericSPEscapeSequence += "?"; + + if(cnt+1 < odbcCmd.Parameters.Count) + { + sSQLCommand += ","; + sGenericSPEscapeSequence += ","; + } + } + + //Complete the statement syntax + sSQLCommand += ")}"; + sGenericSPEscapeSequence += ")}"; + + m_strGeneratedScript = sGenericSPEscapeSequence; + return sGenericSPEscapeSequence; + } + + public OdbcCommand GenerateODBCCommandFromSP(string sql) + { + //To resove the parameters for a given SP we need a live connection + OdbcConnection odbcCon = new OdbcConnection(m_strDBConnection); + OdbcCommand odbcCmd = new OdbcCommand(sql, odbcCon); + + odbcCmd.CommandType = CommandType.StoredProcedure; + + odbcCon.Open(); + + // Have the ODBC Namespace resolve the parameters + OdbcCommandBuilder.DeriveParameters(odbcCmd); + + odbcCon.Close(); + + //Now we'll loop thur the parameters set some bogus test data + foreach(OdbcParameter odbcParam in odbcCmd.Parameters) + { + if(odbcParam.Direction == ParameterDirection.Input) + { + switch(odbcParam.OdbcType) + { + case OdbcType.DateTime: + odbcParam.Value = "'1/1/2001'"; + break; + case OdbcType.Int: + odbcParam.Value ="1"; + break; + case OdbcType.Text: + odbcParam.Value ="T"; + break; + default: + odbcParam.Value = "1"; // This is just a guess on a value type that seems + break; // to work generically + } + } + + } + + // Now we need to process the command and generate a generic escape sequence for the SQL + // the ODBC provider does NOT like named parameters + + odbcCmd.CommandText = BuildSQLSPCommandString(odbcCmd); + + return odbcCmd; + + + } + public OdbcCommand GenerateODBCCommandFromSQL(string sql) + { + int iParamStartIndex = 0; + int iParamEndIndex = 1; + int iParamSize = 0; + string sParameterName = ""; + + // We need to conver the SQL sytax that the user provided to something + // that the ODBC namespace can handle: + // FROM: + // SELECT * FROM CUSTOMERS WHERER CUSTOMERID = @CUSTOMERID + // TO: + // SELECT * FROM CUSTOMERS WHERE CUSTOMERID = ? + // Thats what will be contained in the sODBCSQLEscapeSequence + string sODBCSQLEscapeSequence = sql; + + //Get rid of the \r\n stuff and convert is to normal whitespace + //or we will end up with missing text + sql = sql.Replace("\r\n"," "); + + OdbcConnection odbcCon = new OdbcConnection(m_strDBConnection); + OdbcCommand dbCmdODBC = new OdbcCommand(); + dbCmdODBC.Connection = odbcCon; + dbCmdODBC.CommandType = CommandType.Text; + + // Prep the command to deal with no spaces between commands etc + // (@VALUE1,@VALUE2) + + sql = sql.Replace(","," ,"); + sql = sql.Replace("("," ("); + sql = sql.Replace(")"," )"); + + do + { + //Now we need to shread the SQL the user provided us with to pull out + //the parameters. These will be used to build in the input schema + + // V + // SELECT * FROM CUSTOMERS WHERE CUSTOMERID = @CUSTOMERID AND..... + iParamStartIndex = sql.IndexOf("@",iParamEndIndex); + + //If we run out of parameters get out of the loop + if(iParamStartIndex == -1) + break; +//++++++ NEED TO ADD A SECTION OF TYPE OF QUERY UPDATE, SQL SP etc + // V + // SELECT * FROM CUSTOMERS WHERE CUSTOMERID = @CUSTOMERID AND..... + iParamEndIndex = sql.IndexOf(" ",iParamStartIndex); + + + + //We could be at the end of the string so we need to check + if(iParamEndIndex == -1) + iParamEndIndex = sql.Length; + + //Figure out how big the parameter term is so we only extract it from the string + iParamSize = iParamEndIndex - iParamStartIndex; + sParameterName = sql.Substring(iParamStartIndex,iParamSize); + + // ========================= Process Parameters ======================= + //Add a new parameter to our command object + OdbcParameter odbcParam = new OdbcParameter(); + + odbcParam.ParameterName = sParameterName; + odbcParam.Value = "1"; + odbcParam.Direction = ParameterDirection.Input; + //odbcParam.DbType = CANT DETERMINE THIS!!! + + dbCmdODBC.Parameters.Add(odbcParam); + + //====================== Setup Generic Command SQL ==================== + sODBCSQLEscapeSequence = sODBCSQLEscapeSequence.Replace(sParameterName,"?"); + } + while(iParamEndIndex != sql.Length); + + //Now set the command objects command text to our generic SQL + dbCmdODBC.CommandText = sODBCSQLEscapeSequence; + + //Publish it up to the class level as a property + m_strGeneratedScript = sODBCSQLEscapeSequence; + + return dbCmdODBC; + } + public string GenerateOutputSchema(OdbcCommand odbcCmd) + { + bool bOutParamsFound = false; + + // Call the command to get the output schema + OdbcDataAdapter OdbcAdapter = new OdbcDataAdapter(); + + // Need to call a transaction to prevent writes during the generation + // of an output schema. + // We want to wrap this call in a transaction that we don't commit + odbcCmd.Connection.Open(); + OdbcTransaction odbcTrans = odbcCmd.Connection.BeginTransaction(); + + odbcCmd.Transaction = odbcTrans; + + OdbcAdapter.SelectCommand = odbcCmd; + DataSet custDS = new DataSet(m_strOutputRoot); + + //Load the data set to get the output schema + OdbcAdapter.Fill(custDS); + + // Throw away any junk we may have written + odbcTrans.Rollback(); + odbcCmd.Connection.Close(); + + string xsResultsSchema = custDS.GetXmlSchema(); + + //Now we need to extend the schema to include any output parameters that are included + StringReader sr = new StringReader(xsResultsSchema); + //Load the data set schema into the XML Schema Objects + XmlSchema xsdQueryConfiguration = XmlSchema.Read(sr,null); + + + //Now we add a section for the return value and out parameters + //==================== QUERY PARAMETERS SCHEMA SECTION ==================== + + XmlSchemaElement xsElementParameters = new XmlSchemaElement(); + xsElementParameters.Name = "OutParameters"; + + XmlSchemaComplexType xsComplexType = new XmlSchemaComplexType(); + + xsElementParameters.SchemaType = xsComplexType; // + + // Loop through the parameter section of the command object and create a + // schema attribute for each + //Loop throught the ODBC Command object looking for in parameters + foreach(OdbcParameter odbcParam in odbcCmd.Parameters) + { + // We only want to create elements for out bound parameters since this is the + // adapters output schema + if(odbcParam.Direction != ParameterDirection.Input) + { + bOutParamsFound = true; + XmlSchemaAttribute xsAttribute = new XmlSchemaAttribute(); + xsAttribute.Name = odbcParam.ParameterName.Replace("@",""); + xsAttribute.SchemaTypeName = ConvertODBCDataTypeToXMLDataType(odbcParam.OdbcType.ToString()); + xsComplexType.Attributes.Add(xsAttribute); // + } + } + + // See if we need to add the out parameters section to the schema + if(bOutParamsFound) + { + xsdQueryConfiguration.Items.Add(xsElementParameters); // + } + + // Get the schema string + StringBuilder sb = new StringBuilder(); + StringWriter sw = new StringWriter(sb); + xsdQueryConfiguration.Write(sw); + + string sReturnSchema = sb.ToString(); + + return sReturnSchema; + + } + private XmlQualifiedName ConvertODBCDataTypeToXMLDataType(string ODBCDataType) + { + switch(ODBCDataType) + { + case "BigInt": + return new XmlQualifiedName("long","http://www.w3.org/2001/XMLSchema"); + break; + case "Binary": + return new XmlQualifiedName("base64Binary","http://www.w3.org/2001/XMLSchema"); + break; + case "Bit": + return new XmlQualifiedName("boolean","http://www.w3.org/2001/XMLSchema"); + break; + case "Char": + return new XmlQualifiedName("string","http://www.w3.org/2001/XMLSchema"); + break; + case "DateTime": + return new XmlQualifiedName("dateTime","http://www.w3.org/2001/XMLSchema"); + break; + case "Decimal": + return new XmlQualifiedName("decimal","http://www.w3.org/2001/XMLSchema"); + break; + case "Double": + return new XmlQualifiedName("double","http://www.w3.org/2001/XMLSchema"); + break; + case "Image": + return new XmlQualifiedName("base64Binary","http://www.w3.org/2001/XMLSchema"); + break; + case "Int": + return new XmlQualifiedName("int","http://www.w3.org/2001/XMLSchema"); + break; + case "NChar": + return new XmlQualifiedName("string","http://www.w3.org/2001/XMLSchema"); + break; + case "NText": + return new XmlQualifiedName("string","http://www.w3.org/2001/XMLSchema"); + break; + case "Numeric": + return new XmlQualifiedName("decimal","http://www.w3.org/2001/XMLSchema"); + break; + case "NVarChar": + return new XmlQualifiedName("string","http://www.w3.org/2001/XMLSchema"); + break; + case "Real": + return new XmlQualifiedName("float","http://www.w3.org/2001/XMLSchema"); + break; + case "SmallInt": + return new XmlQualifiedName("short","http://www.w3.org/2001/XMLSchema"); + break; + case "Text": + return new XmlQualifiedName("string","http://www.w3.org/2001/XMLSchema"); + break; + case "TinyInt": + return new XmlQualifiedName("unsignedByte","http://www.w3.org/2001/XMLSchema"); + break; + case "UniqueIdentifier"://FIX THIS + return new XmlQualifiedName("long","http://www.w3.org/2001/XMLSchema"); + break; + case "VarBinary": + return new XmlQualifiedName("base64Binary","http://www.w3.org/2001/XMLSchema"); + break; + case "VarChar": + return new XmlQualifiedName("string","http://www.w3.org/2001/XMLSchema"); + break; + default: + return new XmlQualifiedName("string","http://www.w3.org/2001/XMLSchema"); + + + } + } + public bool CreateBizTalkSchema() + { + OdbcCommand OdbcCmd; + OdbcConnection OdbcCon = new OdbcConnection(m_strDBConnection); + + if(QueryCommandType == AdapterCommandType.SQL) + { + OdbcCmd = this.GenerateODBCCommandFromSQL(m_strScript); + } + else + { + OdbcCmd = this.GenerateODBCCommandFromSP(m_strScript); + } + + InputSchema = ExtractODBCParametersSchema(OdbcCmd); + OutputSchema = GenerateOutputSchema(OdbcCmd); + + + return true; + } + } +}