This is Part 2 of my series on setting up my blog for Orchard CMS. If you have not read Part 1, I suggest you go check it out first as it goes through the setup of the Orchard blog. In this post I will share what I went through to get converted out of Graffiti and to a format that Orchard can import (BlogML).

The Series

Walking Through the Orchard Part 1 – Setting up a Blog
Walking Through the Orchard Part 2 – Conversion from Graffiti
Walking Through the Orchard Part 3 – BlogML Import
Walking Through the Orchard Part 4 – ???

Where to Start?

A few quick internet searches uncovered a very useful program written by Jon Sagara (who says he converted it from VB to C# from Curt C). I downloaded it, unblocked it, extracted it, then added a few extra lines of code to write statements to the output window so I could watch the conversion as it went. I also changed the pointer to the database for Graffiti, so it could find the file to convert. Pretty easy change to the app.config file:

    <add name="Graffiti" connectionString="Data Source=C:\temp\Graffiti_JP.vdb3"/>

Next I commented out the call to export to movable type and uncommented the call to export to BlogML (since that is what I use to import into Orchard). The lines of code I flipped are in the RunButton_Click handler in Form1.cs:


Time to Run

Overall it was a success. It took about 3 hours to run for about 630 posts and 3000+ comments, which is why I was glad I added the Console.Writeline statements so I could watch its progress. Total time from download of the program, initial tests and conversion was just under 5 hours. In the end I had a 4.5 MB XML file that I could use to import into Orchard once I was ready.

NOTE: I ran this conversion for another blog which has about 40 posts and it took about 5 minutes. Not sure why the first one took so long … perhaps it was just an anomaly. The latter seems much more realistic. Maybe due to the comments I had … so basically, “your mileage may vary”.

Cleaning Up

This conversion worked, but there were some things I wish I knew in advance that I did not find out until after I had already exported the content and then imported it into my Orchard instance. At that point, I just cleaned it up and moved on.

So went were those things? Well, the slugs were all exactly the same as the url’s to the posts. I use slugs occasionally for posts like Silverlight TV notices, so I knew I had to go fix these.

Next, the categories in Graffiti were exported as tags. If I looked closer at the BlogML I would have noticed this, but I didn’t. So this was a casualty of my conversion that I was willing to live with and fix later.

The comments were all wrapped with a <p> and </p> html tags. Easy fix once I got it into the destination database, but still annoying. Here is the TSQL I used to fix it.

Caution: I am not responsible for what you do with this TSQL! So use at your own risk Smile. In fact, I included a rollback transaction in here so you can try it and see the results before you commit it.

begin tran
    cast(replace(replace(cast(CommentText as nvarchar(max)), '<p>', ''), '</p>', '') as ntext) as Expr1
from Orchard_Comments_CommentPartRecord
update Orchard_Comments_CommentPartRecord
set    CommentText = cast(replace(replace(cast(CommentText as nvarchar(max)), '<p>', ''), '</p>', '') as ntext) 
select @@rowcount
from Orchard_Comments_CommentPartRecord
rollback tran

There may be other issues waiting for me, but this is what I found in the first few days.

So in summary, here are the issues I ran into:

  1. Slugs got hosed. Wish I knew in advanced, as I would have fixed the code. Hopefully my pain here is your gain.
  2. Tags got hosed. Again, hindsight is 20/20. I have a SQL command I am working on to get these back, but its not bothering me that much.
  3. Comments don’t have names next to them. The user name (for the blog) was brought over for the comments when in fact I wanted the name the person entered in the comment. I don’t require folks to log in, so my user names ere blank. In hindsight I would have brought over the Author name.  You can fix this in the export code above.

Next Up

The next part of  this series will cover the import process into Orchard. And I am realizing that there will certainly be more parts to this series after that too as there is much more I have learned. Overall I am very happy with my decision to move to Orchard. The pains I have run into are almost entirely due to getting off of Graffiti.

I hope this helps! Please share your experiences too.

John Papa

Evangelist on the Loose