You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2537 lines
72 KiB
2537 lines
72 KiB
using System;
|
|
using System.Diagnostics;
|
|
using System.Data;
|
|
using System.Data.SqlClient;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
using System.Runtime.InteropServices;
|
|
using System.Xml.Serialization;
|
|
|
|
using Microsoft.Win32;
|
|
|
|
using UDDI.API;
|
|
using UDDI.API.ServiceType;
|
|
using UDDI.API.Business;
|
|
using UDDI.API.Service;
|
|
using UDDI.API.Binding;
|
|
using UDDI.API.Extensions;
|
|
|
|
namespace UDDI.Tools
|
|
{
|
|
class Migrate
|
|
{
|
|
enum MigrationStage
|
|
{
|
|
DisplayUsage,
|
|
SetReaderConnection,
|
|
ResetWriter,
|
|
MigratePublishers,
|
|
MigrateBareTModels,
|
|
BootstrapResources,
|
|
MigrateCategorizationSchemes,
|
|
MigrateFullTModels,
|
|
MigrateHiddenTModels,
|
|
MigrateBareBusinessEntities,
|
|
MigrateBusinessEntities,
|
|
MigratePublisherAssertions,
|
|
RestoreReaderConnection
|
|
}
|
|
|
|
enum LogType
|
|
{
|
|
ConsoleAndLog,
|
|
ConsoleOnly,
|
|
LogOnly
|
|
}
|
|
|
|
//
|
|
// Registry Constants
|
|
//
|
|
|
|
private const string DatabaseRoot = @"SOFTWARE\Microsoft\UDDI\Database";
|
|
private const string DatabaseSetupRoot = @"SOFTWARE\Microsoft\UDDI\Setup\DBServer";
|
|
private const string ReaderValueName = "ReaderConnectionString";
|
|
private const string WriterValueName = "WriterConnectionString";
|
|
private const string OldReaderValueName = "OldNewReaderConnectionString";
|
|
|
|
//
|
|
// Version Constants
|
|
//
|
|
|
|
private const string V2RC0SITESTR = "5.2.3626.0";
|
|
private const string V2RC1SITESTR = "5.2.3663.0";
|
|
private const string V2RC0STR = "2.0.1.0";
|
|
private const string V2RC1STR = "2.0.1.1";
|
|
private const string V2RC2STR = "2.0.1.2";
|
|
private const string V2RTMSTR = "2.0.1.3";
|
|
|
|
//
|
|
// Upgrade contstants
|
|
//
|
|
|
|
private const string UpgradeRc0ToRc1Script = "uddi.v2.update_rc0_to_rc1.sql";
|
|
private const string UpgradeRc1ToRc2Script = "uddi.v2.update_rc1_to_rc2.sql";
|
|
|
|
//
|
|
// Other Constants
|
|
//
|
|
|
|
private const string LogFileName = "migrate.log.txt";
|
|
private const string ExceptionFileName = "migrate.exceptions.txt";
|
|
private const string ExceptionDirName = "exceptions";
|
|
private const string EmptyAccessPoint = "undefined"; // String to use when both accessPoint and hostingRedirector are null
|
|
private const string EmptyPersonName = "unspecified"; // String to use when personName does not meet minumum length requriements
|
|
|
|
//
|
|
// Command Line Parameters
|
|
//
|
|
|
|
static MigrationStage Stage = MigrationStage.DisplayUsage;
|
|
static string NewReaderConnectionString;
|
|
static bool Verbose = false;
|
|
|
|
//
|
|
// Global Variables
|
|
//
|
|
|
|
static FileStream LogFile = new FileStream( LogFileName, FileMode.Append );
|
|
static StreamWriter Stream = new StreamWriter( LogFile );
|
|
|
|
static string ReaderConnectionString;
|
|
static string WriterConnectionString;
|
|
static string Separator="".PadLeft( 80, '-' );
|
|
static int Exceptions = 0;
|
|
|
|
static Version V2RC0SITE = new Version( V2RC0SITESTR );
|
|
static Version V2RC1SITE = new Version( V2RC1SITESTR );
|
|
static Version V2RC0 = new Version( V2RC0STR );
|
|
static Version V2RC1 = new Version( V2RC1STR );
|
|
static Version V2RC2 = new Version( V2RC2STR );
|
|
static Version V2RTM = new Version( V2RTMSTR );
|
|
|
|
[ StructLayout( LayoutKind.Sequential ) ]
|
|
internal class SECURITY_ATTRIBUTES
|
|
{
|
|
public int nLength;
|
|
public object lpSecurityDescriptor;
|
|
public bool bInheritHandle;
|
|
|
|
public SECURITY_ATTRIBUTES()
|
|
{
|
|
nLength = Marshal.SizeOf( typeof( SECURITY_ATTRIBUTES ) );
|
|
lpSecurityDescriptor = null;
|
|
bInheritHandle = false;
|
|
}
|
|
}
|
|
|
|
internal enum SystemErrorCodes
|
|
{
|
|
ERROR_SUCCESS = 0,
|
|
ERROR_ALREADY_EXISTS = 183
|
|
}
|
|
|
|
//
|
|
// TODO add more values as we need them
|
|
//
|
|
internal enum FileHandleValues
|
|
{
|
|
INVALID_HANDLE_VALUE = -1
|
|
}
|
|
|
|
//
|
|
// TODO add more values as we need them
|
|
//
|
|
internal enum SharedFileProtection : byte
|
|
{
|
|
PAGE_READONLY = 0x02
|
|
}
|
|
|
|
internal class SharedMemory
|
|
{
|
|
int hSharedMemory;
|
|
const int INVALID_HANDLE_VALUE = -1;
|
|
|
|
public bool Create( string name )
|
|
{
|
|
hSharedMemory = -1;
|
|
bool success = false;
|
|
|
|
try
|
|
{
|
|
SECURITY_ATTRIBUTES securityAttributes = new SECURITY_ATTRIBUTES();
|
|
|
|
hSharedMemory = CreateFileMapping( ( int )FileHandleValues.INVALID_HANDLE_VALUE,
|
|
securityAttributes,
|
|
( int )SharedFileProtection.PAGE_READONLY,
|
|
0,
|
|
1,
|
|
name );
|
|
|
|
if( ( int )SystemErrorCodes.ERROR_SUCCESS == GetLastError() )
|
|
{
|
|
success = true;
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
if( -1 != hSharedMemory )
|
|
{
|
|
CloseHandle( hSharedMemory );
|
|
}
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|
|
public void Release()
|
|
{
|
|
if( -1 != hSharedMemory )
|
|
{
|
|
CloseHandle( hSharedMemory );
|
|
}
|
|
}
|
|
|
|
[DllImport( "user32.dll", CharSet=CharSet.Auto )]
|
|
private static extern int MessageBox(int hWnd, String text, String caption, uint type);
|
|
|
|
[DllImport( "kernel32.dll", SetLastError=true )]
|
|
private static extern int CreateFileMapping( int hFile,
|
|
SECURITY_ATTRIBUTES lpAttributes,
|
|
int flProtect,
|
|
int dwMaximumSizeHigh,
|
|
int dwMaximumSizeLow,
|
|
string lpName );
|
|
|
|
[DllImport( "kernel32.dll" )]
|
|
private static extern bool CloseHandle( int hObject );
|
|
|
|
[DllImport( "kernel32.dll" )]
|
|
private static extern int GetLastError();
|
|
}
|
|
|
|
static int Main( string[] args )
|
|
{
|
|
int retcode = 0;
|
|
|
|
//
|
|
// Use shared memory to make sure that only 1 instance of this process is running. sharedMemory.Release() MUST
|
|
// be called when this process exits in order to free up the shared memory.
|
|
//
|
|
SharedMemory sharedMemory = new SharedMemory();
|
|
|
|
try
|
|
{
|
|
|
|
Log( "Microsoft (R) UDDI Migrate Utility", LogType.ConsoleOnly );
|
|
Log( "Copyright (C) Microsoft Corp. 2002. All rights reserved.\n", LogType.ConsoleOnly );
|
|
|
|
if( false == sharedMemory.Create( "UDDI_migration_process" ) )
|
|
{
|
|
Console.WriteLine( "Only 1 instance of this process can be running." );
|
|
System.Environment.Exit( 1 );
|
|
}
|
|
|
|
//
|
|
// parse command line
|
|
//
|
|
retcode = ProcessCommandLine( args );
|
|
|
|
if( Stage == MigrationStage.DisplayUsage )
|
|
{
|
|
DisplayUsage();
|
|
}
|
|
else
|
|
{
|
|
|
|
Log( "Starting execution of migrate.exe", LogType.ConsoleAndLog );
|
|
|
|
//
|
|
// Get connection strings from registry
|
|
//
|
|
GetSettings();
|
|
|
|
//
|
|
// Refresh the config settings
|
|
//
|
|
Config.Refresh();
|
|
|
|
switch( Stage )
|
|
{
|
|
case MigrationStage.SetReaderConnection:
|
|
SetReaderConnection();
|
|
break;
|
|
|
|
case MigrationStage.ResetWriter:
|
|
CheckDatabaseVersions();
|
|
ResetWriter();
|
|
break;
|
|
|
|
case MigrationStage.MigratePublishers:
|
|
CheckDatabaseVersions();
|
|
MigratePublishers();
|
|
break;
|
|
|
|
case MigrationStage.MigrateBareTModels:
|
|
CheckDatabaseVersions();
|
|
MigrateBareTModels();
|
|
break;
|
|
|
|
case MigrationStage.BootstrapResources:
|
|
CheckDatabaseVersions();
|
|
BootstrapResources();
|
|
break;
|
|
|
|
case MigrationStage.MigrateCategorizationSchemes:
|
|
CheckDatabaseVersions();
|
|
MigrateCategorizationSchemes();
|
|
break;
|
|
|
|
case MigrationStage.MigrateFullTModels:
|
|
CheckDatabaseVersions();
|
|
MigrateFullTModels();
|
|
break;
|
|
|
|
case MigrationStage.MigrateHiddenTModels:
|
|
CheckDatabaseVersions();
|
|
MigrateHiddenTModels();
|
|
break;
|
|
|
|
case MigrationStage.MigrateBareBusinessEntities:
|
|
CheckDatabaseVersions();
|
|
MigrateBareBusinessEntities();
|
|
break;
|
|
|
|
case MigrationStage.MigrateBusinessEntities:
|
|
CheckDatabaseVersions();
|
|
MigrateBusinessEntities();
|
|
break;
|
|
|
|
case MigrationStage.MigratePublisherAssertions:
|
|
CheckDatabaseVersions();
|
|
MigratePublisherAssertions();
|
|
break;
|
|
|
|
case MigrationStage.RestoreReaderConnection:
|
|
RestoreReaderConnection();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
retcode = 1;
|
|
Log( "ERROR: " + e.ToString(), LogType.ConsoleAndLog );
|
|
}
|
|
finally
|
|
{
|
|
sharedMemory.Release();
|
|
}
|
|
|
|
if( retcode == 0 )
|
|
Log( "Migrate.exe terminating normally", LogType.ConsoleAndLog );
|
|
else
|
|
Log( "Migrate.exe terminating abnormally", LogType.ConsoleAndLog );
|
|
|
|
Stream.Close();
|
|
LogFile.Close();
|
|
|
|
return retcode;
|
|
}
|
|
|
|
private static int ProcessCommandLine( string [] args )
|
|
{
|
|
int retcode = 0;
|
|
|
|
for( int i = 0; i < args.Length; i ++ )
|
|
{
|
|
if( '-' == args[i][0] || '/' == args[i][0] )
|
|
{
|
|
string option = args[i].Substring( 1 );
|
|
|
|
if( "help" == option.ToLower() || "?" == option )
|
|
{
|
|
Stage = MigrationStage.DisplayUsage;
|
|
return 0;
|
|
}
|
|
else if( "s" == option.ToLower() )
|
|
{
|
|
i++; // move to the next arg
|
|
|
|
try
|
|
{
|
|
Stage = (MigrationStage)Enum.Parse( Stage.GetType(), args[i], true );
|
|
}
|
|
catch( Exception e )
|
|
{
|
|
Log ( "ERROR: Invalid migrationstage value: " + e.ToString(), LogType.ConsoleOnly );
|
|
return 1;
|
|
}
|
|
|
|
}
|
|
else if( "c" == option.ToLower() )
|
|
{
|
|
i++; // move to the next arg
|
|
NewReaderConnectionString = args[i];
|
|
}
|
|
else if( "v" == option.ToLower() )
|
|
{
|
|
Verbose = true;
|
|
}
|
|
else if( "i" == option.ToLower() )
|
|
{
|
|
Stream.Close();
|
|
LogFile.Close();
|
|
LogFile = new FileStream( LogFileName, FileMode.Create );
|
|
Stream = new StreamWriter( LogFile );
|
|
}
|
|
else
|
|
{
|
|
Stage = MigrationStage.DisplayUsage;
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Check argument dependencies
|
|
//
|
|
|
|
switch( Stage )
|
|
{
|
|
case MigrationStage.SetReaderConnection:
|
|
retcode = ( null == NewReaderConnectionString ? 1 : 0 );
|
|
break;
|
|
|
|
default:
|
|
retcode = 0;
|
|
break;
|
|
}
|
|
|
|
return retcode;
|
|
}
|
|
|
|
private static void CheckDatabaseVersions()
|
|
{
|
|
//
|
|
// Process Reader Version
|
|
//
|
|
|
|
Version readerversion = GetDbVersion( ReaderConnectionString );
|
|
Version writerversion = GetDbVersion( WriterConnectionString );
|
|
|
|
if( !writerversion.Equals( readerversion ) )
|
|
{
|
|
Log( "Different database versions detected.", LogType.ConsoleAndLog );
|
|
Log( "Writer Database Version: " + writerversion.ToString(), LogType.LogOnly );
|
|
|
|
switch( writerversion.ToString() )
|
|
{
|
|
case V2RC1STR:
|
|
if( readerversion.Equals( V2RC0 ) )
|
|
{
|
|
Log( "Upgrading reader to UDDI Database version " + V2RC1.ToString(), LogType.ConsoleAndLog );
|
|
ExecuteScript( ReaderConnectionString, UpgradeRc0ToRc1Script );
|
|
}
|
|
else
|
|
{
|
|
throw new ApplicationException( "Migrations from a UDDI database version " + readerversion.ToString() + " to a UDDI database version " + writerversion.ToString() + " are not supported by this tool." );
|
|
}
|
|
|
|
break;
|
|
|
|
case V2RC2STR:
|
|
if( readerversion.Equals( V2RC1 ) )
|
|
{
|
|
Log( "Upgrading reader to UDDI Database version " + V2RC2.ToString(), LogType.ConsoleAndLog );
|
|
ExecuteScript( ReaderConnectionString, UpgradeRc1ToRc2Script );
|
|
}
|
|
else
|
|
{
|
|
throw new ApplicationException( "Migrations from a UDDI database version " + readerversion.ToString() + " to a UDDI database version " + writerversion.ToString() + " are not supported by this tool." );
|
|
}
|
|
|
|
break;
|
|
|
|
case V2RTMSTR:
|
|
throw new ApplicationException( "Migrations from a UDDI database version " + readerversion.ToString() + " to a UDDI database version " + writerversion.ToString() + " are not yet supported by this tool." );
|
|
|
|
default:
|
|
throw new ApplicationException( "Unknown UDDI Database version encountered: " + writerversion.ToString() );
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void SetReaderConnection()
|
|
{
|
|
Log( Separator, LogType.LogOnly );
|
|
Log( "Executing Stage: SetReaderConnection", LogType.ConsoleAndLog );
|
|
|
|
try
|
|
{
|
|
RegistryKey root = Registry.LocalMachine.OpenSubKey( DatabaseRoot, true );
|
|
|
|
string oldconnectionstring = root.GetValue( ReaderValueName ).ToString();
|
|
root.SetValue( ReaderValueName, NewReaderConnectionString );
|
|
Log( "Registry setting changed: " + DatabaseRoot + "\\" + ReaderValueName + " = \"" + NewReaderConnectionString + "\"", LogType.LogOnly );
|
|
root.SetValue( OldReaderValueName, oldconnectionstring );
|
|
Log( "Registry setting changed: " + DatabaseRoot + "\\" + OldReaderValueName + " = \"" + oldconnectionstring + "\"", LogType.LogOnly );
|
|
|
|
root.Close();
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
Log( "ERROR: unable to modify registry: " + e.ToString(), LogType.LogOnly );
|
|
throw new ApplicationException( "SetReaderConnection failed." );
|
|
}
|
|
}
|
|
|
|
private static void ResetWriter()
|
|
{
|
|
Log( Separator, LogType.LogOnly );
|
|
Log( "Executing Stage: ResetWriter", LogType.ConsoleAndLog );
|
|
|
|
//
|
|
// Setup connection to writer
|
|
//
|
|
SqlConnection connection = new SqlConnection( WriterConnectionString );
|
|
connection.Open();
|
|
SqlTransaction transaction;
|
|
transaction = connection.BeginTransaction();
|
|
|
|
try
|
|
{
|
|
//
|
|
// Setup command for delete operation
|
|
//
|
|
|
|
string cmdbatch = "";
|
|
cmdbatch += "DELETE [UDC_categoryBag_TM] \n";
|
|
cmdbatch += "DELETE [UDC_identifierBag_TM] \n";
|
|
cmdbatch += "DELETE [UDC_tModelDesc] \n";
|
|
cmdbatch += "DELETE [UDC_tModels] \n";
|
|
cmdbatch += "DELETE [UDC_instanceDesc] \n";
|
|
cmdbatch += "DELETE [UDC_tModelInstances] \n";
|
|
cmdbatch += "DELETE [UDC_bindingDesc] \n";
|
|
cmdbatch += "DELETE [UDC_bindingTemplates] \n";
|
|
cmdbatch += "DELETE [UDC_names_BS] \n";
|
|
cmdbatch += "DELETE [UDC_categoryBag_BS] \n";
|
|
cmdbatch += "DELETE [UDC_serviceDesc] \n";
|
|
cmdbatch += "DELETE [UDC_businessServices] \n";
|
|
cmdbatch += "DELETE [UDC_addressLines] \n";
|
|
cmdbatch += "DELETE [UDC_addresses] \n";
|
|
cmdbatch += "DELETE [UDC_phones] \n";
|
|
cmdbatch += "DELETE [UDC_emails] \n";
|
|
cmdbatch += "DELETE [UDC_contactDesc] \n";
|
|
cmdbatch += "DELETE [UDC_contacts] \n";
|
|
cmdbatch += "DELETE [UDC_businessDesc] \n";
|
|
cmdbatch += "DELETE [UDC_categoryBag_BE] \n";
|
|
cmdbatch += "DELETE [UDC_identifierBag_BE] \n";
|
|
cmdbatch += "DELETE [UDC_discoveryURLs] \n";
|
|
cmdbatch += "DELETE [UDC_names_BE] \n";
|
|
cmdbatch += "DELETE [UDC_assertions_BE] \n";
|
|
cmdbatch += "DELETE [UDC_serviceProjections] \n";
|
|
cmdbatch += "DELETE [UDT_taxonomyValues] \n";
|
|
cmdbatch += "DELETE [UDT_taxonomies] \n";
|
|
cmdbatch += "DELETE [UDO_changeLog] \n";
|
|
cmdbatch += "DELETE [UDO_queryLog] \n";
|
|
cmdbatch += "DELETE [UDO_operatorLog] \n";
|
|
cmdbatch += "DELETE \n";
|
|
cmdbatch += " [UDO_publishers] \n";
|
|
cmdbatch += "WHERE \n";
|
|
cmdbatch += " ([PUID] <> '"+ UDDI.Utility.GetDefaultPublisher() + "') \n";
|
|
Log( cmdbatch, LogType.LogOnly );
|
|
|
|
SqlCommand command = new SqlCommand( cmdbatch );
|
|
command.Connection = connection;
|
|
command.Transaction = transaction;
|
|
|
|
//
|
|
// Execute command
|
|
//
|
|
|
|
command.ExecuteNonQuery();
|
|
transaction.Commit();
|
|
Log( "Write database has been reset.", LogType.ConsoleAndLog );
|
|
}
|
|
catch( Exception e )
|
|
{
|
|
transaction.Rollback();
|
|
Log( "ERROR: " + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "ResetWriter failed." );
|
|
}
|
|
finally
|
|
{
|
|
connection.Close();
|
|
}
|
|
}
|
|
|
|
private static void MigratePublishers()
|
|
{
|
|
int count = 0;
|
|
|
|
Log( Separator, LogType.LogOnly );
|
|
Log( "Executing Stage: MigratePublishers", LogType.ConsoleAndLog );
|
|
|
|
//
|
|
// Get a list of publishers
|
|
//
|
|
|
|
SqlConnection readerconnection = new SqlConnection( ReaderConnectionString );
|
|
readerconnection.Open();
|
|
|
|
SqlConnection writerconnection = new SqlConnection( WriterConnectionString );
|
|
writerconnection.Open();
|
|
|
|
SqlTransaction transaction;
|
|
transaction = writerconnection.BeginTransaction();
|
|
|
|
try
|
|
{
|
|
//
|
|
// Setup writer publisher insert statement
|
|
//
|
|
|
|
string writercommandbatch = "";
|
|
writercommandbatch += "INSERT [UDO_publishers] ( \n";
|
|
writercommandbatch += " [publisherStatusID], \n";
|
|
writercommandbatch += " [PUID], \n";
|
|
writercommandbatch += " [email], \n";
|
|
writercommandbatch += " [name], \n";
|
|
writercommandbatch += " [phone], \n";
|
|
writercommandbatch += " [isoLangCode], \n";
|
|
writercommandbatch += " [tModelLimit], \n";
|
|
writercommandbatch += " [businessLimit], \n";
|
|
writercommandbatch += " [serviceLimit], \n";
|
|
writercommandbatch += " [bindingLimit], \n";
|
|
writercommandbatch += " [assertionLimit], \n";
|
|
writercommandbatch += " [companyName], \n";
|
|
writercommandbatch += " [addressLine1], \n";
|
|
writercommandbatch += " [addressLine2], \n";
|
|
writercommandbatch += " [mailstop], \n";
|
|
writercommandbatch += " [city], \n";
|
|
writercommandbatch += " [stateProvince], \n";
|
|
writercommandbatch += " [extraProvince], \n";
|
|
writercommandbatch += " [country], \n";
|
|
writercommandbatch += " [postalCode], \n";
|
|
writercommandbatch += " [companyURL], \n";
|
|
writercommandbatch += " [companyPhone], \n";
|
|
writercommandbatch += " [altPhone], \n";
|
|
writercommandbatch += " [backupContact], \n";
|
|
writercommandbatch += " [backupEmail], \n";
|
|
writercommandbatch += " [description], \n";
|
|
writercommandbatch += " [securityToken], \n";
|
|
writercommandbatch += " [flag] )\n";
|
|
writercommandbatch += "VALUES ( \n";
|
|
writercommandbatch += " @publisherStatusID, \n";
|
|
writercommandbatch += " @PUID, \n";
|
|
writercommandbatch += " @email, \n";
|
|
writercommandbatch += " @name, \n";
|
|
writercommandbatch += " @phone, \n";
|
|
writercommandbatch += " @isoLangCode, \n";
|
|
writercommandbatch += " @tModelLimit, \n";
|
|
writercommandbatch += " @businessLimit, \n";
|
|
writercommandbatch += " @serviceLimit, \n";
|
|
writercommandbatch += " @bindingLimit, \n";
|
|
writercommandbatch += " @assertionLimit, \n";
|
|
writercommandbatch += " @companyName, \n";
|
|
writercommandbatch += " @addressLine1, \n";
|
|
writercommandbatch += " @addressLine2, \n";
|
|
writercommandbatch += " @mailstop, \n";
|
|
writercommandbatch += " @city, \n";
|
|
writercommandbatch += " @stateProvince, \n";
|
|
writercommandbatch += " @extraProvince, \n";
|
|
writercommandbatch += " @country, \n";
|
|
writercommandbatch += " @postalCode, \n";
|
|
writercommandbatch += " @companyURL, \n";
|
|
writercommandbatch += " @companyPhone, \n";
|
|
writercommandbatch += " @altPhone, \n";
|
|
writercommandbatch += " @backupContact, \n";
|
|
writercommandbatch += " @backupEmail, \n";
|
|
writercommandbatch += " @description, \n";
|
|
writercommandbatch += " @securityToken, \n";
|
|
writercommandbatch += " @flag )\n";
|
|
|
|
SqlCommand writercommand = new SqlCommand( writercommandbatch );
|
|
writercommand.Parameters.Add( "@publisherStatusID", SqlDbType.TinyInt );
|
|
writercommand.Parameters.Add( "@PUID", SqlDbType.NVarChar, 450 );
|
|
writercommand.Parameters.Add( "@email", SqlDbType.NVarChar, 450 );
|
|
writercommand.Parameters.Add( "@name", SqlDbType.NVarChar, 100 );
|
|
writercommand.Parameters.Add( "@phone", SqlDbType.VarChar, 20 );
|
|
writercommand.Parameters.Add( "@isoLangCode", SqlDbType.VarChar, 17 );
|
|
writercommand.Parameters.Add( "@tModelLimit", SqlDbType.Int );
|
|
writercommand.Parameters.Add( "@businessLimit", SqlDbType.Int );
|
|
writercommand.Parameters.Add( "@serviceLimit", SqlDbType.Int );
|
|
writercommand.Parameters.Add( "@bindingLimit", SqlDbType.Int );
|
|
writercommand.Parameters.Add( "@assertionLimit", SqlDbType.Int );
|
|
writercommand.Parameters.Add( "@companyName", SqlDbType.NVarChar, 100 );
|
|
writercommand.Parameters.Add( "@addressLine1", SqlDbType.NVarChar, 4000 );
|
|
writercommand.Parameters.Add( "@addressLine2", SqlDbType.NVarChar, 4000 );
|
|
writercommand.Parameters.Add( "@mailstop", SqlDbType.NVarChar, 20 );
|
|
writercommand.Parameters.Add( "@city", SqlDbType.NVarChar, 100 );
|
|
writercommand.Parameters.Add( "@stateProvince", SqlDbType.NVarChar, 100 );
|
|
writercommand.Parameters.Add( "@extraProvince", SqlDbType.NVarChar, 100 );
|
|
writercommand.Parameters.Add( "@country", SqlDbType.NVarChar, 100 );
|
|
writercommand.Parameters.Add( "@postalCode", SqlDbType.VarChar, 100 );
|
|
writercommand.Parameters.Add( "@companyURL", SqlDbType.NVarChar, 512 );
|
|
writercommand.Parameters.Add( "@companyPhone", SqlDbType.VarChar, 20 );
|
|
writercommand.Parameters.Add( "@altPhone", SqlDbType.VarChar, 20 );
|
|
writercommand.Parameters.Add( "@backupContact", SqlDbType.NVarChar, 100 );
|
|
writercommand.Parameters.Add( "@backupEmail", SqlDbType.NVarChar, 450 );
|
|
writercommand.Parameters.Add( "@description", SqlDbType.NVarChar, 4000 );
|
|
writercommand.Parameters.Add( "@securityToken", SqlDbType.UniqueIdentifier );
|
|
writercommand.Parameters.Add( "@flag", SqlDbType.Int );
|
|
|
|
writercommand.Connection = writerconnection;
|
|
writercommand.Transaction = transaction;
|
|
|
|
//
|
|
// Execute query against reader and process results
|
|
//
|
|
SqlDataReader reader;
|
|
reader = GetPublisherList( readerconnection );
|
|
|
|
while( reader.Read() )
|
|
{
|
|
count++;
|
|
|
|
//
|
|
// Set writer insert parameters using reader result values.
|
|
// Note: Assumes reader select and writer insert have identical column lists
|
|
//
|
|
|
|
for( int i = 0; i < writercommand.Parameters.Count; i++ )
|
|
{
|
|
writercommand.Parameters[ i ].Value = DBNull.Value;
|
|
|
|
if( !reader.IsDBNull( i ) )
|
|
writercommand.Parameters[ i ].Value = reader.GetSqlValue( i );
|
|
}
|
|
|
|
//
|
|
// Execute writer insert
|
|
//
|
|
|
|
writercommand.ExecuteNonQuery();
|
|
}
|
|
|
|
reader.Close();
|
|
transaction.Commit();
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
transaction.Rollback();
|
|
count = 0;
|
|
Log( "ERROR: database error: " + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "MigratePublishers failed." );
|
|
}
|
|
finally
|
|
{
|
|
readerconnection.Close();
|
|
writerconnection.Close();
|
|
Log( count.ToString() + " publishers migrated.", LogType.ConsoleAndLog );
|
|
}
|
|
}
|
|
|
|
private static void MigrateBareTModels()
|
|
{
|
|
int count = 0;
|
|
|
|
Log( Separator, LogType.LogOnly );
|
|
Log( "Executing Stage: MigrateBareTModels", LogType.ConsoleAndLog );
|
|
|
|
//
|
|
// Open a separate connection to reader
|
|
//
|
|
|
|
SqlConnection connection = new SqlConnection( ReaderConnectionString );
|
|
connection.Open();
|
|
|
|
try
|
|
{
|
|
//
|
|
// Get a list of tModels hosted by Microsoft on reader
|
|
//
|
|
|
|
SqlDataReader reader = GetCompleteTModelList( connection );
|
|
|
|
//
|
|
// Loop through each tModel in the result set
|
|
//
|
|
|
|
//string operatorkey = "";
|
|
|
|
while( reader.Read() )
|
|
{
|
|
TModel tmodel = new TModel();
|
|
|
|
//
|
|
// Set identity
|
|
//
|
|
|
|
Context.User.ID = reader.IsDBNull( 1 ) ? null : reader.GetString( 1 );
|
|
Context.User.SetPublisherRole( Context.User.ID );
|
|
|
|
//
|
|
// Get tModel from reader
|
|
//
|
|
|
|
tmodel.TModelKey = "uuid:" + ( reader.IsDBNull( 0 ) ? "" : reader.GetGuid( 0 ).ToString() );
|
|
ConnectionManager.Open( false, false );
|
|
tmodel.Get();
|
|
ConnectionManager.Close();
|
|
|
|
//
|
|
// Remove identifier and categoryBags
|
|
//
|
|
|
|
if( tmodel.IdentifierBag.Count > 0 )
|
|
{
|
|
tmodel.IdentifierBag.Clear();
|
|
Log( "Cleared identifierBag for tModelKey = " + tmodel.TModelKey, LogType.LogOnly );
|
|
}
|
|
|
|
if( tmodel.CategoryBag.Count > 0 )
|
|
{
|
|
tmodel.CategoryBag.Clear();
|
|
Log( "Cleared categoryBag for tModelKey = " + tmodel.TModelKey, LogType.LogOnly );
|
|
}
|
|
|
|
//
|
|
// Set authorizedName to null
|
|
//
|
|
|
|
tmodel.AuthorizedName = null;
|
|
|
|
//
|
|
// Open writer connection
|
|
//
|
|
|
|
ConnectionManager.Open( true, true );
|
|
|
|
if( Context.User.ID != UDDI.Utility.GetDefaultPublisher() )
|
|
Context.User.SetAllowPreassignedKeys( true );
|
|
|
|
//
|
|
// Save the bare tModel to the writer
|
|
//
|
|
|
|
Log( "save_tModel: tModelKey = " + tmodel.TModelKey + "; name = " + tmodel.Name + "; puid = " + Context.User.ID, LogType.LogOnly );
|
|
tmodel.Save();
|
|
count++;
|
|
|
|
//
|
|
// Note that transaction only spans single save_tModel and operator insert/delete due to connecton manager limitations
|
|
//
|
|
|
|
ConnectionManager.Commit();
|
|
ConnectionManager.Close();
|
|
}
|
|
|
|
reader.Close();
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
Log( "ERROR: " + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "MigrateBareTModels failed." );
|
|
}
|
|
finally
|
|
{
|
|
connection.Close();
|
|
ConnectionManager.Close();
|
|
Log( count.ToString() + " bare tModels migrated.", LogType.ConsoleAndLog );
|
|
}
|
|
}
|
|
|
|
private static void BootstrapResources()
|
|
{
|
|
int count=0;
|
|
|
|
Log( Separator, LogType.LogOnly );
|
|
Log( "Executing Stage: BootstrapResources", LogType.ConsoleAndLog );
|
|
|
|
try
|
|
{
|
|
//
|
|
// load all the bootstrap files found in the \uddi\bootstrap folder
|
|
//
|
|
string targetDir = Registry.LocalMachine.OpenSubKey( @"SOFTWARE\Microsoft\UDDI" ).GetValue( "InstallRoot" ).ToString();
|
|
string bootstrapdir = CheckForSlash(targetDir) + "bootstrap";
|
|
string bootstrapexe = CheckForSlash(targetDir) + @"bin\bootstrap.exe";
|
|
|
|
Log( "Getting list of bootstrap files from directory '" + bootstrapdir + "'", LogType.LogOnly );
|
|
|
|
string[] filepaths = Directory.GetFiles( bootstrapdir, "*.xml" );
|
|
Log( "Writing " + filepaths.Length + " baseline resources to database.", LogType.ConsoleAndLog );
|
|
|
|
foreach( string filepath in filepaths )
|
|
{
|
|
Log( "Importing bootstrap data from: " + filepath, LogType.ConsoleAndLog );
|
|
|
|
ProcessStartInfo startInfo = new ProcessStartInfo( bootstrapexe, "/f \""+ filepath + "\"");
|
|
|
|
startInfo.CreateNoWindow = true;
|
|
startInfo.UseShellExecute = false;
|
|
startInfo.RedirectStandardOutput = true;
|
|
|
|
Process p = new Process();
|
|
p = Process.Start( startInfo );
|
|
|
|
//
|
|
// grab the stdout string
|
|
//
|
|
string bootstrapOutput = p.StandardOutput.ReadToEnd();
|
|
|
|
//
|
|
// wait for bootstrap.exe to complete
|
|
//
|
|
p.WaitForExit();
|
|
|
|
//
|
|
// write the stdout string to the log
|
|
//
|
|
Log( bootstrapOutput, LogType.LogOnly );
|
|
|
|
if( p.ExitCode != 0 )
|
|
{
|
|
throw new ApplicationException( "BootstrapResources failed." );
|
|
}
|
|
|
|
count++;
|
|
}
|
|
}
|
|
catch( Exception e )
|
|
{
|
|
DispositionReport.Throw( e );
|
|
Log( "ERROR: " + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "BootstrapResources failed." );
|
|
}
|
|
finally
|
|
{
|
|
Log( count.ToString() + " resource files bootstrapped.", LogType.ConsoleAndLog );
|
|
}
|
|
}
|
|
|
|
private static void MigrateCategorizationSchemes()
|
|
{
|
|
int count = 0;
|
|
|
|
Log( Separator, LogType.LogOnly );
|
|
Log( "Executing Stage: MigrateCategorizationSchemes", LogType.ConsoleAndLog );
|
|
|
|
//
|
|
// Check database version compatibility
|
|
//
|
|
|
|
Version writerversion = GetDbVersion( WriterConnectionString );
|
|
|
|
if ( writerversion.CompareTo( V2RC2 ) < 0 )
|
|
{
|
|
throw new ApplicationException( "The MigrateCategorizationSchemes migration stage is only supported for UDDI Services database versions " + V2RC2.ToString() + " or later. Your current database version is: " + writerversion.ToString() );
|
|
}
|
|
|
|
//
|
|
// Open a separate connection to reader
|
|
//
|
|
|
|
SqlConnection connection = new SqlConnection( ReaderConnectionString );
|
|
connection.Open();
|
|
|
|
try
|
|
{
|
|
//
|
|
// Get a list of taxonomies
|
|
//
|
|
|
|
SqlDataReader reader = GetTaxonomyList( connection );
|
|
|
|
//
|
|
// Loop through each taxonomy in the result set
|
|
//
|
|
|
|
while( reader.Read() )
|
|
{
|
|
//
|
|
// Check to see if taxonomy is a user-defined taxonomy
|
|
// Note: a user-defined taxonomy is any taxonomy that does not exist in a newly bootstrapped uddi database
|
|
//
|
|
|
|
if( !CategorizationSchemeExists( reader.IsDBNull( 0 ) ? null : reader.GetGuid( 0 ).ToString() ) )
|
|
{
|
|
CategorizationScheme scheme = new CategorizationScheme();
|
|
|
|
//
|
|
// Set identity to system since categorization schemes are not publications
|
|
//
|
|
|
|
Context.User.ID = UDDI.Utility.GetDefaultPublisher();
|
|
Context.User.SetPublisherRole( Context.User.ID );
|
|
|
|
//
|
|
// Get categorization scheme from reader
|
|
//
|
|
|
|
scheme.TModelKey = "uuid:" + ( reader.IsDBNull( 0 ) ? "" : reader.GetGuid( 0 ).ToString() );
|
|
ConnectionManager.Open( false, false );
|
|
scheme.Get();
|
|
ConnectionManager.Close();
|
|
|
|
//
|
|
// Save the categorization scheme to writer
|
|
//
|
|
ConnectionManager.Open( true, true );
|
|
Log( "CategorizationScheme.Save(): tModelKey = " + scheme.TModelKey + "; puid = " + Context.User.ID + "; value count = " + scheme.CategoryValues.Count.ToString(), LogType.LogOnly );
|
|
scheme.Save();
|
|
count++;
|
|
|
|
//
|
|
// Note that transaction only spans single tmodel due to connecton manager limitations
|
|
//
|
|
|
|
ConnectionManager.Commit();
|
|
ConnectionManager.Close();
|
|
|
|
scheme = new CategorizationScheme();
|
|
}
|
|
}
|
|
|
|
reader.Close();
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
Log( "ERROR: " + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "MigrateCategorizationSchemes failed." );
|
|
}
|
|
finally
|
|
{
|
|
connection.Close();
|
|
ConnectionManager.Close();
|
|
Log( count.ToString() + " categorization schemes migrated.", LogType.ConsoleAndLog );
|
|
}
|
|
}
|
|
|
|
private static void MigrateFullTModels()
|
|
{
|
|
int count = 0;
|
|
|
|
Log( Separator, LogType.LogOnly );
|
|
Log( "Executing Stage: MigrateFullTModels", LogType.ConsoleAndLog );
|
|
|
|
//
|
|
// Open a separate connection to reader
|
|
//
|
|
|
|
SqlConnection connection = new SqlConnection( ReaderConnectionString );
|
|
connection.Open();
|
|
|
|
try
|
|
{
|
|
//
|
|
// Get a list of tModels hosted by Micrsoft
|
|
//
|
|
|
|
SqlDataReader reader = GetCompleteTModelList( connection );
|
|
|
|
//
|
|
// Loop through each tModel in the result set
|
|
//
|
|
|
|
TModel tmodel = new TModel();
|
|
|
|
while( reader.Read() )
|
|
{
|
|
count++;
|
|
|
|
//
|
|
// Set identity
|
|
//
|
|
|
|
Context.User.ID = reader.IsDBNull( 1 ) ? null : reader.GetString( 1 );
|
|
Context.User.SetPublisherRole( Context.User.ID );
|
|
string email = reader.IsDBNull( 2 ) ? null : reader.GetString( 2 );
|
|
|
|
//
|
|
// Get tModel from reader
|
|
//
|
|
|
|
string tmodelkey = reader.IsDBNull( 0 ) ? null : reader.GetGuid( 0 ).ToString();
|
|
tmodel.TModelKey = "uuid:" + tmodelkey;
|
|
ConnectionManager.Open( false, false );
|
|
tmodel.Get();
|
|
ConnectionManager.Close();
|
|
|
|
//
|
|
// Fix 1.0 bugs if any
|
|
//
|
|
|
|
FixTModel( tmodel, email );
|
|
|
|
//
|
|
// Set authorizedName to null
|
|
//
|
|
|
|
tmodel.AuthorizedName = null;
|
|
|
|
//
|
|
// Save tModel on writer
|
|
//
|
|
|
|
ConnectionManager.Open( true, true );
|
|
Log( "save_tModel: tModelKey = " + tmodel.TModelKey + "; name = " + tmodel.Name + "; puid = " + Context.User.ID, LogType.LogOnly );
|
|
tmodel.Save();
|
|
|
|
//
|
|
// Note that transaction only spans single tmodel due to connecton manager limitations
|
|
//
|
|
|
|
ConnectionManager.Commit();
|
|
ConnectionManager.Close();
|
|
|
|
tmodel = new TModel();
|
|
}
|
|
reader.Close();
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
Log( "ERROR: " + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "MigrateFullTModels failed." );
|
|
}
|
|
finally
|
|
{
|
|
connection.Close();
|
|
ConnectionManager.Close();
|
|
Log( count.ToString() + " full tModels migrated.", LogType.ConsoleAndLog );
|
|
}
|
|
}
|
|
|
|
private static void MigrateHiddenTModels()
|
|
{
|
|
int count = 0;
|
|
|
|
Log( Separator, LogType.LogOnly );
|
|
Log( "Executing stage: MigrateHiddenTModels", LogType.ConsoleAndLog );
|
|
|
|
//
|
|
// Open a separate connection to reader
|
|
//
|
|
|
|
SqlConnection connection = new SqlConnection( ReaderConnectionString );
|
|
connection.Open();
|
|
|
|
//
|
|
// Open writer connection
|
|
//
|
|
|
|
ConnectionManager.Open( true, true );
|
|
|
|
try
|
|
{
|
|
//
|
|
// Get a list of hidden tModels hosted by Microsoft from reader
|
|
//
|
|
|
|
SqlDataReader reader = GetHiddenTModelList( connection );
|
|
|
|
//
|
|
// Loop through each tModel in the result set
|
|
//
|
|
|
|
while( reader.Read() )
|
|
{
|
|
TModel tmodel = new TModel();
|
|
count++;
|
|
|
|
//
|
|
// Set identity
|
|
//
|
|
|
|
Context.User.ID = reader.IsDBNull( 1 ) ? null : reader.GetString( 1 );
|
|
Context.User.SetPublisherRole( Context.User.ID );
|
|
|
|
//
|
|
// Delete the tModel on the writer connection
|
|
//
|
|
tmodel.TModelKey = "uuid:" + ( reader.IsDBNull( 0 ) ? "" : reader.GetGuid( 0 ).ToString() );
|
|
Log( "delete_tModel: tModelKey = " + tmodel.TModelKey + "; puid = " + Context.User.ID, LogType.LogOnly );
|
|
tmodel.Delete();
|
|
}
|
|
|
|
reader.Close();
|
|
ConnectionManager.Commit();
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
ConnectionManager.Abort();
|
|
count = 0;
|
|
Log( "ERROR: " + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "MigrateHiddenTModels failed." );
|
|
}
|
|
finally
|
|
{
|
|
connection.Close();
|
|
ConnectionManager.Close();
|
|
Log( count.ToString() + " hidden tModels migrated.", LogType.ConsoleAndLog );
|
|
}
|
|
}
|
|
|
|
private static void MigrateBareBusinessEntities()
|
|
{
|
|
int count = 0;
|
|
|
|
Log( Separator, LogType.LogOnly );
|
|
Log( "Executing stage: MigrateBareBusinessEntities", LogType.ConsoleAndLog );
|
|
|
|
//
|
|
// Open a separate connection to reader
|
|
//
|
|
|
|
SqlConnection connection = new SqlConnection( ReaderConnectionString );
|
|
connection.Open();
|
|
|
|
try
|
|
{
|
|
//
|
|
// Get a list of businessEntities hosted by Microsoft on reader
|
|
//
|
|
|
|
SqlDataReader reader = GetBusinessEntityList( connection );
|
|
|
|
//
|
|
// Loop through each businessEntity in the result set
|
|
//
|
|
|
|
while( reader.Read() )
|
|
{
|
|
BusinessEntity businessentity = new BusinessEntity();
|
|
count++;
|
|
|
|
//
|
|
// Set identity
|
|
//
|
|
|
|
Context.User.ID = reader.IsDBNull( 1 ) ? null : reader.GetString( 1 );
|
|
Context.User.SetPublisherRole( Context.User.ID );
|
|
string email = reader.IsDBNull( 2 ) ? null : reader.GetString( 2 );
|
|
|
|
//
|
|
// Get businessEntity from reader
|
|
//
|
|
|
|
businessentity.BusinessKey = reader.IsDBNull( 0 ) ? null : reader.GetGuid( 0 ).ToString();
|
|
ConnectionManager.Open( false, false );
|
|
businessentity.Get();
|
|
ConnectionManager.Close();
|
|
|
|
//
|
|
// Remove all keyedReferences from businessEntity
|
|
//
|
|
|
|
if( 0 < businessentity.CategoryBag.Count )
|
|
{
|
|
businessentity.CategoryBag.Clear();
|
|
Log( "Cleared categoryBag for businessEntity. businessKey = " + businessentity.BusinessKey, LogType.LogOnly );
|
|
}
|
|
|
|
if( 0 < businessentity.IdentifierBag.Count )
|
|
{
|
|
businessentity.IdentifierBag.Clear();
|
|
Log( "Cleared identifierBag for businessEntity. businessKey = " + businessentity.BusinessKey, LogType.LogOnly );
|
|
}
|
|
|
|
foreach( BusinessService bs in businessentity.BusinessServices )
|
|
{
|
|
//
|
|
// Remove all keyedReferences from businessService
|
|
//
|
|
|
|
if( 0 < bs.CategoryBag.Count )
|
|
{
|
|
bs.CategoryBag.Clear();
|
|
Log( "Cleared categoryBag for businessService. serviceKey = " + bs.ServiceKey, LogType.LogOnly );
|
|
}
|
|
|
|
foreach( BindingTemplate bt in bs.BindingTemplates )
|
|
{
|
|
//
|
|
// Clear hostingRedirector from bindingTemplate. Save key in accessPoint
|
|
//
|
|
|
|
if( null != bt.HostingRedirector.BindingKey )
|
|
{
|
|
bt.AccessPoint.Value = bt.HostingRedirector.BindingKey;
|
|
bt.HostingRedirector.BindingKey = null;
|
|
Log( "Cleared hostingRedirector for bindingTemplate. bindingKey = " + bt.BindingKey, LogType.LogOnly );
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Correct v1.0 bugs if any
|
|
//
|
|
|
|
FixBusiness( businessentity, email, false );
|
|
|
|
//
|
|
// Set authorizedName to null
|
|
//
|
|
|
|
businessentity.AuthorizedName = null;
|
|
|
|
//
|
|
// Open writer connection
|
|
//
|
|
|
|
ConnectionManager.Open( true, true );
|
|
|
|
if( Context.User.ID != UDDI.Utility.GetDefaultPublisher() )
|
|
Context.User.SetAllowPreassignedKeys( true );
|
|
|
|
//
|
|
// Save the businessEntity on the writer
|
|
//
|
|
|
|
Log( "save_business: businessKey = " + businessentity.BusinessKey + "; name = " + businessentity.Names[ 0 ].Value + "; puid = " + Context.User.ID, LogType.LogOnly );
|
|
businessentity.Save();
|
|
|
|
//
|
|
// Note that transaction only spans single save_tModel and operator insert/delete due to connecton manager limitations
|
|
//
|
|
|
|
ConnectionManager.Commit();
|
|
ConnectionManager.Close();
|
|
}
|
|
reader.Close();
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
Log( "ERROR: " + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "MigrateBareBusinessEntities failed." );
|
|
}
|
|
finally
|
|
{
|
|
connection.Close();
|
|
ConnectionManager.Close();
|
|
Log( count.ToString() + " bare businessEntities migrated.", LogType.ConsoleAndLog );
|
|
}
|
|
|
|
}
|
|
|
|
private static void MigrateBusinessEntities()
|
|
{
|
|
int count = 0;
|
|
|
|
Log( Separator, LogType.LogOnly );
|
|
Log( "Executing stage: MigrateBusinessEntities", LogType.ConsoleAndLog );
|
|
|
|
//
|
|
// Open a separate connection to reader
|
|
//
|
|
|
|
SqlConnection connection = new SqlConnection( ReaderConnectionString );
|
|
connection.Open();
|
|
|
|
try
|
|
{
|
|
//
|
|
// Get a list of businessEntities hosted by Microsoft on reader
|
|
//
|
|
|
|
SqlDataReader reader = GetBusinessEntityList( connection );
|
|
|
|
//
|
|
// Loop through each businessEntity in the result set
|
|
//
|
|
|
|
while( reader.Read() )
|
|
{
|
|
BusinessEntity businessentity = new BusinessEntity();
|
|
count++;
|
|
|
|
//
|
|
// Set identity
|
|
//
|
|
|
|
Context.User.ID = reader.IsDBNull( 1 ) ? null : reader.GetString( 1 );
|
|
Context.User.SetPublisherRole( Context.User.ID );
|
|
string email = reader.IsDBNull( 2 ) ? null : reader.GetString( 2 );
|
|
|
|
//
|
|
// Get businessEntity from reader
|
|
//
|
|
|
|
businessentity.BusinessKey = reader.IsDBNull( 0 ) ? null : reader.GetGuid( 0 ).ToString();
|
|
ConnectionManager.Open( false, false );
|
|
businessentity.Get();
|
|
ConnectionManager.Close();
|
|
|
|
//
|
|
// Correct v1.0 bugs if any
|
|
//
|
|
|
|
FixBusiness( businessentity, email, true );
|
|
|
|
//
|
|
// Set authorizedName to null
|
|
//
|
|
|
|
businessentity.AuthorizedName = null;
|
|
|
|
//
|
|
// Open writer connection
|
|
//
|
|
|
|
ConnectionManager.Open( true, true );
|
|
|
|
if( Context.User.ID != UDDI.Utility.GetDefaultPublisher() )
|
|
Context.User.SetAllowPreassignedKeys( true );
|
|
|
|
//
|
|
// Save the businessEntity on the writer
|
|
//
|
|
|
|
Log( "save_business: businessKey = " + businessentity.BusinessKey + "; name = " + businessentity.Names[ 0 ].Value + "; puid = " + Context.User.ID, LogType.LogOnly );
|
|
businessentity.Save();
|
|
|
|
//
|
|
// Note that transaction only spans single save_tModel and operator insert/delete due to connecton manager limitations
|
|
//
|
|
|
|
ConnectionManager.Commit();
|
|
ConnectionManager.Close();
|
|
}
|
|
reader.Close();
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
Log( "ERROR: " + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "MigrateBusinessEntities failed." );
|
|
}
|
|
finally
|
|
{
|
|
connection.Close();
|
|
ConnectionManager.Close();
|
|
Log( count.ToString() + " businessEntities migrated.", LogType.ConsoleAndLog );
|
|
}
|
|
|
|
}
|
|
|
|
private static void MigratePublisherAssertions()
|
|
{
|
|
int publishercount = 0;
|
|
int assertioncount = 0;
|
|
|
|
Log( Separator, LogType.LogOnly );
|
|
Log( "Executing stage: MigratePublisherAssertions", LogType.ConsoleAndLog );
|
|
|
|
//
|
|
// Open a separate connection to reader
|
|
//
|
|
|
|
SqlConnection connection = new SqlConnection( ReaderConnectionString );
|
|
connection.Open();
|
|
|
|
try
|
|
{
|
|
//
|
|
// Get a list of publishers on the reader
|
|
//
|
|
|
|
SqlDataReader reader = GetPublisherList( connection );
|
|
|
|
//
|
|
// Loop through each publisher in the result set
|
|
//
|
|
|
|
while( reader.Read() )
|
|
{
|
|
PublisherAssertionCollection assertions = new PublisherAssertionCollection();
|
|
|
|
//
|
|
// Set identity
|
|
//
|
|
|
|
Context.User.ID = reader.IsDBNull( 1 ) ? null : reader.GetString( 1 );
|
|
Context.User.SetPublisherRole( Context.User.ID );
|
|
|
|
//
|
|
// Get assertions
|
|
//
|
|
|
|
ConnectionManager.Open( false, false );
|
|
assertions.Get();
|
|
ConnectionManager.Close();
|
|
|
|
//
|
|
// Open writer connection
|
|
//
|
|
|
|
if( 0 < assertions.Count )
|
|
{
|
|
ConnectionManager.Open( true, true );
|
|
|
|
//
|
|
// Save the assertions on the writer
|
|
//
|
|
|
|
Log( "set_publisherAssertions: puid = " + Context.User.ID + "; count = " + assertions.Count.ToString(), LogType.LogOnly );
|
|
assertions.Save();
|
|
|
|
publishercount++;
|
|
assertioncount = assertioncount + assertions.Count;
|
|
|
|
//
|
|
// Note that transaction only spans single set_publisherAssertions due to connecton manager limitations
|
|
//
|
|
|
|
ConnectionManager.Commit();
|
|
ConnectionManager.Close();
|
|
}
|
|
}
|
|
|
|
reader.Close();
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
Log( "ERROR: " + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "MigratePublisherAssertions failed." );
|
|
}
|
|
finally
|
|
{
|
|
connection.Close();
|
|
ConnectionManager.Close();
|
|
Log( assertioncount.ToString() + " assertions migrated for " + publishercount.ToString() + " publishers.", LogType.ConsoleAndLog );
|
|
}
|
|
}
|
|
|
|
private static void RestoreReaderConnection()
|
|
{
|
|
Log( Separator, LogType.LogOnly );
|
|
Log( "Executing stage: RestoreReaderConnection", LogType.ConsoleAndLog );
|
|
|
|
try
|
|
{
|
|
RegistryKey root = Registry.LocalMachine.OpenSubKey( DatabaseRoot, true );
|
|
|
|
if( null != root.GetValue( OldReaderValueName ) )
|
|
{
|
|
string oldreaderconnectionstring = root.GetValue( OldReaderValueName ).ToString();
|
|
root.SetValue( ReaderValueName, oldreaderconnectionstring );
|
|
Log( "Registry Setting Changed: " + DatabaseRoot + "\\" + ReaderValueName + " = \"" + oldreaderconnectionstring + "\"", LogType.LogOnly );
|
|
root.DeleteValue( OldReaderValueName, true );
|
|
Log( "Deleted Registry Value: " + DatabaseRoot + "\\" + OldReaderValueName, LogType.LogOnly );
|
|
|
|
root.Close();
|
|
}
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
Log( "ERROR:" + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "RestoreReaderConnection failed." );
|
|
}
|
|
}
|
|
|
|
private static void GetSettings()
|
|
{
|
|
|
|
try
|
|
{
|
|
RegistryKey dbsetuproot = Registry.LocalMachine.OpenSubKey( DatabaseSetupRoot );
|
|
|
|
if( null == dbsetuproot )
|
|
{
|
|
throw new ApplicationException( "The UDDI Services Database Components are not installed on this machine." );
|
|
}
|
|
|
|
dbsetuproot.Close();
|
|
|
|
RegistryKey dbroot = Registry.LocalMachine.OpenSubKey( DatabaseRoot, true );
|
|
|
|
if( null == dbroot )
|
|
{
|
|
throw new ApplicationException( "Unable to open registry key: " + DatabaseRoot );
|
|
}
|
|
|
|
ReaderConnectionString = dbroot.GetValue( ReaderValueName ).ToString();
|
|
WriterConnectionString = dbroot.GetValue( WriterValueName ).ToString();
|
|
dbroot.Close();
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
Log( "ERROR:" + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "GetSettings failed." );
|
|
}
|
|
|
|
}
|
|
|
|
private static SqlDataReader GetPublisherList( SqlConnection connection )
|
|
{
|
|
string cmdbatch = "";
|
|
cmdbatch += "SELECT \n";
|
|
cmdbatch += " [publisherStatusID], \n";
|
|
cmdbatch += " [PUID], \n";
|
|
cmdbatch += " [email], \n";
|
|
cmdbatch += " [name], \n";
|
|
cmdbatch += " [phone], \n";
|
|
cmdbatch += " [isoLangCode], \n";
|
|
cmdbatch += " [tModelLimit], \n";
|
|
cmdbatch += " [businessLimit], \n";
|
|
cmdbatch += " [serviceLimit], \n";
|
|
cmdbatch += " [bindingLimit], \n";
|
|
cmdbatch += " [assertionLimit], \n";
|
|
cmdbatch += " [companyName], \n";
|
|
cmdbatch += " [addressLine1], \n";
|
|
cmdbatch += " [addressLine2], \n";
|
|
cmdbatch += " [mailstop], \n";
|
|
cmdbatch += " [city], \n";
|
|
cmdbatch += " [stateProvince], \n";
|
|
cmdbatch += " [extraProvince], \n";
|
|
cmdbatch += " [country], \n";
|
|
cmdbatch += " [postalCode], \n";
|
|
cmdbatch += " [companyURL], \n";
|
|
cmdbatch += " [companyPhone], \n";
|
|
cmdbatch += " [altPhone], \n";
|
|
cmdbatch += " [backupContact], \n";
|
|
cmdbatch += " [backupEmail], \n";
|
|
cmdbatch += " [description], \n";
|
|
cmdbatch += " [securityToken], \n";
|
|
cmdbatch += " [flag] \n";
|
|
cmdbatch += "FROM \n";
|
|
cmdbatch += " [UDO_publishers] \n";
|
|
cmdbatch += "WHERE \n";
|
|
cmdbatch += " ([publisherID] NOT IN (SELECT [publisherID] FROM [UDO_operators])) \n";
|
|
cmdbatch += "ORDER BY \n";
|
|
cmdbatch += " [publisherID] ASC \n";
|
|
|
|
SqlCommand command = new SqlCommand( cmdbatch );
|
|
command.Connection = connection;
|
|
|
|
SqlDataReader reader;
|
|
|
|
try
|
|
{
|
|
reader = command.ExecuteReader();
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
Log( "ERROR: " + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "GetPublisherList failed." );
|
|
}
|
|
|
|
return reader;
|
|
}
|
|
|
|
private static SqlDataReader GetCompleteTModelList( SqlConnection connection )
|
|
{
|
|
string cmdbatch = "";
|
|
cmdbatch += "SELECT \n";
|
|
cmdbatch += " TM.[tModelKey], \n";
|
|
cmdbatch += " PU.[PUID], \n";
|
|
cmdbatch += " PU.[email] \n";
|
|
cmdbatch += "FROM \n";
|
|
cmdbatch += " [UDC_tModels] TM \n";
|
|
cmdbatch += " JOIN [UDO_publishers] PU ON TM.[publisherID] = PU.[publisherID] \n";
|
|
cmdbatch += "ORDER BY \n";
|
|
cmdbatch += " [tModelID] ASC \n";
|
|
|
|
SqlCommand command = new SqlCommand( cmdbatch );
|
|
command.Connection = connection;
|
|
|
|
SqlDataReader reader;
|
|
try
|
|
{
|
|
reader = command.ExecuteReader();
|
|
}
|
|
catch( Exception e )
|
|
{
|
|
Log( "ERROR: " + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "GetCompleteTModelList failed." );
|
|
}
|
|
|
|
return reader;
|
|
}
|
|
|
|
private static SqlDataReader GetHiddenTModelList( SqlConnection connection )
|
|
{
|
|
string cmdbatch = "";
|
|
cmdbatch += "SELECT \n";
|
|
cmdbatch += " TM.[tModelKey], \n";
|
|
cmdbatch += " PU.[PUID], \n";
|
|
cmdbatch += " PU.[email] \n";
|
|
cmdbatch += "FROM \n";
|
|
cmdbatch += " [UDC_tModels] TM \n";
|
|
cmdbatch += " JOIN [UDO_publishers] PU ON TM.[publisherID] = PU.[publisherID] \n";
|
|
cmdbatch += "WHERE \n";
|
|
cmdbatch += " ( TM.[flag] = 1 ) \n";
|
|
cmdbatch += "ORDER BY \n";
|
|
cmdbatch += " [tModelID] ASC \n";
|
|
|
|
SqlCommand command = new SqlCommand( cmdbatch );
|
|
command.Connection = connection;
|
|
|
|
SqlDataReader reader;
|
|
try
|
|
{
|
|
reader = command.ExecuteReader();
|
|
}
|
|
catch( Exception e )
|
|
{
|
|
Log( "ERROR: " + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "GetCompleteTModelList failed." );
|
|
}
|
|
|
|
return reader;
|
|
}
|
|
|
|
private static SqlDataReader GetBusinessEntityList( SqlConnection connection )
|
|
{
|
|
string cmdbatch = "";
|
|
cmdbatch += "SELECT \n";
|
|
cmdbatch += " BE.[businessKey], \n";
|
|
cmdbatch += " PU.[PUID], \n";
|
|
cmdbatch += " PU.[email] \n";
|
|
cmdbatch += "FROM \n";
|
|
cmdbatch += " [UDC_businessEntities] BE \n";
|
|
cmdbatch += " JOIN [UDO_publishers] PU ON BE.[publisherID] = PU.[publisherID] \n";
|
|
cmdbatch += "ORDER BY \n";
|
|
cmdbatch += " [businessID] ASC \n";
|
|
|
|
SqlCommand command = new SqlCommand( cmdbatch );
|
|
command.Connection = connection;
|
|
|
|
SqlDataReader reader;
|
|
|
|
try
|
|
{
|
|
reader = command.ExecuteReader();
|
|
}
|
|
catch( Exception e )
|
|
{
|
|
Log( "ERROR: " + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "GetBusinessEntityList failed." );
|
|
}
|
|
|
|
return reader;
|
|
}
|
|
|
|
private static SqlDataReader GetTaxonomyList( SqlConnection connection )
|
|
{
|
|
string cmdbatch = "";
|
|
cmdbatch += "SELECT \n";
|
|
cmdbatch += " [tModelKey], \n";
|
|
cmdbatch += " [flag] \n";
|
|
cmdbatch += "FROM \n";
|
|
cmdbatch += " [UDT_taxonomies] \n";
|
|
cmdbatch += "ORDER BY \n";
|
|
cmdbatch += " [taxonomyID] ASC \n";
|
|
|
|
SqlCommand command = new SqlCommand( cmdbatch );
|
|
command.Connection = connection;
|
|
|
|
SqlDataReader reader;
|
|
try
|
|
{
|
|
reader = command.ExecuteReader();
|
|
}
|
|
catch( Exception e )
|
|
{
|
|
Log( "ERROR: " + e.ToString(), LogType.ConsoleAndLog );
|
|
throw new ApplicationException( "GetCompleteTModelList failed." );
|
|
}
|
|
|
|
return reader;
|
|
}
|
|
|
|
private static bool CategorizationSchemeExists( string tmodelkey )
|
|
{
|
|
bool bExists = false;
|
|
|
|
ConnectionManager.Open( true, false );
|
|
|
|
SqlStoredProcedureAccessor sp = new SqlStoredProcedureAccessor( "net_taxonomy_get" );
|
|
|
|
sp.Parameters.Add( "@tModelKey", SqlDbType.UniqueIdentifier );
|
|
sp.Parameters.Add( "@flag", SqlDbType.Int, ParameterDirection.InputOutput );
|
|
|
|
sp.Parameters.SetGuidFromString( "@tModelKey", tmodelkey );
|
|
sp.Parameters.SetNull( "@flag" );
|
|
|
|
try
|
|
{
|
|
sp.ExecuteNonQuery();
|
|
bExists = true;
|
|
}
|
|
catch( System.Data.SqlClient.SqlException se )
|
|
{
|
|
switch ( se.Number - UDDI.Constants.ErrorTypeSQLOffset )
|
|
{
|
|
case (int) ErrorType.E_invalidKeyPassed :
|
|
// E_invalidKey: taxonomy does not exist on writer
|
|
bExists = false;
|
|
break;
|
|
|
|
default:
|
|
throw se;
|
|
}
|
|
|
|
}
|
|
catch( Exception e )
|
|
{
|
|
throw e;
|
|
}
|
|
finally
|
|
{
|
|
ConnectionManager.Close();
|
|
}
|
|
|
|
return bExists;
|
|
}
|
|
|
|
|
|
private static void FixTModel( TModel tmodel, string email )
|
|
{
|
|
bool changed = false;
|
|
string change = "";
|
|
|
|
string oldtmodel = Deserialize( UDDI.EntityType.TModel, tmodel );
|
|
|
|
//
|
|
// Fix null tModelKey in identifierBags
|
|
//
|
|
|
|
for( int i=0; i < tmodel.IdentifierBag.Count; i++ )
|
|
if( null == tmodel.IdentifierBag[ i ].TModelKey )
|
|
{
|
|
tmodel.IdentifierBag[ i ].TModelKey = Config.GetString( "TModelKey.GeneralKeywords" );
|
|
changed = true;
|
|
change += "tModel/identifierBag/keyedReference/@tModelKey {" + (i + 1).ToString() + "};";
|
|
}
|
|
|
|
//
|
|
// Delete invalid references to checked taxonomies in identifierBags
|
|
//
|
|
|
|
for( int i=0; i < tmodel.IdentifierBag.Count; i++ )
|
|
{
|
|
ConnectionManager.Open( true, false );
|
|
|
|
SqlStoredProcedureAccessor sp = new SqlStoredProcedureAccessor();
|
|
|
|
sp.ProcedureName = "net_identifierBag_validate";
|
|
|
|
sp.Parameters.Add( "@keyValue", SqlDbType.NVarChar, UDDI.Constants.Lengths.KeyValue );
|
|
sp.Parameters.Add( "@tModelKey", SqlDbType.UniqueIdentifier );
|
|
|
|
sp.Parameters.SetString( "@keyValue", tmodel.IdentifierBag[ i ].KeyValue );
|
|
sp.Parameters.SetGuidFromKey( "@tModelKey", tmodel.IdentifierBag[ i ].TModelKey );
|
|
|
|
try
|
|
{
|
|
sp.ExecuteNonQuery();
|
|
}
|
|
catch( System.Data.SqlClient.SqlException se )
|
|
{
|
|
switch ( se.Number )
|
|
{
|
|
case 70200 :
|
|
// E_invalidValue: bad categorization detected, delete keyedReference
|
|
changed = true;
|
|
change += "tModel/identifierBag/keyedReference {" + (i + 1).ToString() + "}; ";
|
|
tmodel.IdentifierBag.Remove( tmodel.IdentifierBag[ i ] );
|
|
|
|
i--;
|
|
break;
|
|
|
|
case 50009 :
|
|
// E_subProcFailure
|
|
break;
|
|
|
|
default:
|
|
throw se;
|
|
}
|
|
|
|
}
|
|
catch( Exception e )
|
|
{
|
|
throw e;
|
|
}
|
|
finally
|
|
{
|
|
ConnectionManager.Close();
|
|
}
|
|
}
|
|
|
|
if( changed )
|
|
WriteException( email, UDDI.EntityType.TModel, tmodel.TModelKey, oldtmodel, Deserialize( UDDI.EntityType.TModel, tmodel ), change );
|
|
|
|
return;
|
|
}
|
|
|
|
private static void FixBusiness( BusinessEntity business, string email, bool logExceptions )
|
|
{
|
|
bool changed = false;
|
|
string change = "";
|
|
|
|
string oldbusiness = Deserialize( UDDI.EntityType.BusinessEntity, business );
|
|
|
|
//
|
|
// Fix businessEntities with no names
|
|
//
|
|
|
|
if( 0 == business.Names.Count )
|
|
{
|
|
string name = "unspecified";
|
|
business.Names.Add( "en", name );
|
|
changed = true;
|
|
change += "businessEntity/name {1); ";
|
|
}
|
|
|
|
//
|
|
// Fix null tModelKey and / or keyValue in identifierBags
|
|
//
|
|
|
|
for( int i=0; i < business.IdentifierBag.Count; i++ )
|
|
{
|
|
if( null == business.IdentifierBag[ i ].TModelKey )
|
|
{
|
|
business.IdentifierBag[ i ].TModelKey = Config.GetString( "TModelKey.GeneralKeywords" );
|
|
changed = true;
|
|
}
|
|
|
|
if( null == business.IdentifierBag[ i ].KeyValue )
|
|
{
|
|
business.IdentifierBag[ i ].KeyValue = "";
|
|
changed = true;
|
|
}
|
|
|
|
if( changed )
|
|
{
|
|
change += "businessEntity/identifierBag/keyedReference/@tModelKey {" + (i + 1).ToString() + "}; ";
|
|
}
|
|
}
|
|
|
|
//
|
|
// Fix personName elements that do not meet minumum length requirements
|
|
//
|
|
|
|
for( int i=0; i < business.Contacts.Count; i++ )
|
|
{
|
|
if( StringEmpty2( business.Contacts[ i ].PersonName ) )
|
|
{
|
|
business.Contacts[ i ].PersonName = EmptyPersonName;
|
|
changed = true;
|
|
change += "businessEntity/contact/personName {" + (i + 1).ToString() + "};";
|
|
}
|
|
}
|
|
|
|
//
|
|
// Fix bindingTemplates with null accessPoint and hostingRedirector
|
|
//
|
|
|
|
for( int i=0; i < business.BusinessServices.Count; i++ )
|
|
{
|
|
for( int j=0; j < business.BusinessServices[ i ].BindingTemplates.Count; j++ )
|
|
{
|
|
if( Utility.StringEmpty( business.BusinessServices[ i ].BindingTemplates[ j ].HostingRedirector.BindingKey ) && Utility.StringEmpty( business.BusinessServices[ i ].BindingTemplates[ j ].AccessPoint.Value ) )
|
|
{
|
|
business.BusinessServices[ i ].BindingTemplates[ j ].AccessPoint.Value = EmptyAccessPoint;
|
|
changed = true;
|
|
change += "businessEntity/businessServices/businessService/bindingTemplates/bindingTemplate/accessPoint {" + (j + 1).ToString() + "};";
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Delete invalid references to checked taxonomies in categoryBags
|
|
//
|
|
|
|
for( int i=0; i < business.CategoryBag.Count; i++ )
|
|
{
|
|
ConnectionManager.Open( true, false );
|
|
|
|
SqlStoredProcedureAccessor sp = new SqlStoredProcedureAccessor();
|
|
|
|
sp.ProcedureName = "net_categoryBag_validate";
|
|
|
|
sp.Parameters.Add( "@keyValue", SqlDbType.NVarChar, UDDI.Constants.Lengths.KeyValue );
|
|
sp.Parameters.Add( "@tModelKey", SqlDbType.UniqueIdentifier );
|
|
|
|
sp.Parameters.SetString( "@keyValue", business.CategoryBag[ i ].KeyValue );
|
|
sp.Parameters.SetGuidFromKey( "@tModelKey", business.CategoryBag[ i ].TModelKey );
|
|
|
|
try
|
|
{
|
|
sp.ExecuteNonQuery();
|
|
}
|
|
catch( System.Data.SqlClient.SqlException se )
|
|
{
|
|
switch ( se.Number )
|
|
{
|
|
case 70200 :
|
|
// E_invalidValue: bad categorization detected, delete keyedReference
|
|
changed = true;
|
|
change += "businessEntity/categoryBag/keyedReference {" + (i + 1).ToString() + "}; ";
|
|
business.CategoryBag.Remove( business.CategoryBag[ i ] );
|
|
|
|
i--;
|
|
break;
|
|
|
|
case 50009 :
|
|
// E_subProcFailure
|
|
break;
|
|
|
|
default:
|
|
throw se;
|
|
}
|
|
|
|
}
|
|
catch( Exception e )
|
|
{
|
|
throw e;
|
|
}
|
|
finally
|
|
{
|
|
ConnectionManager.Close();
|
|
}
|
|
}
|
|
|
|
//
|
|
// Delete invalid references to checked taxonomies in identifierBags
|
|
//
|
|
|
|
for( int i=0; i < business.IdentifierBag.Count; i++ )
|
|
{
|
|
ConnectionManager.Open( true, false );
|
|
|
|
SqlStoredProcedureAccessor sp = new SqlStoredProcedureAccessor();
|
|
|
|
sp.ProcedureName = "net_identifierBag_validate";
|
|
|
|
sp.Parameters.Add( "@keyValue", SqlDbType.NVarChar, UDDI.Constants.Lengths.KeyValue );
|
|
sp.Parameters.Add( "@tModelKey", SqlDbType.UniqueIdentifier );
|
|
|
|
sp.Parameters.SetString( "@keyValue", business.IdentifierBag[ i ].KeyValue );
|
|
sp.Parameters.SetGuidFromKey( "@tModelKey", business.IdentifierBag[ i ].TModelKey );
|
|
|
|
try
|
|
{
|
|
sp.ExecuteNonQuery();
|
|
}
|
|
catch( System.Data.SqlClient.SqlException se )
|
|
{
|
|
switch ( se.Number )
|
|
{
|
|
case 70200 :
|
|
// E_invalidValue: bad categorization detected, delete keyedReference
|
|
changed = true;
|
|
change += "businessEntity/identifierBag/keyedReference {" + (i + 1).ToString() + "}; ";
|
|
business.IdentifierBag.Remove( business.IdentifierBag[ i ] );
|
|
|
|
i--;
|
|
break;
|
|
|
|
case 50009 :
|
|
// E_subProcFailure
|
|
break;
|
|
|
|
default:
|
|
throw se;
|
|
}
|
|
|
|
}
|
|
catch( Exception e )
|
|
{
|
|
throw e;
|
|
}
|
|
finally
|
|
{
|
|
ConnectionManager.Close();
|
|
}
|
|
}
|
|
|
|
//
|
|
// Fix dangling @hostingRedirectors
|
|
//
|
|
|
|
for( int i=0; i < business.BusinessServices.Count; i++ )
|
|
{
|
|
for( int j=0; j < business.BusinessServices[ i ].BindingTemplates.Count; j++ )
|
|
{
|
|
BindingTemplate binding = business.BusinessServices[ i ].BindingTemplates[ j ];
|
|
|
|
if( null != binding.HostingRedirector.BindingKey )
|
|
{
|
|
ConnectionManager.Open( true, false );
|
|
|
|
SqlStoredProcedureAccessor sp2 = new SqlStoredProcedureAccessor();
|
|
|
|
sp2.ProcedureName = "net_key_validate";
|
|
|
|
sp2.Parameters.Add( "@entityTypeID", SqlDbType.TinyInt );
|
|
sp2.Parameters.Add( "@entityKey", SqlDbType.UniqueIdentifier );
|
|
|
|
sp2.Parameters.SetShort( "@entityTypeID", (short)EntityType.BindingTemplate );
|
|
sp2.Parameters.SetGuidFromString( "@entityKey", binding.HostingRedirector.BindingKey );
|
|
|
|
try
|
|
{
|
|
sp2.ExecuteNonQuery();
|
|
}
|
|
catch( System.Data.SqlClient.SqlException se )
|
|
{
|
|
switch( se.Number - UDDI.Constants.ErrorTypeSQLOffset )
|
|
{
|
|
case (int) ErrorType.E_invalidKeyPassed:
|
|
//
|
|
// Bad hostingRedirector detected
|
|
//
|
|
changed = true;
|
|
change += "businessEntity/businessServices/bindingTemplates/bindingTemplate/hostingRedirector/@bindingKey {" + (i + 1).ToString() + "}; ";
|
|
binding.AccessPoint.Value = "unspecified (previously hostingRedirector/@bindingKey = " + binding.HostingRedirector.BindingKey.ToString() + ")";
|
|
binding.HostingRedirector.BindingKey = null;
|
|
break;
|
|
|
|
default:
|
|
throw se;
|
|
}
|
|
}
|
|
catch( Exception e )
|
|
{
|
|
throw e;
|
|
}
|
|
finally
|
|
{
|
|
ConnectionManager.Close();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if( changed && logExceptions )
|
|
WriteException( email, UDDI.EntityType.BusinessEntity, business.BusinessKey, oldbusiness, Deserialize( UDDI.EntityType.BusinessEntity, business ) , change );
|
|
|
|
return;
|
|
}
|
|
|
|
private static Version GetDbVersion( string connectionstring )
|
|
{
|
|
|
|
Version siteversion;
|
|
Version dbversion;
|
|
|
|
//
|
|
// Get Site.Version config item
|
|
//
|
|
|
|
if( connectionstring == WriterConnectionString )
|
|
{
|
|
// Use standard config against writer
|
|
UDDI.Diagnostics.Debug.VerifySetting( "Site.Version" );
|
|
siteversion = new Version( Config.GetString( "Site.Version" ) );
|
|
}
|
|
else // connectionstring == ReaderConnectionString
|
|
{
|
|
// Standard config routines only support writer
|
|
// We need to get the config setting from reader so use a different approach
|
|
siteversion = new Version( GetReaderConfigValue( "Site.Version" ) );
|
|
}
|
|
|
|
if( siteversion.CompareTo( V2RC0SITE ) < 0 )
|
|
{
|
|
throw new ApplicationException( "Unsupported UDDI Services Site Version detected: " + siteversion.ToString() );
|
|
}
|
|
|
|
//
|
|
// Get Database.Version config item
|
|
//
|
|
|
|
if( siteversion.CompareTo( V2RC0SITE ) == 0 )
|
|
{
|
|
//
|
|
// Indicates an RC0 (Qwest) build of UDDI Services for Windows Server 2003
|
|
// Note: The Database.Verison config item did not exist in RC0 so we use Site.Version instead
|
|
// Note: This is the earliest version of UDDI Services supported by the migration tool
|
|
//
|
|
|
|
dbversion = V2RC0;
|
|
}
|
|
else if( siteversion.CompareTo( V2RC1SITE ) == 0 )
|
|
{
|
|
//
|
|
// Indicates an RC1 build of UDDI Services for Windows Server 2003
|
|
// Note: The Database.Verison config item did not exist in RC1 so we use Site.Version instead
|
|
// Note: This is the earliest version of UDDI Services supported by the migration tool
|
|
//
|
|
|
|
dbversion = V2RC1;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Indicates a post-RC1 build of UDDI Services for Windows Server 2003
|
|
//
|
|
|
|
if( connectionstring == WriterConnectionString )
|
|
{
|
|
// Use standard config against writer
|
|
UDDI.Diagnostics.Debug.VerifySetting( "Database.Version" );
|
|
dbversion = new Version( Config.GetString( "Database.Version" ) );
|
|
}
|
|
else // connectionstring == ReaderConnectionString
|
|
{
|
|
// Standard config routines only support writer
|
|
// We need to get the config setting from reader so use a different approach
|
|
dbversion = new Version( GetReaderConfigValue( "Database.Version" ) );
|
|
}
|
|
|
|
}
|
|
|
|
//
|
|
// Evalutate database version
|
|
//
|
|
|
|
switch( dbversion.ToString() )
|
|
{
|
|
case V2RC0STR:
|
|
case V2RC1STR:
|
|
case V2RC2STR:
|
|
break;
|
|
|
|
case V2RTMSTR:
|
|
//
|
|
// TODO: this will change when we ship RTM
|
|
//
|
|
throw new ApplicationException( "UDDI Services Database Version " + dbversion.ToString() + " is not currently supported by this tool." );
|
|
|
|
default:
|
|
throw new ApplicationException( "Unsupported UDDI Services Database Version detected: " + dbversion.ToString() );
|
|
}
|
|
|
|
Log( "UDDI Services Database Version detected: " + dbversion.ToString() + "; connection: " + connectionstring, LogType.LogOnly );
|
|
|
|
return dbversion;
|
|
}
|
|
|
|
private static string GetReaderConfigValue( string configname )
|
|
{
|
|
string configvalue = null;
|
|
|
|
SqlConnection connection = new SqlConnection( ReaderConnectionString );
|
|
connection.Open();
|
|
|
|
try
|
|
{
|
|
|
|
SqlCommand sp = new SqlCommand( "net_config_get", connection );
|
|
sp.CommandType = CommandType.StoredProcedure;
|
|
|
|
SqlDataReader reader = sp.ExecuteReader();
|
|
|
|
while( reader.Read() )
|
|
{
|
|
if( configname.ToUpper() == ( reader.IsDBNull( 0 ) ? null : reader.GetString( 0 ).ToUpper() ) )
|
|
{
|
|
configvalue = reader.IsDBNull( 1 ) ? null : reader.GetString( 1 );
|
|
break;
|
|
}
|
|
}
|
|
|
|
reader.Close();
|
|
}
|
|
catch( Exception e )
|
|
{
|
|
throw new ApplicationException( "Execute of net_config_get failed. Error: " + e.ToString() );
|
|
}
|
|
finally
|
|
{
|
|
connection.Close();
|
|
}
|
|
|
|
if( null == configvalue )
|
|
{
|
|
throw new ApplicationException( "Unknown configName requested: " + configname );
|
|
}
|
|
|
|
return configvalue;
|
|
}
|
|
|
|
private static string GetResource( string name )
|
|
{
|
|
try
|
|
{
|
|
Assembly assembly = Assembly.GetExecutingAssembly();
|
|
|
|
//
|
|
// Read the resource.
|
|
//
|
|
Log( "Reading resource: " + name, LogType.LogOnly );
|
|
Stream stream = assembly.GetManifestResourceStream( name );
|
|
StreamReader reader = new StreamReader( stream );
|
|
|
|
return reader.ReadToEnd();
|
|
}
|
|
catch ( Exception e )
|
|
{
|
|
throw new ApplicationException( "Unable to get resource for: " + name + "; error: " + e.ToString() );
|
|
}
|
|
}
|
|
|
|
private static void ExecuteScript( string connectionstring, string scriptname )
|
|
{
|
|
string script = GetResource( scriptname );
|
|
|
|
Log( "Executing script " + scriptname + " on connection: " + connectionstring, LogType.LogOnly );
|
|
|
|
//
|
|
// Scripts are comprised of multiple batches separated by "GO".
|
|
// The SQL managed provider does not recognize this convention,
|
|
// so this code must handle batching manually
|
|
//
|
|
|
|
string buffer = "";
|
|
|
|
for( int i=0; i <= ( script.Length - 1 ); i++ )
|
|
{
|
|
buffer = buffer + script[ i ].ToString();
|
|
|
|
//
|
|
// Detect 'G' + 'O' + whitespace at beginning of script
|
|
//
|
|
if( ( 2 == i ) && ( 'G' == Char.ToUpper( script[ i - 2 ] ) ) && ( 'O' == Char.ToUpper( script[ i - 1 ] ) ) && ( Char.IsWhiteSpace( script[ i ] ) ) )
|
|
{
|
|
//
|
|
// This case can be ignored since no commands exist in the batch
|
|
//
|
|
buffer = "";
|
|
continue;
|
|
}
|
|
|
|
//
|
|
// Detect whitespace + 'G' + 'O' + whitespace inside script
|
|
// Note: case whitespace + 'G' + 'O' at end of script is handled automatically
|
|
//
|
|
if( ( 2 < i ) && ( Char.IsWhiteSpace( script[ i - 3 ] ) ) && ( 'G' == Char.ToUpper( script[ i - 2 ] ) ) && ( 'O' == Char.ToUpper( script[ i - 1 ] ) ) && ( Char.IsWhiteSpace( script[ i ] ) ) )
|
|
{
|
|
RunBatch( connectionstring, buffer );
|
|
buffer = "";
|
|
}
|
|
}
|
|
|
|
if( buffer.Length > 0 )
|
|
{
|
|
RunBatch( connectionstring, buffer );
|
|
}
|
|
}
|
|
|
|
private static void RunBatch( string connectionstring, string batch )
|
|
{
|
|
batch = batch.Trim();
|
|
|
|
//
|
|
// Strip "GO" off end of batch if it exists
|
|
//
|
|
|
|
if( ( 3 < batch.Length ) && Char.IsWhiteSpace( batch[ batch.Length - 3 ] ) && ( batch.EndsWith( "GO" ) ) )
|
|
{
|
|
batch = batch.Substring( 0, batch.Length - 2 );
|
|
}
|
|
|
|
batch = batch.Trim();
|
|
|
|
if( batch.Length == 0 )
|
|
return;
|
|
|
|
SqlConnection connection = new SqlConnection( connectionstring );
|
|
connection.Open();
|
|
SqlCommand command = new SqlCommand( batch, connection );
|
|
|
|
try
|
|
{
|
|
command.ExecuteNonQuery();
|
|
}
|
|
catch( Exception e )
|
|
{
|
|
throw new ApplicationException( "Attempt to execute batch failed: " + e.ToString() );
|
|
}
|
|
finally
|
|
{
|
|
connection.Close();
|
|
}
|
|
}
|
|
|
|
private static void WriteException( string email, EntityType entitytype, string entitykey, string oldxml, string newxml, string change )
|
|
{
|
|
Exceptions++;
|
|
|
|
Log( "Logging exception number " + Exceptions.ToString( "0000" ) + " to exceptions file.", LogType.LogOnly );
|
|
|
|
if( !Directory.Exists( ExceptionDirName ) )
|
|
Directory.CreateDirectory( ExceptionDirName );
|
|
|
|
//
|
|
// Write a new record to exceptions file
|
|
//
|
|
|
|
string oldfilename = ExceptionDirName + "\\" + Exceptions.ToString( "0000" ) + "_old_" + entitykey + ".xml";
|
|
oldfilename = oldfilename.Replace( ':', '-' );
|
|
|
|
string newfilename = ExceptionDirName + "\\" + Exceptions.ToString( "0000" ) + "_new_" + entitykey + ".xml";
|
|
newfilename = newfilename.Replace( ':', '-' );
|
|
|
|
string exceptionRecord="";
|
|
exceptionRecord += Exceptions.ToString() + "\t";
|
|
exceptionRecord += email + "\t";
|
|
exceptionRecord += entitytype.ToString() + "\t";
|
|
exceptionRecord += entitykey + "\t";
|
|
exceptionRecord += oldfilename + "\t";
|
|
exceptionRecord += newfilename + "\t";
|
|
exceptionRecord += change;
|
|
|
|
FileStream exceptionfile = new FileStream( ExceptionFileName, FileMode.Append );
|
|
StreamWriter stream = new StreamWriter( exceptionfile );
|
|
stream.WriteLine( exceptionRecord );
|
|
stream.Close();
|
|
exceptionfile.Close();
|
|
|
|
//
|
|
// Write old and new entities out to exception directory
|
|
//
|
|
|
|
Log( "Creating exception file: " + oldfilename, LogType.LogOnly );
|
|
|
|
FileStream oldfile = new FileStream( oldfilename, FileMode.CreateNew );
|
|
stream = new StreamWriter( oldfile );
|
|
stream.Write( oldxml );
|
|
stream.Close();
|
|
oldfile.Close();
|
|
|
|
Log( "Creating exception file: " + newfilename, LogType.LogOnly );
|
|
|
|
FileStream newfile = new FileStream( newfilename, FileMode.CreateNew );
|
|
stream = new StreamWriter( newfile );
|
|
stream.Write( newxml );
|
|
stream.Close();
|
|
newfile.Close();
|
|
|
|
return;
|
|
}
|
|
|
|
private static string CheckForSlash( string str )
|
|
{
|
|
if( !str.EndsWith( @"\" ) )
|
|
{
|
|
return ( str + @"\" );
|
|
}
|
|
|
|
return str;
|
|
}
|
|
|
|
private static string Deserialize( EntityType entitytype, object entity )
|
|
{
|
|
XmlSerializer serializer;
|
|
string payload;
|
|
|
|
switch( entitytype )
|
|
{
|
|
case EntityType.BusinessEntity:
|
|
serializer = new XmlSerializer( typeof( BusinessEntity ) );
|
|
break;
|
|
case EntityType.TModel:
|
|
serializer = new XmlSerializer( typeof( TModel ) );
|
|
break;
|
|
default:
|
|
throw new ApplicationException( "Invalid entitytype in WriteException()." );
|
|
}
|
|
|
|
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
|
|
UTF8EncodedStringWriter stringWriter = new UTF8EncodedStringWriter();
|
|
|
|
try
|
|
{
|
|
namespaces.Add( "", "urn:uddi-org:api_v2" );
|
|
|
|
serializer.Serialize( stringWriter, entity, namespaces );
|
|
payload = stringWriter.ToString();
|
|
}
|
|
finally
|
|
{
|
|
stringWriter.Close();
|
|
}
|
|
|
|
|
|
return payload;
|
|
}
|
|
|
|
private static void Log( string message, LogType logType )
|
|
{
|
|
switch ( logType )
|
|
{
|
|
case LogType.ConsoleAndLog:
|
|
Console.WriteLine( message );
|
|
Stream.WriteLine( "{0}: {1}", DateTime.Now.ToLongTimeString(), message );
|
|
break;
|
|
case LogType.ConsoleOnly:
|
|
Console.WriteLine( message );
|
|
break;
|
|
case LogType.LogOnly:
|
|
if( Verbose )
|
|
Console.WriteLine( message );
|
|
|
|
Stream.WriteLine( "{0}: {1}", DateTime.Now.ToLongTimeString(), message );
|
|
break;
|
|
}
|
|
}
|
|
|
|
private static void DisplayUsage()
|
|
{
|
|
Log( "Migrates data from UDDI V1.5 to UDDI V2.0", LogType.ConsoleOnly );
|
|
Log( "Output is logged to " + LogFileName + "\n", LogType.ConsoleOnly );
|
|
Log( "migrate [-?] [-s migrationstage] [-c readerconnectstring] [-v] [-i] \n", LogType.ConsoleOnly );
|
|
Log( " [?]: Display usage information ", LogType.ConsoleOnly );
|
|
Log( " [-s migrationstage]: Use one of the following values for migrationstage: ", LogType.ConsoleOnly );
|
|
Log( " SetReaderConnection: Sets ReaderConnectionString in registry", LogType.ConsoleOnly );
|
|
Log( " Note: Reference a V2.0 db loaded with V1.5 data", LogType.ConsoleOnly );
|
|
Log( " Note: Requires -c argument", LogType.ConsoleOnly );
|
|
Log( " ResetWriter: Resets publishers, tModels and businessEntities on write db", LogType.ConsoleOnly );
|
|
Log( " MigratePublishers: Migrates publisher accounts from read to write db", LogType.ConsoleOnly );
|
|
Log( " MigrateBareTModels: Migrates bare TModels from read to write db", LogType.ConsoleOnly );
|
|
Log( " BootstrapResources: Bootstraps all resources in \\uddi\\bootstrap", LogType.ConsoleOnly );
|
|
Log( " MigrateCategorizationSchemes: Migrates categorization schemes from read to write db", LogType.ConsoleOnly );
|
|
Log( " MigrateFullTModels: Migrates full TModels from read to write db", LogType.ConsoleOnly );
|
|
Log( " MigrateHiddenTModels: Migrates hidden TModels from read to write db", LogType.ConsoleOnly );
|
|
Log( " MigrateBusinessEntities: Migrates businessEntities from read to write db", LogType.ConsoleOnly );
|
|
Log( " MigratePublisherAssertions: Migrates publisher assertions from read to write db", LogType.ConsoleOnly );
|
|
Log( " RestoreReaderConnection: Restores original ReaderConnectionString", LogType.ConsoleOnly );
|
|
Log( " [-c readerconnectstring]: Used to specify a ReaderConnectionString", LogType.ConsoleOnly );
|
|
Log( " Note: use only with -s SetReaderConnection", LogType.ConsoleOnly );
|
|
Log( " Note: must use double-quotes around connection string", LogType.ConsoleOnly );
|
|
Log( " [-v]: Verbose output to console.", LogType.ConsoleOnly );
|
|
Log( " [-i]: Initialize log file.\n", LogType.ConsoleOnly );
|
|
Log( "Examples:", LogType.ConsoleOnly );
|
|
Log( " migrate -?", LogType.ConsoleOnly );
|
|
Log( " migrate -s SetReaderConnection ", LogType.ConsoleOnly );
|
|
Log( " -c \"Data Source=SRV;Initial Catalog=DB;Integrated Security=SSPI\" -i", LogType.ConsoleOnly );
|
|
Log( " migrate -s ResetWriter", LogType.ConsoleOnly );
|
|
Log( " migrate -s MigratePublishers", LogType.ConsoleOnly );
|
|
Log( " migrate -s MigrateBareTModels", LogType.ConsoleOnly );
|
|
Log( " migrate -s BootstrapResources", LogType.ConsoleOnly );
|
|
Log( " migrate -s MigrateCategorizationSchemes", LogType.ConsoleOnly );
|
|
Log( " migrate -s MigrateFullTModels", LogType.ConsoleOnly );
|
|
Log( " migrate -s MigrateHiddenTModels", LogType.ConsoleOnly );
|
|
Log( " migrate -s MigrateBareBusinessEntities", LogType.ConsoleOnly );
|
|
Log( " migrate -s MigrateBusinessEntities", LogType.ConsoleOnly );
|
|
Log( " migrate -s MigratePublisherAssertions", LogType.ConsoleOnly );
|
|
Log( " migrate -s RestoreReaderConnection", LogType.ConsoleOnly );
|
|
}
|
|
|
|
private static bool StringEmpty2( string str )
|
|
{
|
|
if( null == str )
|
|
return true;
|
|
#if never
|
|
if( 0 == str.Trim().Length )
|
|
return true;
|
|
#endif
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|