Import from SQL to NSF: It's So Easy!
Fri Apr 06 19:57:00 EDT 2012
I decided I should probably finally get around to moving this blog from WordPress to Domino, if for no other reason than to have a perfect testbed for the weird stuff I've been doing lately. The first task is to write an importer, so I decided to just do a straight SQL rows -> Domino documents import. This couldn't be easier if you follow this simple guide:
- Write a Java agent that uses the appropriate JDBC connector for your database. In my case, it's MySQL, so I had it do a "show tables" to get a list of tables, then loop over those to do "select * from whatever" statements to get all documents.
- Since it's Domino, you can just do
doc.replaceItemValue(column, rs.getObject(column))
! - Oh wait, you can't all the time. Make sure to handle a couple cases, like converting BigIntegers to longs and Timestamps to DateTimes.
- Wait, Domino doesn't even handle Boolean? For frack's sake, FINE:
row.replaceItemValue(column, cell.equals(Boolean.TRUE) ? 1 : 0);
- Oh hey, that import went really smoothly! Now I'll just make some views based on the table name and... crap. Forgot to include the table name! Maybe I shouldn't have written this importer at four in the morning.
- Better delete all the documents and start over.
- What's this, an error when I went to delete all the documents in the All view? "Field is too large (32k) or..." oh no.
- Oh crap.
- Crap!
- Ah, I know - I'll just write an agent to do
session.CurrentDatabase.AllDocuments.RemoveAll(True)
and that'll fix that. - Hmm, nope, that didn't work. Alright, based on the documents created around the same time, I can guess that it's the "option_value" field that's too big. Why did it even cram that data into summary if it completely breaks the document? Well, no point in dealing with that now. It's time for StampAll to take care of that!
- Nope? Okay, how about
session.CurrentDatabase.GetView("All").AllEntries.StampAll
? - Not all categorized? What kind of error message is THAT?
- Time to delete the database and start over!
- Alright, THIS TIME, check to see if the String value is over, let's say, 16000 bytes and, if so, store it in a RichTextItem instead.
- Oh nice, it worked.
- Oh crap, I forgot to include the table name again.
And that's all there is to it!
Dan SIckles - Fri Apr 06 12:59:00 EDT 2012
Only four craps! Last time I tried something like that it was at least five craps.
Patrick Sawyer - Sun Apr 08 14:01:04 EDT 2012
Why didn't you try to use TDI for that? Curious if there as a limitation that prevented you from using it.