diff --git a/script/import_storage b/script/import_storage index 6806b57f..2659defd 100755 --- a/script/import_storage +++ b/script/import_storage @@ -20,7 +20,7 @@ ARGV.options do |opts| "contains .snapshot files.") do |storage| OPTIONS[:storage] = storage end - + opts.separator "" opts.on("-i", "--instiki /full/path/to/instiki", String, @@ -31,15 +31,33 @@ ARGV.options do |opts| opts.separator "" + opts.on("-o", "--outfile /full/path/to/output_file", String, + "Full path (including filename!) to where ", + "you want the SQL output placed, such as ", + "/home/joe/instiki.sql") do |outfile| + OPTIONS[:outfile] = outfile + end + + opts.separator "" + opts.on_tail("-h", "--help", "Show this help message.") { puts opts; exit } opts.parse! end -if OPTIONS[:instiki].nil? or OPTIONS[:storage].nil? - $stderr.puts "Please specify full paths to Instiki installation and storage" - $stderr.puts +if OPTIONS[:instiki].nil? or OPTIONS[:storage].nil? or OPTIONS[:outfile].nil? + $stderr.puts "Please specify full paths to Instiki installation and storage," + $stderr.puts "as well as the path to the output file" + $stderr.puts + puts ARGV.options + exit -1 +end + +if FileTest.exists? OPTIONS[:outfile] + $stderr.puts "Output file #{OPTIONS[:outfile]} already exists!" + $stderr.puts "Please specify a new file" + $stderr.puts puts ARGV.options exit -1 end @@ -77,18 +95,64 @@ class Revision end end +def sql_insert(table, hash) + output = "INSERT INTO #{table} (" + output << hash.keys.join(", ") + + output << ") VALUES ('" + output << hash.values.map{|v| v.to_s.gsub("'", "\\\\'")}.join("', '") + + output << "');" + return output +end + WikiService.storage_path = OPTIONS[:storage] wiki = WikiService.instance -wiki.webs.each_pair do |web_name, web| - # INSERT INTO webs goes here - puts "Web #{web_name} has #{web.pages.keys.size} pages" - web.pages.each_pair do |page_name, page| - # INSERT INTO pages goes here - puts " Page #{page_name} has #{page.revisions.size} revisions" - page.revisions.each_with_index do |rev, i| - # INSERT INTO revisions goes here - puts " Revision #{i} created at #{rev.created_at}" - end +File.open(OPTIONS[:outfile], 'w') { |outfile| + wiki.webs.each_pair do |web_name, web| + outfile.puts sql_insert(:webs, { + :id => web.object_id, + :name => web.name, + :address => web.address, + :password => web.password, + :additional_style => web.additional_style, + :allow_uploads => web.allow_uploads, + :published => web.published, + :count_pages => web.count_pages, + :markup => web.markup, + :color => web.color, + :max_upload_size => web.max_upload_size, + :safe_mode => web.safe_mode, + :brackets_only => web.brackets_only, + }) + + puts "Web #{web_name} has #{web.pages.keys.size} pages" + web.pages.each_pair do |page_name, page| + outfile.puts sql_insert(:pages, { + :id => page.object_id, + :web_id => web.object_id, + :locked_by => page.locked_by, + :name => page.name + }) + + puts " Page #{page_name} has #{page.revisions.size} revisions" + page.revisions.each_with_index do |rev, i| + outfile.puts sql_insert(:revisions, { + :id => rev.object_id, + :page_id => page.object_id, + :content => rev.content, + :author => rev.author, + :ip => '0.0.0.0', + }) + puts " Revision #{i} created at #{rev.created_at}" + end + end end -end + + ['webs', 'pages', 'revisions'].each do |table| + outfile.puts "UPDATE #{table} SET created_at = NOW();" + outfile.puts "UPDATE #{table} SET updated_at = NOW();" + end + outfile.puts "UPDATE revisions SET revised_at = NOW();" +}