Example #1
0
        private async Task <ConnectionCompleteParams> Connect(ConnectParams connectParams, string uri)
        {
            string connectionErrorMessage = string.Empty;

            try
            {
                // open connection based on request details
                ConnectionCompleteParams result = await connectionService.Connect(connectParams);

                connectionErrorMessage = result != null ? $"{result.Messages} error code:{result.ErrorNumber}"  : string.Empty;
                if (result != null && !string.IsNullOrEmpty(result.ConnectionId))
                {
                    return(result);
                }
                else
                {
                    await SendSessionFailedNotification(uri, result.ErrorMessage);

                    return(null);
                }
            }
            catch (Exception ex)
            {
                await SendSessionFailedNotification(uri, ex.ToString());

                return(null);
            }
        }
Example #2
0
        public static async Task <TestConnectionResult> InitLiveConnectionInfoAsync(string databaseName = null, string ownerUri = null)
        {
            ScriptFile scriptFile = null;

            if (string.IsNullOrEmpty(ownerUri))
            {
                string sqlFilePath = GetTestSqlFile();
                scriptFile = TestServiceProvider.Instance.WorkspaceService.Workspace.GetFile(sqlFilePath);
                ownerUri   = scriptFile.ClientFilePath;
            }
            ConnectParams connectParams = TestServiceProvider.Instance.ConnectionProfileService.GetConnectionParameters(TestServerType.OnPrem, databaseName);

            var connectionService = GetLiveTestConnectionService();
            var connectionResult  =
                await connectionService
                .Connect(new ConnectParams
            {
                OwnerUri   = ownerUri,
                Connection = connectParams.Connection
            });

            if (!string.IsNullOrEmpty(connectionResult.ErrorMessage))
            {
                Console.WriteLine(connectionResult.ErrorMessage);
            }

            ConnectionInfo connInfo = null;

            connectionService.TryFindConnection(ownerUri, out connInfo);
            return(new TestConnectionResult()
            {
                ConnectionInfo = connInfo, ScriptFile = scriptFile
            });
        }
Example #3
0
        /// <summary>
        /// Create a connection parameters object
        /// </summary>
        private ConnectParams CreateConnectParams(InstanceInfo connectionProfile, string key, string databaseName)
        {
            ConnectParams connectParams = new ConnectParams();

            connectParams.Connection                     = new ConnectionDetails();
            connectParams.Connection.ServerName          = connectionProfile.ServerName;
            connectParams.Connection.DatabaseName        = connectionProfile.Database;
            connectParams.Connection.DatabaseDisplayName = connectionProfile.Database;
            connectParams.Connection.UserName            = connectionProfile.User;
            connectParams.Connection.Password            = connectionProfile.Password;
            connectParams.Connection.MaxPoolSize         = 200;
            connectParams.Connection.AuthenticationType  = connectionProfile.AuthenticationType.ToString();
            if (!string.IsNullOrEmpty(databaseName))
            {
                connectParams.Connection.DatabaseName        = databaseName;
                connectParams.Connection.DatabaseDisplayName = databaseName;
            }
            if (key == DefaultSqlAzureInstanceKey || key == DefaultSqlAzureV12InstanceKey)
            {
                connectParams.Connection.ConnectTimeout         = 30;
                connectParams.Connection.Encrypt                = true;
                connectParams.Connection.TrustServerCertificate = false;
            }
            return(connectParams);
        }
        /// <summary>
        /// Check that the fields in ConnectParams are all valid
        /// </summary>
        public static bool IsValid(this ConnectParams parameters, out string errorMessage)
        {
            errorMessage = string.Empty;
            if (string.IsNullOrEmpty(parameters.OwnerUri))
            {
                errorMessage = SR.ConnectionParamsValidateNullOwnerUri;
            }
            else if (parameters.Connection == null)
            {
                errorMessage = SR.ConnectionParamsValidateNullConnection;
            }
            else if (!string.IsNullOrEmpty(parameters.Connection.ConnectionString))
            {
                // Do not check other connection parameters if a connection string is present
                return(string.IsNullOrEmpty(errorMessage));
            }
            else if (string.IsNullOrEmpty(parameters.Connection.ServerName))
            {
                errorMessage = SR.ConnectionParamsValidateNullServerName;
            }
            else if (string.IsNullOrEmpty(parameters.Connection.AuthenticationType) || parameters.Connection.AuthenticationType == "SqlLogin")
            {
                // For SqlLogin, username cannot be empty
                if (string.IsNullOrEmpty(parameters.Connection.UserName))
                {
                    errorMessage = SR.ConnectionParamsValidateNullSqlAuth("UserName");
                }
            }

            return(string.IsNullOrEmpty(errorMessage));
        }
