NAME
   Algorithm::Dependency::Source::DBI - Database source for
   Algorithm::Dependency

SYNOPSIS
     use DBI;
     use Algorithm::Dependency;
     use Algorithm::Dependency::Source::DBI;

     # Load the data from a database
     my $data_source = Algorithm::Dependency::Source::DBI->new(
         dbh            => DBI->connect('dbi:SQLite:sqlite.db'),
         select_ids     => 'select name from stuff',
         select_depends => 'select from, to from m2m_deps',
     );

     # Create the dependency object, and indicate the items that are already
     # selected/installed/etc in the database
     my $dep = Algorithm::Dependency->new(
         source   => $data_source,
         selected => [ 'This', 'That' ]
         ) or die 'Failed to set up dependency algorithm';

     # For the item 'Foo', find out the other things we also have to select.
     # This WON'T include the item we selected, 'Foo'.
     my $also = $dep->depends( 'Foo' );
     print $also
           ? "By selecting 'Foo', you are also selecting the following items: "
                   . join( ', ', @$also )
           : "Nothing else to select for 'Foo'";

     # Find out the order we need to act on the items in.
     # This WILL include the item we selected, 'Foo'.
     my $schedule = $dep->schedule( 'Foo' );

DESCRIPTION
   The Algorithm::Dependency module has shown itself to be quite reliable
   over a long period of time, as well as relatively easy to setup and use.

   However, recently there has been an increasing use of things like
   DBD::SQLite to store and distribute structured data.

   Algorithm::Dependency::Source::DBI extends Algorithm::Dependency by
   providing a simple way to create dependency objects that pull their data
   from a database directly.

METHODS
 new
     my $simple = Algorithm::Dependency::Source::DBI->new(
         dbh            => $dbi_db_handle,
         select_ids     => 'select name from stuff',
         select_depends => 'select from, to from m2m_deps',
     );

     my $complex = Algorithm::Dependency::Source::DBI->new(
         dbh            => $dbi_db_handle,
         select_ids     => [ 'select name from stuff where foo = ?',         'bar' ],
         select_depends => [ 'select from, to from m2m_deps where from = ?', 'bar' ],
     );

   The "new" constructor takes three named named params.

   The "dbh" param should be a standard DBI database connection.

   The "select_ids" param is either a complete SQL string, or a reference
   to an "ARRAY" containing a SQL string with placeholders and matching
   variables.

   When executed on the database, it should return a single column
   containing the complete set of all item identifiers.

   The "select_depends" param is either a complete SQL string, or a
   reference to an "ARRAY" containing a SQL string with placeholders and
   matching variables.

   When executed on the database, it should return two columns containing
   the complete set of all dependencies, where identifiers in the
   first-column depends on identifiers in the second-column.

   Returns a new Algorithm::Dependency::Source::DBI object, or dies on
   error.

 dbh
   The "dbh" accessor returns the database handle provided to the
   constructor.

 select_ids
   The "select_ids" accessor returns the SQL statement provided to the
   constructor. If a raw string was provided, it will be returned as a
   reference to an "ARRAY" containing the SQL string and no params.

 select_depends
   The "select_depends" accessor returns the SQL statement provided to the
   constructor. If a raw string was provided, it will be returned as a
   reference to an "ARRAY" containing the SQL string and no params.

SUPPORT
   To file a bug against this module, use the CPAN bug tracking system

   <http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Algorithm-Dependency-Sou
   rce-DBI>

   For other comments, contact the author.

AUTHOR
   Adam Kennedy <[email protected]>

SEE ALSO
   Algorithm::Dependency, <http://ali.as/>

COPYRIGHT
   Copyright 2007 Adam Kennedy.

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

   The full text of the license can be found in the LICENSE file included
   with this module.