/*
Kooboo is a content management system based on ASP.NET MVC framework. Copyright 2009 Yardi Technology Limited.
This program is free software: you can redistribute it and/or modify it under the terms of the
GNU General Public License version 3 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program.
If not, see http://www.kooboo.com/gpl3/.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using Everest.Library.ExtensionMethod;
using Everest.Library.Versioning;
namespace Everest.Providers.Versioning.DB{
/// <summary>
///
/// </summary>
public class DBVersioning : IVersioning
{
//string EntityConnectionString = @"metadata=res://*/DB.Versioning.csdl|res://*/DB.Versioning.ssdl|res://*/DB.Versioning.msl;provider={0};provider connection string=""{1}""";
EverestVersioningEntities dataContext;
public DBVersioning(string connectionStringName)
{
dataContext = new EverestVersioningEntities(ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString);
}
#region IVersioning Members
/// <summary>
/// Checkouts the specified UUID.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="user">The user.</param>
/// <param name="comment">The comment.</param>
/// <returns></returns>
public IVersionItem Checkout(Guid uuid, string user, string comment)
{
var lastestVersionItem = EnsureUncheckoutedByOthers(uuid, user);
if (lastestVersionItem != null)
{
lastestVersionItem.CheckoutBy = user;
lastestVersionItem.CheckoutComment = comment;
dataContext.SaveChanges();
}
return lastestVersionItem;
}
/// <summary>
/// Ensures the uncheckouted by others.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="user">The user.</param>
/// <param name="lastestRevision">The lastest revision.</param>
/// <returns></returns>
private Everest_VersionItem EnsureUncheckoutedByOthers(Guid uuid, string user)
{
var lastestVersionItem = (from v in dataContext.Everest_VersionItem
where v.UUID == uuid
orderby v.Revision descending
select v).FirstOrDefault();
if (lastestVersionItem != null)
{
if (lastestVersionItem.IsCheckout && lastestVersionItem.CheckoutBy != user)
{
throw new Exception(string.Format(Resources.CheckoutedByOthers, lastestVersionItem.CheckoutBy));
}
}
return lastestVersionItem;
}
/// <summary>
/// Checkins the specified versionable.
/// </summary>
/// <param name="versionable">The versionable.</param>
/// <param name="user">The user.</param>
/// <param name="comment">The comment.</param>
/// <returns></returns>
public IVersionItem Checkin(IVersionable versionable, string user, string comment)
{
Guid uuid = versionable.UUID;
var lastestVersionItem = EnsureUncheckoutedByOthers(uuid, user);
var revision = 1;
if (lastestVersionItem != null)
{
revision = lastestVersionItem.Revision + 1;
//set checkin
lastestVersionItem.CheckoutBy = string.Empty;
}
Everest_VersionItem versionItem = new Everest_VersionItem(this);
versionItem.UUID = uuid;
versionItem.SnapshotFormName = versionable.FormSchemaName;
versionItem.CheckinUser = user;
versionItem.Revision = revision;
versionItem.CheckinComment = comment;
versionItem.Body = versionable.SerializeToXml();
versionItem.DateTime = DateTime.Now;
versionItem.ObjectType = versionable.GetType().GetTypeNameWithoutVersion();
dataContext.AddToEverest_VersionItem(versionItem);
dataContext.SaveChanges();
return versionItem;
}
/// <summary>
/// Reverts the specified UUID to the revision.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="user">The user.</param>
/// <param name="revision">The revision.</param>
/// <param name="comment">The comment.</param>
/// <returns></returns>
public IVersionItem Revert(Guid uuid, string user, int revision, string comment)
{
var lastestVersionItem = EnsureUncheckoutedByOthers(uuid, user);
var newRevision = 1;
if (lastestVersionItem != null)
{
newRevision = lastestVersionItem.Revision + 1;
//set checkin
lastestVersionItem.CheckoutBy = string.Empty;
}
var revisionItem = (from v in dataContext.Everest_VersionItem
where v.UUID == uuid && v.Revision == revision
select v).First();
//cannot revert to the same version.
if (revisionItem.Revision == lastestVersionItem.Revision)
{
throw new Exception(Resources.RevertToSameVersion);
}
Everest_VersionItem newVersionItem = new Everest_VersionItem(this);
newVersionItem.Body = revisionItem.Body;
if (string.IsNullOrEmpty(comment))
{
newVersionItem.CheckinComment = string.Format(Resources.RevertedFrom, revision);
}
else
newVersionItem.CheckinComment = comment;
newVersionItem.DateTime = DateTime.Now;
newVersionItem.Revision = newRevision;
newVersionItem.Size = revisionItem.Size;
newVersionItem.CheckinUser = user;
newVersionItem.UUID = revisionItem.UUID;
newVersionItem.SnapshotFormName = revisionItem.SnapshotFormName;
newVersionItem.ObjectType = revisionItem.ObjectType;
object o = revisionItem.GetObject();
if (o is IVersionable)
{
((IVersionable)o).OnRevert(newVersionItem, revisionItem);
}
dataContext.AddToEverest_VersionItem(newVersionItem);
dataContext.SaveChanges();
return newVersionItem;
}
/// <summary>
/// Gets the versions.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <returns></returns>
public IEnumerable<IVersionItem> GetVersions(Guid uuid)
{
return (from v in dataContext.Everest_VersionItem
where v.UUID == uuid
orderby v.VersionID descending
select v).ToArray();
}
/// <summary>
/// Gets the version.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="revision">The revision.</param>
/// <returns></returns>
public IVersionItem GetVersion(Guid uuid, int revision)
{
return (from v in dataContext.Everest_VersionItem
where v.UUID == uuid && v.Revision == revision
select v).FirstOrDefault();
}
/// <summary>
/// Compares the specified UUID.
/// Default to compare to the last revision.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="revision">The revision.</param>
/// <returns></returns>
public IComparison Compare(Guid uuid, int revision)
{
throw new NotImplementedException();
}
/// <summary>
/// Compares the specified UUID.
/// Default to compare to the last revision.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="sourceRevision">The source revision.</param>
/// <param name="toRevision">To revision.</param>
/// <returns></returns>
public IComparison Compare(Guid uuid, int sourceRevision, int toRevision)
{
throw new NotImplementedException();
}
#endregion
/// <summary>
/// Gets the predecessor.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="revision">The revision.</param>
/// <returns></returns>
internal IVersionItem GetPredecessor(Guid uuid, int revision)
{
return (from v in dataContext.Everest_VersionItem
where v.UUID == uuid && v.Revision < revision
orderby v.Revision descending
select v).FirstOrDefault();
}
/// <summary>
/// Gets the successor.
/// </summary>
/// <param name="uuid">The UUID.</param>
/// <param name="revision">The revision.</param>
/// <returns></returns>
internal IVersionItem GetSuccessor(Guid uuid, int revision)
{
return (from v in dataContext.Everest_VersionItem
where v.UUID == uuid && v.Revision > revision
orderby v.Revision ascending
select v).FirstOrDefault();
}
#region IVersioning Members
/// <summary>
/// Checkouts the specified UUID.
/// </summary>
/// <param name="o"></param>
/// <param name="user"></param>
/// <param name="comment"></param>
/// <returns></returns>
public IVersionItem Checkout(IVersionable o, string user, string comment)
{
return Checkout(o.UUID, user, comment);
}
#endregion
#region IVersioning Members
public void ClearVersions(Guid uuid)
{
var versions = dataContext.Everest_VersionItem.Where(v => v.UUID == uuid).ToList();
foreach (var item in versions)
{
dataContext.DeleteObject(item);
}
dataContext.SaveChanges();
}
#endregion
}
}
|