Example #5
0
        public static TestConnectionResult InitLiveConnectionInfo(string databaseName = null, string ownerUri = null)
        {
            ScriptFile    scriptFile    = null;
            ConnectParams connectParams = TestServiceProvider.Instance.ConnectionProfileService.GetConnectionParameters(TestServerType.OnPrem, databaseName);

            if (string.IsNullOrEmpty(ownerUri))
            {
                ownerUri   = GetTestSqlFile();
                scriptFile = TestServiceProvider.Instance.WorkspaceService.Workspace.GetFile(ownerUri);
                ownerUri   = scriptFile.ClientUri;
            }
            var connectionService = GetLiveTestConnectionService();
            var connectionResult  =
                connectionService
                .Connect(new ConnectParams
            {
                OwnerUri   = ownerUri,
                Connection = connectParams.Connection
            });

            connectionResult.Wait();

            ConnectionInfo connInfo = null;

            connectionService.TryFindConnection(ownerUri, out connInfo);
            return(new TestConnectionResult()
            {
                ConnectionInfo = connInfo, ScriptFile = scriptFile
            });
        }
Example #6
0
        public static TestConnectionResult InitLiveConnectionInfo()
        {
            string        sqlFilePath   = GetTestSqlFile();
            ScriptFile    scriptFile    = TestServiceProvider.Instance.WorkspaceService.Workspace.GetFile(sqlFilePath);
            ConnectParams connectParams = TestServiceProvider.Instance.ConnectionProfileService.GetConnectionParameters(TestServerType.OnPrem);

            string ownerUri          = scriptFile.ClientFilePath;
            var    connectionService = TestObjects.GetLiveTestConnectionService();
            var    connectionResult  =
                connectionService
                .Connect(new ConnectParams()
            {
                OwnerUri   = ownerUri,
                Connection = connectParams.Connection
            });

            connectionResult.Wait();

            ConnectionInfo connInfo = null;

            connectionService.TryFindConnection(ownerUri, out connInfo);
            return(new TestConnectionResult()
            {
                ConnectionInfo = connInfo, ScriptFile = scriptFile
            });
        }
Example #7
0
        /// <summary>
        /// Example test that performs a connect, then disconnect.
        /// All tests must have the same signature of returning an async Task
        /// and taking in a ServiceTestDriver as a parameter.
        /// </summary>
        public async Task ConnectDisconnectTest(ServiceTestDriver driver)
        {
            var connectParams = new ConnectParams();

            connectParams.OwnerUri                      = "file";
            connectParams.Connection                    = new ConnectionDetails();
            connectParams.Connection.ServerName         = "localhost";
            connectParams.Connection.AuthenticationType = "Integrated";

            var result = await driver.SendRequest(ConnectionRequest.Type, connectParams);

            if (result)
            {
                await driver.WaitForEvent(ConnectionCompleteNotification.Type);

                var disconnectParams = new DisconnectParams();
                disconnectParams.OwnerUri = "file";
                var result2 = await driver.SendRequest(DisconnectRequest.Type, disconnectParams);

                if (result2)
                {
                    Console.WriteLine("success");
                }
            }
        }
        private void RunConnectRequestHandlerTask(ConnectParams connectParams)
        {
            // create a task to connect asynchronously so that other requests are not blocked in the meantime
            Task.Run(async() =>
            {
                try
                {
                    // result is null if the ConnectParams was successfully validated
                    ConnectionCompleteParams result = ValidateConnectParams(connectParams);
                    if (result != null)
                    {
                        await ServiceHost.SendEvent(ConnectionCompleteNotification.Type, result);
                        return;
                    }

                    // open connection based on request details
                    result = await Connect(connectParams);
                    await ServiceHost.SendEvent(ConnectionCompleteNotification.Type, result);
                }
                catch (Exception ex)
                {
                    ConnectionCompleteParams result = new ConnectionCompleteParams()
                    {
                        Messages = ex.ToString()
                    };
                    await ServiceHost.SendEvent(ConnectionCompleteNotification.Type, result);
                }
            });
        }
        /// <summary>
        /// Check that the fields in ConnectParams are all valid
        /// </summary>
        public static bool IsValid(this ConnectParams parameters, out string errorMessage)
        {
            errorMessage = string.Empty;
            if (string.IsNullOrEmpty(parameters.OwnerUri))
            {
                errorMessage = SR.ConnectionParamsValidateNullOwnerUri;
            }
            else if (parameters.Connection == null)
            {
                errorMessage = SR.ConnectionParamsValidateNullConnection;
            }
            else if (string.IsNullOrEmpty(parameters.Connection.ServerName))
            {
                errorMessage = SR.ConnectionParamsValidateNullServerName;
            }
            else if (string.IsNullOrEmpty(parameters.Connection.AuthenticationType) || parameters.Connection.AuthenticationType == "SqlLogin")
            {
                // For SqlLogin, username/password cannot be empty
                if (string.IsNullOrEmpty(parameters.Connection.UserName))
                {
                    errorMessage = SR.ConnectionParamsValidateNullSqlAuth("UserName");
                }
                else if (string.IsNullOrEmpty(parameters.Connection.Password))
                {
                    errorMessage = SR.ConnectionParamsValidateNullSqlAuth("Password");
                }
            }

            return(string.IsNullOrEmpty(errorMessage));
        }
        /// <summary>
        /// Establishes a new session and stores its information
        /// </summary>
        /// <returns><see cref="ObjectExplorerSession"/> object if successful, null if unsuccessful</returns>
        internal async Task <ObjectExplorerSession> DoCreateSession(ConnectionDetails connectionDetails, string uri)
        {
            try
            {
                ObjectExplorerSession session;
                connectionDetails.PersistSecurityInfo = true;
                ConnectParams connectParams = new ConnectParams()
                {
                    OwnerUri = uri, Connection = connectionDetails
                };

                ConnectionCompleteParams connectionResult = await Connect(connectParams, uri);

                if (connectionResult == null)
                {
                    // Connection failed and notification is already sent
                    return(null);
                }

                session = ObjectExplorerSession.CreateSession(connectionResult, serviceProvider);
                sessionMap.AddOrUpdate(uri, session, (key, oldSession) => session);
                return(session);
            }
            catch (Exception ex)
            {
                await SendSessionFailedNotification(uri, ex.Message);

                return(null);
            }
        }
