20 Ocak 2014 Pazartesi

Session Verileri Hosting Üzerindeki MSSQL Server Üzerinde Kullanmak

Merhaba Arkadaşlar.
Session verilerini MSSQL server üzerinde kullanmak sitemizde ciddi bir performans artışı ve login sürelerinin istediğiniz ölçüde uzatılmasını sağlar.
Daha önceki yazılarımızda asp.net session verileri mssql üzerinde kullanmayı anlatmıştık fakat sitemiz bir hosting kullanıyorsa kafamıza göre istediğimiz veritabanını ve iznini kullanamamaktayız.
Bu nedenle aşağıdaki adımları izleyerek hosting üzerindeki bir çok sys fonksiyonunu kullanmadan kendi başımıza session verilerini kurabiliriz.
1ADIM :Session databasini kurmak.
-önce hosting panelinden veritabanıadı , kullanıcı adı ve şifre bilgilerini oluşturmalız.
-daha sonra hangi framework kullanıyorsak  onun altındaki dosyayı çalıştırmalız
C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regsql.exe -S veritabanı_adı_adresi
 -U kullanıcı_adı -P sifre -A all -d database_adı
-----------------------------------------------------------------------------------------------------
Microsoft (R) ASP.NET SQL Kayıt Aracı sürüm 4.0.30319.18408
SQL sunucusuna ASP.NET özelliklerini yüklemek veya bunları kaldırmak için kullan
ılan yönetim yardımcı programı.
Telif hakkı (C) Microsoft Corporation. Tüm hakları saklıdır.
Bu özellikleri ekleme işlemini başlat:
Membership
Profile
RoleManager
Personalization
SqlWebEventProvider
.............
Tamamlandı.
--------------------------------------------------------------------------------------------------------
Şeklinde veritabanını istediğimiz şekilde oluşturuyoruz.
Daha sonra web.config içine aşağıdaki satırları eklemelisiniz (system.web içine eklenmeli)
  <system.web>
<sessionState mode="SQLServer" sqlConnectionString="Data Source=Database_adı;Initial Catalog=veritabanı;User ID=kullanıcı;Password=şifre" cookieless="false" timeout="120" />
  </system.web>

eğer hosting firmanız oluşturduğunuz veritabanına db_owner yetkisini vermişse herhangi bir sorun yaşamadan siteniz hatasız açılacaktır fakat db_owner yetkisi sa kullanıcında ise ve hosting firmanız yetkiyi vermezse ozaman MSSQL server bazı fonksiyonlarını bizim elle eklememiz gerekli.Bu fonksiyonların başında TempGetVersiyon fonksiyonu bulunmakta.

Aşağıda vermiş olduğum bu stored procedure tüm ihtiyaç duyulan fonksiyonları kendisi eklemekte.
Bu stored procedure Microsoft SQL server Management studio ile çalıştırıp hata almamışsanız.Artık session verilerinizi veritabanı üzerinde tutuyorsunuz demektir.

Türkçe hiç bir yerde bu konuyla ilgili bilgi bulamadığım için ekliyorum.2 günlük hata ayıklamının sonucu yazılmıştır.Umarım işinize yarar.


