//-----------------------------------------------------------------------
//
// Copyright (c) Outercurve Foundation. All rights reserved.
//
//-----------------------------------------------------------------------
namespace RelyingPartyLogic {
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.EntityClient;
using System.Data.SqlClient;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Web;
public class Database : IHttpModule, IDisposable {
private const string DataContextKey = "DataContext";
private const string DataContextTransactionKey = "DataContextTransaction";
///
/// Initializes a new instance of the class.
///
public Database() {
}
public static User LoggedInUser {
get { return DataContext.AuthenticationTokens.Where(token => token.ClaimedIdentifier == HttpContext.Current.User.Identity.Name).Select(token => token.User).FirstOrDefault(); }
}
///
/// Gets the transaction-protected database connection for the current request.
///
public static DatabaseEntities DataContext {
get {
DatabaseEntities dataContext = DataContextSimple;
if (dataContext == null) {
dataContext = new DatabaseEntities();
dataContext.Connection.Open();
DataContextTransaction = (EntityTransaction)dataContext.Connection.BeginTransaction();
DataContextSimple = dataContext;
}
return dataContext;
}
}
///
/// Gets a value indicating whether the data context is already initialized.
///
internal static bool IsDataContextInitialized {
get { return DataContextSimple != null; }
}
internal static EntityTransaction DataContextTransaction {
get {
if (HttpContext.Current != null) {
return HttpContext.Current.Items[DataContextTransactionKey] as EntityTransaction;
} else if (OperationContext.Current != null) {
object data;
if (OperationContext.Current.IncomingMessageProperties.TryGetValue(DataContextTransactionKey, out data)) {
return data as EntityTransaction;
} else {
return null;
}
} else {
throw new InvalidOperationException();
}
}
private set {
if (HttpContext.Current != null) {
HttpContext.Current.Items[DataContextTransactionKey] = value;
} else if (OperationContext.Current != null) {
OperationContext.Current.IncomingMessageProperties[DataContextTransactionKey] = value;
} else {
throw new InvalidOperationException();
}
}
}
private static DatabaseEntities DataContextSimple {
get {
if (HttpContext.Current != null) {
return HttpContext.Current.Items[DataContextKey] as DatabaseEntities;
} else if (OperationContext.Current != null) {
object data;
if (OperationContext.Current.IncomingMessageProperties.TryGetValue(DataContextKey, out data)) {
return data as DatabaseEntities;
} else {
return null;
}
} else {
throw new InvalidOperationException();
}
}
set {
if (HttpContext.Current != null) {
HttpContext.Current.Items[DataContextKey] = value;
} else if (OperationContext.Current != null) {
OperationContext.Current.IncomingMessageProperties[DataContextKey] = value;
} else {
throw new InvalidOperationException();
}
}
}
public void Dispose() {
}
void IHttpModule.Init(HttpApplication context) {
context.EndRequest += this.Application_EndRequest;
context.Error += this.Application_Error;
}
protected void Application_EndRequest(object sender, EventArgs e) {
CommitAndCloseDatabaseIfNecessary();
}
protected void Application_Error(object sender, EventArgs e) {
if (DataContextTransaction != null) {
DataContextTransaction.Rollback();
DataContextTransaction.Dispose();
DataContextTransaction = null;
}
}
private static void CommitAndCloseDatabaseIfNecessary() {
var dataContext = DataContextSimple;
if (dataContext != null) {
dataContext.SaveChanges();
if (DataContextTransaction != null) {
DataContextTransaction.Commit();
DataContextTransaction.Dispose();
}
dataContext.Dispose();
DataContextSimple = null;
}
}
}
}