Example #11
0
        /// <summary>
        /// Extract QML debug connection parameters from command line args
        /// </summary>
        public static bool ParseCommandLine(
            string execPath,
            string args,
            out ushort portFrom,
            out ushort portTo,
            out string hostName,
            out string fileName,
            out bool block)
        {
            portFrom = portTo = 0;
            hostName = fileName = "";
            block    = false;

            ConnectParams connParams = ConnectParamsParser
                                       .Parse(args)
                                       .GetValues <ConnectParams>(TokenId.ConnectParams)
                                       .FirstOrDefault();

            if (connParams == null)
            {
                return(false);
            }

            portFrom = connParams.Port;
            if (connParams.MaxPort.HasValue)
            {
                portTo = connParams.MaxPort.Value;
            }
            hostName = connParams.Host;
            fileName = connParams.File;
            block    = connParams.Block;

            return(true);
        }
        private async void TestAddCMS()
        {
            string        name          = "TestAddCMS" + DateTime.Now.ToString();
            ConnectParams connectParams = CreateConnectParams();

            // Prepare for list servers (may or may not have servers but will have listCmsServersResult)
            var requestContext = new Mock <RequestContext <ListRegisteredServersResult> >();

            requestContext.Setup((RequestContext <ListRegisteredServersResult> x) => x.SendResult(It.Is <ListRegisteredServersResult>((listCmsServersResult) => listCmsServersResult.RegisteredServersList != null))).Returns(Task.FromResult(new object()));

            CreateCentralManagementServerParams connectToCMS = new CreateCentralManagementServerParams
            {
                RegisteredServerName        = name,
                RegisteredServerDescription = "My Registered Test Server",
                ConnectParams = connectParams
            };

            // Actual test after preparation start here
            CmsService cmsService = CmsService.Instance;

            // Connect to CMS
            await cmsService.HandleCreateCentralManagementServerRequest(connectToCMS, requestContext.Object);

            await cmsService.CmsTask;

            requestContext.VerifyAll();
        }
