[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