/*********************************************************************
 InstallSqlState.SQL

 Installs the tables, and stored procedures necessary for
 supporting ASP.NET session state on SQL Azure.

 Copyright Microsoft, Inc.
 All Rights Reserved.

 *********************************************************************/

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[happylifesessionTempSessions]') AND type in (N'U'))
DROP TABLE [dbo].[happylifesessionTempSessions]
GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[happylifesessionTempApplications]') AND type in (N'U'))
DROP TABLE [dbo].[happylifesessionTempApplications]
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'GetMajorVersion') AND (type = 'P')))
DROP PROCEDURE [dbo].GetMajorVersion
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'CreateTempTables') AND (type = 'P')))
DROP PROCEDURE [dbo].CreateTempTables
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetVersion') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetVersion
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'GetHashCode') AND (type = 'P')))
DROP PROCEDURE [dbo].GetHashCode
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetAppID') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetAppID
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetStateItem') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetStateItem
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetStateItem2') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetStateItem2
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetStateItem3') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetStateItem3
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetStateItemExclusive') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetStateItemExclusive
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetStateItemExclusive2') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetStateItemExclusive2
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempGetStateItemExclusive3') AND (type = 'P')))
DROP PROCEDURE [dbo].TempGetStateItemExclusive3
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempReleaseStateItemExclusive') AND (type = 'P')))
DROP PROCEDURE [dbo].TempReleaseStateItemExclusive
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempInsertUninitializedItem') AND (type = 'P')))
DROP PROCEDURE [dbo].TempInsertUninitializedItem
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempInsertStateItemShort') AND (type = 'P')))
DROP PROCEDURE [dbo].TempInsertStateItemShort
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempInsertStateItemLong') AND (type = 'P')))
DROP PROCEDURE [dbo].TempInsertStateItemLong
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempUpdateStateItemShort') AND (type = 'P')))
DROP PROCEDURE [dbo].TempUpdateStateItemShort
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempUpdateStateItemShortNullLong') AND (type = 'P')))
DROP PROCEDURE [dbo].TempUpdateStateItemShortNullLong
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempUpdateStateItemLong') AND (type = 'P')))
DROP PROCEDURE [dbo].TempUpdateStateItemLong
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempUpdateStateItemLongNullShort') AND (type = 'P')))
DROP PROCEDURE [dbo].TempUpdateStateItemLongNullShort
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempRemoveStateItem') AND (type = 'P')))
DROP PROCEDURE [dbo].TempRemoveStateItem
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'TempResetTimeout') AND (type = 'P')))
DROP PROCEDURE [dbo].TempResetTimeout
GO

IF (EXISTS (SELECT name FROM sysobjects WHERE (name = N'DeleteExpiredSessions') AND (type = 'P')))
DROP PROCEDURE [dbo].DeleteExpiredSessions
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.GetMajorVersion
@@ver int OUTPUT
AS
BEGIN
DECLARE @version nchar(100)
DECLARE @dot int
DECLARE @hyphen int
DECLARE @SqlToExec nchar(4000)

SELECT @@ver = 7
SELECT @version = @@Version
SELECT @hyphen = CHARINDEX(N' - ', @version)
IF (NOT(@hyphen IS NULL) AND @hyphen > 0)
BEGIN
SELECT @hyphen = @hyphen + 3
SELECT @dot = CHARINDEX(N'.', @version, @hyphen)
IF (NOT(@dot IS NULL) AND @dot > @hyphen)
BEGIN
SELECT @version = SUBSTRING(@version, @hyphen, @dot - @hyphen)
SELECT @@ver = CONVERT(int, @version)
END
END
END
GO

/*****************************************************************************/


CREATE PROCEDURE dbo.CreateTempTables
AS
CREATE TABLE [happylifesession].dbo.happylifesessionTempSessions (
SessionId  nvarchar(88) NOT NULL PRIMARY KEY,
Created datetime NOT NULL DEFAULT GETUTCDATE(),
Expires datetime NOT NULL,
LockDate datetime NOT NULL,
LockDateLocal  datetime NOT NULL,
LockCookie int NOT NULL,
Timeout int NOT NULL,
Locked bit NOT NULL,
SessionItemShort VARBINARY(7000) NULL,
SessionItemLong image  NULL,
Flags  int NOT NULL DEFAULT 0,
)

CREATE NONCLUSTERED INDEX Index_Expires ON [happylifesession].dbo.happylifesessionTempSessions(Expires)

CREATE TABLE [happylifesession].dbo.happylifesessionTempApplications (
AppId  int NOT NULL PRIMARY KEY,
AppName char(280)  NOT NULL,
)

