Click here to Skip to main content
15,886,780 members
Articles / Web Development / ASP.NET

Monitor your Web Services usage via .NET SOAP Extensions

Rate me:
Please Sign up or sign in to vote.
4.98/5 (48 votes)
6 Apr 2009CPOL27 min read 110.4K   3K   167  
This article demonstrates how you can monitor usage of your Web Services using .NET and SOAP Extensions.
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_WSDM_UserSubscription_WSDM_Services]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[WSDM_UserSubscription] DROP CONSTRAINT FK_WSDM_UserSubscription_WSDM_Services
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_WSDM_UserSubscription_WSDM_SubscriptionType]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[WSDM_UserSubscription] DROP CONSTRAINT FK_WSDM_UserSubscription_WSDM_SubscriptionType
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_WSDM_ServiceUsageTracking_WSDM_UserSubscription]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[WSDM_ServiceUsageTracking] DROP CONSTRAINT FK_WSDM_ServiceUsageTracking_WSDM_UserSubscription
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_WSDM_UserSubscription_WSDM_Users]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[WSDM_UserSubscription] DROP CONSTRAINT FK_WSDM_UserSubscription_WSDM_Users
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[proc_WSDM_GetLatestUsers]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[proc_WSDM_GetLatestUsers]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[proc_WSDM_PopulateStaticTables]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[proc_WSDM_PopulateStaticTables]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[proc_WSDM_ProcessUserSubscriptions]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[proc_WSDM_ProcessUserSubscriptions]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[proc_WSDM_RegisterUser]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[proc_WSDM_RegisterUser]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[proc_WSDM_SendRegistrationMail]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[proc_WSDM_SendRegistrationMail]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[proc_WSDM_SubscribeUser]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[proc_WSDM_SubscribeUser]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[proc_WSDM_UsageAccounting]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[proc_WSDM_UsageAccounting]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[proc_WSDM_ValidateUser]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[proc_WSDM_ValidateUser]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[WSDM_Configuration]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[WSDM_Configuration]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[WSDM_LoggerTable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[WSDM_LoggerTable]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[WSDM_ServiceUsageTracking]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[WSDM_ServiceUsageTracking]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[WSDM_Services]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[WSDM_Services]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[WSDM_SubscriptionType]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[WSDM_SubscriptionType]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[WSDM_UserSubscription]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[WSDM_UserSubscription]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[WSDM_Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[WSDM_Users]
GO

CREATE TABLE [dbo].[WSDM_Configuration] (
	[TrialVersionDays] [int] NOT NULL ,
	[TrialVersionCalls] [int] NOT NULL ,
	[PromoStartHour] [int] NOT NULL ,
	[PromoEndHour] [int] NOT NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[WSDM_LoggerTable] (
	[ID] [int] IDENTITY (1, 1) NOT NULL ,
	[LogTime] [datetime] NULL ,
	[Description] [varchar] (500) COLLATE SQL_Latin1_General_CP1_CI_AS  NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[WSDM_ServiceUsageTracking] (
	[UserSubscriptionID] [int] NOT NULL ,
	[TimeUsed] [datetime] NOT NULL ,
	[Success] [bit] NOT NULL ,
	[Description] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[WSDM_Services] (
	[ServiceID] [int] IDENTITY (1, 1) NOT NULL ,
	[ServiceName] [varchar] (40) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
	[ServiceDescription] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[WSDM_SubscriptionType] (
	[SubscriptionTypeID] [int] IDENTITY (1, 1) NOT NULL ,
	[SubscriptionType] [varchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
	[SubscriptionSubType] [varchar] (15) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
	[SubscriptionDescription] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[WSDM_UserSubscription] (
	[UserSubscriptionID] [int] IDENTITY (1, 1) NOT NULL ,
	[UserID] [int] NOT NULL ,
	[ServiceID] [int] NOT NULL ,
	[SubscriptionTypeID] [int] NOT NULL ,
	[SubscribedOn] [datetime] NOT NULL ,
	[SubscriptionParam] [int] NULL ,
	[Active] [bit] NOT NULL ,
	[SubscriptionDisabledAt] [datetime] NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[WSDM_Users] (
	[UserID] [int] IDENTITY (1, 1) NOT NULL ,
	[FirstName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
	[LastName] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
	[EmailAddress] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
	[RegistrationKey] [uniqueidentifier] NOT NULL ,
	[RegistrationDate] [datetime] NOT NULL 
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[WSDM_Services] WITH NOCHECK ADD 
	CONSTRAINT [PK_WSDM_Services] PRIMARY KEY  CLUSTERED 
	(
		[ServiceID]
	)  ON [PRIMARY] 
GO

ALTER TABLE [dbo].[WSDM_SubscriptionType] WITH NOCHECK ADD 
	CONSTRAINT [PK_WSDM_SubscriptionType] PRIMARY KEY  CLUSTERED 
	(
		[SubscriptionTypeID]
	)  ON [PRIMARY] 
GO

ALTER TABLE [dbo].[WSDM_UserSubscription] WITH NOCHECK ADD 
	CONSTRAINT [PK_WSDM_UserSubscription] PRIMARY KEY  CLUSTERED 
	(
		[UserSubscriptionID]
	)  ON [PRIMARY] 
GO

ALTER TABLE [dbo].[WSDM_Users] WITH NOCHECK ADD 
	CONSTRAINT [PK_WSDM_Users] PRIMARY KEY  CLUSTERED 
	(
		[UserID]
	)  ON [PRIMARY] 
GO

 CREATE  CLUSTERED  INDEX [IX_WSDM_ServiceUsageTracking] ON [dbo].[WSDM_ServiceUsageTracking]([UserSubscriptionID]) ON [PRIMARY]
GO

ALTER TABLE [dbo].[WSDM_LoggerTable] ADD 
	CONSTRAINT [DF__WSDM_Logg__LogTi__4C0144E4] DEFAULT (getdate()) FOR [LogTime]
GO

ALTER TABLE [dbo].[WSDM_Users] ADD 
	CONSTRAINT [IX_WSDM_First_Last_Email] UNIQUE  NONCLUSTERED 
	(
		[FirstName],
		[LastName],
		[EmailAddress]
	)  ON [PRIMARY] 
GO

ALTER TABLE [dbo].[WSDM_ServiceUsageTracking] ADD 
	CONSTRAINT [FK_WSDM_ServiceUsageTracking_WSDM_UserSubscription] FOREIGN KEY 
	(
		[UserSubscriptionID]
	) REFERENCES [dbo].[WSDM_UserSubscription] (
		[UserSubscriptionID]
	)
GO

ALTER TABLE [dbo].[WSDM_UserSubscription] ADD 
	CONSTRAINT [FK_WSDM_UserSubscription_WSDM_Services] FOREIGN KEY 
	(
		[ServiceID]
	) REFERENCES [dbo].[WSDM_Services] (
		[ServiceID]
	),
	CONSTRAINT [FK_WSDM_UserSubscription_WSDM_SubscriptionType] FOREIGN KEY 
	(
		[SubscriptionTypeID]
	) REFERENCES [dbo].[WSDM_SubscriptionType] (
		[SubscriptionTypeID]
	),
	CONSTRAINT [FK_WSDM_UserSubscription_WSDM_Users] FOREIGN KEY 
	(
		[UserID]
	) REFERENCES [dbo].[WSDM_Users] (
		[UserID]
	)
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

CREATE PROC proc_WSDM_GetLatestUsers
AS
BEGIN
	
	SELECT 	U.EmailAddress, S.ServiceName, ST.SubscriptionType, ST.SubscriptionSubType,
		US.SubscribedOn, US.SubscriptionParam, US.Active
	FROM WSDM_Users U
	INNER JOIN WSDM_UserSubscription US
	ON U.UserID = US.UserID
	INNER JOIN WSDM_Services S
	ON US.ServiceID = S.ServiceID
	INNER JOIN WSDM_SubscriptionType ST
	ON ST.SubscriptionTypeID = US.SubscriptionTypeID
	WHERE US.Active = 1
	ORDER BY US.SubscribedOn DESC

END

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO








CREATE         PROCEDURE proc_WSDM_PopulateStaticTables
AS
BEGIN

	-- Services 
	INSERT INTO WSDM_Services ( ServiceName, ServiceDescription )
	VALUES ('GetStockQuote', 'This service provides current stock quote value.')

	INSERT INTO WSDM_Services ( ServiceName, ServiceDescription )
	VALUES ('GetTemperatureByZipCode', 'This service provides temperature by zip code.')

	INSERT INTO WSDM_Services ( ServiceName, ServiceDescription )
	VALUES ('GetCurrencyExchangeRate', 'This service provides current exchange rate for foreign currency against US$.')


	-- Substription types
	INSERT INTO WSDM_SubscriptionType (SubscriptionType, SubscriptionSubType, SubscriptionDescription)
	VALUES ('Trial', 'None', 'Use of trial version of service for X number f days with Y calls at most per method')


	INSERT INTO WSDM_SubscriptionType (SubscriptionType, SubscriptionSubType, SubscriptionDescription)
	VALUES ('Full', 'Standard', 'Use of full version of service for Y number of calls')

	INSERT INTO WSDM_SubscriptionType (SubscriptionType, SubscriptionSubType, SubscriptionDescription)
	VALUES ('Full','Premium', 'Use of Full version of service for X number of days')


	INSERT INTO WSDM_SubscriptionType (SubscriptionType, SubscriptionSubType, SubscriptionDescription)
	VALUES ('Full', 'Promo', 'Use of full version of service for Y number of calls during pre-declared hours')

	-- Configuration parameters
	INSERT INTO WSDM_Configuration (TrialVersionDays, TrialVersionCalls, PromoStartHour, PromoEndHour)
	VALUES ( 3, 1000, 18, 23)

END











GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO




CREATE  PROC proc_WSDM_ProcessUserSubscriptions
AS
BEGIN

	DECLARE @NumOfDaysAllowedInTrial		INT
	DECLARE @NumOfCallsAllowedInTrial		INT

	SELECT @NumOfDaysAllowedInTrial = TrialVersionDays, @NumOfCallsAllowedInTrial = TrialVersionCalls
	FROM WSDM_Configuration
	
	UPDATE US
	SET Active = 0, SubscriptionDisabledAt = GetUTCDate()
	FROM WSDM_UserSubscription US
	INNER JOIN 
		(
		-- Get current active subscription under trial mode with either number of allowed calls 
		-- or number of days allowed in trial mode reached
		SELECT UserSubscriptionID
		FROM
			(
			SELECT UT.UserSubscriptionID, T.SubscribedOn, COUNT(*) CallsMadeSoFar, 
				DATEDIFF( dd, T.SubscribedOn, GetUTCDate() ) DaysUsedSoFar
			FROM WSDM_ServiceUsageTracking UT
			INNER JOIN
				(
				SELECT 	US.UserSubscriptionID, ST.SubscriptionType, ST.SubscriptionSubType, 
					US.SubscribedOn, US.SubscriptionParam, US.Active
				FROM WSDM_UserSubscription US
				INNER JOIN WSDM_SubscriptionType ST
				ON ST.SubscriptionTypeID = US.SubscriptionTypeID
				WHERE US.Active = 1 AND ST.SubscriptionType = 'TRIAL'
				) T
			ON UT.UserSubscriptionID = T.UserSubscriptionID
			GROUP BY UT.UserSubscriptionID, T.SubscribedOn
			) UG
		WHERE CallsMadeSoFar > @NumOfCallsAllowedInTrial OR DaysUsedSoFar > @NumOfDaysAllowedInTrial

		-- Get current active subscription under full mode with either standard or promo sub-type
		-- and number of calls subscribed for is reached
		UNION ALL
		SELECT UserSubscriptionID
		FROM
			(
			SELECT UT.UserSubscriptionID,  FSP.SubscriptionParam, COUNT(*) CallsMadeSoFar 
			FROM WSDM_ServiceUsageTracking UT
			INNER JOIN
				(
				SELECT 	US.UserSubscriptionID, US.SubscribedOn, US.SubscriptionParam
				FROM WSDM_UserSubscription US
				INNER JOIN WSDM_SubscriptionType ST
				ON ST.SubscriptionTypeID = US.SubscriptionTypeID
				WHERE US.Active = 1 AND ST.SubscriptionType = 'FULL' 
				AND ( ST.SubscriptionSubType = 'Standard' OR ST.SubscriptionSubType = 'Promo' )
				) FSP
			ON UT.UserSubscriptionID = FSP.UserSubscriptionID
			GROUP BY UT.UserSubscriptionID, FSP.SubscriptionParam
			) UG
		WHERE CallsMadeSoFar >=  SubscriptionParam

		-- Get current active subscription under full mode with premium service
		-- and number of days subscribed for is reached
		UNION ALL
		SELECT UserSubscriptionID
		FROM
			(
			SELECT 	US.UserSubscriptionID, DATEDIFF( dd, US.SubscribedOn, GetUTCDate() ) DaysUsedSoFar,
				US.SubscriptionParam DaysAllowed
			FROM WSDM_UserSubscription US
			INNER JOIN WSDM_SubscriptionType ST
			ON ST.SubscriptionTypeID = US.SubscriptionTypeID
			WHERE US.Active = 1 AND ST.SubscriptionType = 'FULL' 
			AND ST.SubscriptionSubType = 'Premium'
			) UG
		WHERE DaysUsedSoFar >=  DaysAllowed
		) EX
	ON US.UserSubscriptionID = EX.UserSubscriptionID


END



GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO






CREATE     PROCEDURE proc_WSDM_RegisterUser
	@FirstName		VARCHAR(50),
	@LastName		VARCHAR(50),
	@EMailAddress		VARCHAR(50)
AS
BEGIN

	INSERT INTO WSDM_Users (FirstName, LastName, EmailAddress, RegistrationKey, RegistrationDate)
	VALUES ( @FirstName, @LastName, @EMailAddress, NewID(), GetUTCDate() )

	SELECT @@IDENTITY

END







GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO





CREATE PROCEDURE proc_WSDM_SendRegistrationMail
	@UserID		INT
AS
BEGIN

	DECLARE @Subject	VARCHAR(100)
	DECLARE @Message	VARCHAR(2000)
	DECLARE @Email		VARCHAR(100)
	DECLARE @FirstName	VARCHAR(50)
	DECLARE @LastName	VARCHAR(50)
	DECLARE @RegKey		UNIQUEIDENTIFIER


	SELECT @FirstName = FirstName, @LastName = LastName, @Email = EmailAddress, @RegKey = RegistrationKey
	FROM WSDM_Users
	WHERE UserID = @UserID


	SET @Subject = 'Registration for using Web-Services'
	SET @Message = 'Hi ' + @LastName +  ', ' + @FirstName + CHAR(13) + CHAR(10)
	SET @Message = @Message + 'You have been successfully registered. ' + CHAR(13) + CHAR(10)
	SET @Message = @Message + 'You Registration key is  ' + CONVERT(VARCHAR(50), @RegKey) + CHAR(13) + CHAR(10)
	SET @Message = @Message + 'Regards ' + CHAR(13) + CHAR(10)
	SET @Message = @Message + 'Web Master ' + CHAR(13) + CHAR(10)
	
	--PRINT @Message

	EXEC master.dbo.xp_sendmail @recipients = @Email, 
	   @message = @Message,
	   @subject = @Subject
	


END



GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO



CREATE      PROCEDURE proc_WSDM_SubscribeUser
	@RegKey				VARCHAR(50),
	@ServiceName			VARCHAR(50),
	@SubscriptionType		VARCHAR(15),
	@SubscriptionSubType		VARCHAR(10),
	@SubscriptionParam		INT
AS
BEGIN
	DECLARE @UserID			INT
	DECLARE @ServiceID		INT
	DECLARE @SubscriptionTypeID	INT
	
	DECLARE @LogMessage	VARCHAR(500)
	SET @LogMessage = 'proc_WSDM_SubscribeUser: Subscription request for RegKey = ' + @RegKey + ', ServiceName = ' + @ServiceName
	SET @LogMessage = @LogMessage + ', SubscriptionType = ' + @SubscriptionType + ', SubscriptionSubType = ' + @SubscriptionSubType 
	SET @LogMessage = @LogMessage + ', SubscriptionParam = ' + CONVERT(VARCHAR(5), @SubscriptionParam)
	INSERT INTO WSDM_LoggerTable (Description) VALUES (@LogMessage)

	-- Get User
	SELECT @UserID = UserID
	FROM WSDM_Users
	WHERE CONVERT(VARCHAR(50), RegistrationKey) = @RegKey

	PRINT @UserID
	IF @UserID IS NULL
	BEGIN
		RAISERROR('Invalid Registration Key', 18, 1, 18)
		PRINT 'Invalid User'
		 RETURN 5001
	END

	-- Get Service Type
	SELECT @ServiceID = ServiceID
	FROM WSDM_Services
	WHERE ServiceName = @ServiceName

	PRINT @ServiceID
	IF @ServiceID IS NULL
	BEGIN
		PRINT 'Invalid Service'
		 RETURN 5002
	END

	-- Get subscription ID
	SELECT @SubscriptionTypeID = SubscriptionTypeID
	FROM WSDM_SubscriptionType
	WHERE SubscriptionType = @SubscriptionType AND SubscriptionSubType = @SubscriptionSubType 

	PRINT @SubscriptionTypeID
	IF @SubscriptionTypeID IS NULL
	BEGIN
		PRINT 'Invalid SubscriptionTypeID'
		 RETURN 5003
	END


	DECLARE @PreviousID INT

	SELECT @PreviousID = UserSubscriptionID 
	FROM WSDM_UserSubscription
	WHERE UserID = @UserID AND ServiceID = @ServiceID AND SubscriptionTypeID = @SubscriptionTypeID AND Active = 1

	SET @LogMessage = 'previous service id found to be ' + CONVERT(VARCHAR(5), @PreviousID)
	INSERT INTO WSDM_LoggerTable (Description) VALUES (@LogMessage)

	IF @PreviousID IS NOT NULL
	BEGIN
		UPDATE WSDM_UserSubscription
		SET Active = 0, SubscriptionDisabledAt = GetUTCDate()
		WHERE UserSubscriptionID = @PreviousID
	END

	INSERT INTO WSDM_UserSubscription ( UserID, ServiceID, SubscriptionTypeID, SubscribedOn,  SubscriptionParam, Active)
	VALUES (@UserID, @ServiceID, @SubscriptionTypeID, GetUTCDate(),  @SubscriptionParam, 1)

	SELECT @@IDENTITY AS SubscriptionID

END






GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO





CREATE          PROCEDURE proc_WSDM_UsageAccounting
	@ServiceName			VARCHAR(25),
	@RegKey				VARCHAR(50)
AS
BEGIN

	DECLARE @LogMessage	VARCHAR(100)
	SET @LogMessage = 'Accouting Request for RegKey = ' + @RegKey + ', ServiceName = ' + @ServiceName
	INSERT INTO WSDM_LoggerTable (Description) VALUES (@LogMessage)


	DECLARE @ServiceID			INT
	DECLARE @UserID				INT
	DECLARE @UserSubscriptionID		INT
	DECLARE @SubscriptionTypeID		INT
	DECLARE @SubscriptionType		VARCHAR(10)
	DECLARE @SubscriptionSubType		VARCHAR(10)
	DECLARE @SubscriptionStartDate		DATETIME
	DECLARE @SubscriptionParam		INT


	-- Get UserID
	SELECT @UserID = UserID 
	FROM WSDM_Users
	WHERE CONVERT(VARCHAR(50), RegistrationKey) = @RegKey

	IF @UserID IS NULL
	BEGIN
		-- Invalid license key
		INSERT INTO WSDM_LoggerTable (Description) VALUES ('Invalid User')
		RETURN 5001
	END

	-- Get ServiceID
	SELECT @ServiceID = ServiceID 
	FROM WSDM_Services
	WHERE ServiceName = @ServiceName

	IF @ServiceID IS NULL
	BEGIN
		-- Invalid license key
		INSERT INTO WSDM_LoggerTable (Description) VALUES ('Invalid ServiceName')
		RETURN 5002
	END

	-- See if user for this particular method has a valid subscription
	SELECT @UserSubscriptionID = UserSubscriptionID
	FROM WSDM_UserSubscription
	WHERE UserID = @Userid AND ServiceID = @ServiceID AND Active = 1

	IF @UserSubscriptionID IS NULL
	BEGIN
		-- User does not have any valid subscription
		INSERT INTO WSDM_LoggerTable (Description) VALUES ('No valid subscription exists')
		RETURN 5004
	END

	INSERT INTO WSDM_ServiceUsageTracking
	VALUES ( @UserSubscriptionID, CURRENT_TIMESTAMP, 1, 'Success')

END














GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO






CREATE           PROCEDURE proc_WSDM_ValidateUser
	@ServiceName			VARCHAR(25),
	@RegKey				VARCHAR(50)
AS
BEGIN
	DECLARE @ServiceID			INT
	DECLARE @UserID				INT
	DECLARE @UserSubscriptionID		INT
	DECLARE @SubscriptionTypeID		INT
	DECLARE @SubscriptionType		VARCHAR(10)
	DECLARE @SubscriptionSubType		VARCHAR(10)
	DECLARE @SubscriptionStartDate		DATETIME
	DECLARE @SubscriptionParam		INT
	DECLARE @NumOfCallsMadeSoFar		INT
	DECLARE @NumOfHoursUsedSoFar		INT		

	DECLARE @bExpired			BIT

	SET @bExpired = 0

	DECLARE @LogMessage	VARCHAR(100)
	SET @LogMessage = 'Validation Request for RegKey = ' + @RegKey + ', ServiceName = ' + @ServiceName
	INSERT INTO WSDM_LoggerTable (Description) VALUES (@LogMessage)

	-- Get UserID
	SELECT @UserID = UserID 
	FROM WSDM_Users
	WHERE CONVERT(VARCHAR(50), RegistrationKey) = @RegKey

	IF @UserID IS NULL
	BEGIN
		-- Invalid license key
		INSERT INTO WSDM_LoggerTable (Description) VALUES ('Invalid User')
		RETURN 5001
	END

	-- Get ServiceID
	SELECT @ServiceID = ServiceID 
	FROM WSDM_Services
	WHERE ServiceName = @ServiceName

	IF @ServiceID IS NULL
	BEGIN
		-- Invalid license key
		INSERT INTO WSDM_LoggerTable (Description) VALUES ('Invalid ServiceName')
		RETURN 5002
	END


	SELECT @UserSubscriptionID = UserSubscriptionID, @SubscriptionTypeID = SubscriptionTypeID
	FROM WSDM_UserSubscription
	WHERE UserID = @Userid AND ServiceID = @ServiceID AND Active = 1

	IF @UserSubscriptionID IS NULL
	BEGIN
		-- user not subscribed for this service
		INSERT INTO WSDM_LoggerTable (Description) VALUES ('Invalid subscription')
		RETURN 5003
	END
	
	SELECT @SubscriptionType = SubscriptionType, @SubscriptionSubType = SubscriptionSubType 
	FROM WSDM_SubscriptionType
	WHERE SubscriptionTypeID = @SubscriptionTypeID


	IF ( @SubscriptionType = 'TRIAL' )
	BEGIN
		PRINT 'TRIAL VERSION'

		--Read Trial Configuration
		DECLARE @TrialDaysLimit		INT
		DECLARE @TrialCallsLimit	INT

		SELECT @TrialDaysLimit = TrialVersionDays, @TrialCallsLimit = TrialVersionCalls
		FROM WSDM_Configuration

		-- Number of days past for user so far in trial mode
		SELECT @NumOfHoursUsedSoFar = DATEDIFF(hh, SubscribedOn, GetUTCDate() )
		FROM WSDM_UserSubscription
		WHERE UserSubscriptionID = @UserSubscriptionID 
		
		print @NumOfHoursUsedSoFar

		-- Number of calls user have made so far for this method
		SELECT @NumOfCallsMadeSoFar = COUNT(*) 
		FROM WSDM_ServiceUsageTracking
		WHERE  UserSubscriptionID = @UserSubscriptionID AND Success = 1

		IF @NumOfHoursUsedSoFar > @TrialDaysLimit*24 OR @NumOfCallsMadeSoFar > @TrialCallsLimit
		BEGIN
			SET @bExpired = 1
		END
		
	END
	ELSE IF ( @SubscriptionType = 'FULL' )
	BEGIN
		DECLARE @NumOfCallsAllowed 	INT
		DECLARE @NumOfHoursAllowed	INT
		DECLARE @PromoStartHour		INT
		DECLARE @PromoEndHour		INT

		IF @SubscriptionSubType = 'Standard' 
		BEGIN
			-- Calls allowed
			SELECT @NumOfCallsAllowed = SubscriptionParam
			FROM WSDM_UserSubscription
			WHERE UserSubscriptionID = @UserSubscriptionID 

			-- Calls made so far
			SELECT @NumOfCallsMadeSoFar = COUNT(*) 
			FROM WSDM_ServiceUsageTracking
			WHERE  UserSubscriptionID = @UserSubscriptionID AND Success = 1
		
			IF ( @NumOfCallsMadeSoFar >= @NumOfCallsAllowed )
			BEGIN
				SET @bExpired = 1
			END

		END 
		ELSE IF @SubscriptionSubType = 'Premium' 
		BEGIN
			-- Calls allowed
			SELECT @NumOfHoursAllowed = SubscriptionParam*24
			FROM WSDM_UserSubscription
			WHERE UserSubscriptionID = @UserSubscriptionID 

			-- Days used so far
			SELECT @NumOfHoursUsedSoFar = DATEDIFF(hh, SubscribedOn, GetUTCDate() )
			FROM WSDM_UserSubscription
			WHERE UserSubscriptionID = @UserSubscriptionID 

			IF ( @NumOfHoursUsedSoFar >= @NumOfHoursAllowed  )
			BEGIN

				SET @bExpired = 1
			END

		END 
		ELSE IF @SubscriptionSubType = 'Promo' 
		BEGIN
			SELECT @PromoStartHour = PromoStartHour, @PromoEndHour = PromoEndHour 
			FROM WSDM_Configuration

			-- First check if current hour falls in promo usage hours
			IF ( DATEPART(hh, GetUTCDate()) BETWEEN @PromoStartHour AND @PromoEndHour ) 
			BEGIN
				-- Calls allowed
				SELECT @NumOfCallsAllowed = SubscriptionParam
				FROM WSDM_UserSubscription
				WHERE UserSubscriptionID = @UserSubscriptionID 
	
				-- Calls made so far
				SELECT @NumOfCallsMadeSoFar = COUNT(*) 
				FROM WSDM_ServiceUsageTracking
				WHERE  UserSubscriptionID = @UserSubscriptionID AND Success = 1
			
				IF ( @NumOfCallsMadeSoFar >= @NumOfCallsAllowed )
				BEGIN
					SET @bExpired = 1
				END
			END
			ELSE
			BEGIN
				SET @bExpired = 1
			END
		END 
	END



	IF @bExpired = 1
	BEGIN
		-- User subscription has expired
		RETURN 5005
	END
	ELSE
	BEGIN
		-- Valid user
		INSERT INTO WSDM_LoggerTable (Description) VALUES ('User validated')
		RETURN 0
	END


END














GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

-- Script generated on 12/5/2004 11:57 PM
-- By: sa
-- Server: (LOCAL)

BEGIN TRANSACTION            
  DECLARE @JobID BINARY(16)  
  DECLARE @ReturnCode INT    
  SELECT @ReturnCode = 0     
IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'[Uncategorized (Local)]') < 1 
  EXECUTE msdb.dbo.sp_add_category @name = N'[Uncategorized (Local)]'
  -- Delete the job with the same name (if it exists)
  SELECT @JobID = job_id     
  FROM   msdb.dbo.sysjobs    
  WHERE (name = N'Process User Subscriptions')       
  IF (@JobID IS NOT NULL)    
  BEGIN  
  -- Check if the job is a multi-server job  
  IF (EXISTS (SELECT  * 
              FROM    msdb.dbo.sysjobservers 
              WHERE   (job_id = @JobID) AND (server_id <> 0))) 
  BEGIN 
    -- There is, so abort the script 
    RAISERROR (N'Unable to import job ''Process User Subscriptions'' since there is already a multi-server job with this name.', 16, 1) 
    GOTO QuitWithRollback  
  END 
  ELSE 
    -- Delete the [local] job 
    EXECUTE msdb.dbo.sp_delete_job @job_name = N'Process User Subscriptions' 
    SELECT @JobID = NULL
  END 

BEGIN 
  -- Add the job
  EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT , @job_name = N'Process User Subscriptions', @owner_login_name = N'sa', @description = N'No description available.', @category_name = N'[Uncategorized (Local)]', @enabled = 1, @notify_level_email = 0, @notify_level_page = 0, @notify_level_netsend = 0, @notify_level_eventlog = 2, @delete_level= 0
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  -- Add the job steps
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id = 1, @step_name = N'Process User Subscriptions', @command = N'EXEC proc_WSDM_ProcessUserSubscriptions', @database_name = N'WSDM_DB', @server = N'', @database_user_name = N'', @subsystem = N'TSQL', @cmdexec_success_code = 0, @flags = 0, @retry_attempts = 0, @retry_interval = 1, @output_file_name = N'', @on_success_step_id = 0, @on_success_action = 1, @on_fail_step_id = 0, @on_fail_action = 2
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID, @start_step_id = 1 

  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  -- Add the job schedules
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name = N'Process User Subscriptions', @enabled = 1, @freq_type = 4, @active_start_date = 20041205, @active_start_time = 0, @freq_interval = 1, @freq_subday_type = 8, @freq_subday_interval = 1, @freq_relative_interval = 0, @freq_recurrence_factor = 0, @active_end_date = 99991231, @active_end_time = 235959
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 
  -- Add the Target Servers
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID, @server_name = N'(local)' 
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback 

END
COMMIT TRANSACTION          
GOTO   EndSave              
QuitWithRollback:
  IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION 
EndSave: 


By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Architect
Canada Canada
Kamran Bilgrami is a seasoned software developer with background in designing mission critical applications for carrier grade telecom networks. More recently he is involved in design & development of real-time biometric based security solutions. His areas of interest include .NET, software security, mathematical modeling and patterns.

He blogs regularly at http://WindowsDebugging.Wordpress.com

Comments and Discussions