Example #13
0
        private static async Task <AssessmentResult <TResult> > CallAssessment <TResult>(
            string methodName,
            SqlObjectType sqlObjectType,
            LiveConnectionHelper.TestConnectionResult liveConnection)
            where TResult : AssessmentItemInfo
        {
            var connInfo = liveConnection.ConnectionInfo;

            AssessmentResult <TResult> response;

            using (var service = new SqlAssessmentService(
                       TestServiceProvider.Instance.ConnectionService,
                       TestServiceProvider.Instance.WorkspaceService))
            {
                AddTestRules(service);

                string           randomUri     = Guid.NewGuid().ToString();
                AssessmentParams requestParams =
                    new AssessmentParams {
                    OwnerUri = randomUri, TargetType = sqlObjectType
                };
                ConnectParams connectParams = new ConnectParams
                {
                    OwnerUri   = requestParams.OwnerUri,
                    Connection = connInfo.ConnectionDetails,
                    Type       = ConnectionType.Default
                };

                var methodInfo = typeof(SqlAssessmentService).GetMethod(
                    methodName,
                    BindingFlags.Instance | BindingFlags.NonPublic);

                Assert.NotNull(methodInfo);

                var func = (AssessmentMethod <TResult>)Delegate.CreateDelegate(
                    typeof(AssessmentMethod <TResult>),
                    service,
                    methodInfo);

                response = await service.CallAssessmentEngine <TResult>(
                    requestParams,
                    connectParams,
                    randomUri,
                    t => func(t));
            }

            Assert.NotNull(response);
            if (response.Success)
            {
                Assert.All(
                    response.Items,
                    i =>
                {
                    Assert.Equal(sqlObjectType, i.TargetType);
                    Assert.Contains(i.Level, AllowedSeverityLevels);
                });
            }

            return(response);
        }
        private async void TestAddRemoveServerGroup()
        {
            string        name          = "TestAddRemoveServerGroup" + DateTime.Now.ToString();
            ConnectParams connectParams = await CreateAndConnectWithConnectParams();

            // Prepare for Server group add
            var requestContext1 = new Mock <RequestContext <bool> >();

            requestContext1.Setup((RequestContext <bool> x) => x.SendResult(It.Is <bool>((result) => result == true))).Returns(Task.FromResult(new object()));
            AddServerGroupParams addRegServerParams = new AddServerGroupParams
            {
                GroupName        = name,
                GroupDescription = "My Registered Test Server Group",
                ParentOwnerUri   = connectParams.OwnerUri,
                RelativePath     = null,
            };

            // prepare for Server group list
            var requestContext2 = new Mock <RequestContext <ListRegisteredServersResult> >();

            requestContext2.Setup((RequestContext <ListRegisteredServersResult> x) => x.SendResult(It.Is <ListRegisteredServersResult>((listCmsServersResult) => listCmsServersResult.RegisteredServerGroups.Find(p => p.Name.Contains(name)) != null))).Returns(Task.FromResult(new object()));
            ListRegisteredServersParams listServersParams = new ListRegisteredServersParams
            {
                ParentOwnerUri = connectParams.OwnerUri,
                RelativePath   = null
            };

            // prepare for server group remove
            var requestContext3 = new Mock <RequestContext <bool> >();

            requestContext1.Setup((RequestContext <bool> x) => x.SendResult(It.Is <bool>((result) => result == true))).Returns(Task.FromResult(new object()));
            RemoveServerGroupParams removeRegServerParams = new RemoveServerGroupParams
            {
                ParentOwnerUri = connectParams.OwnerUri,
                GroupName      = name,
                RelativePath   = null
            };

            // Actual test start here
            CmsService cmsService = CmsService.Instance;

            await cmsService.HandleAddServerGroupRequest(addRegServerParams, requestContext1.Object);

            await cmsService.CmsTask;

            requestContext1.VerifyAll();

            await cmsService.HandleListRegisteredServersRequest(listServersParams, requestContext2.Object);

            await cmsService.CmsTask;

            requestContext2.VerifyAll();

            await cmsService.HandleRemoveServerGroupRequest(removeRegServerParams, requestContext3.Object);

            await cmsService.CmsTask;

            requestContext3.VerifyAll();
        }
        private async Task <ConnectParams> CreateAndConnectWithConnectParams()
        {
            ConnectParams     connectParams = CreateConnectParams();
            ConnectionService connService   = ConnectionService.Instance;
            await connService.Connect(connectParams);

            return(connectParams);
        }
 private bool IsConnectionChanged(ConnectParams connectionParams, ConnectionInfo connectionInfo)
 {
     if (connectionInfo.HasConnectionType(connectionParams.Type) &&
         !connectionInfo.ConnectionDetails.IsComparableTo(connectionParams.Connection))
     {
         return(true);
     }
     return(false);
 }
        /// <summary>
        /// Open a connection with the specified ConnectParams
        /// </summary>
        public virtual async Task <ConnectionCompleteParams> Connect(ConnectParams connectionParams)
        {
            // Validate parameters
            ConnectionCompleteParams validationResults = ValidateConnectParams(connectionParams);

            if (validationResults != null)
            {
                return(validationResults);
            }

            // If there is no ConnectionInfo in the map, create a new ConnectionInfo,
            // but wait until later when we are connected to add it to the map.
            ConnectionInfo connectionInfo;
            bool           connectionChanged = false;

            if (!ownerToConnectionMap.TryGetValue(connectionParams.OwnerUri, out connectionInfo))
            {
                connectionInfo = new ConnectionInfo(ConnectionFactory, connectionParams.OwnerUri, connectionParams.Connection);
            }
            else if (IsConnectionChanged(connectionParams, connectionInfo))
            {
                // We are actively changing the connection information for this connection. We must disconnect
                // all active connections, since it represents a full context change
                connectionChanged = true;
            }

            DisconnectExistingConnectionIfNeeded(connectionParams, connectionInfo, disconnectAll: connectionChanged);

            if (connectionChanged)
            {
                connectionInfo = new ConnectionInfo(ConnectionFactory, connectionParams.OwnerUri, connectionParams.Connection);
            }

            // Try to open a connection with the given ConnectParams
            ConnectionCompleteParams response = await TryOpenConnection(connectionInfo, connectionParams);

            if (response != null)
            {
                return(response);
            }

            // If this is the first connection for this URI, add the ConnectionInfo to the map
            bool addToMap = connectionChanged || !ownerToConnectionMap.ContainsKey(connectionParams.OwnerUri);

            if (addToMap)
            {
                ownerToConnectionMap[connectionParams.OwnerUri] = connectionInfo;
            }

            // Return information about the connected SQL Server instance
            ConnectionCompleteParams completeParams = GetConnectionCompleteParams(connectionParams.Type, connectionInfo);

            // Invoke callback notifications
            InvokeOnConnectionActivities(connectionInfo, connectionParams);

            return(completeParams);
        }
