diff --git a/webif/lib/rsv.class b/webif/lib/rsv.class
index 8ff26c8..6aa883f 100755
--- a/webif/lib/rsv.class
+++ b/webif/lib/rsv.class
@@ -517,7 +517,7 @@ proc {rsv find_hsvc} {lcn channel} {
rsv method cleanvars {} {
return [lsort [lmap i [$self vars] {
if {[string index $i 0] eq "_"} continue
- concat "" $i
+ function $i
}]]
}
@@ -922,7 +922,7 @@ proc {rsv backup} {file} {
puts $fd "# version 2"
- puts $fd "# [join $fields "\t"]"
+ puts $fd "#\n# Schedule\n# [join $fields "\t"]"
foreach event $events {
puts " Backing up scheduled event '[$event name]'"
@@ -942,6 +942,8 @@ proc {rsv backup} {file} {
puts "Backing up channel favourites..."
puts " Names:"
+ puts $fd "#\n# Favourites"
+
# Favourite names
set favnames {}
loop i 1 6 {
@@ -975,13 +977,42 @@ proc {rsv backup} {file} {
}
puts "Done."
+ puts "Backing up skiplist..."
+
+ set skiplist [$rsvdb query {
+ select * from skip
+ order by ulslot, start
+ }]
+ if {[llength $skiplist]} {
+ # Add key line
+ set keys "#\n# Skiplist\n#"
+ foreach {k v} [lindex $skiplist 0] {
+ append keys " $k,"
+ }
+ puts $fd $keys
+
+ foreach skip $skiplist {
+ puts -nonewline $fd "skip\t"
+ foreach {k v} $skip {
+ puts -nonewline $fd "$v\t"
+ }
+ puts $fd ""
+ }
+ }
+
+ puts "Done."
+
puts "Backing up channel list..."
+ puts $fd "#\n# Channels by hSvc"
+
foreach channel [epg channellist hSvc] {
lassign $channel name hsvc
puts $fd "hsvc\t$hsvc\t$name"
}
+ puts $fd "#\n# Channels by LCN"
+
foreach channel [epg channellist usLcn] {
lassign $channel name uslcn
puts $fd "lcn\t$uslcn\t$name"
@@ -1003,13 +1034,6 @@ proc {rsv restore} {file} {
error "Error opening $file - $msg"
}
- puts "Restoring scheduled events from $file..."
-
- catch { exec /mod/bin/nugget quit }
- $rsvdb query {delete from TBL_RESERVATION;}
-
- set fields [[rsv] cleanvars]
-
set data [split [read $fd] "\n"]
set ver 1
@@ -1034,6 +1058,19 @@ proc {rsv restore} {file} {
set chanmap [lreverse $hsvcmap]
+ puts "Restoring scheduled events from $file..."
+
+ # Disable RTS until next restart.
+ catch { exec /mod/bin/nugget quit }
+
+ # Clear tables
+ foreach tab {TBL_RESERVATION pending skip} {
+ $rsvdb query {delete from %s;} $tab
+ }
+
+ set fields [[rsv] cleanvars]
+
+ ######################################################################
# Restore events
foreach line $data {
@@ -1117,6 +1154,50 @@ proc {rsv restore} {file} {
puts ""
}
+ ######################################################################
+ # Restore skiplist
+ puts "Restoring skiplist..."
+
+ set fields "ulslot state service_id event_id hSvc start
+ ucCRIDType szCRID szSkipCRID"
+
+ foreach line $data {
+ set vals [lrange [lassign [split $line "\t"] key] 0 end-1]
+ if {$key ne "skip"} continue
+
+ lassign $vals {*}$fields
+
+ # Map old hSvc to new
+ if {![dict exists $hsvcmap $hSvc]} {
+ # Should not happen
+ puts " Losing skip entry ($hSvc)"
+ continue
+ }
+ set chan $hsvcmap($hSvc)
+ puts " Restoring skip for $chan - $szSkipCRID"
+
+ # Fetch new hSvc and service_id
+ set _hsvc [get_channel_attr $chan]
+ set _service_id [get_channel_attr $chan usSvcId]
+ if {$_hsvc eq "" || $_service_id eq ""} {
+ puts " Cannot map channel name to service."
+ continue
+ }
+ if {$hSvc != $_hsvc || $service_id != $_service_id} {
+ puts -nonewline " Service number has changed "
+ puts "$hSvc -> $_hsvc, fixing."
+ lset vals [lsearch $fields hSvc] $_hsvc
+ lset vals [lsearch $fields service_id] $_service_id
+ }
+ catch {$rsvdb query "
+ insert into skip([join $fields ,]) values (
+ [join [lrepeat [llength $fields] "'%s'"] ,]
+ );
+ " {*}$vals}
+ }
+
+ ######################################################################
+ # Restore favourites
puts "Restoring favourite channels..."
$rsvdb query {delete from channel.TBL_FAV}