[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