summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorAndreas Brachold <vdr07@deltab.de>2007-08-13 18:41:27 +0000
committerAndreas Brachold <vdr07@deltab.de>2007-08-13 18:41:27 +0000
commitbcbf441e09fb502cf64924ff2530fa144bdf52c5 (patch)
treef377707a2dac078db8cd0c7d7abfe69ac1006d71 /contrib
downloadxxv-bcbf441e09fb502cf64924ff2530fa144bdf52c5.tar.gz
xxv-bcbf441e09fb502cf64924ff2530fa144bdf52c5.tar.bz2
* Move files to trunk
Diffstat (limited to 'contrib')
-rw-r--r--contrib/README27
-rwxr-xr-xcontrib/at-vdradmin2xxv.pl222
-rwxr-xr-xcontrib/chronicle-remove-duplicate.pl105
-rw-r--r--contrib/create-database.sql22
-rw-r--r--contrib/export-data.sql10
-rw-r--r--contrib/import-data.sql17
-rwxr-xr-xcontrib/update-xxv283
-rw-r--r--contrib/upgrade-xxv-db.sql304
8 files changed, 990 insertions, 0 deletions
diff --git a/contrib/README b/contrib/README
new file mode 100644
index 0000000..4640274
--- /dev/null
+++ b/contrib/README
@@ -0,0 +1,27 @@
+To create a empty database und create a mysql-useraccount, change on
+file create-database.sql on all placed username 'xpix' and password 'xpix97'
+to your our values.
+
+$ cat ./contrib/create-database.sql | mysql -u root
+
+Adjust your mysql-username and password also on xxvd.cfg
+[General]
+DSN=DBI:mysql:database=xxv;host=localhost;port=3306
+PWD=xpix97
+USR=xpix
+
+
+--------------------------------------------------------------------------------
+
+To upgrade database from prior release from xxv call 'update-xxv'
+It's backup your own data like Autotimer or XXV-Useraccount.
+
+$ ./contrib/update-xxv
+
+
+--------------------------------------------------------------------------------
+
+To migrate autotimer from vdradmin to xxv call 'at-vdradmin2xxv.pl'
+It's could use to export some data from xxv autotimer to vdradmin.
+
+$ ./contrib/at-vdradmin2xxv.pl /path/vdradmind.at
diff --git a/contrib/at-vdradmin2xxv.pl b/contrib/at-vdradmin2xxv.pl
new file mode 100755
index 0000000..6d41b55
--- /dev/null
+++ b/contrib/at-vdradmin2xxv.pl
@@ -0,0 +1,222 @@
+#!/usr/bin/perl -w
+use strict;
+use warnings;
+use DBI; #Database independent interface for Perl
+use DBD::mysql; #MySQL driver for the Perl5 Database Interface (DBI)
+use Getopt::Std;
+
+my $db = "xxv";
+my $host = "localhost";
+my $port = "3306";
+my $usr = "root";
+my $pwd = "";
+
+
+my $Usage = qq{
+Import or Export Autotimer from XXV to or from a VDRAdmin file
+Usage: $0 [options] file
+
+Options:
+ -H <hostname> : Host name of the MySQL server (default: '$host')
+ -P <port> : Port number of MySQL server (default: '$port')
+ -d <database> : XXV database name (default: '$db')
+ -u <user> : Username (default: '$usr')
+ -p <password> : Password (default: '$pwd')
+ -e : Export to file (default: Import from file)
+ -h : Help
+
+};
+
+use vars qw/ %opt /;
+my $dbh;
+
+die $Usage if (!$ARGV[0] || !getopts("d:H:P:u:p:eh", \%opt) || $opt{h} );
+
+
+$db = $opt{d} if($opt{d});
+$host = $opt{H} if($opt{H});
+$port = $opt{P} if($opt{P});
+$usr = $opt{u} if($opt{u});
+$pwd = $opt{p} if($opt{p});
+
+my $filename = "@ARGV";
+
+# ------------------
+sub ChannelArray {
+# ------------------
+ my $field = shift || return undef;
+ my $sql = sprintf('select %s, POS from CHANNELS order by POS', $field);
+ my $erg = $dbh->selectall_arrayref($sql);
+ return $erg;
+}
+
+# ------------------
+sub PosToChannel {
+# ------------------
+ my $pos = shift || return undef;
+ my $sql = sprintf('select Id from CHANNELS where POS = "%lu"', $pos);
+ my $erg = $dbh->selectall_arrayref($sql);
+ return $erg->[0][0];
+}
+
+# ------------------
+sub _insert {
+# ------------------
+ my $data = shift || return;
+
+ if(ref $data eq 'HASH') {
+ my ($names, $vals, $kenn);
+ map {
+ push(@$names, $_);
+ push(@$vals, $data->{$_}),
+ push(@$kenn, '?'),
+ } sort keys %$data;
+
+ my $sql = sprintf("REPLACE INTO AUTOTIMER (%s) VALUES (%s)",
+ join(', ', @$names),
+ join(', ', @$kenn),
+ );
+ my $sth = $dbh->prepare( $sql );
+ $sth->execute( @$vals );
+ } else {
+ my $sth = $dbh->prepare('REPLACE INTO AUTOTIMER VALUES (?,?,?,?,?,?,?,?,?)');
+ $sth->execute( @$data );
+ }
+}
+
+# ------------------
+# Name: autotimerimport
+# Descr: Read a file for import autotimer export list.
+# Usage: autotimerimport($filename);
+# ------------------
+sub autotimerimport {
+ my $AT_FILENAME = shift || die("No filename to import! Use $0 'vdradmind.at'\n");
+
+ my $cnt = "0";
+ open(AT_FILE, "$AT_FILENAME") || return die sprintf("Can't open file '%s' : %s\n",$AT_FILENAME,$!);
+ while(<AT_FILE>) {
+ chomp;
+ next if ($_ eq "");
+
+ my($active, $pattern, $section, $start, $stop, $episode, $prio,
+ $lft, $channel, $directoy) = split(/\:/, $_);
+
+ my $data;
+ $data->{Id} = 0;
+ if($active eq "1") { $data->{Activ} = 'y'; }
+ else { $data->{Activ} = 'n'; }
+
+ my @vals;
+ $data->{Done} = 'timer';
+ $data->{Search} = $pattern;
+ push(@vals, "title")
+ if($section & 1);
+ push(@vals, "subtitle")
+ if($section & 2);
+ push(@vals, "description")
+ if($section & 4);
+ $data->{InFields} = join(',', @vals);
+ if( $channel ne "") {
+ if (my $chid = &PosToChannel($channel)) {
+ $data->{Channels} = $chid;
+ }
+ }
+ $data->{Priority} = $prio;
+ $data->{Lifetime} = $lft;
+ $data->{Dir} = $directoy;
+ $data->{Start} = $start;
+ $data->{Stop} = $stop;
+ # autotimerimport don't support episode, i belief "1" means File = title~subtitle / "0" means File = title
+ # $data->{Episode} = $episode;
+
+ &_insert($data);
+ ++$cnt;
+ }
+ close (AT_FILE);
+ print STDERR sprintf("%d Autotimer read from file %s.\n",$cnt,$AT_FILENAME);
+
+ return 0;
+}
+
+# ------------------
+# Name: autotimerexport
+# Descr: Read autotimer from database and save this to a export file.
+# Usage: autotimerexport($filename);
+# ------------------
+sub autotimerexport {
+ my $AT_FILENAME = shift || die("No filename to export! Use $0 -e 'vdradmind.at'\n");
+
+ die sprintf("File to store autotimer '%s' already exist! The file can't be overwritten. Please remove the file manually.\n",$AT_FILENAME)
+ if(-e $AT_FILENAME);
+
+ my $sql = "select Activ, Search, InFields, Channels, Dir, Start, Stop, Priority, Lifetime from AUTOTIMER order by Id";
+ my $atlist = $dbh->selectall_arrayref($sql);
+
+ die "No autotimer data are to export available!\n"
+ if((!$atlist) || (scalar $atlist <= 0));
+
+ my $cnt = "0";
+ open(AT_FILE, ">$AT_FILENAME") || die sprintf("Can't open file '%s' : %s\n",$AT_FILENAME,$!);
+ foreach my $data (@$atlist) {
+ if($data->[1] ne "" and $data->[2] ne "") {
+
+ my $active = "0";
+ my $pattern = $data->[1];
+ my $section = "0";
+ my $start = "";
+ my $stop = "";
+ my $episode = "0"; # autotimerexport don't support episode, i belief "1" means File = title~subtitle / "0" means File = title
+ my $prio = "";
+ my $lft = "";
+ my $channel = "";
+ my $directoy = "";
+
+ $active = "1" if($data->[0] eq "y");
+
+ $section |= 1 if ($data->[2]=~/^.*title.*$/);
+ $section |= 2 if ($data->[2]=~/^.*subtitle.*$/);
+ $section |= 4 if ($data->[2]=~/^.*description.*$/);
+
+ if( $data->[3]) {
+ foreach my $ch (@{&ChannelArray('Id')}) {
+ if ($data->[3] eq $ch->[0]) { # vdradmin suppport only one Channel
+ $channel = $ch->[1];
+ last;
+ }
+ }
+ }
+
+ $directoy = $data->[4] if($data->[4]);
+ $start = $data->[5] if($data->[5] and $data->[5] ne $data->[6]); # Exclude if start and stop if same value e.g. 0000
+ $stop = $data->[6] if($data->[6] and $data->[5] ne $data->[6]);
+ $prio = $data->[7] if($data->[7]);
+ $lft = $data->[8] if($data->[8]);
+
+ print AT_FILE sprintf("%s:%s:%s:%s:%s:%s:%s:%s:%s:%s\n",
+ $active,$pattern,$section,$start,$stop,$episode,$prio,$lft,$channel,$directoy)
+ || die sprintf("Can't write file '%s' : %s\n",$AT_FILENAME,$!);
+ ++$cnt;
+ }
+ }
+ close (AT_FILE);
+
+ print STDERR sprintf("%d Autotimer write to file %s\n",$cnt,$AT_FILENAME);
+
+ return 0;
+}
+
+
+$dbh = DBI->connect("DBI:mysql:database=$db;host=$host;port=$port", $usr, $pwd,{
+ PrintError => 1,
+ AutoCommit => 1,
+}) || die $DBI::errstr;
+
+exit 1
+ unless($dbh);
+
+exit &autotimerexport($filename)
+ if($opt{e});
+exit &autotimerimport($filename)
+ if(!$opt{e});
+
+
diff --git a/contrib/chronicle-remove-duplicate.pl b/contrib/chronicle-remove-duplicate.pl
new file mode 100755
index 0000000..2902107
--- /dev/null
+++ b/contrib/chronicle-remove-duplicate.pl
@@ -0,0 +1,105 @@
+#!/usr/bin/perl -w
+use strict;
+use warnings;
+use DBI; #Database independent interface for Perl
+use DBD::mysql; #MySQL driver for the Perl5 Database Interface (DBI)
+use Getopt::Std;
+
+my $db = "xxv";
+my $host = "localhost";
+my $port = "3306";
+my $usr = "root";
+my $pwd = "";
+
+
+my $Usage = qq{
+this script search and remove duplicates from CHRONICLE.
+Duplicates should never occurrence, but it's some time possible.
+e.g. after migration from mysql 4.0 to 5.0.
+
+Usage: $0 [options]
+
+Options:
+ -H <hostname> : Host name of the MySQL server (default: '$host')
+ -P <port> : Port number of MySQL server (default: '$port')
+ -d <database> : XXV database name (default: '$db')
+ -u <user> : Username (default: '$usr')
+ -p <password> : Password (default: '$pwd')
+ -q : Be quiet
+ -h : Help
+
+};
+
+use vars qw/ %opt /;
+my $dbh;
+
+die $Usage if (!getopts("d:H:P:u:p:hq", \%opt) || $opt{h} );
+
+
+$db = $opt{d} if($opt{d});
+$host = $opt{H} if($opt{H});
+$port = $opt{P} if($opt{P});
+$usr = $opt{u} if($opt{u});
+$pwd = $opt{p} if($opt{p});
+
+# ------------------
+# dump_duplicates
+# ------------------
+sub dump_duplicates {
+
+# my $sth = $dbh->prepare('select id,title,channel_id FROM CHRONICLE')
+ my $sth = $dbh->prepare('select id,title,channel_id FROM CHRONICLE WHERE id IN (SELECT id FROM TMPCHRONICLE)')
+ or die "Couldn't prepare dump statement: " . $dbh->errstr;
+ my @data;
+
+ $sth->execute()
+ or die "Couldn't execute dump statement: " . $sth->errstr;
+
+ while (@data = $sth->fetchrow_array()) {
+ print sprintf("%3d: %20s %s\n",$data[0],$data[2],$data[1]);
+ }
+
+ if ($sth->rows == 0) {
+ print "There none duplicates found.\n";
+ }
+}
+# ------------------
+# search and remove duplicates from CHRONICLE
+# ------------------
+sub remove_duplicates {
+
+ $dbh->do(qq|DROP TABLE IF EXISTS TMPCHRONICLE|)
+ || die "Couldn't drop temporary table: ". $dbh->errstr;
+ $dbh->do(qq|
+ CREATE TEMPORARY TABLE TMPCHRONICLE
+ SELECT min(id) id
+ FROM CHRONICLE
+ GROUP BY title,channel_id,starttime,duration
+ HAVING count(*) > 1
+ |) || die "Couldn't create temporary table: ". $dbh->errstr;
+
+ &dump_duplicates() if(! $opt{q});
+
+ $dbh->do(qq|DELETE FROM CHRONICLE WHERE id IN (SELECT id FROM TMPCHRONICLE)|)
+ || die "Couldn't delete duplicates from temporary table: ". $dbh->errstr;
+
+ $dbh->do(qq|DROP TABLE IF EXISTS TMPCHRONICLE|)
+ || die "Couldn't drop temporary table: ". $dbh->errstr;
+
+ $dbh->disconnect;
+
+ return 0;
+}
+
+$dbh = DBI->connect("DBI:mysql:database=$db;host=$host;port=$port", $usr, $pwd,{
+ PrintError => 1,
+ AutoCommit => 1,
+}) || die $DBI::errstr;
+
+exit 1
+ unless($dbh);
+
+exit &remove_duplicates();
+
+
+
diff --git a/contrib/create-database.sql b/contrib/create-database.sql
new file mode 100644
index 0000000..8c31b90
--- /dev/null
+++ b/contrib/create-database.sql
@@ -0,0 +1,22 @@
+--
+-- Current Database: mysql
+--
+use mysql;
+
+CREATE DATABASE IF NOT EXISTS xxv;
+
+use xxv;
+
+-- Create a mysql-Account : Adjust User and Password here and add this to xxvd.cfg
+-- [General]
+-- DSN=DBI:mysql:database=xxv;host=localhost;port=3306
+-- PWD=password
+-- USR=username
+
+-- The first line is useful for granting access to user xxv on all computers in a network.
+/* grant all privileges on xxv.* to username@'%' IDENTIFIED BY 'password'; */
+
+-- Grant access to user xxv on the local machine with password 'xxv'
+grant all privileges on xxv.* to xxv@localhost IDENTIFIED BY 'xxv';
+
+flush privileges;
diff --git a/contrib/export-data.sql b/contrib/export-data.sql
new file mode 100644
index 0000000..d863159
--- /dev/null
+++ b/contrib/export-data.sql
@@ -0,0 +1,10 @@
+--
+-- Store Table from Database xxv to files
+--
+
+select * INTO OUTFILE '/tmp/autotimer.sav' from AUTOTIMER;
+select * INTO OUTFILE '/tmp/user.sav' from USER;
+select * INTO OUTFILE '/tmp/chronicle.sav' from CHRONICLE;
+select * INTO OUTFILE '/tmp/medialib_actors.sav' from MEDIALIB_ACTORS;
+select * INTO OUTFILE '/tmp/medialib_videodata.sav' from MEDIALIB_VIDEODATA;
+select * INTO OUTFILE '/tmp/medialib_videogenre.sav' from MEDIALIB_VIDEOGENRE;
diff --git a/contrib/import-data.sql b/contrib/import-data.sql
new file mode 100644
index 0000000..fbad5e8
--- /dev/null
+++ b/contrib/import-data.sql
@@ -0,0 +1,17 @@
+--
+-- Load files to Database xxv
+--
+
+DELETE from AUTOTIMER;
+DELETE from CHRONICLE;
+DELETE from USER;
+DELETE from MEDIALIB_ACTORS;
+DELETE from MEDIALIB_VIDEODATA;
+DELETE from MEDIALIB_VIDEOGENRE;
+
+load data infile '/tmp/autotimer.sav' into table AUTOTIMER;
+load data infile '/tmp/user.sav' into table USER;
+load data infile '/tmp/chronicle.sav' into table CHRONICLE;
+load data infile '/tmp/medialib_actors.sav' into table MEDIALIB_ACTORS;
+load data infile '/tmp/medialib_videodata.sav' into table MEDIALIB_VIDEODATA;
+load data infile '/tmp/medialib_videogenre.sav' into table MEDIALIB_VIDEOGENRE;
diff --git a/contrib/update-xxv b/contrib/update-xxv
new file mode 100755
index 0000000..ec51119
--- /dev/null
+++ b/contrib/update-xxv
@@ -0,0 +1,283 @@
+#!/bin/bash
+#
+# Update XXV's database
+#
+# Usage: update-xxv [OPTIONS]
+#
+# Options: -b <target> : Make a backup first to <target>.gz
+# -h <hostname> : Host name of the MySQL server (default: localhost)
+# -P <port> : Port number of MySQL server
+# -d <database> : XXV database name (default: xxv)
+# -u <user> : Username (default: root)
+# -p <password> : Password (default: no password)
+# -a : Ask for password
+# -f : Force upgrade, do not check version
+# -v : Display actual Version
+# -h : Help
+
+
+# Increment the version number each time the database changes!
+#
+actualVersion=25
+
+# Specify tables to export before and import after update
+#
+tables='AUTOTIMER USER CHRONICLE MEDIALIB_ACTORS MEDIALIB_VIDEODATA MEDIALIB_VIDEOGENRE'
+
+showTitle()
+{
+ echo
+ echo 'update-xxv'
+ echo '----------'
+ echo
+}
+
+showHelp()
+{
+ echo 'Usage: update-xxv [-b] [-h hostname] [-P port] [-d database]'
+ echo ' [-u user] [-p password]'
+ echo
+ echo '-b <target> : Make a backup first to <target>.gz'
+ echo '-H <hostname> : Host name of the MySQL server (default: localhost)'
+ echo '-P <port> : Port number of MySQL server'
+ echo '-d <database> : XXV database name (default: xxv)'
+ echo '-u <user> : Username (default: root)'
+ echo '-p <password> : Password (default: no password)'
+ echo '-a : Ask for password'
+ echo '-f : Force upgrade, do not check version'
+ echo '-v : Display actual version'
+ echo '-h : Help'
+}
+
+showCommandLineHint()
+{
+ echo
+ echo 'Hint: You might need to overwrite the defaults for the database'
+ echo 'server, the database name or the user name and password.'
+ echo
+ echo 'See update-xxv -h for a list of available options.'
+ echo
+}
+
+showError()
+{
+ echo "Error: $*" >&2
+}
+
+showInfo()
+{
+ echo "Info: $*"
+}
+
+setDefaults()
+{
+ [ -z $isDoBackup ] && isDoBackup='false'
+ [ -z $host ] && host='localhost'
+ [ -z $database ] && database='xxv'
+ [ -z $user ] && user='root'
+ [ -z $isForceUpdate ] && isForceUpdate='false'
+ [ -z $askPassword ] && askPassword='false'
+}
+
+buildMysqlParams()
+{
+ mysqlParams="--host=$host --user=$user"
+ if [ $askPassword == 'true' ] ; then
+ mysqlParams="$mysqlParams -p"
+ else
+ if [ -n "$password" ] ; then
+ mysqlParams="$mysqlParams --password='$password'"
+ fi
+ fi
+ if [ -n "$port" ] ; then
+ mysqlParams="$mysqlParams --port=$port"
+ fi
+}
+
+checkXxv()
+{
+ if pgrep xxvd >/dev/null 2>&1 ; then
+ showError 'XXV is still running, please stop XXV first!'
+ exit 1
+ fi
+}
+
+checkServer()
+{
+ showInfo 'Checking Server'
+ if ! eval mysql $mysqlParams </dev/null >/dev/null 2>&1 ; then
+ showError "Can not connect to mysql server on '$host' !"
+ showCommandLineHint
+ exit 1
+ fi
+}
+
+checkDatabase()
+{
+ showInfo 'Checking Database'
+ if ! eval mysql $mysqlParams -f -B -e '"show databases;"' | \
+ grep -e "^$database$" > /dev/null 2>&1 ; then
+ showError "Can not access database '$database'"
+ showCommandLineHint
+ exit 1
+ fi
+}
+
+exportDb()
+{
+ showInfo 'Saving Data'
+ for table in $tables ; do
+ savFile="$exportDir/$table.sav"
+ if ! eval mysql $mysqlParams -f -B $database -e \
+ "\"select * into outfile '$savFile' from $table;\"" ; then
+ showError "Can't save table '$table'"
+ fi
+ done
+}
+
+importDb()
+{
+ showInfo 'Restoring Data'
+ for table in $tables ; do
+ savFile="$exportDir/$table.sav"
+ if ! eval mysql $mysqlParams -f -B $database -e \
+ "\"load data infile '$savFile' into table $table;\"" ; then
+ showError "Can't load table '$table'"
+ exit 1
+ fi
+ done
+}
+
+updateDb()
+{
+ showInfo 'Updating Database'
+ if ! eval mysql $mysqlParams -f -B $database < upgrade-xxv-db.sql ; then
+ showError 'Update failed!' ;
+ exit 1
+ fi
+}
+
+getActualVersion()
+{
+ showInfo "Retrieving actual version: '$actualVersion'";
+}
+
+getVersion()
+{
+ showInfo 'Retrieving current version'
+ version=`eval mysql $mysqlParams -f -B -s $database -e \
+ "\"select Version from VERSION;\"" 2>/dev/null`
+}
+
+updateVersion()
+{
+ showInfo 'Updateing Version'
+ if ! eval mysql $mysqlParams -f -B $database -e \
+ "\"insert into VERSION (Version) VALUES($actualVersion);\"" ; then
+ showError 'Could not set new version number!!!'
+ exit 1
+ fi
+}
+
+#
+# main()
+#
+
+showTitle
+
+# parse parameters
+while [ $# -ge 1 ] ; do
+ case $1 in
+ -b)
+ backupTarget=$2 ; shift
+ ;;
+ -H)
+ host=$2 ; shift
+ ;;
+ -P)
+ port=$2 ; shift
+ ;;
+ -d)
+ database=$2 ; shift
+ ;;
+ -u)
+ user=$2 ; shift
+ ;;
+ -p)
+ password=$2 ; shift
+ ;;
+ -a)
+ askPassword='true'
+ ;;
+ -f)
+ isForceUpdate='true'
+ ;;
+ -v)
+ getActualVersion
+ exit 1;
+ ;;
+ *)
+ showHelp
+ exit 1
+ ;;
+ esac
+
+ shift
+done
+
+# check if XXV is still running
+checkXxv
+
+# set defaults and build mysql command line
+setDefaults
+buildMysqlParams
+
+# check the database
+checkServer
+checkDatabase
+
+# retrieve version and check if update should be performed
+getVersion
+[ -z $version ] && version=0
+showInfo "current database version: $version"
+showInfo "new database version: $actualVersion"
+
+if [ $actualVersion -eq $version ] ; then
+ showInfo 'Database is up to date - no need to update'
+ if [ $isForceUpdate == 'true' ] ;then
+ showInfo 'As requested, the update will be forced!'
+ else
+ exit 0
+ fi
+fi
+if [ $actualVersion -lt $version ] ; then
+ showError 'Database is more actual than the version you want to update to.'
+ showError 'Database downgrades are not advisable!'
+ if [ $isForceUpdate == 'true' ] ;then
+ showInfo 'As requested, a downgrade will be forced anyway!'
+ else
+ exit 1
+ fi
+fi
+
+# backup
+if [ ! -z $backupTarget ] ; then
+ showInfo 'Performing backup...'
+ mysqldump $mysqlParams $database | gzip >"$backupTarget.gz" 2>/dev/null
+ if [ $? -ne 0 ] ; then
+ showError 'Backup failed!!!'
+ exit 1
+ fi
+fi
+
+# now actually perform the update
+showInfo 'Starting update...'
+exportDir=/tmp/xxv-update.$$
+mkdir $exportDir
+chmod a+rwx $exportDir
+exportDb
+updateDb
+importDb
+updateVersion
+showInfo 'Update successful'
+rm -rf $exportDir
diff --git a/contrib/upgrade-xxv-db.sql b/contrib/upgrade-xxv-db.sql
new file mode 100644
index 0000000..f8e075a
--- /dev/null
+++ b/contrib/upgrade-xxv-db.sql
@@ -0,0 +1,304 @@
+-- MySQL dump 10.10
+--
+-- Host: localhost Database: xxv
+-- ------------------------------------------------------
+-- Server version 5.0.30-Debian_3
+
+--
+-- Table structure for table `AUTOTIMER`
+--
+
+DROP TABLE IF EXISTS `AUTOTIMER`;
+CREATE TABLE `AUTOTIMER` (
+ `Id` int(11) unsigned NOT NULL auto_increment,
+ `Activ` enum('y','n') default 'y',
+ `Done` set('timer','recording','chronicle') NOT NULL default 'timer',
+ `Search` text NOT NULL,
+ `InFields` set('title','subtitle','description') NOT NULL,
+ `Channels` text,
+ `Start` char(4) default '0000',
+ `Stop` char(4) default '0000',
+ `MinLength` tinyint(4) default NULL,
+ `Priority` tinyint(2) default NULL,
+ `Lifetime` tinyint(2) default NULL,
+ `Dir` text,
+ `VPS` enum('y','n') default 'n',
+ `prevminutes` tinyint(4) default NULL,
+ `afterminutes` tinyint(4) default NULL,
+ `Weekdays` set('Mon','Tue','Wed','Thu','Fri','Sat','Sun') default NULL,
+ `startdate` datetime default NULL,
+ `stopdate` datetime default NULL,
+ `count` int(11) default NULL,
+ PRIMARY KEY (`Id`)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `CHANNELGROUPS`
+--
+
+DROP TABLE IF EXISTS `CHANNELGROUPS`;
+CREATE TABLE `CHANNELGROUPS` (
+ `Id` int(11) NOT NULL auto_increment,
+ `Name` varchar(100) default 'unknown',
+ `Counter` int(11) default '0',
+ PRIMARY KEY (`Id`)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `CHANNELS`
+--
+
+DROP TABLE IF EXISTS `CHANNELS`;
+CREATE TABLE `CHANNELS` (
+ `Id` varchar(100) NOT NULL,
+ `Name` varchar(100) NOT NULL default '',
+ `Frequency` int(11) NOT NULL default '0',
+ `Parameters` varchar(100) default '',
+ `Source` varchar(100) default NULL,
+ `Srate` int(11) default '0',
+ `VPID` varchar(100) default '',
+ `APID` varchar(100) default '',
+ `TPID` varchar(100) default '',
+ `CA` varchar(100) default '',
+ `SID` int(11) default '0',
+ `NID` int(11) default '0',
+ `TID` int(11) default '0',
+ `RID` int(11) default '0',
+ `GRP` int(11) default '0',
+ `POS` int(11) NOT NULL,
+ PRIMARY KEY (`Id`)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `CHRONICLE`
+--
+
+DROP TABLE IF EXISTS `CHRONICLE`;
+CREATE TABLE `CHRONICLE` (
+ `id` int(10) unsigned NOT NULL auto_increment,
+ `hash` varchar(16) NOT NULL default '',
+ `title` text NOT NULL,
+ `channel_id` varchar(100) NOT NULL default '',
+ `starttime` datetime NOT NULL default '0000-00-00 00:00:00',
+ `duration` int(11) NOT NULL default '0',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `hash` (`hash`)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `EPG`
+--
+
+DROP TABLE IF EXISTS `EPG`;
+CREATE TABLE `EPG` (
+ `eventid` bigint(20) unsigned NOT NULL default '0',
+ `title` text NOT NULL,
+ `subtitle` text,
+ `description` text,
+ `channel_id` varchar(100) NOT NULL default '',
+ `starttime` datetime NOT NULL default '0000-00-00 00:00:00',
+ `duration` int(11) NOT NULL default '0',
+ `tableid` tinyint(4) default '0',
+ `image` text,
+ `version` tinyint(3) default '0',
+ `video` varchar(100) default '',
+ `audio` varchar(255) default '',
+ `addtime` datetime NOT NULL default '0000-00-00 00:00:00',
+ `vpstime` datetime default '0000-00-00 00:00:00',
+ PRIMARY KEY (`eventid`),
+ KEY `starttime` (`starttime`),
+ KEY `channel_id` (`channel_id`)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `MEDIALIB_ACTORS`
+--
+
+DROP TABLE IF EXISTS `MEDIALIB_ACTORS`;
+CREATE TABLE `MEDIALIB_ACTORS` (
+ `name` varchar(255) NOT NULL default '',
+ `actorid` varchar(15) NOT NULL default '',
+ `imgurl` varchar(255) NOT NULL default '',
+ `checked` timestamp NOT NULL,
+ PRIMARY KEY (`name`)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `MEDIALIB_VIDEODATA`
+--
+
+DROP TABLE IF EXISTS `MEDIALIB_VIDEODATA`;
+CREATE TABLE `MEDIALIB_VIDEODATA` (
+ `id` int(10) unsigned NOT NULL auto_increment,
+ `md5` varchar(32) default NULL,
+ `title` varchar(255) default NULL,
+ `subtitle` varchar(255) default NULL,
+ `language` varchar(255) default NULL,
+ `diskid` varchar(15) default NULL,
+ `comment` varchar(255) default NULL,
+ `disklabel` varchar(32) default NULL,
+ `imdbID` varchar(15) default NULL,
+ `year` year(4) default NULL,
+ `imgurl` varchar(255) default NULL,
+ `director` varchar(255) default NULL,
+ `actors` text,
+ `runtime` int(10) unsigned default NULL,
+ `country` varchar(255) default NULL,
+ `plot` text,
+ `filename` varchar(255) default NULL,
+ `filesize` int(16) unsigned default NULL,
+ `filedate` datetime default NULL,
+ `audio_codec` varchar(255) default NULL,
+ `video_codec` varchar(255) default NULL,
+ `video_width` int(10) unsigned default NULL,
+ `video_height` int(10) unsigned default NULL,
+ `istv` tinyint(1) unsigned NOT NULL default '0',
+ `lastupdate` timestamp NOT NULL,
+ `seen` tinyint(1) unsigned NOT NULL default '0',
+ `mediatype` int(10) unsigned NOT NULL default '0',
+ `custom1` varchar(255) default NULL,
+ `custom2` varchar(255) default NULL,
+ `custom3` varchar(255) default NULL,
+ `custom4` varchar(255) default NULL,
+ `created` datetime default NULL,
+ `owner_id` int(11) NOT NULL default '0',
+ PRIMARY KEY (`id`),
+ KEY `seen` (`seen`),
+ KEY `title_idx` (`title`),
+ KEY `diskid_idx` (`diskid`),
+ KEY `mediatype` (`mediatype`,`istv`),
+ FULLTEXT KEY `actors_idx` (`actors`),
+ FULLTEXT KEY `comment` (`comment`)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `MEDIALIB_VIDEOGENRE`
+--
+
+DROP TABLE IF EXISTS `MEDIALIB_VIDEOGENRE`;
+CREATE TABLE `MEDIALIB_VIDEOGENRE` (
+ `video_id` int(10) unsigned NOT NULL default '0',
+ `genre_id` int(10) unsigned NOT NULL default '0',
+ PRIMARY KEY (`video_id`,`genre_id`)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `MUSIC`
+--
+
+DROP TABLE IF EXISTS `MUSIC`;
+CREATE TABLE `MUSIC` (
+ `Id` int(11) unsigned NOT NULL auto_increment,
+ `FILE` text NOT NULL,
+ `ARTIST` varchar(128) default 'unknown',
+ `ALBUM` varchar(128) default 'unknown',
+ `TITLE` varchar(128) default 'unknown',
+ `COMMENT` varchar(128) default NULL,
+ `TRACKNUM` varchar(10) default '0',
+ `YEAR` smallint(4) unsigned default NULL,
+ `GENRE` varchar(128) default NULL,
+ `BITRATE` smallint(4) unsigned default NULL,
+ `FREQUENCY` varchar(4) default NULL,
+ `SECS` int(11) NOT NULL,
+ PRIMARY KEY (`Id`)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `OLDEPG`
+--
+
+DROP TABLE IF EXISTS `OLDEPG`;
+CREATE TABLE `OLDEPG` (
+ `eventid` bigint(20) unsigned NOT NULL default '0',
+ `title` text NOT NULL,
+ `subtitle` text,
+ `description` text,
+ `channel_id` varchar(100) NOT NULL default '',
+ `starttime` datetime NOT NULL default '0000-00-00 00:00:00',
+ `duration` int(11) NOT NULL default '0',
+ `tableid` tinyint(4) default '0',
+ `image` text,
+ `version` tinyint(3) default '0',
+ `video` varchar(100) default '',
+ `audio` varchar(255) default '',
+ `addtime` datetime NOT NULL default '0000-00-00 00:00:00',
+ `vpstime` datetime default '0000-00-00 00:00:00',
+ PRIMARY KEY (`eventid`),
+ KEY `starttime` (`starttime`),
+ KEY `channel_id` (`channel_id`)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `RECORDS`
+--
+
+DROP TABLE IF EXISTS `RECORDS`;
+CREATE TABLE `RECORDS` (
+ `eventid` bigint(20) unsigned NOT NULL,
+ `RecordId` int(11) unsigned NOT NULL,
+ `RecordMD5` varchar(32) NOT NULL,
+ `Path` text NOT NULL,
+ `Prio` tinyint(4) NOT NULL,
+ `Lifetime` tinyint(4) NOT NULL,
+ `State` tinyint(4) NOT NULL,
+ `Marks` text,
+ `Type` enum('TV','RADIO','UNKNOWN') default 'TV',
+ `addtime` timestamp NOT NULL,
+ PRIMARY KEY (`eventid`),
+ UNIQUE KEY `eventid` (`eventid`)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `TIMERS`
+--
+
+DROP TABLE IF EXISTS `TIMERS`;
+CREATE TABLE `TIMERS` (
+ `Id` int(11) unsigned NOT NULL,
+ `Status` char(1) default '1',
+ `ChannelID` varchar(100) NOT NULL default '',
+ `Day` varchar(20) default '-------',
+ `Start` int(11) unsigned default NULL,
+ `Stop` int(11) unsigned default NULL,
+ `Priority` tinyint(2) default NULL,
+ `Lifetime` tinyint(2) default NULL,
+ `File` text,
+ `Summary` text,
+ `NextStartTime` datetime default NULL,
+ `NextStopTime` datetime default NULL,
+ `Collision` varchar(100) default '0',
+ `eventid` bigint(20) unsigned default '0',
+ `eventstarttime` datetime default NULL,
+ `eventduration` int(10) unsigned default '0',
+ `AutotimerId` int(11) unsigned default '0',
+ `addtime` timestamp NOT NULL,
+ `Checked` char(1) default '0',
+ PRIMARY KEY (`Id`)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `USER`
+--
+
+DROP TABLE IF EXISTS `USER`;
+CREATE TABLE `USER` (
+ `Id` int(11) unsigned NOT NULL auto_increment,
+ `Name` varchar(100) NOT NULL default '',
+ `Password` varchar(100) NOT NULL,
+ `Level` set('admin','user','guest') NOT NULL,
+ `Prefs` varchar(100) default '',
+ `UserPrefs` varchar(100) default '',
+ `Deny` set('tlist','alist','rlist','mlist','tedit','aedit','redit','remote','stream','cedit','media') default NULL,
+ `MaxLifeTime` tinyint(2) default '0',
+ `MaxPriority` tinyint(2) default '0',
+ PRIMARY KEY (`Id`)
+) TYPE=MyISAM;
+
+--
+-- Table structure for table `VERSION`
+--
+
+DROP TABLE IF EXISTS `VERSION`;
+CREATE TABLE `VERSION` (
+ `Version` tinyint(4) NOT NULL default '0'
+) TYPE=MyISAM;