[Midnightbsd-cvs] mports: lib/Magus: Added the database layer.

ctriv at midnightbsd.org ctriv at midnightbsd.org
Sat Oct 20 18:32:39 EDT 2007


Log Message:
-----------
Added the database layer.  Locks, ports, and the ready queue, and such such.

Modified Files:
--------------
    mports/Tools/lib/Magus:
        Chroot.pm (r1.5 -> r1.6)
        Index.pm (r1.1 -> r1.2)
        PortTest.pm (r1.1 -> r1.2)

Added Files:
-----------
    mports/Tools/lib/Magus:
        Config.pm (r1.1)
        DBI.pm (r1.1)
        Depend.pm (r1.1)
        Lock.pm (r1.1)
        Machine.pm (r1.1)
        Port.pm (r1.1)
        Result.pm (r1.1)
        SubResult.pm (r1.1)

-------------- next part --------------
--- /dev/null
+++ Tools/lib/Magus/SubResult.pm
@@ -0,0 +1,18 @@
+package Magus::SubResult;
+#
+# $MidnightBSD: mports/Tools/lib/Magus/SubResult.pm,v 1.1 2007/10/20 22:32:39 ctriv Exp $
+#
+
+use strict;
+use warnings;
+use base qw(Magus::DBI);
+
+__PACKAGE__->table('subresults');
+__PACKAGE__->columns(All => qw/result phase type name msg/);
+
+__PACKAGE__->has_a(result => 'Mport::Result');
+
+
+1;
+__END__
+
--- /dev/null
+++ Tools/lib/Magus/Depend.pm
@@ -0,0 +1,17 @@
+package Magus::Depend;
+#
+# $MidnightBSD: mports/Tools/lib/Magus/Depend.pm,v 1.1 2007/10/20 22:32:39 ctriv Exp $
+#
+use strict;
+use warnings;
+
+use base 'Magus::DBI';
+
+
+__PACKAGE__->table('depends');
+__PACKAGE__->columns(Primary => qw(port dependency));
+__PACKAGE__->has_a(dependency => 'Magus::Port');
+
+
+1;
+__END__
Index: PortTest.pm
===================================================================
RCS file: /home/cvs/mports/Tools/lib/Magus/PortTest.pm,v
retrieving revision 1.1
retrieving revision 1.2
diff -LTools/lib/Magus/PortTest.pm -LTools/lib/Magus/PortTest.pm -u -r1.1 -r1.2
--- Tools/lib/Magus/PortTest.pm
+++ Tools/lib/Magus/PortTest.pm
@@ -75,7 +75,7 @@
   return $self;
 }
 
-=head2 my @results = $test->run
+=head2 my $results = $test->run
 
 Runs the test and returns a data structure representing the results.
 
