summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlperl0/lib/CPAN/SQLite.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg/tlperl0/lib/CPAN/SQLite.pm')
-rwxr-xr-xMaster/tlpkg/tlperl0/lib/CPAN/SQLite.pm323
1 files changed, 323 insertions, 0 deletions
diff --git a/Master/tlpkg/tlperl0/lib/CPAN/SQLite.pm b/Master/tlpkg/tlperl0/lib/CPAN/SQLite.pm
new file mode 100755
index 00000000000..01fd4139af7
--- /dev/null
+++ b/Master/tlpkg/tlperl0/lib/CPAN/SQLite.pm
@@ -0,0 +1,323 @@
+package CPAN::SQLite;
+use strict;
+use warnings;
+use File::HomeDir;
+require File::Spec;
+use Cwd;
+require CPAN::SQLite::META;
+
+our $VERSION = '0.199';
+
+# an array ref of distributions to ignore indexing
+my $ignore = [qw(SpreadSheet-WriteExcel-WebPivot)];
+our $db_name = 'cpandb.sql';
+
+use constant WIN32 => $^O eq 'MSWin32';
+
+sub new {
+ my ($class, %args) = @_;
+ my ($CPAN, $update_indices);
+ my $db_dir = $args{db_dir};
+ my $urllist = [];
+ my $keep_source_where;
+ # for testing undr Darwin, must load CPAN::MyConfig contained
+ # in PERL5LIB, as File::HomeDir doesn't use this
+ if ($ENV{CPAN_SQLITE_TESTING}) {
+ eval {require CPAN::MyConfig;};
+ }
+ eval {require CPAN; CPAN::HandleConfig->load;};
+ if ( not $@ and not defined $args{CPAN} ) {
+ $CPAN = $CPAN::Config->{cpan_home};
+ $db_dir = $CPAN;
+ $keep_source_where = $CPAN::Config->{keep_source_where};
+ $urllist = $CPAN::Config->{urllist};
+ die qq{The '$CPAN' directory doesn't exist} unless -d $CPAN;
+ $update_indices = 0;
+ }
+ else {
+ $CPAN = $args{CPAN} || '';
+ die qq{Please specify the CPAN location} unless defined $CPAN;
+ die qq{The '$CPAN' directory doesn't exist} unless (-d $CPAN);
+ $update_indices = (-f File::Spec->catfile($CPAN, 'MIRRORING.FROM')) ?
+ 0 : 1;
+ }
+ push @$urllist, q{http://www.cpan.org/};
+ $db_dir ||= cwd;
+ my $self = {%args, CPAN => $CPAN, update_indices => $update_indices,
+ db_name => $db_name, urllist => $urllist,
+ keep_source_where => $keep_source_where, db_dir => $db_dir};
+ bless $self, $class;
+}
+
+sub index {
+ my ($self, %args) = @_;
+ require CPAN::SQLite::Index;
+ my %wanted = map {$_ => $self->{$_}}
+ qw(CPAN ignore update_indices db_name db_dir
+ keep_source_where setup reindex urllist);
+ my $log_dir = $self->{CPAN} || $self->{db_dir};
+ die qq{Please create the directory '$log_dir' first} unless -d $log_dir;
+ my $index = CPAN::SQLite::Index->new(%wanted, %args, log_dir => $log_dir);
+ $index->index() or do {
+ warn qq{Indexing failed!};
+ return;
+ };
+ return 1;
+}
+
+sub query {
+ my ($self, %args) = @_;
+ my $cwd = $self->{cwd};
+ require CPAN::SQLite::Search;
+ my %wanted = map {$_ => $self->{$_}}
+ qw(max_results CPAN db_name db_dir meta_obj);
+ my $query = CPAN::SQLite::Search->new(%wanted, %args);
+ %wanted = map {$_ => $self->{$_}} qw(mode query id name);
+ $query->query(%wanted, %args) or do {
+ warn qq{Query failed!};
+ return;
+ };
+ my $results = $query->{results};
+ return unless defined $results;
+ $self->{results} = $query->{results};
+ return 1;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+CPAN::SQLite - maintain and search a minimal CPAN database
+
+=head1 SYNOPSIS
+
+ my $obj = CPAN::SQLite->new(CPAN => '/path/to/CPAN');
+ $obj->index(setup => 1);
+
+ $obj->query(mode => 'dist', name => 'CPAN');
+ my $results = $obj->{results};
+
+=head1 DESCRIPTION
+
+This package is used for setting up, maintaining, and
+searching a CPAN database consisting of the information
+stored in the three main CPAN indices:
+F<$CPAN/modules/03modlist.data.gz>,
+F<$CPAN/modules/02packages.details.txt.gz>, and
+F<$CPAN/authors/01mailrc.txt.gz>. It should be
+considered at an alpha stage of development.
+
+One begins by creating the object as
+
+ my $obj = CPAN::SQLite->new(%args);
+
+which accepts the following arguments:
+
+=over 3
+
+=item * C<CPAN =E<gt> '/path/to/CPAN'>
+
+This specifies the path to where the index files are
+to be stored. This could be a local CPAN mirror,
+defined here by the presence of a F<MIRRORED.BY> file beneath
+this directory, or a local directory in which to store
+these files from a remote CPAN mirror. In the latter case,
+the index files are fetched from a remote CPAN mirror,
+using the same list that C<CPAN.pm> uses, if this is
+configured, and are updated if they are more than one
+day old.
+
+If the C<CPAN> option is not given, it will default
+to C<cpan_home> of L<CPAN>, if this is configured,
+with the index files found under C<keep_source_where>.
+A fatal error results if such a directory isn't found.
+Updates to these index files are assumed here to be
+handled by C<CPAN.pm>.
+
+=item * C<db_dir =E<gt> '/path/to/db/dir'>
+
+This specifies the path to where the database file is
+found. If not given, it defaults to the
+C<cpan_home> directory of C<CPAN.pm>, if present, or to
+the directory in which the script was invoked. The name
+of the database file is C<cpandb.sql>.
+
+=back
+
+There are two main methods available.
+
+=head2 C<$obj-E<gt>index(%args);>
+
+This is used to set up and maintain the database. The
+following arguments are accepted:
+
+=over 3
+
+=item * setup =E<gt> 1
+
+This specifies that the database is to be created and
+populated from the CPAN indices; any exisiting database
+will be overwritten. Not specifying this option will
+assume that an existing database is to be updated.
+
+=item * reindex =E<gt> 'dist_name'
+
+This specifies that the CPAN distribution C<dist_name>
+is to be reindexed.
+
+=back
+
+=head2 C<$obj-E<gt>query(%args);>
+
+This is used for querying the database by distribution
+name, module name, or CPAN author name. There are
+two arguments needed to specify such queries.
+
+=over 3
+
+=item * C<mode =E<gt> some_value>
+
+This specifies what type of query to perform,
+with C<mode> being one of C<dist>, C<module>,
+or C<author>, for searching through, respectively,
+CPAN distribution names, module names, or author names and
+CPAN ids.
+
+=item * C<type =E<gt> query_term>
+
+This specifies the query term for the search, with
+C<type> being one of C<name>, to search for an
+exact match, or C<search>, for searching for partial
+matches. Perl regular expressions are supported in
+the C<query_term> for the C<search> option.
+
+=back
+
+As well, an option of C<max_results =E<gt> some_number> will
+limit the number of results returned; if not specified,
+this defaults to 200.
+
+=head1 CPAN.pm support
+
+As of CPAN.pm version 1.88_65, there is experimental support
+within CPAN.pm for using CPAN::SQLite to obtain
+information on packages, modules, and authors. One goal
+of this is to reduce the memory footprint of the CPAN.pm
+shell, as this information is no longer all preloaded into
+memory. This can be enabled through
+
+ perl -MCPAN -e shell
+ cpan> o conf use_sqlite 1
+
+Use
+
+ cpan> o conf commit
+
+to save this setting for future sessions.
+
+Using CPAN::SQLite, what happens is that a request for information
+through CPAN.pm, such as
+
+ cpan> a ANDK
+
+will cause a query to the SQLite database to be made.
+If successful, this will place the relevant data for this
+request into the data structure CPAN.pm uses to store and
+retrieve such information. Thus, at any given time, the
+only information CPAN.pm stores in memory is that for
+packages, modules, and authors for which previous queries
+have been made. There are certain requests, such as
+
+ cpan> r
+
+to make a list of recommended packages for which upgrades
+on CPAN are available, which will result in loading
+information on all available packages into memory; if such
+a query is made, the subsequent memory footprint of CPAN.pm
+with and without CPAN::SQLite will be essentially the same.
+
+The database itself, called F<cpandb.sql>, will be stored
+in the location specified by C<$CPAN::Config-E<gt>{cpan_home}>.
+When first started, this database will be created, and afterwards,
+it will be updated if the database is older than one day since
+the last update. A log file of the creation or update process, called
+F<cpan_search_log.dddddddddd>, will be created in the same
+directory as the database file.
+
+=head1 SEE ALSO
+
+L<CPAN::SQLite::Index>, for setting up and maintaining
+the database, and L<CPAN::SQLite::Search> for an
+interface to querying the database. Some details
+of the interaction with L<CPAN> is available from
+L<CPAN::SQLite::META>. See also the L<cpandb> script for a
+command-line interface to the
+indexing and querying of the database.
+
+Development takes place on the CPAN-Search-Lite project
+at L<http://cpan-search.svn.sourceforge.net/viewvc/cpan-search/CPAN-SQLite/>.
+
+=head1 SUPPORT
+
+You can find documentation for this module with the perldoc command.
+
+ perldoc CPAN::SQLite
+
+You can also look for information at:
+
+=over 4
+
+=item * AnnoCPAN: Annotated CPAN documentation
+
+L<http://annocpan.org/dist/CPAN-SQLite>
+
+=item * CPAN::Forum: Discussion forum
+
+L<http:///www.cpanforum.com/dist/CPAN-SQLite>
+
+=item * CPAN Ratings
+
+L<http://cpanratings.perl.org/d/CPAN-SQLite>
+
+=item * RT: CPAN's request tracker
+
+L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=CPAN-SQLite>
+
+=item * Search CPAN
+
+L<http://search.cpan.org/dist/CPAN-SQLite>
+
+=back
+
+=head1 BUGS
+
+At this time, CPAN::SQLite keeps information contained only
+in the latest version of a CPAN distribution. This means that
+modules that are provided only in older versions of a CPAN
+distribution will not be present in the database; for example,
+at this time, the latest version of the I<libwww-perl> distribution
+on CPAN is 5.805, but there are modules such as I<URI::URL::finger>
+contained in version 5.10 of libwww-perl that are not present in 5.805.
+This behaviour differs from that of L<CPAN> without CPAN::SQLite.
+This may change in the future.
+
+Please report bugs and feature requests via
+L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=CPAN-SQLite>.
+
+=head1 ENVIRONMENT VARIABLES
+
+Information messages from the indexing procedures are printed
+out to STDOUT if the environment variable CPAN_SQLITE_DEBUG
+is set. This is automatically set within L<CPAN::SQLite::Index>.
+If CPAN_SQLITE_NO_LOG_FILES is set, no log files will be created
+during the indexing procedures.
+
+=head1 COPYRIGHT
+
+This software is copyright 2006,2008 by Randy Kobes
+E<lt>r.kobes@uwinnipeg.caE<gt>. Use and
+redistribution are under the same terms as Perl itself.
+
+=cut