Example #18
0
        // public
        public static void Connect(Socket connectingSocket, IPEndPoint connectEndPoint, int connectTimeout)
        {
            ConnectParams connectParams = new ConnectParams(connectingSocket, connectEndPoint, connectTimeout);

            Thread connectingThread = new Thread(new ParameterizedThreadStart(ConnectThread));
            connectingThread.Start(connectParams);

            connectingThread.Join();
        }
Example #19
0
        internal static async Task ExecuteQuery(string query)
        {
            // create a temporary "workspace" file
            using (SelfCleaningTempFile queryTempFile = new SelfCleaningTempFile())
                // create the client helper which wraps the client driver objects
                using (ClientHelper testHelper = new ClientHelper())
                {
                    // connnection details
                    ConnectParams connectParams = new ConnectParams();
                    connectParams.Connection                    = new ConnectionDetails();
                    connectParams.Connection.ServerName         = "localhost";
                    connectParams.Connection.DatabaseName       = "master";
                    connectParams.Connection.AuthenticationType = "Integrated";

                    // connect to the database
                    await testHelper.Connect(queryTempFile.FilePath, connectParams);

                    // execute the query
                    QueryExecuteCompleteParams queryComplete =
                        await testHelper.RunQuery(queryTempFile.FilePath, query);

                    if (queryComplete.BatchSummaries != null && queryComplete.BatchSummaries.Length > 0)
                    {
                        var batch = queryComplete.BatchSummaries[0];
                        if (batch.ResultSetSummaries != null && batch.ResultSetSummaries.Length > 0)
                        {
                            var resultSet = batch.ResultSetSummaries[0];

                            // retrive the results
                            QueryExecuteSubsetResult querySubset = await testHelper.ExecuteSubset(
                                queryTempFile.FilePath, batch.Id,
                                resultSet.Id, 0, (int)resultSet.RowCount);

                            // print the header
                            foreach (var column in resultSet.ColumnInfo)
                            {
                                Console.Write(column.ColumnName + ", ");
                            }
                            Console.Write(Environment.NewLine);

                            // print the rows
                            foreach (var row in querySubset.ResultSubset.Rows)
                            {
                                for (int i = 0; i < resultSet.ColumnInfo.Length; ++i)
                                {
                                    Console.Write(row.GetValue(i) + ", ");
                                }
                                Console.Write(Environment.NewLine);
                            }
                        }
                    }

                    // close database connection
                    await testHelper.Disconnect(queryTempFile.FilePath);
                }
        }
