Skip to content

Instantly share code, notes, and snippets.

@vince-geekcore
Last active November 22, 2016 21:56
Show Gist options
  • Save vince-geekcore/3af5de5352edf7aae31fffa3a9044023 to your computer and use it in GitHub Desktop.
Save vince-geekcore/3af5de5352edf7aae31fffa3a9044023 to your computer and use it in GitHub Desktop.
This code was used in a one-time migration script on Sitecore 7.2 (2014) // Parts are supplied by Sitecore.Support. No guarantees ;) // More context can be found here http://www.geekcore.nl/sitecore/extreme-sitecore-migration/
// This code was used in a one-time migration script on Sitecore 7.2 (2014)
// Parts are supplied by Sitecore.Support. No guarantees ;)
// More context can be found here http://www.geekcore.nl/sitecore/extreme-sitecore-migration/
public class TransferMedia
{
public Sitecore.Data.Database migration
{
get
{
return Sitecore.Data.Database.GetDatabase("migration");
}
}
protected Database ContentDatabase
{
get
{
Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master");
return master;
}
}
public log4net.ILog logger = log4net.LogManager.GetLogger("Sitecore.Diagnostics.xxxxxxxxxxx");
public StringBuilder Messages = new StringBuilder();
public void TransferMediaFolder(Item siteRoot)
{
using (new SecurityDisabler())
{
Item mediaLibRootInMigration = migration.GetItem(Sitecore.ItemIDs.MediaLibraryRoot);
Item mediaLibItem = mediaLibRootInMigration.Axes.GetChild(siteRoot.Name);
if(mediaLibItem == null)
{
// No media folder found!!
string nomedialibMessage = String.Format("No media library folder in migration DB found for '{0}'", siteRoot.Paths.FullPath);
Messages.AppendLine(nomedialibMessage);
logger.Info(nomedialibMessage);
return;
}
Item medialibRootInMaster = ContentDatabase.GetItem(Sitecore.ItemIDs.MediaLibraryRoot);
TransferMediaNode(mediaLibItem, medialibRootInMaster, true);
string successMessage = String.Format("Succesfully transferred media item library for '{0}'", siteRoot.Paths.FullPath);
Messages.AppendLine(successMessage);
logger.Info(successMessage);
}
}
/// <summary>
/// Transfers the items.
///
/// </summary>
protected bool TransferMediaNode(Item sourceItem, Item destinationRoot, bool includeSubItems)
{
bool itemTransferred = false;
if (sourceItem == null)
{
// do something
}
if (destinationRoot == null)
{
// do something
}
using (new ProxyDisabler())
{
string outerXml = sourceItem.GetOuterXml(includeSubItems);
try
{
ItemTransferringCapsule capsule = new ItemTransferringCapsule(sourceItem.Database, destinationRoot.Database);
try
{
Event.Subscribe("item:saved", new EventHandler(BlobTransferrer.TransferBlobOnSave));
using (new ItemTransferringContext(capsule))
destinationRoot.Paste(outerXml, false, PasteMode.Overwrite);
}
finally
{
Event.Unsubscribe("item:saved", new EventHandler(BlobTransferrer.TransferBlobOnSave));
}
}
catch (TemplateNotFoundException ex)
{
// log /throw error
}
}
return itemTransferred;
}
}
public class ItemTransferringCapsule
{
public Database SourceDb { get; set; }
public Database TargetDb { get; set; }
public ItemTransferringCapsule(Database sourceDb, Database targetDb)
{
this.SourceDb = sourceDb;
this.TargetDb = targetDb;
}
}
public class ItemTransferringContext : Switcher<ItemTransferringCapsule>
{
public ItemTransferringContext(ItemTransferringCapsule capsule)
: base(capsule)
{
}
}
public class BlobTransferrer
{
public static log4net.ILog logger = log4net.LogManager.GetLogger("Sitecore.Diagnostics.xxxxxxxxx");
public static void TransferBlobOnSave(object sender, EventArgs e)
{
ItemTransferringCapsule currentValue = Switcher<ItemTransferringCapsule, ItemTransferringCapsule>.CurrentValue;
if (currentValue == null)
return;
Item obj = SitecoreEventArgs.GetItem(e, 0);
Assert.IsNotNull((object)obj, "Item cannot be null");
List<Guid> blobIds = new List<Guid>();
if (obj.Template != null)
{
foreach (TemplateField templateField in TemplateManager.GetTemplate(obj).GetFields())
{
if (templateField.IsBlob)
{
string str = obj.Fields[templateField.ID].GetValue(true);
if (!StringExtensions.IsNullOrEmpty(str) && MainUtil.IsID(str))
blobIds.Add(new Guid(str));
}
}
}
else
{
// No media folder found!!
string noTemplateMessage = String.Format("No template found for item: '{0}'", obj.Paths.FullPath);
logger.Info(noTemplateMessage);
}
if (blobIds.Count <= 0)
return;
BlobTransferrer.PerformBlobsTransfer(blobIds, currentValue);
}
private static void PerformBlobsTransfer(List<Guid> blobIds, ItemTransferringCapsule currentCapsule)
{
foreach (Guid blobId in blobIds)
{
if (!ItemManager.BlobStreamExists(blobId, currentCapsule.TargetDb))
{
using (Stream blobStream = ItemManager.GetBlobStream(blobId, currentCapsule.SourceDb))
ItemManager.SetBlobStream(blobStream, blobId, currentCapsule.TargetDb);
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment