/****************************************************************************/ -- tssdsp.sql -- -- Terminal Server Session Directory stored procedures. -- -- Copyright (C) 2000 Microsoft Corporation /****************************************************************************/ /****************************************************************************/ -- SP_TSSDServerOnline -- -- Called by TSSDSQL to indicate a new server is coming up. Removes all -- previous entries related to this server in case of unexpected shutdown. -- Returns a 2-entry recordset with the values (ServerID, ClusterID) that -- are used in later stored procedure calls. /****************************************************************************/ IF EXISTS (SELECT name FROM sysobjects WHERE name = 'SP_TSSDServerOnline' and type = 'P') DROP PROCEDURE SP_TSSDServerOnline GO CREATE PROCEDURE SP_TSSDServerOnline @ServerAddress nvarchar(63), @ClusterName nvarchar(63) AS DECLARE @ClusterID int DECLARE @ServerID int DECLARE @ParsedClusterName nvarchar(63) -- Turn off intermediate returns to the client. Needed to help ADO -- return a valid final recordset, plus reduces round-trips on network. SET NOCOUNT ON -- We need to perform some locking on the tables to make sure -- of the data integrity. We are assuming default isolation level -- of Read Committed. BEGIN TRANSACTION SET @ServerID = (SELECT MIN(ServerID) FROM TSSD_Servers WHERE ServerAddress = @ServerAddress) DELETE FROM TSSD_Sessions WHERE ServerID = @ServerID DELETE FROM TSSD_Servers WHERE ServerID = @ServerID -- The TS may end up sending a NULL param when it's really an empty -- string. Handle that gracefully. IF (@ClusterName IS NULL) BEGIN SET @ParsedClusterName = "" END ELSE BEGIN SET @ParsedClusterName = @ClusterName END -- If the cluster does not exist, create it. SET @ClusterID = (SELECT MIN(ClusterID) FROM TSSD_Clusters WHERE ClusterName = @ParsedClusterName) IF (@ClusterID IS NULL) BEGIN INSERT INTO TSSD_Clusters (ClusterName) VALUES (@ParsedClusterName) SET @ClusterID = (SELECT MIN(ClusterID) FROM TSSD_Clusters WHERE ClusterName = @ParsedClusterName) END INSERT INTO TSSD_Servers (ServerAddress, ClusterID, AlmostInTimeLow, AlmostInTimeHigh) VALUES (@ServerAddress, @ClusterID, 0, 0) -- Generate the return recordset. SELECT ServerID, @ClusterID FROM TSSD_Servers WHERE ServerAddress = @ServerAddress -- Finished the update. COMMIT TRANSACTION GO /****************************************************************************/ -- SP_TSSDServerOffline -- -- Called by TSSDSQL to indicate a server is going offline in a graceful -- fashion. Removes all remaining entries related to this server. /****************************************************************************/ IF EXISTS (SELECT name FROM sysobjects WHERE name = 'SP_TSSDServerOffline' and type = 'P') DROP PROCEDURE SP_TSSDServerOffline GO CREATE PROCEDURE SP_TSSDServerOffline @ServerID int AS -- Turn off intermediate returns to the client. Needed to help ADO -- return a valid final recordset, plus reduces round-trips on network. SET NOCOUNT ON -- We need to perform some locking on the tables to make sure -- of the data integrity. We are assuming default isolation level -- of Read Committed. BEGIN TRANSACTION DELETE FROM TSSD_Sessions WHERE ServerID = @ServerID DELETE FROM TSSD_Servers WHERE ServerID = @ServerID -- Finished the update. COMMIT TRANSACTION GO /****************************************************************************/ -- SP_TSSDGetUserDisconnectedSessions -- -- Called by the TSSDSQL directory provider to return a recordset -- containing the info needed to populate the disconnected session info -- blocks. /****************************************************************************/ IF EXISTS (SELECT name FROM sysobjects WHERE name = 'SP_TSSDGetUserDisconnectedSessions' and type = 'P') DROP PROCEDURE SP_TSSDGetUserDisconnectedSessions GO CREATE PROCEDURE SP_TSSDGetUserDisconnectedSessions @UserName nvarchar(255), @Domain nvarchar(127), @ClusterID int AS -- Turn off intermediate returns to the client. Needed to help ADO -- return a valid final recordset, plus reduces round-trips on network. SET NOCOUNT ON -- We need to perform some locking on the tables to make sure -- of the data integrity. We are assuming default isolation level -- of Read Committed. BEGIN TRANSACTION -- Create the result set with the fields from the (only) user record. SELECT ServerAddress, SessionID, TSProtocol, CreateTimeLow, CreateTimeHigh, DisconnectionTimeLow, DisconnectionTimeHigh, ApplicationType, ResolutionWidth, ResolutionHeight, ColorDepth FROM TSSD_Sessions JOIN TSSD_Servers ON (TSSD_Sessions.ServerID = TSSD_Servers.ServerID) WHERE UserName = @UserName AND Domain = @Domain AND State = 1 AND ClusterID = @ClusterID -- Finished the update. COMMIT TRANSACTION GO /****************************************************************************/ -- SP_TSSDCreateSession -- -- Adds a session record to the system. /****************************************************************************/ IF EXISTS (SELECT name FROM sysobjects WHERE name = 'SP_TSSDCreateSession' and type = 'P') DROP PROCEDURE SP_TSSDCreateSession GO CREATE PROCEDURE SP_TSSDCreateSession @UserName nvarchar(255), @Domain nvarchar(127), @ServerID int, @SessionID int, @TSProtocol int, @AppType nvarchar(255), @ResolutionWidth int, @ResolutionHeight int, @ColorDepth int, @CreateTimeLow int, @CreateTimeHigh int AS -- Turn off intermediate returns to the client. Needed to help ADO -- return a valid recordset, plus reduces round-trips on network. SET NOCOUNT ON -- We need to perform some locking on the tables to make sure -- of the data integrity. We are assuming default isolation level -- of Read Committed. BEGIN TRANSACTION -- If this ServerName/SessionID combo already exists in the table, -- remove it. DELETE FROM TSSD_Sessions WHERE ServerID = @ServerID AND SessionID = @SessionID -- Add the session. INSERT TSSD_Sessions (UserName, Domain, ServerID, SessionID, TSProtocol, CreateTimeLow, CreateTimeHigh, ApplicationType, ResolutionWidth, ResolutionHeight, ColorDepth) VALUES (@UserName, @Domain, @ServerID, @SessionID, @TSProtocol, @CreateTimeLow, @CreateTimeHigh, @AppType, @ResolutionWidth, @ResolutionHeight, @ColorDepth) -- Finished the update. COMMIT TRANSACTION GO /****************************************************************************/ -- SP_TSSDDeleteSession -- -- Removes a session from the database. /****************************************************************************/ IF EXISTS (SELECT name FROM sysobjects WHERE name = 'SP_TSSDDeleteSession' and type = 'P') DROP PROCEDURE SP_TSSDDeleteSession GO CREATE PROCEDURE SP_TSSDDeleteSession @ServerID int, @SessionID int AS BEGIN TRANSACTION DELETE FROM TSSD_Sessions WHERE ServerID = @ServerID AND SessionID = @SessionID COMMIT TRANSACTION GO /****************************************************************************/ -- SP_TSSDSetSessionDisconnected -- -- Changes the session to disconnected and sets the disconnection time. /****************************************************************************/ IF EXISTS (SELECT name FROM sysobjects WHERE name = 'SP_TSSDSetSessionDisconnected' and type = 'P') DROP PROCEDURE SP_TSSDSetSessionDisconnected GO CREATE PROCEDURE SP_TSSDSetSessionDisconnected @ServerID int, @SessionID int, @DiscTimeLow int, @DisctimeHigh int AS BEGIN TRANSACTION UPDATE TSSD_Sessions SET State = 1, DisconnectionTimeLow = @DiscTimeLow, DisconnectionTimeHigh = @DiscTimeHigh WHERE ServerID = @ServerID AND SessionID = @SessionID COMMIT TRANSACTION GO /****************************************************************************/ -- SP_TSSDSetSessionReconnected -- -- Changes the session to connected and updates the fields that can change on -- reconnection. /****************************************************************************/ IF EXISTS (SELECT name FROM sysobjects WHERE name = 'SP_TSSDSetSessionReconnected' and type = 'P') DROP PROCEDURE SP_TSSDSetSessionReconnected GO CREATE PROCEDURE SP_TSSDSetSessionReconnected @ServerID int, @SessionID int, @TSProtocol int, @ResWidth int, @ResHeight int, @ColorDepth int AS BEGIN TRANSACTION UPDATE TSSD_Sessions SET State = 0, TSProtocol = @TSProtocol, ResolutionWidth = @ResWidth, ResolutionHeight = @ResHeight, ColorDepth = @ColorDepth WHERE ServerID = @ServerID AND SessionID = @SessionID UPDATE TSSD_Servers SET AlmostInTimeLow = 0, AlmostInTimeHigh = 0 WHERE ServerID = @ServerID COMMIT TRANSACTION GO /****************************************************************************/ -- SP_TSSDSetServerReconnectPending -- -- If the specified server has 0's in its Almost-In-Time values, add the -- timestamp passed in. Used by Directory Integrity Service /****************************************************************************/ IF EXISTS (SELECT name FROM sysobjects WHERE name = 'SP_TSSDSetServerReconnectPending' and type = 'P') DROP PROCEDURE SP_TSSDSetServerReconnectPending GO CREATE PROCEDURE SP_TSSDSetServerReconnectPending @ServerAddress nvarchar(63), @AlmostTimeLow int, @AlmostTimeHigh int AS DECLARE @ServerID int BEGIN TRANSACTION SET @ServerID = (SELECT MIN(ServerID) FROM TSSD_Servers WHERE ServerAddress = @ServerAddress) UPDATE TSSD_Servers SET AlmostInTimeLow = @AlmostTimeLow, AlmostInTimeHigh = @AlmostTimeHigh WHERE ServerID = @ServerID AND AlmostInTimeLow = 0 AND AlmostInTimeHigh = 0 COMMIT TRANSACTION GO