Example #20
0
        public async void ConnectingTwiceWithTheSameUriDoesNotCreateAnotherDbConnection()
        {
            // Setup the connect and disconnect params
            var connectParamsSame1 = new ConnectParams()
            {
                OwnerUri   = "connectParamsSame",
                Connection = TestObjects.GetTestConnectionDetails()
            };
            var connectParamsSame2 = new ConnectParams()
            {
                OwnerUri   = "connectParamsSame",
                Connection = TestObjects.GetTestConnectionDetails()
            };
            var disconnectParamsSame = new DisconnectParams()
            {
                OwnerUri = connectParamsSame1.OwnerUri
            };
            var connectParamsDifferent = new ConnectParams()
            {
                OwnerUri   = "connectParamsDifferent",
                Connection = TestObjects.GetTestConnectionDetails()
            };
            var disconnectParamsDifferent = new DisconnectParams()
            {
                OwnerUri = connectParamsDifferent.OwnerUri
            };

            // Given a request to connect to a database, there should be no initial connections in the map
            var service = TestObjects.GetTestConnectionService();
            Dictionary <string, ConnectionInfo> ownerToConnectionMap = service.OwnerToConnectionMap;

            Assert.Equal(0, ownerToConnectionMap.Count);

            // If we connect to the service, there should be 1 connection
            await service.Connect(connectParamsSame1);

            Assert.Equal(1, ownerToConnectionMap.Count);

            // If we connect again with the same URI, there should still be 1 connection
            await service.Connect(connectParamsSame2);

            Assert.Equal(1, ownerToConnectionMap.Count);

            // If we connect with a different URI, there should be 2 connections
            await service.Connect(connectParamsDifferent);

            Assert.Equal(2, ownerToConnectionMap.Count);

            // If we disconnect with the unique URI, there should be 1 connection
            service.Disconnect(disconnectParamsDifferent);
            Assert.Equal(1, ownerToConnectionMap.Count);

            // If we disconnect with the duplicate URI, there should be 0 connections
            service.Disconnect(disconnectParamsSame);
            Assert.Equal(0, ownerToConnectionMap.Count);
        }
        private ConnectParams CreateConnectParams()
        {
            ConnectParams connectParams = TestServiceProvider.Instance.ConnectionProfileService.GetConnectionParameters(TestServerType.OnPrem, "master");

            connectParams.OwnerUri = LiveConnectionHelper.GetTestSqlFile();
            connectParams.Connection.DatabaseName        = null;
            connectParams.Connection.DatabaseDisplayName = null;

            return(connectParams);
        }
        /// <summary>
        /// Gets the existing connection with the given URI and connection type string. If none exists,
        /// creates a new connection. This cannot be used to create a default connection or to create a
        /// connection if a default connection does not exist.
        /// </summary>
        /// <param name="ownerUri">URI identifying the resource mapped to this connection</param>
        /// <param name="connectionType">
        /// What the purpose for this connection is. A single resource
        /// such as a SQL file may have multiple connections - one for Intellisense, another for query execution
        /// </param>
        /// <param name="alwaysPersistSecurity">
        /// Workaround for .Net Core clone connection issues: should persist security be used so that
        /// when SMO clones connections it can do so without breaking on SQL Password connections.
        /// This should be removed once the core issue is resolved and clone works as expected
        /// </param>
        /// <returns>A DB connection for the connection type requested</returns>
        public async Task <DbConnection> GetOrOpenConnection(string ownerUri, string connectionType, bool alwaysPersistSecurity = false)
        {
            Validate.IsNotNullOrEmptyString(nameof(ownerUri), ownerUri);
            Validate.IsNotNullOrEmptyString(nameof(connectionType), connectionType);

            // Try to get the ConnectionInfo, if it exists
            ConnectionInfo connectionInfo;

            if (!ownerToConnectionMap.TryGetValue(ownerUri, out connectionInfo))
            {
                throw new ArgumentOutOfRangeException(SR.ConnectionServiceListDbErrorNotConnected(ownerUri));
            }

            // Make sure a default connection exists
            DbConnection defaultConnection;

            if (!connectionInfo.TryGetConnection(ConnectionType.Default, out defaultConnection))
            {
                throw new InvalidOperationException(SR.ConnectionServiceDbErrorDefaultNotConnected(ownerUri));
            }

            // Try to get the DbConnection
            DbConnection connection;

            if (!connectionInfo.TryGetConnection(connectionType, out connection) && ConnectionType.Default != connectionType)
            {
                // If the DbConnection does not exist and is not the default connection, create one.
                // We can't create the default (initial) connection here because we won't have a ConnectionDetails
                // if Connect() has not yet been called.
                bool?originalPersistSecurityInfo = connectionInfo.ConnectionDetails.PersistSecurityInfo;
                if (alwaysPersistSecurity)
                {
                    connectionInfo.ConnectionDetails.PersistSecurityInfo = true;
                }
                ConnectParams connectParams = new ConnectParams
                {
                    OwnerUri   = ownerUri,
                    Connection = connectionInfo.ConnectionDetails,
                    Type       = connectionType
                };
                try
                {
                    await Connect(connectParams);
                }
                finally
                {
                    connectionInfo.ConnectionDetails.PersistSecurityInfo = originalPersistSecurityInfo;
                }

                connectionInfo.TryGetConnection(connectionType, out connection);
            }

            return(connection);
        }
