{"id":475664,"date":"2016-05-15T20:43:08","date_gmt":"2016-05-15T18:43:08","guid":{"rendered":"http:\/\/blog.embedded-system-design.de\/?p=475664"},"modified":"2016-05-15T20:43:08","modified_gmt":"2016-05-15T18:43:08","slug":"owncloud-termine-aus-der-datenbank-extrahieren","status":"publish","type":"post","link":"https:\/\/blog.embedded-system-design.de\/index.php\/2016\/05\/15\/owncloud-termine-aus-der-datenbank-extrahieren\/","title":{"rendered":"OwnCloud: Termine aus der Datenbank retten"},"content":{"rendered":"<p>Habe mir heute morgen meine OwnCloud-Installation beim Update und Wechsel des Datenbank-Backends von Sqlite auf MySQL zerschossen. Statt zu versuchen, das ganze r\u00fcckg\u00e4ngig zu machen, habe ich mich daf\u00fcr entschieden, eine frische Wolke aufsetzen. Doch neben Dateien m\u00fcssen nat\u00fcrlich die Termine und Aufgabenlisten selbstverst\u00e4ndlich mitziehen.<\/p>\n<p>Das folgende Perl-Skript hilft, um die Termine aus der alten Sqlite-Datenbank von OwnCloud 8 zu extrahieren. Es ist mit der hei\u00dfen Nadel gestrickt, doch es erf\u00fcllt zun\u00e4chst seinen Zweck. Es erzeugt f\u00fcr jeden in der Datenbank zu findenden Kalender eine vCal-Datei (.vcs), die sich mit OwnCloud 9 wieder importieren l\u00e4sst. Enthalten sind neben den Terminen auch m\u00f6gliche Aufgaben- und Journal-Eintr\u00e4ge (VEVENT, VTODO, VJOURNAL).<\/p>\n<pre lang=\"perl\" line=\"1\">#!\/usr\/bin\/perl -w\n#\n# This script is a quick'n'dirty hack to restore calendar entries from an\n# OwnCloud 8 sqlite database file. It opens the sqlite database owncloud.db\n# and reads all calendar entries. They will be written into vCal files named\n# user-calendar.vcs and should be importable by another OwnCloud instance.\n# -------------------------------------------------------------------------\n# Open database\n\nuse DBI;\nuse strict;\n\nmy $driver   = \"SQLite\"; \nmy $database = \"owncloud.db\";\nmy $dsn = \"DBI:$driver:dbname=$database\";\nmy $userid = \"\";\nmy $password = \"\";\nmy $dbh = DBI-&gt;connect($dsn, $userid, $password, { RaiseError =&gt; 1 }) \n                      or die $DBI::errstr;\n\n# Get all calendars\n\nmy $sth_cals = $dbh-&gt;prepare(\"SELECT id,userid,uri FROM oc_clndr_calendars;\");\nmy $result = $sth_cals-&gt;execute() or die $DBI::errstr;\nif ( $result &lt; 0 ) { print $DBI::errstr; } while ( my @row_cal = $sth_cals-&gt;fetchrow_array() )\n{\n\n\t# Get all entries of each calendar\n\n\tmy $id = $row_cal[0];\n\tmy $userid = $row_cal[1];\n\tmy $uri = $row_cal[2];\n\n\tmy $filename = \"$userid-$uri.vcs\";\n\tprintf(\"$filename ...\\n\");\n\n\topen(my $out, \"&gt;\", $filename);\n\tprint $out \"BEGIN:VCALENDAR\\n\";\n\tprint $out \"VERSION:2.0\\n\";\n\tprint $out \"PRODID:ownCloud Calendar\\n\";\n\n\tmy $sth = $dbh-&gt;prepare(\"SELECT calendardata FROM oc_clndr_objects WHERE calendarid=$id;\");\n\tmy $rv = $sth-&gt;execute() or die $DBI::errstr;\n\tif($rv &lt; 0){ print $DBI::errstr; } while(my @row = $sth-&gt;fetchrow_array()) {\n\t\tmy $entry = $row[0];\n\t\tif ( $entry =~ m\/(BEGIN:(VEVENT|VTODO|VJOURNAL).*END:(VEVENT|VTODO|VJOURNAL))\/s )\n\t\t{\n      \t\t\tprint($out \"$1\\n\");\n\t\t}\n\t}\n\n\tprint $out \"END:VCALENDAR\\n\";\n\tclose($out);\n}\n\n$dbh-&gt;disconnect();\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Habe mir heute morgen meine OwnCloud-Installation beim Update und Wechsel des Datenbank-Backends von Sqlite auf MySQL zerschossen. Statt zu versuchen, das ganze r\u00fcckg\u00e4ngig zu machen, habe ich mich daf\u00fcr entschieden, eine frische Wolke aufsetzen. Doch neben Dateien m\u00fcssen nat\u00fcrlich die Termine und Aufgabenlisten selbstverst\u00e4ndlich mitziehen. Das folgende Perl-Skript hilft, um die Termine aus der alten &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/blog.embedded-system-design.de\/index.php\/2016\/05\/15\/owncloud-termine-aus-der-datenbank-extrahieren\/\">Weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1,16],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/posts\/475664"}],"collection":[{"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/comments?post=475664"}],"version-history":[{"count":0,"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/posts\/475664\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/media?parent=475664"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/categories?post=475664"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/tags?post=475664"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}