using System; using System.Collections; using System.Data; using System.Data.OleDb; using System.Globalization; using System.Runtime.Serialization; using System.Security.Permissions; using PrincipalPermission = System.Security.Permissions.PrincipalPermissionAttribute; using SecurityPermission = System.Security.Permissions.SecurityPermissionAttribute; using StrongNameIdentityPermission = System.Security.Permissions.StrongNameIdentityPermissionAttribute; namespace Gastfriheten.Data { /// /// Summary description for Booking. /// public class Booking { int _bookingId; short _apartmentId; int _personId; DateTime _start; DateTime _end; string _contactPhone; string _activity; string _firstName; string _lastName; internal Booking (int id, short apartmentId, DateTime start, DateTime end, int personId, string contactPhone, string activity, string firstName, string lastName) { _bookingId = id; _apartmentId = apartmentId; _start = start; _end = end; _contactPhone = contactPhone; _activity = activity; _firstName = firstName; _lastName = lastName; _personId = personId; } private Booking (IDataReader reader) { int i = 0; _bookingId = reader.GetInt32 (i); _apartmentId = reader.GetInt16 (++i); _personId = reader.GetInt32 (++i); _firstName = reader.GetString (++i); _lastName = reader.GetString (++i); _start = reader.GetDateTime (++i); _end = reader.GetDateTime (++i); _contactPhone = reader.GetString (++i); if (!reader.IsDBNull (++i)) { _activity = reader.GetString (i); } } #region properties public int Id { get { return _bookingId; } } public short ApartmentId { get { return _apartmentId; } } public DateTime Start { get { return _start; } } public DateTime End { get { return _end; } } public string ContactPhone { get { return _contactPhone; } } public string Activity { get { return _activity; } } public string FirstName { get { return _firstName; } } public string LastName { get { return _lastName; } } public int PersonId { get { return _personId; } } #endregion public override string ToString () { return String.Format (CultureInfo.InvariantCulture, "{0} {1} ({2}): {3} - {4}", _firstName, _lastName, _contactPhone, _start, _end); } public static Booking[] GetAll () { ArrayList list = new ArrayList (); OleDbDataReader reader = OleDBHelper.ExecuteReader (DBConfiguration.ConnectionString, CommandType.Text, "Execute GetBookings"); while (reader.Read ()) { list.Add (new Booking (reader)); } reader.Close (); Booking[] retVal = new Booking[list.Count]; list.CopyTo (retVal); return retVal; } [@PrincipalPermission (SecurityAction.Demand, Role = "Styrelse")] public static void Add (int PersonId, DateTime beginDate, DateTime endDate, string contactPhone, string activity) { if (beginDate > endDate) { throw new ArgumentException ("Slutdatum måste vara senare än startdatum."); } ValidateNotNull (contactPhone, "contactPhone"); ValidateNotOverlapping (beginDate, endDate); OleDbParameter[] parameters = new OleDbParameter[5]; parameters[0] = new OleDbParameter ("inPersonId", OleDbType.Integer, 4); parameters[0].Value = PersonId; parameters[1] = new OleDbParameter ("inStart", OleDbType.DBTimeStamp); parameters[1].Value = beginDate; parameters[2] = new OleDbParameter ("inEnd", OleDbType.DBTimeStamp); parameters[2].Value = endDate; parameters[3] = new OleDbParameter ("inContactPhone", OleDbType.VarChar); parameters[3].Value = contactPhone; parameters[4] = new OleDbParameter ("inActivity", OleDbType.VarChar); parameters[4].Value = activity; OleDBHelper.ExecuteNonQuery (DBConfiguration.ConnectionString, CommandType.Text, "Execute AddBooking", parameters); } static void ValidateNotOverlapping (DateTime begin, DateTime end) { Booking[] bookings = GetAll (); foreach (Booking booking in bookings) { if (booking.Start < begin && booking.End > begin || booking.Start < end && booking.End > end) { throw new OverlappedBookingException ("Overlapps with previous booking.", booking); } } } [@PrincipalPermission (SecurityAction.Demand, Role = "Styrelse")] public static void Delete (int bookingId) { OleDbParameter param = new OleDbParameter ("inBookingId", OleDbType.Integer, 4); param.Value = bookingId; OleDBHelper.ExecuteNonQuery (DBConfiguration.ConnectionString, CommandType.Text, "Execute DeleteBooking", param); } private static void ValidateNotNull (object obj, string param) { if (obj == null) { throw new ArgumentNullException (param, param + " must be specified."); } } } [Serializable] public class OverlappedBookingException : Exception, ISerializable { Booking booking; public OverlappedBookingException () { } public OverlappedBookingException (string message) : base(message) { } public OverlappedBookingException (string message, Exception inner) : base(message, inner) { } public OverlappedBookingException (string message, Booking booking) : base(message) { this.booking = booking; } public Booking Booking { get { return booking; } } #region Serialization protected OverlappedBookingException (SerializationInfo info, StreamingContext context) : base(info, context) { // Implement type-specific deserialization logic. int id = info.GetInt32 ("id"); short apartmentid = info.GetInt16 ("apartmentid"); int personId = info.GetInt32 ("personid"); DateTime start = new DateTime (info.GetInt64 ("startTicks")); DateTime end = new DateTime (info.GetInt64 ("endTicks")); string contactPhone = info.GetString ("contactPhone"); string activity = info.GetString ("activity"); string firstName = info.GetString ("firstname"); string lastName = info.GetString ("lastname"); booking = new Booking (id, apartmentid, start, end, personId, contactPhone, activity, firstName, lastName); } [@SecurityPermission (SecurityAction.Demand, SerializationFormatter=true)] [@StrongNameIdentityPermission (SecurityAction.LinkDemand, Name="mscorlib", Version="1.0.5000.0", PublicKey="b77a5c561934e089")] public new void GetObjectData (SerializationInfo info, StreamingContext context) { // Implement type-specific serialization logic and call base serializer. info.AddValue ("id", booking.Id); info.AddValue ("apartmentid", booking.ApartmentId); info.AddValue ("personid", booking.PersonId); info.AddValue ("startTicks", booking.Start.Ticks); info.AddValue ("endTicks", booking.End.Ticks); info.AddValue ("contactPhone", booking.ContactPhone); info.AddValue ("activity", booking.Activity); info.AddValue ("firstname", booking.FirstName); info.AddValue ("lastname", booking.LastName); base.GetObjectData (info, context); } #endregion } }