Example #23
0
        /// <summary>
        /// Establishes a new session and stores its information
        /// </summary>
        /// <returns><see cref="ObjectExplorerSession"/> object if successful, null if unsuccessful</returns>
        internal async Task <ObjectExplorerSession> DoCreateSession(ConnectionDetails connectionDetails, string uri)
        {
            try
            {
                ObjectExplorerSession session = null;
                connectionDetails.PersistSecurityInfo = true;
                ConnectParams connectParams = new ConnectParams()
                {
                    OwnerUri = uri, Connection = connectionDetails, Type = Connection.ConnectionType.ObjectExplorer
                };
                bool isDefaultOrSystemDatabase = DatabaseUtils.IsSystemDatabaseConnection(connectionDetails.DatabaseName) || string.IsNullOrWhiteSpace(connectionDetails.DatabaseDisplayName);

                ConnectionInfo           connectionInfo;
                ConnectionCompleteParams connectionResult = await Connect(connectParams, uri);

                if (!connectionService.TryFindConnection(uri, out connectionInfo))
                {
                    return(null);
                }

                if (connectionResult == null)
                {
                    // Connection failed and notification is already sent
                    return(null);
                }

                int       timeout   = (int)TimeSpan.FromSeconds(settings?.CreateSessionTimeout ?? ObjectExplorerSettings.DefaultCreateSessionTimeout).TotalMilliseconds;
                QueueItem queueItem = bindingQueue.QueueBindingOperation(
                    key: bindingQueue.AddConnectionContext(connectionInfo, connectionName),
                    bindingTimeout: timeout,
                    waitForLockTimeout: timeout,
                    bindOperation: (bindingContext, cancelToken) =>
                {
                    session = ObjectExplorerSession.CreateSession(connectionResult, serviceProvider, bindingContext.ServerConnection, isDefaultOrSystemDatabase);
                    session.ConnectionInfo = connectionInfo;

                    sessionMap.AddOrUpdate(uri, session, (key, oldSession) => session);
                    return(session);
                });

                queueItem.ItemProcessed.WaitOne();
                if (queueItem.GetResultAsT <ObjectExplorerSession>() != null)
                {
                    session = queueItem.GetResultAsT <ObjectExplorerSession>();
                }
                return(session);
            }
            catch (Exception ex)
            {
                await SendSessionFailedNotification(uri, ex.Message);

                return(null);
            }
        }
        private async Task <ObjectExplorerSession> CreateSession(string databaseName)
        {
            ConnectParams connectParams = TestServiceProvider.Instance.ConnectionProfileService.GetConnectionParameters(TestServerType.OnPrem, databaseName);
            //connectParams.Connection.Pooling = false;
            ConnectionDetails details = connectParams.Connection;
            string            uri     = ObjectExplorerService.GenerateUri(details);

            var session = await _service.DoCreateSession(details, uri);

            Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "OE session created for database: {0}", databaseName));
            return(session);
        }
        /// <summary>
        /// Create a connection parameters object
        /// </summary>
        public static ConnectParams CreateConnectParams(string server, string database, string username, string password)
        {
            ConnectParams connectParams = new ConnectParams();

            connectParams.Connection                    = new ConnectionDetails();
            connectParams.Connection.ServerName         = server;
            connectParams.Connection.DatabaseName       = database;
            connectParams.Connection.UserName           = username;
            connectParams.Connection.Password           = password;
            connectParams.Connection.AuthenticationType = "SqlLogin";
            return(connectParams);
        }
        /// <summary>
        /// Open a connection with the specified ConnectParams
        /// </summary>
        public async Task <ConnectionCompleteParams> Connect(ConnectParams connectionParams)
        {
            // Validate parameters
            ConnectionCompleteParams validationResults = ValidateConnectParams(connectionParams);

            if (validationResults != null)
            {
                return(validationResults);
            }

            // If there is no ConnectionInfo in the map, create a new ConnectionInfo,
            // but wait until later when we are connected to add it to the map.
            ConnectionInfo connectionInfo;

            if (!ownerToConnectionMap.TryGetValue(connectionParams.OwnerUri, out connectionInfo))
            {
                connectionInfo = new ConnectionInfo(ConnectionFactory, connectionParams.OwnerUri, connectionParams.Connection);
            }

            // Resolve if it is an existing connection
            // Disconnect active connection if the URI is already connected for this connection type
            DbConnection existingConnection;

            if (connectionInfo.TryGetConnection(connectionParams.Type, out existingConnection))
            {
                var disconnectParams = new DisconnectParams()
                {
                    OwnerUri = connectionParams.OwnerUri,
                    Type     = connectionParams.Type
                };
                Disconnect(disconnectParams);
            }

            // Try to open a connection with the given ConnectParams
            ConnectionCompleteParams response = await TryOpenConnection(connectionInfo, connectionParams);

            if (response != null)
            {
                return(response);
            }

            // If this is the first connection for this URI, add the ConnectionInfo to the map
            if (!ownerToConnectionMap.ContainsKey(connectionParams.OwnerUri))
            {
                ownerToConnectionMap[connectionParams.OwnerUri] = connectionInfo;
            }

            // Invoke callback notifications
            InvokeOnConnectionActivities(connectionInfo, connectionParams);

            // Return information about the connected SQL Server instance
            return(GetConnectionCompleteParams(connectionParams.Type, connectionInfo));
        }
        public ConnectParams GetConnectionParameters(string key = DefaultSql2016InstanceKey, string databaseName = null)
        {
            InstanceInfo instanceInfo = GetInstance(key);

            if (instanceInfo != null)
            {
                ConnectParams connectParam = CreateConnectParams(instanceInfo, key, databaseName);

                return(connectParam);
            }
            return(null);
        }