CREATE NONCLUSTERED INDEX Index_AppName ON [happylifesession].dbo.happylifesessionTempApplications(AppName)

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempGetVersion
@ver char(10) OUTPUT
AS
SELECT @ver = "2"
RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.GetHashCode
@input varchar(280),
@hash int OUTPUT
AS
/*
 This sproc is based on this C# hash function:

int GetHashCode(string s)
{
int hash = 5381;
int len = s.Length;

for (int i = 0; i < len; i++) {
int c = Convert.ToInt32(s[i]);
hash = ((hash << 5) + hash) ^ c;
}

return hash;
}

However, SQL 7 doesn't provide a 32-bit integer
type that allows rollover of bits, we have to
divide our 32bit integer into the upper and lower
16 bits to do our calculation.
*/

DECLARE @hi_16bit  int
DECLARE @lo_16bit  int
DECLARE @hi_t  int
DECLARE @lo_t  int
DECLARE @len int
DECLARE @i int
DECLARE @c int
DECLARE @carry int

SET @hi_16bit = 0
SET @lo_16bit = 5381

SET @len = DATALENGTH(@input)
SET @i = 1

WHILE (@i <= @len)
BEGIN
SET @c = ASCII(SUBSTRING(@input, @i, 1))

/* Formula:
 hash = ((hash << 5) + hash) ^ c */

/* hash << 5 */
SET @hi_t = @hi_16bit * 32 /* high 16bits << 5 */
SET @hi_t = @hi_t & 0xFFFF /* zero out overflow */

SET @lo_t = @lo_16bit * 32 /* low 16bits << 5 */

SET @carry = @lo_16bit & 0x1F0000 /* move low 16bits carryover to hi 16bits */
SET @carry = @carry / 0x10000 /* >> 16 */
SET @hi_t = @hi_t + @carry
SET @hi_t = @hi_t & 0xFFFF /* zero out overflow */

/* + hash */
SET @lo_16bit = @lo_16bit + @lo_t
SET @hi_16bit = @hi_16bit + @hi_t + (@lo_16bit / 0x10000)
/* delay clearing the overflow */

/* ^c */
SET @lo_16bit = @lo_16bit ^ @c

/* Now clear the overflow bits */
SET @hi_16bit = @hi_16bit & 0xFFFF
SET @lo_16bit = @lo_16bit & 0xFFFF

SET @i = @i + 1
END

/* Do a sign extension of the hi-16bit if needed */
IF (@hi_16bit & 0x8000 <> 0)
SET @hi_16bit = 0xFFFF0000 | @hi_16bit

/* Merge hi and lo 16bit back together */
SET @hi_16bit = @hi_16bit * 0x10000 /* << 16 */
SET @hash = @hi_16bit | @lo_16bit

RETURN 0
GO

/*****************************************************************************/

DECLARE @cmd nchar(4000)

SET @cmd = N'
CREATE PROCEDURE dbo.TempGetAppID
@appName varchar(280),
@appId int OUTPUT
AS
SET @appName = LOWER(@appName)
SET @appId = NULL

SELECT @appId = AppId
FROM [happylifesession].dbo.happylifesessionTempApplications
WHERE AppName = @appName

IF @appId IS NULL BEGIN
BEGIN TRAN

SELECT @appId = AppId
FROM [happylifesession].dbo.happylifesessionTempApplications WITH (TABLOCKX)
WHERE AppName = @appName

IF @appId IS NULL
BEGIN
EXEC GetHashCode @appName, @appId OUTPUT

INSERT [happylifesession].dbo.happylifesessionTempApplications
VALUES
(@appId, @appName)

IF @@ERROR = 2627
BEGIN
DECLARE @dupApp varchar(280)

SELECT @dupApp = RTRIM(AppName)
FROM [happylifesession].dbo.happylifesessionTempApplications
WHERE AppId = @appId

RAISERROR(''SQL session state fatal error: hash-code collision between applications ''''%s'''' and ''''%s''''. Please rename the 1st application to resolve the problem.'',
18, 1, @appName, @dupApp)
END
END

COMMIT
END

RETURN 0'
EXEC(@cmd)
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempGetStateItem
@id nvarchar(88),
@itemShort varbinary(7000) OUTPUT,
@locked bit OUTPUT,
@lockDate  datetime OUTPUT,
@lockCookie int OUTPUT
AS
DECLARE @length AS int
DECLARE @now AS datetime
SET @now = GETUTCDATE()

UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, @now),
@locked = Locked,
@lockDate = LockDateLocal,
@lockCookie = LockCookie,
@itemShort = CASE @locked
WHEN 0 THEN SessionItemShort
ELSE NULL
END,
@length = CASE @locked
WHEN 0 THEN DATALENGTH(SessionItemLong)
ELSE NULL
END
WHERE SessionId = @id

IF @length IS NOT NULL BEGIN
SELECT [SessionItemLong] FROM [happylifesession].dbo.happylifesessionTempSessions WHERE SessionId = @id
END

RETURN 0

GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempGetStateItem2
@id nvarchar(88),
@itemShort varbinary(7000) OUTPUT,
@locked bit OUTPUT,
@lockAge int OUTPUT,
@lockCookie int OUTPUT
AS
DECLARE @length AS int
DECLARE @now AS datetime
SET @now = GETUTCDATE()

UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, @now),
@locked = Locked,
@lockAge = DATEDIFF(second, LockDate, @now),
@lockCookie = LockCookie,
@itemShort = CASE @locked
WHEN 0 THEN SessionItemShort
ELSE NULL
END,
@length = CASE @locked
WHEN 0 THEN DATALENGTH(SessionItemLong)
ELSE NULL
END
WHERE SessionId = @id

IF @length IS NOT NULL BEGIN
SELECT [SessionItemLong] FROM [happylifesession].dbo.happylifesessionTempSessions WHERE SessionId = @id
END

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempGetStateItem3
@id nvarchar(88),
@itemShort varbinary(7000) OUTPUT,
@locked bit OUTPUT,
@lockAge int OUTPUT,
@lockCookie int OUTPUT,
@actionFlags int OUTPUT
AS
DECLARE @length AS int
DECLARE @now AS datetime
SET @now = GETUTCDATE()

UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, @now),
@locked = Locked,
@lockAge = DATEDIFF(second, LockDate, @now),
@lockCookie = LockCookie,
@itemShort = CASE @locked
WHEN 0 THEN SessionItemShort
ELSE NULL
END,
@length = CASE @locked
WHEN 0 THEN DATALENGTH(SessionItemLong)
ELSE NULL
END,
/* If the Uninitialized flag (0x1) if it is set,
 remove it and return InitializeItem (0x1) in actionFlags */
Flags = CASE
WHEN (Flags & 1) <> 0 THEN (Flags & ~1)
ELSE Flags
END,
@actionFlags = CASE
WHEN (Flags & 1) <> 0 THEN 1
ELSE 0
END
WHERE SessionId = @id

IF @length IS NOT NULL BEGIN
SELECT [SessionItemLong] FROM [happylifesession].dbo.happylifesessionTempSessions WHERE SessionId = @id
END

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempGetStateItemExclusive
@id nvarchar(88),
@itemShort varbinary(7000) OUTPUT,
@locked bit OUTPUT,
@lockDate  datetime OUTPUT,
@lockCookie int OUTPUT
AS
DECLARE @length AS int
DECLARE @now AS datetime
DECLARE @nowLocal AS datetime

SET @now = GETUTCDATE()
SET @nowLocal = GETDATE()

UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, @now),
LockDate = CASE Locked
WHEN 0 THEN @now
ELSE LockDate
END,
@lockDate = LockDateLocal = CASE Locked
WHEN 0 THEN @nowLocal
ELSE LockDateLocal
END,
@lockCookie = LockCookie = CASE Locked
WHEN 0 THEN LockCookie + 1
ELSE LockCookie
END,
@itemShort = CASE Locked
WHEN 0 THEN SessionItemShort
ELSE NULL
END,
@length = CASE Locked
WHEN 0 THEN DATALENGTH(SessionItemLong)
ELSE NULL
END,
@locked = Locked,
Locked = 1
WHERE SessionId = @id

