«

»

Mai 15

OwnCloud: Termine aus der Datenbank retten

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ückgängig zu machen, habe ich mich dafür entschieden, eine frische Wolke aufsetzen. Doch neben Dateien müssen natürlich die Termine und Aufgabenlisten selbstverständlich mitziehen.

Das folgende Perl-Skript hilft, um die Termine aus der alten Sqlite-Datenbank von OwnCloud 8 zu extrahieren. Es ist mit der heißen Nadel gestrickt, doch es erfüllt zunächst seinen Zweck. Es erzeugt für jeden in der Datenbank zu findenden Kalender eine vCal-Datei (.vcs), die sich mit OwnCloud 9 wieder importieren lässt. Enthalten sind neben den Terminen auch mögliche Aufgaben- und Journal-Einträge (VEVENT, VTODO, VJOURNAL).

#!/usr/bin/perl -w
#
# This script is a quick'n'dirty hack to restore calendar entries from an
# OwnCloud 8 sqlite database file. It opens the sqlite database owncloud.db
# and reads all calendar entries. They will be written into vCal files named
# user-calendar.vcs and should be importable by another OwnCloud instance.
# -------------------------------------------------------------------------
# Open database

use DBI;
use strict;

my $driver   = "SQLite"; 
my $database = "owncloud.db";
my $dsn = "DBI:$driver:dbname=$database";
my $userid = "";
my $password = "";
my $dbh = DBI->connect($dsn, $userid, $password, { RaiseError => 1 }) 
                      or die $DBI::errstr;

# Get all calendars

my $sth_cals = $dbh->prepare("SELECT id,userid,uri FROM oc_clndr_calendars;");
my $result = $sth_cals->execute() or die $DBI::errstr;
if ( $result < 0 ) { print $DBI::errstr; } while ( my @row_cal = $sth_cals->fetchrow_array() )
{

	# Get all entries of each calendar

	my $id = $row_cal[0];
	my $userid = $row_cal[1];
	my $uri = $row_cal[2];

	my $filename = "$userid-$uri.vcs";
	printf("$filename ...\n");

	open(my $out, ">", $filename);
	print $out "BEGIN:VCALENDAR\n";
	print $out "VERSION:2.0\n";
	print $out "PRODID:ownCloud Calendar\n";

	my $sth = $dbh->prepare("SELECT calendardata FROM oc_clndr_objects WHERE calendarid=$id;");
	my $rv = $sth->execute() or die $DBI::errstr;
	if($rv < 0){ print $DBI::errstr; } while(my @row = $sth->fetchrow_array()) {
		my $entry = $row[0];
		if ( $entry =~ m/(BEGIN:(VEVENT|VTODO|VJOURNAL).*END:(VEVENT|VTODO|VJOURNAL))/s )
		{
      			print($out "$1\n");
		}
	}

	print $out "END:VCALENDAR\n";
	close($out);
}

$dbh->disconnect();

 

Schreibe einen Kommentar