Author image David Westbrook
and 1 contributors


GBPVR::CDBI - Database Abstraction for GBPVR


Version 0.04


Example to search the program listings:

        use GBPVR::CDBI::Programme;
        my @rows = GBPVR::CDBI::Programme->search_like(name => 'Star%');

Example to display the recorded shows:

        use GBPVR::CDBI::RecordingSchedule;
        my @rows = GBPVR::CDBI::RecordingSchedule->search(status => 2);
        foreach my $row (@rows){
          printf "-----------------------\n";
          printf "%s - '%s'\n", $row->programme_oid->name, $row->programme_oid->sub_title;
          printf "<%s>\n", $row->filename;
          printf "   %s\n", $row->programme_oid->description;

Example to show pending shows (yes, you should be able to order_by via search() and not have to call sort):

        use GBPVR::CDBI::RecordingSchedule;
        my @rows = GBPVR::CDBI::RecordingSchedule->search(status => 0);
        @rows = sort { $a->manual_start_time cmp $b->manual_start_time } @rows;
        foreach my $row (@rows){
          printf "%-20s %8s %s - '%s'\n",
          printf "   %s\n", $row->programme_oid->description;

Example to force all scheduled 'Simpsons' recordings to be low quality:

        use GBPVR::CDBI::RecordingSchedule;
        my $iterator = GBPVR::CDBI::RecordingSchedule->retrieve_all;
        while( my $row = $iterator->next ){
          next unless $row->programme_oid->name =~ /simpsons/i;
          next if $row->quality_level == 2;


This set of classes provides an easy to use, robust, and well-documented way to access the GBPVR database via the Class::DBI module. The major tables are included as well as that of the Video Archive plugin.

This is a windows-only module since GBPVR is a windows-only application.

What is GBPVR? It is a Personal Video Recorder (PVR) program. The Microsoft Access .mdb database that is creates stores information such as recording schedules and details about completed recordings. GBPVR can be obtained here:

Note that this allows both read and transactional write access to the database.

Why was this written? In part, as an exercise in Class::DBI, but largely to make it very easy to write stand-alone apps/scripts in perl for GBPVR. To run any kind of custom task involving setting schedules or listing schedules or listing recorded shows.

More details will follow, but it is possible to compile perl scripts that use this into stand-alone exe's to distribute to systems without perl installed (see PAR).


The following are the provided GBPVR classes. Note that they all inherit from Class::DBI, so that having an attribute of 'foo' means that $obj->foo is an accessor and $obj->foo('bar') is a mutator. Also note that for the foreign keys, the attribute method will return either the foreign key value or the foreign object, depending on the context.


Video Archive

The Video Archive plug-in:


The RecTracker Utility:



Wrapper for Class::DBI->set_db -- takes just a filename of a MS Access file (.mdb) and calls set_db w/the proper connection string. Takes two named parameters -- 'file' is required. If it is a relative path, it will be with respect to the GBPVR home directory. 'dbopts' is an optional hashref to path through to set_db() -- it defaults to { AutoCommit=>0, LongTruncOk => 1, LongReadLen => 255 }


The contrib directory of the distribution contains several short sample scripts to illustrate quick & easy code to perform useful tasks.

Prints out pending recordings, earliest first; includes times, channel, title, and show description.

The same as but outputs them in iCal format with each recording as a separate event. Also takes into account recurring recordings and treats them differently. Requires Data::ICal.

Good example of cross-database usage. This finds all of the shows from the VideoArchive database (i.e. everything that's been recorded already), and checks if it exists in the RecTracker database (i.e. to see if it's already flagged as 'do not record again'). Any that are not found are simply created as new records in the RecTracker database. This is especially handy if you install RecTracker after having used VideoArchive for a while.

Usage: channel HH:MM HH:MM

Basically a "quick record" -- just put the channel number (what you would hit on the tv remote), and the start and end times (24-hr format), and it will create a pending-recording entry for today for that channel and time.

This is a utility clean up script i was using for a while when running GBPVR on a low-end machine (PIII-400). It does two tasks -- 1) deletes any pending entry more than 3 days in the future (otherwise the MVP server was too slow to load; these deleted entries get remade by the EPG update nightly anyways); 2) forces all recordings to be low quality (I found that, on an older GBPVR version, the requested quality wouldn't always take, especially if done from the listings or search screens).

This is written using Class::DBI methods.

Same as but written by just feeding SQL through Class::DBI.

Same as but written using Class::DBI::AbstractSearch calls.

Same as but written using Win32::ODBC instead of DBI/Class::DBI. Provided solely for reference as yet another way to do the task.


David Westbrook, <dwestbrook at>


GBPVR::CDBI is only intended for use on Win32, as GBPVR will only run on windows.

GBPVR::CDBI requires the following modules:







Please report any bugs or feature requests to bug-gbpvr-cdbi at, or through the web interface at I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.


You can find documentation for this module with the perldoc command.

    perldoc GBPVR::CDBI

You can also look for information at:


Sub for creating GBPVR

jeff for the VideoArchive plugin

jorm for the RecTracker utility


Copyright 2006 David Westbrook, all rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.



The initial release/announcement:


GBPVR wiki (documents the program, configuration, plugins, utilities, etc):