304 lines
10 KiB
Transact-SQL
304 lines
10 KiB
Transact-SQL
/****************************************************************************/
|
|
-- 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
|
|
|