IF @length IS NOT NULL BEGIN
SELECT [SessionItemLong] FROM [happylifesession].dbo.happylifesessionTempSessions WHERE SessionId = @id
END

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempGetStateItemExclusive2
@id nvarchar(88),
@itemShort varbinary(7000) OUTPUT,
@locked bit OUTPUT,
@lockAge int OUTPUT,
@lockCookie int OUTPUT
AS
DECLARE @length AS int
DECLARE @now AS datetime
DECLARE @nowLocal AS datetime

SET @now = GETUTCDATE()
SET @nowLocal = GETDATE()

UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, @now),
LockDate = CASE Locked
WHEN 0 THEN @now
ELSE LockDate
END,
LockDateLocal = CASE Locked
WHEN 0 THEN @nowLocal
ELSE LockDateLocal
END,
@lockAge = CASE Locked
WHEN 0 THEN 0
ELSE DATEDIFF(second, LockDate, @now)
END,
@lockCookie = LockCookie = CASE Locked
WHEN 0 THEN LockCookie + 1
ELSE LockCookie
END,
@itemShort = CASE Locked
WHEN 0 THEN SessionItemShort
ELSE NULL
END,
@length = CASE Locked
WHEN 0 THEN DATALENGTH(SessionItemLong)
ELSE NULL
END,
@locked = Locked,
Locked = 1
WHERE SessionId = @id

IF @length IS NOT NULL BEGIN
SELECT [SessionItemLong] FROM [happylifesession].dbo.happylifesessionTempSessions WHERE SessionId = @id
END

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempGetStateItemExclusive3
@id nvarchar(88),
@itemShort varbinary(7000) OUTPUT,
@locked bit OUTPUT,
@lockAge int OUTPUT,
@lockCookie int OUTPUT,
@actionFlags int OUTPUT
AS
DECLARE @length AS int
DECLARE @now AS datetime
DECLARE @nowLocal AS datetime

SET @now = GETUTCDATE()
SET @nowLocal = GETDATE()

UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, @now),
LockDate = CASE Locked
WHEN 0 THEN @now
ELSE LockDate
END,
LockDateLocal = CASE Locked
WHEN 0 THEN @nowLocal
ELSE LockDateLocal
END,
@lockAge = CASE Locked
WHEN 0 THEN 0
ELSE DATEDIFF(second, LockDate, @now)
END,
@lockCookie = LockCookie = CASE Locked
WHEN 0 THEN LockCookie + 1
ELSE LockCookie
END,
@itemShort = CASE Locked
WHEN 0 THEN SessionItemShort
ELSE NULL
END,
@length = CASE Locked
WHEN 0 THEN DATALENGTH(SessionItemLong)
ELSE NULL
END,
@locked = Locked,
Locked = 1,

/* If the Uninitialized flag (0x1) if it is set,
 remove it and return InitializeItem (0x1) in actionFlags */
Flags = CASE
WHEN (Flags & 1) <> 0 THEN (Flags & ~1)
ELSE Flags
END,
@actionFlags = CASE
WHEN (Flags & 1) <> 0 THEN 1
ELSE 0
END
WHERE SessionId = @id

IF @length IS NOT NULL BEGIN
SELECT SessionItemLong FROM [happylifesession].dbo.happylifesessionTempSessions WHERE SessionId = @id
END

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempReleaseStateItemExclusive
@id nvarchar(88),
@lockCookie int
AS
UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, GETUTCDATE()),
Locked = 0
WHERE SessionId = @id AND LockCookie = @lockCookie

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempInsertUninitializedItem
@id nvarchar(88),
@itemShort varbinary(7000),
@timeout int
AS

DECLARE @now AS datetime
DECLARE @nowLocal AS datetime

SET @now = GETUTCDATE()
SET @nowLocal = GETDATE()

INSERT [happylifesession].dbo.happylifesessionTempSessions
(SessionId,
SessionItemShort,
Timeout,
Expires,
Locked,
LockDate,
LockDateLocal,
LockCookie,
Flags)
VALUES
(@id,
@itemShort,
@timeout,
DATEADD(n, @timeout, @now),
0,
@now,
@nowLocal,
1,
1)

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempInsertStateItemShort
@id nvarchar(88),
@itemShort varbinary(7000),
@timeout int
AS