--- /dev/null
+++ Tools/lib/Magus/Machine.pm
@@ -0,0 +1,17 @@
+package Magus::Machine;
+#
+# $MidnightBSD: mports/Tools/lib/Magus/Machine.pm,v 1.1 2007/10/20 22:32:39 ctriv Exp $
+#
+
+use strict;
+use warnings;
+use base qw(Magus::DBI);
+
+
+__PACKAGE__->table('machines');
+__PACKAGE__->columns(Essential => qw/id arch name maintainer/);
+
+
+1;
+__END__
+
--- /dev/null
+++ Tools/lib/Magus/DBI.pm
@@ -0,0 +1,16 @@
+package Magus::DBI;
+
+use strict;
+use warnings;
+use base 'Class::DBI';
+
+
+__PACKAGE__->connection(
+  "DBI:mysql:database=$Magus::Config{DBName}:host=$Magus::Config{DBHost}", 
+  $Magus::Config{DBUser},
+  $Magus::Config{DBPass}
+);
+
+
+1;
+__END__
--- /dev/null
+++ Tools/lib/Magus/Port.pm
@@ -0,0 +1,48 @@
+package Magus::Port;
+#
+# $MidnightBSD: mports/Tools/lib/Magus/Port.pm,v 1.1 2007/10/20 22:32:39 ctriv Exp $
+#
+use strict;
+use warnings;
+
+use base 'Magus::DBI';
+
+__PACKAGE__->table('ports');
+__PACKAGE__->columns(Essential => qw(name version license pkgname));
+__PACKAGE__->columns(All       => qw(description));
+__PACKAGE__->has_many(depends => [ 'Magus::Depend' => 'dependency' ] => 'port');
+__PACKAGE__->has_many(results => 'Magus::Result');
+
+__PACKAGE__->set_sql(ready_ports => <<END_OF_SQL);
+SELECT ports.* FROM ports 
+WHERE 
+    (name NOT IN (SELECT port FROM locks WHERE arch=?)) 
+  AND 
+    (name NOT IN (SELECT port FROM results WHERE arch=? AND version=ports.version)) 
+  AND 
+    (
+      (name NOT IN (SELECT port FROM depends)) 
+      OR 
+      (name NOT IN (SELECT port FROM depends WHERE dependency NOT IN (SELECT port FROM results WHERE arch=? AND (summary="pass" OR summary="warn"))))
+    )
+END_OF_SQL
+
+sub get_ready_port {
+  my $arch = $Magus::Machine->arch;
+  
+  return shift->search_ready_ports(($Magus::Machine->arch) x 3)->next;
+}
+  
+
+sub origin {
+  return join('/', $Mport::Globals::ROOT, $_[0]->name);
+}
+
+sub current_result {
+  my ($self) = @_;
+  return $self->results(arch => $Magus::Machine->arch, version => $self->version)->next;
+}
+
+
+1;
+__END__
Index: Chroot.pm
===================================================================
RCS file: /home/cvs/mports/Tools/lib/Magus/Chroot.pm,v
retrieving revision 1.5
retrieving revision 1.6
diff -LTools/lib/Magus/Chroot.pm -LTools/lib/Magus/Chroot.pm -u -r1.5 -r1.6
--- Tools/lib/Magus/Chroot.pm
+++ Tools/lib/Magus/Chroot.pm
@@ -111,7 +111,7 @@
   foreach my $dir (@{$self->{loopbacks}}) {
     $self->_mkdir($dir);
     system("/sbin/mount -t nullfs -o ro $dir $self->{root}/$dir") == 0
-      or die "mount returned non-zer	o: $?\n";
+      or die "mount returned non-zero: $?\n";
   }
   
   $self->_mtree('BSD.root.dist', '/');  
@@ -123,7 +123,7 @@
   }
   
   $self->_mtree('BSD.local.dist', $self->{localbase});
-  $self->_mtree('BSD.x11-4.dist', $self->{x11base});
+  $self->_mtree('BSD.x11-4.dist', $self->{x11base}) if $self->{x11base};
   
   system("/sbin/mount -t devfs devfs $self->{root}/dev");
   $self->_touchfile('/.clean');
Index: Index.pm
===================================================================
RCS file: /home/cvs/mports/Tools/lib/Magus/Index.pm,v
retrieving revision 1.1
retrieving revision 1.2
diff -LTools/lib/Magus/Index.pm -LTools/lib/Magus/Index.pm -u -r1.1 -r1.2
--- Tools/lib/Magus/Index.pm
+++ Tools/lib/Magus/Index.pm
@@ -5,16 +5,38 @@
 use strict;
 use warnings;
 
