[Midnightbsd-cvs] mports: Index.pm: A pretty significant refactoring.
ctriv at midnightbsd.org
ctriv at midnightbsd.org
Mon Sep 10 22:29:27 EDT 2007
Log Message:
-----------
A pretty significant refactoring. This code is still in active
developement, and future such changes are likely.
Modified Files:
--------------
mports/Tools/lib/Mport:
Index.pm (r1.1 -> r1.2)
-------------- next part --------------
Index: Index.pm
===================================================================
RCS file: /home/cvs/mports/Tools/lib/Mport/Index.pm,v
retrieving revision 1.1
retrieving revision 1.2
diff -LTools/lib/Mport/Index.pm -LTools/lib/Mport/Index.pm -u -r1.1 -r1.2
--- Tools/lib/Mport/Index.pm
+++ Tools/lib/Mport/Index.pm
@@ -6,8 +6,7 @@
use warnings;
use Mport::Globals qw($ROOT $INDEX);
-use Mport::Port ();
-use Mport::Utils qw(make_var);
+use Mport::Utils qw(make_var recurse_ports);
use YAML;
use Cwd;
@@ -17,78 +16,78 @@
sub build {
my ($class) = @_;
- my $cwd = $ROOT;
my $dbh = create_db();
-
- chdir($cwd);
-
- recurse($cwd, $dbh);
-}
-
-sub recurse {
- my ($cwd, $dbh) = @_;
- my @subdirs = make_var('SUBDIR');
+ my $categories_inserted;
- if (!@subdirs) {
- return process_port($cwd, $dbh);
- }
+ recurse_ports {
+ insert_categories($dbh) unless $categories_inserted++;
- foreach my $subdir (@subdirs) {
- $subdir = "$cwd/$subdir";
- eval { chdir($subdir); };
- next if $@;
- recurse($subdir, $dbh)
- }
-}
+ my $yaml = `make describe-yaml`;
+ my %port;
+ eval {
+ %port = %{Load($yaml)};
+ };
+
+ if ($@) {
+ warn "Unable to parse yaml for $_[0]: $@\n";
+ return;
+ }
-sub process_port {
- my ($cwd, $dbh) = @_;
+ local $dbh->{AutoCommit} = 0;
- my $yaml = `make describe-yaml`;
- my %port;
- eval {
- %port = %{Load($yaml)};
- };
+ eval {
+ my $sth = $dbh->prepare("INSERT INTO ports (name, version, description, pkgname, license) VALUES (?,?,?,?,?)");
+ $sth->execute(@port{qw(name version description pkgname license)});
+ $sth->finish;
+
+ $sth = $dbh->prepare("INSERT INTO depends (port, type, dependency) VALUES (?,?,?)");
+ while (my ($type, $deps) = each %{$port{'depends'}}) {
+ foreach my $dep (@$deps) {
+ $sth->execute($port{'name'}, $type, $dep);
+ }
+ }
+ $sth->finish;
+
+ $sth = $dbh->prepare("INSERT INTO port_categories (port, category_id) VALUES (?, (SELECT id FROM categories WHERE category=?))");
+ foreach my $cat (@{$port{'categories'}}) {
+ $sth->execute($port{'name'}, $cat);
+ }
+ $sth->finish;
+
+ $dbh->commit;
+ };
- if ($@) {
- warn "Unable to parse yaml for $cwd\n";
- return;
- }
+ if ($@) {
+ warn "Unable to insert $port{'name'} ($_[0]): $@\n";
+ eval { $dbh->rollback };
+ }
+ };
+}
- local $dbh->{AutoCommit} = 0;
+sub insert_categories {
+ my ($dbh) = @_;
- eval {
- my $sth = $dbh->prepare("INSERT INTO mports (name, version, description, origin) VALUES (?,?,?,?)");
- $sth->execute(@port{qw(name version description origin)});
- $sth->finish;
-
- $sth = $dbh->prepare("INSERT INTO depends (port, type, dependency) VALUES (?,?,?)");
- foreach my $type (qw(lib run build patch extract fetch)) {
- foreach my $dep (@{$port{"${type}_depends"}}) {
- $sth->execute($port{'name'}, $type, $dep);
- }
- }
- $sth->finish;
-
- $dbh->commit;
- };
+ my @categories = make_var("VALID_CATEGORIES");
- if ($@) {
- warn "Unable to insert $port{'name'}: $@\n";
- eval { $dbh->rollback };
- }
+ my $sth = $dbh->prepare("INSERT INTO categories (category) VALUES (?)");
+ foreach my $cat (@categories) {
+ $sth->execute($cat);
+ }
+ $sth->finish;
}
+
sub create_db {
unlink($INDEX);
my $dbh = DBI->connect("dbi:SQLite:dbname=$INDEX", "", "", { RaiseError => 1, PrintError => 0 });
$dbh->do(<<END_O_SQL);
-CREATE TABLE mports (
+CREATE TABLE ports (
name text primary key,
version text,
description text,
- origin text
+ license text,
+ pkgname text
)
END_O_SQL
$dbh->do(<<END_O_SQL);
@@ -98,10 +97,26 @@
dependency text
);
END_O_SQL
- $dbh->do('CREATE INDEX mport_version_index ON mports (name, version)');
+ $dbh->do(<<END_O_SQL);
+CREATE TABLE categories (
+ id integer primary key autoincrement,
+ category text
+);
+END_O_SQL
+ $dbh->do(<<END_O_SQL);
+CREATE TABLE port_categories (
+ port text,
+ category_id int
+);
+END_O_SQL
+
+ $dbh->do('CREATE INDEX mport_version_index ON ports (name, version)');
$dbh->do('CREATE INDEX depends_port ON depends (port)');
$dbh->do('CREATE INDEX depends_revese ON depends (dependency)');
$dbh->do('CREATE INDEX depends_type ON depends (port, type)');
+
+ # XXX more indexes needed.
+
return $dbh;
}
More information about the Midnightbsd-cvs
mailing list