""Carlos Guzmán Álvarez"" <[EMAIL PROTECTED]> ha scritto nel messaggio
news:[EMAIL PROTECTED]
> Hello:
>
>>Maybe Carlos should be interested to add this class to the .net provider
>>2.0.
>>
> Sure :) if you don't have problems on release it under the IDPL ( to have
> the same lincese as the provider :) )
Absolutely! My name written in small somewhere is enough ;)
To use this class you'll ned a similar configuration in the web.config
<sessionState cookieless="false" regenerateExpiredSessionId="true"
mode="Custom" customProvider="FbSessionProvider" timeout="20">
<providers>
<add name="FbSessionProvider" type="FbSessionStateStore"
connectionStringName="FbSessionService" />
</providers>
</sessionState>
and obviously a connectionstring needs to be added as well.
Class code below my signature.
Ciao,
Alessandro.
using System;
using System.Configuration;
using System.Configuration.Provider;
using System.Collections.Specialized;
using System.Data;
using System.IO;
using System.Web;
using System.Web.Configuration;
using System.Web.SessionState;
using FirebirdSql.Data.Firebird;
public sealed class FbSessionStateStore: SessionStateStoreProviderBase
{
private SessionStateSection _config;
private string _connectionString;
private string _applicationName;
public string ApplicationName
{
get
{
return _applicationName;
}
}
public override void Initialize(string name, NameValueCollection config)
{
if (config == null)
{
throw new ArgumentNullException("config");
}
if (String.IsNullOrEmpty(name))
{
name = "FbSessionStateStore";
}
base.Initialize(name, config);
_applicationName =
System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath;
Configuration cfg =
WebConfigurationManager.OpenWebConfiguration(ApplicationName);
_config =
(SessionStateSection)cfg.GetSection("system.web/sessionState");
ConnectionStringSettings connectionStringSettings =
ConfigurationManager.ConnectionStrings[config["connectionStringName"]];
if (connectionStringSettings == null ||
String.IsNullOrEmpty(connectionStringSettings.ConnectionString))
{
throw new ProviderException("Connection string cannot be
blank.");
}
_connectionString = connectionStringSettings.ConnectionString;
}
public override void Dispose()
{
}
public override bool
SetItemExpireCallback(SessionStateItemExpireCallback expireCallback)
{
return false;
}
public override void SetAndReleaseItemExclusive(HttpContext context,
string id, SessionStateStoreData item, object lockId, bool newItem)
{
string sessItems =
Serialize((SessionStateItemCollection)item.Items);
using (FbConnection cn = new FbConnection(_connectionString))
{
cn.Open();
if (newItem)
{
using (FbCommand cmd = cn.CreateCommand())
{
cmd.CommandText = "DELETE FROM SESSIONS WHERE SESSION_ID
= @SESSION_ID AND APPLICATION_NAME = @APPLICATION_NAME AND EXPIRES <
@EXPIRES";
cmd.Parameters.Add("@SESSION_ID", FbDbType.VarChar,
80).Value = id;
cmd.Parameters.Add("@APPLICATION_NAME",
FbDbType.VarChar, 100).Value = ApplicationName;
cmd.Parameters.Add("@EXPIRES", FbDbType.TimeStamp).Value
= DateTime.Now;
cmd.ExecuteNonQuery();
}
using (FbCommand cmd = cn.CreateCommand())
{
cmd.CommandText = "INSERT INTO SESSIONS (SESSION_ID,
APPLICATION_NAME, CREATED, EXPIRES, LOCK_DATE, LOCK_ID, TIMEOUT, LOCKED,
SESSION_ITEMS, FLAGS) VALUES(@SESSION_ID, @APPLICATION_NAME, @CREATED,
@EXPIRES, @LOCK_DATE, @LOCK_ID , @TIMEOUT, @LOCKED, @SESSION_ITEMS,
@FLAGS)";
cmd.Parameters.Add("@SESSION_ID", FbDbType.VarChar,
80).Value = id;
cmd.Parameters.Add("@APPLICATION_NAME",
FbDbType.VarChar, 100).Value = ApplicationName;
cmd.Parameters.Add("@CREATED", FbDbType.TimeStamp).Value
= DateTime.Now;
cmd.Parameters.Add("@EXPIRES", FbDbType.TimeStamp).Value
= DateTime.Now.AddMinutes((Double)item.Timeout);
cmd.Parameters.Add("@LOCK_DATE",
FbDbType.TimeStamp).Value = DateTime.Now;
cmd.Parameters.Add("@LOCK_ID", FbDbType.Integer).Value =
0;
cmd.Parameters.Add("@TIMEOUT", FbDbType.Integer).Value =
item.Timeout;
cmd.Parameters.Add("@LOCKED", FbDbType.SmallInt).Value =
false;
cmd.Parameters.Add("@SESSION_ITEMS", FbDbType.Text,
sessItems.Length).Value = sessItems;
cmd.Parameters.Add("@FLAGS", FbDbType.Integer).Value =
0;
cmd.ExecuteNonQuery();
}
}
else
{
using (FbCommand cmd = cn.CreateCommand())
{
cmd.CommandText = "UPDATE SESSIONS SET EXPIRES =
@EXPIRES, SESSION_ITEMS = @SESSION_ITEMS, LOCKED = @LOCKED WHERE SESSION_ID
= @SESSION_ID AND APPLICATION_NAME = @APPLICATION_NAME AND LOCK_ID =
@LOCK_ID";
cmd.Parameters.Add("@EXPIRES", FbDbType.TimeStamp).Value
= DateTime.Now.AddMinutes((Double)item.Timeout);
cmd.Parameters.Add("@SESSION_ITEMS", FbDbType.Text,
sessItems.Length).Value = sessItems;
cmd.Parameters.Add("@LOCKED", FbDbType.SmallInt).Value =
false;
cmd.Parameters.Add("@SESSION_ID", FbDbType.VarChar,
80).Value = id;
cmd.Parameters.Add("@APPLICATION_NAME",
FbDbType.VarChar, 100).Value = ApplicationName;
cmd.Parameters.Add("@LOCK_ID", FbDbType.Integer).Value =
lockId;
cmd.ExecuteNonQuery();
}
}
}
}
public override SessionStateStoreData GetItem(HttpContext context,
string id, out bool locked, out TimeSpan lockAge, out object lockId, out
SessionStateActions actions)
{
return GetSessionStoreItem(false, context, id, out locked, out
lockAge, out lockId, out actions);
}
public override SessionStateStoreData GetItemExclusive(HttpContext
context, string id, out bool locked, out TimeSpan lockAge, out object
lockId, out SessionStateActions actions)
{
return GetSessionStoreItem(true, context, id, out locked, out
lockAge, out lockId, out actions);
}
private SessionStateStoreData GetSessionStoreItem(bool lockRecord,
HttpContext context, string id, out bool locked, out TimeSpan lockAge, out
object lockId, out SessionStateActions actionFlags)
{
locked = false;
lockAge = TimeSpan.Zero;
lockId = null;
actionFlags = 0;
SessionStateStoreData item = null;
using (FbConnection cn = new FbConnection(_connectionString))
{
DateTime expires;
string serializedItems = "";
bool foundRecord = false;
bool deleteData = false;
int timeout = 0;
cn.Open();
if (lockRecord)
{
using (FbCommand cmd = cn.CreateCommand())
{
cmd.CommandText = "UPDATE SESSIONS SET LOCKED = @LOCKED,
LOCK_DATE = @LOCK_DATE WHERE SESSION_ID = @SESSION_ID AND APPLICATION_NAME =
@APPLICATION_NAME AND LOCKED = @LOCKED2 AND EXPIRES > @EXPIRES";
cmd.Parameters.Add("@LOCKED", FbDbType.SmallInt).Value =
true;
cmd.Parameters.Add("@LOCK_DATE",
FbDbType.TimeStamp).Value = DateTime.Now;
cmd.Parameters.Add("@SESSION_ID", FbDbType.VarChar,
80).Value = id;
cmd.Parameters.Add("@APPLICATION_NAME",
FbDbType.VarChar, 100).Value = ApplicationName;
cmd.Parameters.Add("@LOCKED2", FbDbType.Integer).Value =
false;
cmd.Parameters.Add("@EXPIRES", FbDbType.TimeStamp).Value
= DateTime.Now;
if (cmd.ExecuteNonQuery() == 0)
{
locked = true;
}
else
{
locked = false;
}
}
}
using (FbCommand cmd = cn.CreateCommand())
{
cmd.CommandText = "SELECT EXPIRES, SESSION_ITEMS, LOCK_ID,
LOCK_DATE, FLAGS, TIMEOUT FROM SESSIONS WHERE SESSION_ID = @SESSION_ID AND
APPLICATION_NAME = @APPLICATION_NAME";
cmd.Parameters.Add("@SESSION_ID", FbDbType.VarChar,
80).Value = id;
cmd.Parameters.Add("@APPLICATION_NAME", FbDbType.VarChar,
100).Value = ApplicationName;
using (FbDataReader reader =
cmd.ExecuteReader(CommandBehavior.SingleRow))
{
while (reader.Read())
{
expires = reader.GetDateTime(0);
if (expires < DateTime.Now)
{
locked = false;
deleteData = true;
}
else
{
foundRecord = true;
}
serializedItems = reader.GetString(1);
lockId = reader.GetInt32(2);
lockAge =
DateTime.Now.Subtract(reader.GetDateTime(3));
actionFlags =
(SessionStateActions)reader.GetInt32(4);
timeout = reader.GetInt32(5);
}
if (!foundRecord)
{
locked = false;
}
}
}
if (deleteData)
{
using (FbCommand cmd = cn.CreateCommand())
{
cmd.CommandText = "DELETE FROM SESSIONS WHERE SESSION_ID
= @SESSION_ID AND APPLICATION_NAME = @APPLICATION_NAME";
cmd.Parameters.Add("@SESSION_ID", FbDbType.VarChar,
80).Value = id;
cmd.Parameters.Add("@APPLICATION_NAME",
FbDbType.VarChar, 100).Value = ApplicationName;
cmd.ExecuteNonQuery();
}
}
if (foundRecord && !locked)
{
lockId = (int)lockId + 1;
using (FbCommand cmd = cn.CreateCommand())
{
cmd.CommandText = "UPDATE SESSIONS SET LOCK_ID =
@LOCK_ID, Flags = 0 WHERE SESSION_ID = @SESSION_ID AND APPLICATION_NAME =
@APPLICATION_NAME";
cmd.Parameters.Add("@LOCK_ID", FbDbType.Integer).Value =
lockId;
cmd.Parameters.Add("@SESSION_ID", FbDbType.VarChar,
80).Value = id;
cmd.Parameters.Add("@APPLICATION_NAME",
FbDbType.VarChar, 100).Value = ApplicationName;
cmd.ExecuteNonQuery();
}
if (actionFlags == SessionStateActions.InitializeItem)
{
item = CreateNewStoreData(context,
_config.Timeout.Minutes);
}
else
{
item = Deserialize(context, serializedItems, timeout);
}
}
}
return item;
}
private string Serialize(SessionStateItemCollection items)
{
MemoryStream ms = new MemoryStream();
using (BinaryWriter writer = new BinaryWriter(ms))
{
if (items != null)
{
items.Serialize(writer);
}
}
return Convert.ToBase64String(ms.ToArray());
}
private SessionStateStoreData Deserialize(HttpContext context, string
serializedItems, int timeout)
{
MemoryStream ms = new
MemoryStream(Convert.FromBase64String(serializedItems));
SessionStateItemCollection sessionItems;
using (BinaryReader reader = new BinaryReader(ms))
{
sessionItems = SessionStateItemCollection.Deserialize(reader);
}
return new SessionStateStoreData(sessionItems,
SessionStateUtility.GetSessionStaticObjects(context), timeout);
}
public override void ReleaseItemExclusive(HttpContext context, string
id, object lockId)
{
using (FbConnection cn = new FbConnection(_connectionString))
{
cn.Open();
using (FbCommand cmd = cn.CreateCommand())
{
cmd.CommandText = "UPDATE SESSIONS SET LOCKED = 0, EXPIRES =
@EXPIRES WHERE SESSION_ID = @SESSION_ID AND APPLICATION_NAME =
@APPLICATION_NAME AND LOCK_ID = @LOCK_ID";
cmd.Parameters.Add("@EXPIRES", FbDbType.TimeStamp).Value =
DateTime.Now.AddMinutes(_config.Timeout.Minutes);
cmd.Parameters.Add("@SESSION_ID", FbDbType.VarChar,
80).Value = id;
cmd.Parameters.Add("@APPLICATION_NAME", FbDbType.VarChar,
100).Value = ApplicationName;
cmd.Parameters.Add("@LOCK_ID", FbDbType.Integer).Value =
lockId;
cmd.ExecuteNonQuery();
}
}
}
public override void RemoveItem(HttpContext context, string id, object
lockId, SessionStateStoreData item)
{
using (FbConnection cn = new FbConnection(_connectionString))
{
cn.Open();
using (FbCommand cmd = cn.CreateCommand())
{
cmd.CommandText = "DELETE * FROM SESSIONS WHERE SESSION_ID =
@SESSION_ID AND APPLICATION_NAME = @APPLICATION_NAME AND LOCK_ID =
@LOCK_ID";
cmd.Parameters.Add("@SESSION_ID", FbDbType.VarChar,
80).Value = id;
cmd.Parameters.Add("@APPLICATION_NAME", FbDbType.VarChar,
100).Value = ApplicationName;
cmd.Parameters.Add("@LOCK_ID", FbDbType.Integer).Value =
lockId;
cmd.ExecuteNonQuery();
}
}
}
public override void CreateUninitializedItem(HttpContext context, string
id, int timeout)
{
using (FbConnection cn = new FbConnection(_connectionString))
{
cn.Open();
using (FbCommand cmd = cn.CreateCommand())
{
cmd.CommandText = "INSERT INTO SESSIONS(SESSION_ID,
APPLICATION_NAME, CREATED, EXPIRES, LOCK_DATE, LOCK_ID, TIMEOUT, LOCKED,
SESSION_ITEMS, FLAGS) VALUES(@SESSION_ID, @APPLICATION_NAME, @CREATED,
@EXPIRES, @LOCK_DATE, @LOCK_ID , @TIMEOUT, @LOCKED, @SESSION_ITEMS,
@FLAGS)";
cmd.Parameters.Add("@SESSION_ID", FbDbType.VarChar,
80).Value = id;
cmd.Parameters.Add("@APPLICATION_NAME", FbDbType.VarChar,
100).Value = ApplicationName;
cmd.Parameters.Add("@CREATED", FbDbType.TimeStamp).Value =
DateTime.Now;
cmd.Parameters.Add("@EXPIRES", FbDbType.TimeStamp).Value =
DateTime.Now.AddMinutes((Double)timeout);
cmd.Parameters.Add("@LOCK_DATE", FbDbType.TimeStamp).Value =
DateTime.Now;
cmd.Parameters.Add("@LOCK_ID", FbDbType.Integer).Value = 0;
cmd.Parameters.Add("@TIMEOUT", FbDbType.Integer).Value =
timeout;
cmd.Parameters.Add("@LOCKED", FbDbType.SmallInt).Value =
false;
cmd.Parameters.Add("@SESSION_ITEMS", FbDbType.Text, 0).Value
= "";
cmd.Parameters.Add("@FLAGS", FbDbType.Integer).Value = 1;
cmd.ExecuteNonQuery();
}
}
}
public override SessionStateStoreData CreateNewStoreData(HttpContext
context, int timeout)
{
return new SessionStateStoreData(new SessionStateItemCollection(),
SessionStateUtility.GetSessionStaticObjects(context), timeout);
}
public override void ResetItemTimeout(HttpContext context, string id)
{
using (FbConnection cn = new FbConnection(_connectionString))
{
cn.Open();
using (FbCommand cmd = cn.CreateCommand())
{
cmd.CommandText = "UPDATE SESSIONS SET EXPIRES = @EXPIRES
WHERE SESSION_ID = @SESSION_ID AND APPLICATION_NAME = @APPLICATION_NAME";
cmd.Parameters.Add("@EXPIRES", FbDbType.TimeStamp).Value =
DateTime.Now.AddMinutes(_config.Timeout.Minutes);
cmd.Parameters.Add("@SESSION_ID", FbDbType.VarChar,
80).Value = id;
cmd.Parameters.Add("@APPLICATION_NAME", FbDbType.VarChar,
100).Value = ApplicationName;
cmd.ExecuteNonQuery();
}
}
}
public override void InitializeRequest(HttpContext context)
{
}
public override void EndRequest(HttpContext context)
{
}
}
-------------------------------------------------------
This SF.Net email is sponsored by the JBoss Inc.
Get Certified Today * Register for a JBoss Training Course
Free Certification Exam for All Training Attendees Through End of 2005
Visit http://www.jboss.com/services/certification for more information
_______________________________________________
Firebird-net-provider mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/firebird-net-provider