-use base 'Mport::Index'
+use base 'Mport::Index';
   
   
-sub connect_db {
+sub create_db {
   my ($class) = @_;
   
-  # Connect to mysql here.
+  return DBI->connect(
+    "DBI:mysql:database=$Magus::Config{DBName}:host=$Magus::Config{DBHost}",
+    $Magus::Config{DBUser},
+    $Magus::Config{DBPass},
+    { RaiseError => 1, PrintError => 0 },
+  );
 }  
   
 
+sub insert_depends {
+  my ($class, $port, $dbh) = @_;
+  
+  # We only have one depend type, merge into a unique list
+  my %depends;
+  while (my ($type, $deps) = each %{$port->{'depends'}}) {
+    foreach my $dep (@$deps) {
+      $depends{$dep}++;
+    }
+  }
+  
+  foreach my $dep (keys %depends) {
+    Magus::Depend->insert({port => $port->{'name'}, dependency => $dep});
+  }
+}  
+       
+
    
 1;
 __END__
--- /dev/null
+++ Tools/lib/Magus/Config.pm
@@ -0,0 +1,26 @@
+package Magus::Config;
+#
+# $MidnightBSD: mports/Tools/lib/Magus/Config.pm,v 1.1 2007/10/20 22:32:39 ctriv Exp $
+# 
+
+use strict;
+use warnings;
+use YAML qw(LoadFile);
+
+our %Config = ( load_config("$Magus::Root/config.yaml") );
+
+sub import {
+  no strict 'refs';
+  
+  my $caller = caller;
+  
+  *{"$caller\::Config"} = \%Config;
+}
+
+sub load_config {
+  %Config = %{ LoadFile(shift) };
+}
+
+1;
+__END__
+
--- /dev/null
+++ Tools/lib/Magus/Lock.pm
@@ -0,0 +1,72 @@
+package Magus::Lock;
+#
+# $MidnightBSD: mports/Tools/lib/Magus/Lock.pm,v 1.1 2007/10/20 22:32:39 ctriv Exp $
+#
+
+use base qw(Magus::DBI);
+use strict;
+use warnings;
+
+__PACKAGE__->table('locks');
+__PACKAGE__->columns(Essential => qw(id port arch machine));
+
+__PACKAGE__->has_a(machine => "Magus::Machine");
+__PACKAGE__->has_a(port    => "Magus::Port");
+
+
+sub get_ready_lock {
+  my ($class, $port) = @_;
+  
+  if (defined $port) {
+    return $class->_get_lock($port);
+  } else {
+    return $class->_find_and_lock_unlocked_port();
+  }
+}
+
+
+sub _get_lock {
+  my ($class, $port) = @_;
+  my $lock;
+  
+  eval {
+    $lock = $class->insert({
+      port    => $port,
+      machine => $Magus::Machine,
+      arch    => $Magus::Machine->arch
+    });
+  };
+  
+  if ($@) {
+    if ($@ =~ m/duplicate/i) {
+      return;
+    } else {
+      die $@;
+    }
+  }
+  
+  return $lock;
+}
+
+sub _find_and_lock_unlocked_port {
+  my ($class) = @_;
+  
+  my $lock;
+  my $port;
+  
+  while (!defined $lock) {
+    my $port = Magus::Port->get_ready_port;
+   
+    if (!$port) { # we ran thru all the ports...
+      return;
+    }
+    
+    $lock = $class->_get_lock($port);
+  }
+  
+  return $lock;
+}
+
+1;
+__END__
+
--- /dev/null
+++ Tools/lib/Magus/Result.pm
@@ -0,0 +1,21 @@
+package Magus::Result;
+#
+# $MidnightBSD: mports/Tools/lib/Magus/Result.pm,v 1.1 2007/10/20 22:32:39 ctriv Exp $
+#
+
+use base qw(Magus::DBI);
+use strict;
+use warnings;
+
+
+__PACKAGE__->table('results');
+__PACKAGE__->columns(All => qw/id port version summary machine arch/);
+
+__PACKAGE__->has_a(port => 'Magus::Port');
+__PACKAGE__->has_a(machine => 'Magus::Machine');
+__PACKAGE__->has_many(subresults => 'Magus::SubResult');
+
+
+1;
+__END__
+


More information about the Midnightbsd-cvs mailing list