DECLARE @now AS datetime
DECLARE @nowLocal AS datetime

SET @now = GETUTCDATE()
SET @nowLocal = GETDATE()

INSERT [happylifesession].dbo.happylifesessionTempSessions
(SessionId,
SessionItemShort,
Timeout,
Expires,
Locked,
LockDate,
LockDateLocal,
LockCookie)
VALUES
(@id,
@itemShort,
@timeout,
DATEADD(n, @timeout, @now),
0,
@now,
@nowLocal,
1)

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempInsertStateItemLong
@id nvarchar(88),
@itemLong  image,
@timeout int
AS
DECLARE @now AS datetime
DECLARE @nowLocal AS datetime

SET @now = GETUTCDATE()
SET @nowLocal = GETDATE()

INSERT [happylifesession].dbo.happylifesessionTempSessions
(SessionId,
SessionItemLong,
Timeout,
Expires,
Locked,
LockDate,
LockDateLocal,
LockCookie)
VALUES
(@id,
@itemLong,
@timeout,
DATEADD(n, @timeout, @now),
0,
@now,
@nowLocal,
1)

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempUpdateStateItemShort
@id nvarchar(88),
@itemShort varbinary(7000),
@timeout int,
@lockCookie int
AS
UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, @timeout, GETUTCDATE()),
SessionItemShort = @itemShort,
Timeout = @timeout,
Locked = 0
WHERE SessionId = @id AND LockCookie = @lockCookie

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempUpdateStateItemShortNullLong
@id nvarchar(88),
@itemShort varbinary(7000),
@timeout int,
@lockCookie int
AS
UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, @timeout, GETUTCDATE()),
SessionItemShort = @itemShort,
SessionItemLong = NULL,
Timeout = @timeout,
Locked = 0
WHERE SessionId = @id AND LockCookie = @lockCookie

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempUpdateStateItemLong
@id nvarchar(88),
@itemLong  image,
@timeout int,
@lockCookie int
AS
UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, @timeout, GETUTCDATE()),
SessionItemLong = @itemLong,
Timeout = @timeout,
Locked = 0
WHERE SessionId = @id AND LockCookie = @lockCookie

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempUpdateStateItemLongNullShort
@id nvarchar(88),
@itemLong  image,
@timeout int,
@lockCookie int
AS
UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, @timeout, GETUTCDATE()),
SessionItemLong = @itemLong,
SessionItemShort = NULL,
Timeout = @timeout,
Locked = 0
WHERE SessionId = @id AND LockCookie = @lockCookie

RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempRemoveStateItem
@id nvarchar(88),
@lockCookie int
AS
DELETE [happylifesession].dbo.happylifesessionTempSessions
WHERE SessionId = @id AND LockCookie = @lockCookie
RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.TempResetTimeout
@id nvarchar(88)
AS
UPDATE [happylifesession].dbo.happylifesessionTempSessions
SET Expires = DATEADD(n, Timeout, GETUTCDATE())
WHERE SessionId = @id
RETURN 0
GO

/*****************************************************************************/

CREATE PROCEDURE dbo.DeleteExpiredSessions
AS
DECLARE @now datetime
SET @now = GETUTCDATE()

DELETE [happylifesession].dbo.happylifesessionTempSessions
WHERE Expires < @now

RETURN 0
GO

/*****************************************************************************/

EXECUTE dbo.CreateTempTables
GO

/*************************************************************/
/*************************************************************/
/*************************************************************/
/*************************************************************/

PRINT ''
PRINT '------------------------------------------'
PRINT 'Completed execution of InstallSqlState.SQL'
PRINT '------------------------------------------'

IF NOT EXISTS(SELECT NAME FROM sys.sysusers where name='happylifesession')
BEGIN
CREATE USER [happylifesession] FOR LOGIN [happylifesession]
END
GO
EXEC sp_addrolemember N'db_datawriter', N'happylifesession'
GO
EXEC sp_addrolemember N'db_datareader', N'happylifesession'
GO
EXEC sp_addrolemember N'db_owner', N'happylifesession'
GO