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 00000000..dc860f90 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/AdapterManagement.cs differ 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 00000000..bd5b223c Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/AssemblyInfo.cs differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/DatalinkTypeConverter.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/DatalinkTypeConverter.cs new file mode 100644 index 00000000..a9c348f6 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/DatalinkTypeConverter.cs @@ -0,0 +1,95 @@ +/************************************************************************* + * 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.ComponentModel; +using System.Globalization; + +using Microsoft.BizTalk.Adapter.Framework; + +namespace Microsoft.BizTalk.Adapters.ODBC.ODBCDesignTime +{ + /// + /// 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 00000000..0d564ea3 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ODBCAdapter.snk differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ODBCAdapterResource.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ODBCAdapterResource.resx new file mode 100644 index 00000000..4fc8538e --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ODBCAdapterResource.resx @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 00000000..ef07fdac Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ReceiveHandler.xsd differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ReceiveLocation.xsd b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ReceiveLocation.xsd new file mode 100644 index 00000000..8c8513c1 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/ReceiveLocation.xsd differ 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 00000000..2fa23162 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitHandler.xsd differ 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 00000000..f28e5007 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Design-Time/TransmitLocation.xsd differ 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 00000000..016e3e7e Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/AssemblyInfo.cs differ 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 00000000..0d564ea3 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCAdapter.snk differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCAdapterProperties.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCAdapterProperties.cs new file mode 100644 index 00000000..c4fc77b1 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCAdapterProperties.cs differ 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 00000000..62940b56 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCMsgContext.cs differ 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 00000000..86632b7e Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCReceiver.cs differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCReceiverEndpoint.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCReceiverEndpoint.cs new file mode 100644 index 00000000..24735699 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCReceive/ODBCReceiverEndpoint.cs differ 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 00000000..016e3e7e Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/AssemblyInfo.cs differ 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 00000000..0d564ea3 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCAdapter.snk differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCAdapterExceptions.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCAdapterExceptions.cs new file mode 100644 index 00000000..2c3f36e5 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCAdapterExceptions.cs differ 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 00000000..6873bd68 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCAdapterProperties.cs differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCTransmitAdapter.csproj b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCTransmitAdapter.csproj new file mode 100644 index 00000000..f19955a3 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCTransmitAdapter.csproj @@ -0,0 +1,194 @@ + + + + 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 00000000..a4c110e0 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCTransmitAdapterBatch.cs differ 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 00000000..e6d1d355 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Adapter/Run-Time/ODBCTransmit/ODBCTransmitter.cs differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/Adapter.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/Adapter.cs new file mode 100644 index 00000000..1785d8cd --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/Adapter.cs @@ -0,0 +1,134 @@ +//--------------------------------------------------------------------- +// File: Adapter.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 the root object for an adapter, it +// implements IBTTransport, IBTTransportControl, IPersistPropertyBag +// which are required for all adapters, though IPersistPropertyBag is +// optional +// +//--------------------------------------------------------------------- +// 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 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 00000000..0d564ea3 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ODBCAdapter.snk differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ODBCBaseAdapter.csproj b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ODBCBaseAdapter.csproj new file mode 100644 index 00000000..3c67b7cf --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/BaseAdapter/ODBCBaseAdapter.csproj @@ -0,0 +1,119 @@ + + + + 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 00000000..0d564ea3 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCAdapter.snk differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverDialog.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverDialog.cs new file mode 100644 index 00000000..db2109f5 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCDriverPrompt/ODBCDriverDialog.cs @@ -0,0 +1,256 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; + +namespace ODBCDriverPrompt +{ + public class ODBCDriverDialog : System.Windows.Forms.Form + { + internal System.Windows.Forms.Button cmdCancel; + internal System.Windows.Forms.CheckBox chkIncludeUID; + internal System.Windows.Forms.Label Label1; + internal System.Windows.Forms.Button cmdNewDSN; + internal System.Windows.Forms.Button cmdOK; + internal System.Windows.Forms.ListBox lstDSNs; + + private System.ComponentModel.Container components = null; + + private string mConnectionString = null; + + public ODBCDriverDialog( ) + { + Application.EnableVisualStyles( ); + + InitializeComponent( ); + } + + public string ConnectionString + { + get + { + return mConnectionString; + } + set + { + mConnectionString = value; + } + } + /// + /// 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 00000000..0d564ea3 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCAdapter.snk differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCPerformanceCounterInstaller.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCPerformanceCounterInstaller.cs new file mode 100644 index 00000000..8774d9d8 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCPerformanceCounterInstaller.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Configuration.Install; +using System.Diagnostics; +using System.ComponentModel; + +namespace Microsoft.BizTalk.Adapters.ODBC +{ + [RunInstaller(true)] + public class ODBCPerformanceCounterInstaller : Installer + { + public override void Install(System.Collections.IDictionary stateSaver) + { + base.Install(stateSaver); + InstallODBCPerformanceCounters(); + InstallODBCEventSource(); + } + + public override void Uninstall(System.Collections.IDictionary savedState) + { + base.Uninstall(savedState); + UnInstallODBCPerformanceCounters(); + UnInstallODBCEventSource(); + } + + private void InstallODBCPerformanceCounters() + { + + UnInstallODBCPerformanceCounters(); //Remove any leftover artifacts, just in case. + + CounterCreationDataCollection perfCounters = new CounterCreationDataCollection(); + CounterCreationData messageCount = new CounterCreationData(); + messageCount.CounterName = "MessageCount"; + messageCount.CounterHelp = "Tracks the number of data messages sent to the BTS ODBC Query Engine"; + messageCount.CounterType = PerformanceCounterType.NumberOfItems32; + + CounterCreationData messagesPerSecond = new CounterCreationData(); + messagesPerSecond.CounterName = "MessagesPerSecond"; + messagesPerSecond.CounterHelp = "Tracks the number of messages sent per second"; + messagesPerSecond.CounterType = PerformanceCounterType.RateOfCountsPerSecond32; + + CounterCreationData dbConnectionCount = new CounterCreationData(); + dbConnectionCount.CounterName = "DbConnectionCount"; + dbConnectionCount.CounterHelp = "Tracks the current number of database connections"; + dbConnectionCount.CounterType = PerformanceCounterType.NumberOfItems32; + + CounterCreationData errorCount = new CounterCreationData(); + errorCount.CounterName = "ErrorCount"; + errorCount.CounterHelp = "Tracks the number of errors generated by the BTS ODBC Query Engine"; + + perfCounters.Add(messageCount); + perfCounters.Add(messagesPerSecond); + perfCounters.Add(dbConnectionCount); + perfCounters.Add(errorCount); + + PerformanceCounterCategory category = PerformanceCounterCategory.Create("BtsOdbcQueryEngine", "BizTalk Server ODBC Query Engine", PerformanceCounterCategoryType.Unknown, perfCounters); + + } + + private void UnInstallODBCPerformanceCounters() + { + if (PerformanceCounterCategory.Exists("BtsOdbcQueryEngine")) + { + PerformanceCounterCategory.Delete("BtsOdbcQueryEngine"); + } + } + + private void InstallODBCEventSource() + { + UnInstallODBCEventSource(); + EventLog.CreateEventSource("ODBCAdapter", "Application"); + } + + private void UnInstallODBCEventSource() + { + if (EventLog.SourceExists("ODBCAdapter")) + { EventLog.DeleteEventSource("ODBCAdapter"); } + } + + private void InitializeComponent() + { + + } + } +} diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCPerformanceCounterInstaller.resx b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCPerformanceCounterInstaller.resx new file mode 100644 index 00000000..52a9ad3e --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCQueryProcessor/ODBCPerformanceCounterInstaller.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 00000000..0d564ea3 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ODBCAdapter.snk differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ODBCSchemaHelper.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ODBCSchemaHelper.cs new file mode 100644 index 00000000..8c947a30 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/ODBCSchemaHelper.cs @@ -0,0 +1,901 @@ +//--------------------------------------------------------------------- +// File: ODBCSchemaHelp.cs +// +// Summary: ADO.NET ODBC Provider based BizTalk adapter. +// +// Sample: Adapter framework runtime adapter. +// +//--------------------------------------------------------------------- +// +// 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; +using System.Data.Odbc; +using System.Collections; +using System.Xml; +using System.Xml.Schema; +using System.IO; +using System.Text; +using System.Windows.Forms; + +namespace Microsoft.BizTalk.Adapters.ODBC.SchemaWizard +{ + public class ODBCSchemaHelper + { + public ODBCSchemaHelper( ) { } + + public string InputSchema = ""; // FIX THIS: SHould be read only + public string OutputSchema = "";// FIX THIS: SHould be read only + public AdapterCommandType QueryCommandType = AdapterCommandType.SQL; + private bool _HasInputParameters = false; + private string _QueryProcessingOutPut = string.Empty; // + + public string QueryOutput + { + get + { + return _QueryProcessingOutPut; + } + } + + public enum AdapterCommandType + { + SQL, + StoredProcedure + } + + public enum PortType + { + Receive = 1, + Send = 2 + } + + public enum AdapterStatementType + { + Input, + InputOutput + } + + private string _strDBConnection = string.Empty; + private string _strScript = string.Empty; + private string _strTableName = string.Empty; + private AdapterCommandType _updateType;//FIX THIS + private PortType _portType; + private string _strInputRoot = string.Empty; + private string _strOutputRoot = string.Empty; + private string _strSPName = string.Empty; + private string _strTargetNamespace = string.Empty; + private string _strGeneratedScript = string.Empty; + private string _strWSDL = string.Empty; + private bool _ModifyCommand = false; + + private AdapterStatementType _StatementType = AdapterStatementType.InputOutput; + + #region Properties + + public AdapterStatementType StatementType + { + get + { + return _StatementType; + } + set + { + _StatementType = value; + } + } + + public bool OverrideQueryProcessing + { + set + { + _ModifyCommand = value; + } + } + + public string strDBConnection + { + get + { + return _strDBConnection; + } + set + { + _strDBConnection = value; + } + } + + public bool InputParameter + { + get + { + return _HasInputParameters; + } + } + + public string strScript + { + get + { + return _strScript; + } + set + { + _strScript = value; + // This will init all of the schemas and other things! + this.CreateBizTalkSchema( ); + } + } + + public bool ModifyCommand + { + get + { + return _ModifyCommand; + } + set + { + _ModifyCommand = value; + } + + } + + public string strTableName + { + get + { + return _strTableName; + } + set + { + _strTableName = value; + } + } + + public AdapterCommandType UpdategramType // FIX THIS: + { + get + { + return _updateType; + } + set + { + _updateType = value; + } + } + + public PortType portType + { + get + { + return _portType; + } + set + { + _portType = value; + } + } + + public string strInputRoot + { + get + { + return _strInputRoot; + } + set + { + _strInputRoot = value; + } + } + + public string strOutputRoot + { + get + { + return _strOutputRoot; + } + set + { + _strOutputRoot = value; + } + } + + public string strSPName + { + get + { + return _strSPName; + } + set + { + _strSPName = value; + } + } + + public string strTargetNamespace + { + get + { + return _strTargetNamespace; + } + set + { + _strTargetNamespace = value; + } + } + + public string strGeneratedScript + { + get + { + return _strGeneratedScript; + } + set + { + _strGeneratedScript = value; + } + } + + public string strWSDL + { + get + { + return _strWSDL; + } + set + { + _strWSDL = value; + } + } + + #endregion + + private XmlSchemaAnnotation AdapterHeaderAnnotationSection( string ProcessedCommandScript ) + { + //====================== 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 = ? + // 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 00000000..c86fa9f8 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/TestCases.xls differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/Validator.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/Validator.cs new file mode 100644 index 00000000..ee0aba51 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/Validator.cs @@ -0,0 +1,179 @@ +//--------------------------------------------------------------------- +// 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.SchemaWizard +{ + /// + /// 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 00000000..e568f6c1 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/ODBCSchemaWizard/WizardLogo.JPG differ 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 00000000..77bb0687 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/BizTalk ODBC Adapter.doc differ 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 00000000..6f8a4168 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/BizTalk ODBC Adapter.vsd differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/NorthhWindsMods.sql b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/NorthhWindsMods.sql new file mode 100644 index 00000000..b3f78f52 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/NorthhWindsMods.sql differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCAdapter.reg b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCAdapter.reg new file mode 100644 index 00000000..83ca81a0 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCAdapter.reg @@ -0,0 +1,37 @@ +Windows Registry Editor Version 5.00 +[HKEY_CLASSES_ROOT\CLSID\{8d285509-9e4a-4702-a8df-821e0f937d2b}] +@="ODBC Adapter" +"AppID"="{ea74dc63-3c08-40a1-8737-d68ccaa0130f}" + +[HKEY_CLASSES_ROOT\CLSID\{8d285509-9e4a-4702-a8df-821e0f937d2b}\BizTalk] +@="BizTalk" +"TransPortType"="ODBC" +"Constraints"=dword:0003d8b + +"OutboundProtocol_PageProv"="{2DE93EE6-CB01-4007-93E9-C3D71689A283}" +"TransmitLocation_PageProv"="{2DE93EE6-CB01-4007-93E9-C3D71689A282}" +"InboundProtocol_PageProv"="{2DE93EE6-CB01-4007-93E9-C3D71689A281}" +"ReceiveLocation_PageProv"="{2DE93EE6-CB01-4007-93E9-C3D71689A280}" + +"OutboundEngineCLSID"="{884c48a8-0856-409a-bafa-344257874914}" +"OutboundTypeName"="Microsoft.BizTalk.Adapters.ODBC.RunTime.ODBCTransmitAdapter.ODBCTransmitter" +"OutboundAssemblyPath"="C:\\Program Files\\Microsoft BizTalk Server 2006\\SDK\\Samples\\AdaptersDevelopment\\ODBC\\Bin\\ODBCTransmitAdapter.dll" + +"InboundEngineCLSID"="{4b7d3786-5519-45e5-93e1-7ecfcd918c85}" +"InboundTypeName"="Microsoft.BizTalk.Adapters.ODBC.RunTime.ODBCReceiveAdapter.ODBCReceiver" +"InboundAssemblyPath"="C:\\Program Files\\Microsoft BizTalk Server 2006\\SDK\\Samples\\AdaptersDevelopment\\ODBC\\Bin\\ODBCReceiveAdapter.dll" + +"AdapterMgmtTypeName"="Microsoft.BizTalk.Adapters.ODBC.ODBCDesignTime.AdapterManagement" +"AdapterMgmtAssemblyPath"="C:\\Program Files\\Microsoft BizTalk Server 2006\\SDK\\Samples\\AdaptersDevelopment\\ODBC\\Bin\\ODBCAdapterManagement.dll" + +"AliasesXML"="ODBC://" +"PropertyNameSpace"="http://schemas.microsoft.com/ODBC" + +"ReceiveHandlerPropertiesXML"="" +"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 00000000..0d564ea3 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCAdapter.snk differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCAdapter_Local.reg b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCAdapter_Local.reg new file mode 100644 index 00000000..7f577c8a Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCAdapter_Local.reg differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCTYPESMatch.XSD b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCTYPESMatch.XSD new file mode 100644 index 00000000..7c8cb9cc --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/ODBCTYPESMatch.XSD @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 00000000..affb85d0 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/Resources/RosettaStoneTypeMappings.xls differ 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 00000000..0d564ea3 Binary files /dev/null and b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/ODBCAdapter.snk differ diff --git a/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/TestForm.cs b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/TestForm.cs new file mode 100644 index 00000000..c9c30b78 --- /dev/null +++ b/BizTalk Server/Adapters/Community Adapter for ODBC/Source Code/TestHarness/TestForm.cs @@ -0,0 +1,681 @@ +//--------------------------------------------------------------------- +// File: TestForm.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 System.Data; +using System.Data.OleDb; +using System.Data.Odbc; +using System.Xml; +using System.Xml.Schema; +using System.Xml.Serialization; +using System.IO; +using System.Text; +using System.Reflection; + +using Microsoft.BizTalk.Adapters.ODBC.SchemaWizard; +using Microsoft.BizTalk.Adapters.ODBC; + +using ODBCDriverPrompt; + +namespace Microsoft.BizTalk.Adapters.ODBC +{ + public class TestForm : System.Windows.Forms.Form + { + private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1; + private System.Windows.Forms.OpenFileDialog digOpenFile; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tpQueryEngine; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox txtInputSchemaLocation; + private System.Windows.Forms.Label label6; + private System.Windows.Forms.TextBox txtInputInstanceName; + private System.Windows.Forms.Button btnSchemaName; + private System.Windows.Forms.Button btnInputInst; + private System.Windows.Forms.Button btnExecuteQuery; + private System.Windows.Forms.TextBox txtQueryResults; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.TextBox txtConnectionString; + private System.Windows.Forms.Label label9; + private System.Windows.Forms.Button btnConnection; + private System.Windows.Forms.RadioButton rdoReceive; + private System.Windows.Forms.RadioButton rdoSend; + private System.Windows.Forms.Label lblSchemaName; + private System.Windows.Forms.TextBox txtIterations; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.Label label10; + private System.Windows.Forms.TabPage tpSchemaWizard; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.TextBox txtOutputSchema; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.TextBox txtInputSchema; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox txtSQLStatement; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label11; + private System.Windows.Forms.Label label12; + + private System.ComponentModel.Container components = null; + + public TestForm( ) + { + 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.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; + } + } +}