// ========================================================================
// Copyright 2007 - Volian Enterprises, Inc. All rights reserved.          
// Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
// ------------------------------------------------------------------------
// $Workfile: $     $Revision: $                                           
// $Author: $   $Date: $                                                   
//                                                                         
// $History: $                                                             
// ========================================================================
using System;
using System.Data;
using System.Data.SqlClient;
using Csla;
using Csla.Data;
using System.Configuration;
using System.IO;
using System.ComponentModel;
using System.Diagnostics;
namespace VEPROMS.CSLA.Library
{
	/// 
	///	Database Generated by MyGeneration using the CSLA Object Mapping template
	/// 
	[Serializable()]
	public static partial class Database
	{
		#region Log4Net
		private static readonly log4net.ILog _MyLog = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
		#endregion
		public static void LogException(string s, Exception ex)
		{
			int i = 0;
			Console.WriteLine("Error - {0}", s);
			for (; ex != null; ex = ex.InnerException)
			{
				Console.WriteLine("{0}{1} - {2}", "".PadLeft(++i * 2), ex.GetType().ToString(), ex.Message);
			}
		}
		private static bool _LoggingInfo = false; // By default don't log info 
		public static bool LoggingInfo
		{
			get { return _LoggingInfo; }
			set { _LoggingInfo = value; }
		}
		static System.Diagnostics.Process _CurrentProcess = System.Diagnostics.Process.GetCurrentProcess();
		public static void LogInfo(string s, int hashCode)
		{
			if (_LoggingInfo)
				Console.WriteLine("{0} MB {1}", _CurrentProcess.WorkingSet64 / 1000000, string.Format(s, hashCode));
		}
		public static void LogDebug(string s, int hashCode)
		{
			if (_LoggingInfo)
				Console.WriteLine("{0} MB {1}", _CurrentProcess.WorkingSet64 / 1000000, string.Format(s, hashCode));
		}
		private static string _ConnectionName = "VEPROMS";
		public static string ConnectionName
		{
			get { return Database._ConnectionName; }
			set { Database._ConnectionName = value; _VEPROMS_Connection = null; /* Reset Connection */ }
		}
		private static string _VEPROMS_Connection;
		public static string VEPROMS_Connection
		{
			get
			{
				if (_VEPROMS_Connection != null) // Use Lazy Load
					return _VEPROMS_Connection;
				DateTime.Today.ToLongDateString();
				// If DBConnection.XML exists, use the connection string from DBConnection.XML
				string cnOverride = System.Windows.Forms.Application.StartupPath + @"\DBConnection.XML";
				if (System.IO.File.Exists(cnOverride))
				{
					System.Xml.XmlDocument xd = new System.Xml.XmlDocument();
					xd.Load(cnOverride);
					System.Xml.XmlNode xn = xd.SelectSingleNode("DBConnection/@string");
					if (xn != null)
					{
						return _VEPROMS_Connection = xn.InnerText;
					}
				}
				// Otherwise get the value from the ConfigurationManager
				ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings[ConnectionName];
				if (cs == null)
				{
					throw new ApplicationException("Database.cs Could not find connection " + ConnectionName);
				}
				string constr = cs.ConnectionString;
				if (constr.Contains("{MENU}"))
				{
					constr = ChooseDatabase(constr);
				}
				return _VEPROMS_Connection = constr;
			}
		}
		private static string _SelectedDatabase;
		public static string SelectedDatabase
		{
			get { return Database._SelectedDatabase; }
			set { Database._SelectedDatabase = value; }
		}
		private static string ChooseDatabase(string constr)
		{
			string tmp = constr.Replace("{MENU}", "master");
			SqlConnection cn = new SqlConnection(tmp);
			cn.Open();
//			SqlDataAdapter da = new SqlDataAdapter("select name from sysdatabases where name like 'VEP%' order by name", cn);
			SqlDataAdapter da = new SqlDataAdapter("select name,case when object_id(name + '..Revisions') is not null then 'Approval' when object_id(name + '..ContentAudits') is not null then 'Change Manager' else 'Original' end functionality from sysdatabases where name like 'VEP%' order by name", cn);
			DataSet ds = new DataSet();
			da.Fill(ds);
			cn.Close();
			System.Windows.Forms.ContextMenuStrip cms = new System.Windows.Forms.ContextMenuStrip();
			cms.Items.Add("Choose Database");
			System.Windows.Forms.ToolStripMenuItem tsmi = cms.Items[0] as System.Windows.Forms.ToolStripMenuItem;
			tsmi.BackColor = System.Drawing.Color.FromKnownColor(System.Drawing.KnownColor.ActiveCaption);// System.Drawing.Color.Pink;
			tsmi.ForeColor = System.Drawing.Color.FromKnownColor(System.Drawing.KnownColor.ActiveCaptionText);
			tsmi.Font = new System.Drawing.Font(tsmi.Font, System.Drawing.FontStyle.Bold);
			foreach (DataRow dr in ds.Tables[0].Rows)
			{
				if(dr["functionality"].ToString() == "Approval")
					cms.Items.Add(dr["name"].ToString(), null, new EventHandler(Database_Click));
			}
			while (_SelectedDatabase == null)
			{
				cms.Show(new System.Drawing.Point((System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width - cms.Width) / 2, (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height - cms.Height) / 2));
				System.Windows.Forms.Application.DoEvents();
			}
			return constr.Replace("{MENU}", _SelectedDatabase);
		}
		static void Database_Click(object sender, EventArgs e)
		{
			System.Windows.Forms.ToolStripMenuItem tsmi = sender as System.Windows.Forms.ToolStripMenuItem;
			if (tsmi != null)
			{
				_SelectedDatabase = tsmi.Text;
			}
		}
		public static SqlConnection VEPROMS_SqlConnection
		{
			get
			{
				string strConn = VEPROMS_Connection; // If failure - Fail (Don't try to catch)
				// Attempt to make a connection 
				try
				{
					SqlConnection cn = new SqlConnection(strConn);
					cn.Open();
					return cn;
				}
				catch (SqlException exsql)
				{
					const string strAttachError = "An attempt to attach an auto-named database for file ";
					if (exsql.Message.StartsWith(strAttachError))
					{// Check to see if the file is missing
						string sFile = exsql.Message.Substring(strAttachError.Length);
						sFile = sFile.Substring(0, sFile.IndexOf(" failed"));
						//	"An attempt to attach an auto-named database for file  failed"
						if (strConn.ToLower().IndexOf("user instance=true") < 0)
						{
							throw new ApplicationException("Connection String missing attribute: User Instance=True");
						}
						if (System.IO.File.Exists(sFile))
						{
							throw new ApplicationException("Database file " + sFile + " Cannot be opened\r\n", exsql);
						}
						else
						{
							throw new FileNotFoundException("Database file " + sFile + " Not Found", exsql);
						}
					}
					else
					{
						throw new ApplicationException("Failure on Connect", exsql);
					}
				}
				catch (Exception ex)// Throw Application Exception on Failure
				{
					if (_MyLog.IsErrorEnabled) _MyLog.Error("Connection Error", ex);
					throw new ApplicationException("Failure on Connect", ex);
				}
			}
		}
		public static void PurgeData()
		{
			try
			{
				SqlConnection cn = VEPROMS_SqlConnection;
				SqlCommand cmd = new SqlCommand("purgedata", cn);
				cmd.CommandType = CommandType.StoredProcedure;
				cmd.CommandTimeout = 0;
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex)
			{
				if (_MyLog.IsErrorEnabled) _MyLog.Error("Purge Error", ex);
				throw new ApplicationException("Failure on Purge", ex);
			}
		}
	}
	public class DbCslaException : Exception
	{
		internal DbCslaException(string message, Exception innerException) : base(message, innerException) { ;}
		internal DbCslaException(string message) : base(message) { ;}
		internal DbCslaException() : base() { ;}
	} // Class
} // Namespace