Example #28
0
        private async Task HandleAssessmentRequest <TResult>(
            RequestContext <AssessmentResult <TResult> > requestContext,
            AssessmentParams requestParams,
            Func <SqlObjectLocator, Task <List <TResult> > > assessmentFunction)
            where TResult : AssessmentItemInfo
        {
            try
            {
                string randomUri = Guid.NewGuid().ToString();

                // get connection
                if (!ConnectionService.TryFindConnection(requestParams.OwnerUri, out var connInfo))
                {
                    await requestContext.SendError(SR.SqlAssessmentQueryInvalidOwnerUri);

                    return;
                }

                ConnectParams connectParams = new ConnectParams
                {
                    OwnerUri   = randomUri,
                    Connection = connInfo.ConnectionDetails,
                    Type       = ConnectionType.Default
                };

                if (!connInfo.TryGetConnection(ConnectionType.Default, out var connection))
                {
                    await requestContext.SendError(SR.SqlAssessmentConnectingError);
                }

                var workTask = CallAssessmentEngine <TResult>(
                    requestParams,
                    connectParams,
                    randomUri,
                    assessmentFunction)
                               .ContinueWith(async tsk =>
                {
                    await requestContext.SendResult(tsk.Result);
                });

                ActiveRequests.TryAdd(randomUri, workTask);
            }
            catch (Exception ex)
            {
                if (ex is StackOverflowException || ex is OutOfMemoryException)
                {
                    throw;
                }

                await requestContext.SendError(ex.ToString());
            }
        }
        /// <summary>
        /// Invokes the initial on-connect activities if the provided ConnectParams represents the default
        /// connection.
        /// </summary>
        private void InvokeOnConnectionActivities(ConnectionInfo connectionInfo, ConnectParams connectParams)
        {
            if (connectParams.Type != ConnectionType.Default)
            {
                return;
            }

            foreach (var activity in this.onConnectionActivities)
            {
                // not awaiting here to allow handlers to run in the background
                activity(connectionInfo);
            }
        }
        /// <summary>
        /// Handle new connection requests
        /// </summary>
        /// <param name="connectParams"></param>
        /// <param name="requestContext"></param>
        /// <returns></returns>
        protected async Task HandleConnectRequest(
            ConnectParams connectParams,
            RequestContext <bool> requestContext)
        {
            Logger.Write(LogLevel.Verbose, "HandleConnectRequest");

            try
            {
                RunConnectRequestHandlerTask(connectParams);
                await requestContext.SendResult(true);
            }
            catch
            {
                await requestContext.SendResult(false);
            }
        }
        /// <summary>
        /// Request a new connection to be created
        /// </summary>
        /// <returns>True if the connection completed successfully</returns>
        public async Task <bool> Connect(string ownerUri, ConnectParams connectParams, int timeout = 15000)
        {
            connectParams.OwnerUri = ownerUri;
            var connectResult = await Driver.SendRequest(ConnectionRequest.Type, connectParams);

            if (connectResult)
            {
                var completeEvent = await Driver.WaitForEvent(ConnectionCompleteNotification.Type, timeout);

                return(!string.IsNullOrEmpty(completeEvent.ConnectionId));
            }
            else
            {
                return(false);
            }
        }
Example #32
0
        private static PopSession ConnectCore(ConnectParams @params)
        {
            PopSession session = null;

              try {
            session = PopSessionCreator.CreateSession(@params.Profile,
                                                  @params.AuthMechanism,
                                                  @params.CreateSslStreamCallback ?? PopConnection.CreateSslStream);
              }
              finally {
            @params.Profile.SetCredentials(null);
              }

              return session;
        }
Example #33
0
        private static ImapSession ConnectCore(ConnectParams @params)
        {
            ImapSession session = null;

              try {
            session = ImapSessionCreator.CreateSession(@params.Profile,
                                                   @params.AuthMechanism,
                                                   @params.CreateSslStreamCallback ?? ImapConnection.CreateSslStream);
              }
              finally {
            @params.Profile.SetCredentials(null);
              }

              // update server info
              if (session.ServerCapabilities.Has(ImapCapability.Namespace))
            session.Namespace();

              if (session.ServerCapabilities.Has(ImapCapability.ID))
            session.ID(null); // TODO: client ID

              session.UpdateSelectedMailboxSizeAndStatus = false;

              return session;
        }
Example #34
0
        private IAsyncResult BeginConnect(ConnectParams @params,
                                      AsyncCallback asyncCallback,
                                      object asyncState)
        {
            ThrowIfAlreadyConnectedOrAsyncConnectRunning();

              connectAsyncResult = new ConnectAsyncResult();
              connectAsyncResult.BeginConnect(@params, asyncCallback, asyncState);

              return connectAsyncResult;
        }
Example #35
0
            internal void BeginConnect(ConnectParams @params,
                                 AsyncCallback asyncCallback,
                                 object asyncState)
            {
                var proc = (ConnectProc)ImapClient.ConnectCore;

                this.asyncCallback = asyncCallback;
                this.asyncState = asyncState;

                innerAsyncResult = (AsyncResult)proc.BeginInvoke(@params, Callback, null);
            }