summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-db/ODLX/ConfigDB.pm107
-rw-r--r--config-db/ODLX/DBSchema.pm2
-rw-r--r--config-db/ODLX/MetaDB/Base.pm28
-rw-r--r--config-db/ODLX/MetaDB/DBI.pm127
-rwxr-xr-xconfig-db/testConfDB.pl16
5 files changed, 255 insertions, 25 deletions
diff --git a/config-db/ODLX/ConfigDB.pm b/config-db/ODLX/ConfigDB.pm
index 93ef14be..aa9625d3 100644
--- a/config-db/ODLX/ConfigDB.pm
+++ b/config-db/ODLX/ConfigDB.pm
@@ -20,14 +20,17 @@ use Exporter;
my @accessExports = qw(
connectConfigDB disconnectConfigDB
- fetchSystemsByFilter fetchSystemsById fetchAllSystemIDsOfClient
+ fetchVendorOSesByFilter fetchVendorOSesByID fetchAllVendorOSIDsOfSystem
+ fetchSystemsByFilter fetchSystemsByID fetchAllSystemIDsOfClient
fetchAllSystemIDsOfGroup
- fetchClientsByFilter fetchClientsById fetchAllClientIDsOfSystem
+ fetchClientsByFilter fetchClientsByID fetchAllClientIDsOfSystem
fetchAllClientIDsOfGroup
- fetchGroupsByFilter fetchGroupsById fetchAllGroupIDsOfClient
+ fetchGroupsByFilter fetchGroupsByID fetchAllGroupIDsOfClient
fetchAllGroupIDsOfSystem
);
my @manipulationExports = qw(
+ addVendorOS removeVendorOS changeVendorOS
+ setSystemIDsOfVendorOS addSystemIDsToVendorOS removeSystemIDsFromVendorOS
addSystem removeSystem changeSystem
setClientIDsOfSystem addClientIDsToSystem removeClientIDsFromSystem
setGroupIDsOfSystem addGroupIDsToSystem removeGroupIDsFromSystem
@@ -160,6 +163,27 @@ sub disconnectConfigDB
$confDB->{'meta-db'}->disconnectConfigDB();
}
+sub fetchVendorOSesByFilter
+{
+ my $confDB = shift;
+ my $filter = shift;
+ my $resultCols = shift;
+
+ my @vendorOSes
+ = $confDB->{'meta-db'}->fetchVendorOSesByFilter($filter, $resultCols);
+ return wantarray() ? @vendorOSes : shift @vendorOSes;
+}
+
+sub fetchVendorOSesByID
+{
+ my $confDB = shift;
+ my $id = shift;
+
+ my $filter = { 'id' => $id };
+ my @vendorOSes = $confDB->{'meta-db'}->fetchVendorOSesByFilter($filter);
+ return wantarray() ? @vendorOSes : shift @vendorOSes;
+}
+
sub fetchSystemsByFilter
{
my $confDB = shift;
@@ -171,7 +195,7 @@ sub fetchSystemsByFilter
return wantarray() ? @systems : shift @systems;
}
-sub fetchSystemsById
+sub fetchSystemsByID
{
my $confDB = shift;
my $id = shift;
@@ -181,6 +205,14 @@ sub fetchSystemsById
return wantarray() ? @systems : shift @systems;
}
+sub fetchAllSystemIDsOfVendorOS
+{
+ my $confDB = shift;
+ my $vendorOSID = shift;
+
+ return $confDB->{'meta-db'}->fetchAllSystemIDsOfVendorOS($vendorOSID);
+}
+
sub fetchAllSystemIDsOfClient
{
my $confDB = shift;
@@ -206,7 +238,7 @@ sub fetchClientsByFilter
return wantarray() ? @clients : shift @clients;
}
-sub fetchClientsById
+sub fetchClientsByID
{
my $confDB = shift;
my $id = shift;
@@ -243,7 +275,7 @@ sub fetchGroupsByFilter
return wantarray() ? @groups : shift @groups;
}
-sub fetchGroupsById
+sub fetchGroupsByID
{
my $confDB = shift;
my $id = shift;
@@ -272,6 +304,69 @@ sub fetchAllGroupIDsOfClient
################################################################################
### data manipulation interface
################################################################################
+sub addVendorOS
+{
+ my $confDB = shift;
+ my $valRows = _aref(shift);
+
+ return $confDB->{'meta-db'}->addVendorOS($valRows);
+}
+
+sub removeVendorOS
+{
+ my $confDB = shift;
+ my $vendorOSIDs = _aref(shift);
+
+ return $confDB->{'meta-db'}->removeVendorOS($vendorOSIDs);
+}
+
+sub changeVendorOS
+{
+ my $confDB = shift;
+ my $vendorOSIDs = _aref(shift);
+ my $valRows = _aref(shift);
+
+ return $confDB->{'meta-db'}->changeVendorOS($vendorOSIDs, $valRows);
+}
+
+sub setSystemIDsOfVendorOS
+{
+ my $confDB = shift;
+ my $vendorOSID = shift;
+ my $systemIDs = _aref(shift);
+
+ my %seen;
+ my @uniqueSystemIDs = grep { !$seen{$_}++ } @$systemIDs;
+ return $confDB->{'meta-db'}->setSystemIDsOfVendorOS($vendorOSID,
+ \@uniqueSystemIDs);
+}
+
+sub addSystemIDsToVendorOS
+{
+ my $confDB = shift;
+ my $vendorOSID = shift;
+ my $newSystemIDs = _aref(shift);
+
+ my @systemIDs
+ = $confDB->{'meta-db'}->fetchAllSystemIDsOfVendorOS($vendorOSID);
+ push @systemIDs, @$newSystemIDs;
+ return setSystemIDsOfVendorOS($confDB, $vendorOSID, \@systemIDs);
+}
+
+sub removeSystemIDsFromVendorOS
+{
+ my $confDB = shift;
+ my $vendorOSID = shift;
+ my $removedSystemIDs = _aref(shift);
+
+ my %toBeRemoved;
+ @toBeRemoved{@$removedSystemIDs} = ();
+ my @systemIDs
+ = grep { !exists $toBeRemoved{$_} }
+ $confDB->{'meta-db'}->fetchAllSystemIDsOfVendorOS($vendorOSID);
+ return setSystemIDsOfVendorOS($confDB, $vendorOSID, \@systemIDs);
+}
+
sub addSystem
{
my $confDB = shift;
diff --git a/config-db/ODLX/DBSchema.pm b/config-db/ODLX/DBSchema.pm
index ff3fefb1..3d4ba843 100644
--- a/config-db/ODLX/DBSchema.pm
+++ b/config-db/ODLX/DBSchema.pm
@@ -69,7 +69,7 @@ $DbSchema = {
'system' => [
# a system describes one bootable instance of a vendor os
'id:pk', # primary key
- 'vendor_os:fk', # foreign key
+ 'vendor_os_id:fk', # foreign key
'name:s.32', # name used in filesystem and passed to kernel via cmdline arg
# (e.g.: suse-9.3-minimal, suse-9.3-minimal-nbd, ...)
'label:s.128', # visible name (pxe-label)
diff --git a/config-db/ODLX/MetaDB/Base.pm b/config-db/ODLX/MetaDB/Base.pm
index aac97dfa..0f7fcbdc 100644
--- a/config-db/ODLX/MetaDB/Base.pm
+++ b/config-db/ODLX/MetaDB/Base.pm
@@ -221,6 +221,14 @@ An array of hash-refs containing the resulting data rows.
=cut
+sub fetchVendorOSesByFilter
+{
+}
+
+sub fetchVendorOSesById
+{
+}
+
sub fetchSystemsByFilter
{
}
@@ -229,6 +237,10 @@ sub fetchSystemsById
{
}
+sub fetchAllSystemIDsOfVendorOS
+{
+}
+
sub fetchAllSystemIDsOfClient
{
}
@@ -281,6 +293,22 @@ sub generateNextIdForTable
return undef;
}
+sub addVendorOS
+{
+}
+
+sub removeVendorOS
+{
+}
+
+sub changeVendorOS
+{
+}
+
+sub setSystemIDsOfVendorOS
+{
+}
+
sub addSystem
{
}
diff --git a/config-db/ODLX/MetaDB/DBI.pm b/config-db/ODLX/MetaDB/DBI.pm
index 776285cb..a2f101d6 100644
--- a/config-db/ODLX/MetaDB/DBI.pm
+++ b/config-db/ODLX/MetaDB/DBI.pm
@@ -82,6 +82,31 @@ sub _doSelect
return @vals;
}
+sub fetchVendorOSesByFilter
+{
+ my $self = shift;
+ my $filter = shift;
+ my $resultCols = shift;
+
+ $resultCols = '*' unless (defined $resultCols);
+ my $sql = "SELECT $resultCols FROM vendor_os";
+ my $connector;
+ foreach my $col (keys %$filter) {
+ $connector = !defined $connector ? 'WHERE' : 'AND';
+ $sql .= " $connector $col = '$filter->{$col}'";
+ }
+ return $self->_doSelect($sql);
+}
+
+sub fetchVendorOSesById
+{
+ my $self = shift;
+ my $id = shift;
+ my $resultCols = shift;
+
+ return $self->fetchVendorOSesByFilter({'id' => $id}, $resultCols);
+}
+
sub fetchSystemsByFilter
{
my $self = shift;
@@ -95,8 +120,7 @@ sub fetchSystemsByFilter
$connector = !defined $connector ? 'WHERE' : 'AND';
$sql .= " $connector $col = '$filter->{$col}'";
}
- my @rows = $self->_doSelect($sql);
- return @rows;
+ return $self->_doSelect($sql);
}
sub fetchSystemsById
@@ -108,6 +132,17 @@ sub fetchSystemsById
return $self->fetchSystemsByFilter({'id' => $id}, $resultCols);
}
+sub fetchAllSystemIDsOfVendorOS
+{
+ my $self = shift;
+ my $vendorOSID = shift;
+
+ my $sql = qq[
+ SELECT id FROM system WHERE vendor_os_id = '$vendorOSID'
+ ];
+ return $self->_doSelect($sql, 'id');
+}
+
sub fetchAllSystemIDsOfClient
{
my $self = shift;
@@ -116,8 +151,7 @@ sub fetchAllSystemIDsOfClient
my $sql = qq[
SELECT system_id FROM client_system_ref WHERE client_id = '$clientID'
];
- my @rows = $self->_doSelect($sql, 'system_id');
- return @rows;
+ return $self->_doSelect($sql, 'system_id');
}
sub fetchAllSystemIDsOfGroup
@@ -128,8 +162,7 @@ sub fetchAllSystemIDsOfGroup
my $sql = qq[
SELECT system_id FROM group_system_ref WHERE group_id = '$groupID'
];
- my @rows = $self->_doSelect($sql, 'system_id');
- return @rows;
+ return $self->_doSelect($sql, 'system_id');
}
sub fetchClientsByFilter
@@ -145,8 +178,7 @@ sub fetchClientsByFilter
$connector = !defined $connector ? 'WHERE' : 'AND';
$sql .= " $connector $col = '$filter->{$col}'";
}
- my @rows = $self->_doSelect($sql);
- return @rows;
+ return $self->_doSelect($sql);
}
sub fetchClientsById
@@ -166,8 +198,7 @@ sub fetchAllClientIDsOfSystem
my $sql = qq[
SELECT client_id FROM client_system_ref WHERE system_id = '$systemID'
];
- my @rows = $self->_doSelect($sql, 'system_id');
- return @rows;
+ return $self->_doSelect($sql, 'system_id');
}
sub fetchAllClientIDsOfGroup
@@ -178,8 +209,7 @@ sub fetchAllClientIDsOfGroup
my $sql = qq[
SELECT client_id FROM group_client_ref WHERE group_id = '$groupID'
];
- my @rows = $self->_doSelect($sql, 'system_id');
- return @rows;
+ return $self->_doSelect($sql, 'system_id');
}
sub fetchGroupsByFilter
@@ -195,8 +225,7 @@ sub fetchGroupsByFilter
$connector = !defined $connector ? 'WHERE' : 'AND';
$sql .= " $connector $col = '$filter->{$col}'";
}
- my @rows = $self->_doSelect($sql);
- return @rows;
+ return $self->_doSelect($sql);
}
sub fetchGroupsById
@@ -216,8 +245,7 @@ sub fetchAllGroupIDsOfSystem
my $sql = qq[
SELECT group_id FROM group_system_ref WHERE system_id = '$systemID'
];
- my @rows = $self->_doSelect($sql, 'group_id');
- return @rows;
+ return $self->_doSelect($sql, 'group_id');
}
sub fetchAllGroupIDsOfClient
@@ -228,8 +256,7 @@ sub fetchAllGroupIDsOfClient
my $sql = qq[
SELECT group_id FROM group_client_ref WHERE client_id = '$clientID'
];
- my @rows = $self->_doSelect($sql, 'group_id');
- return @rows;
+ return $self->_doSelect($sql, 'group_id');
}
################################################################################
@@ -386,6 +413,70 @@ sub _updateRefTable
}
}
+sub _updateOneToManyRefAttr
+{
+ my $self = shift;
+ my $table = shift;
+ my $oneID = shift;
+ my $newManyIDs = shift;
+ my $fkCol = shift;
+ my $oldManyIDs = shift;
+
+ my %lastManyIDs;
+ @lastManyIDs{@$oldManyIDs} = ();
+
+ foreach my $id (@$newManyIDs) {
+ if (!exists $lastManyIDs{$id}) {
+ # ID has changed, update it
+ $self->_doUpdate($table, $id, [{ $fkCol => $oneID }]);
+ } else {
+ # ID hasn't changed, leave as is, but remove from hash:
+ delete $lastManyIDs{$id};
+ }
+ }
+
+ # all the remaining many-IDs need to be set to 0:
+ foreach my $id (scalar keys %lastManyIDs) {
+ $self->_doUpdate($table, $id, [{ $fkCol => '0' }]);
+ }
+}
+
+sub addVendorOS
+{
+ my $self = shift;
+ my $valRows = shift;
+
+ return $self->_doInsert('vendor_os', $valRows);
+}
+
+sub removeVendorOS
+{
+ my $self = shift;
+ my $vendorOSIDs = shift;
+
+ return $self->_doDelete('vendor_os', $vendorOSIDs);
+}
+
+sub changeVendorOS
+{
+ my $self = shift;
+ my $vendorOSIDs = shift;
+ my $valRows = shift;
+
+ return $self->_doUpdate('vendor_os', $vendorOSIDs, $valRows);
+}
+
+sub setSystemIDsOfVendorOS
+{
+ my $self = shift;
+ my $vendorOSID = shift;
+ my $systemIDs = shift;
+
+ my @currSystems = $self->fetchAllSystemsOfVendorOS($vendorOSID);
+ $self->_updateOneToManyRefAttr('system', $vendorOSID, $systemIDs,
+ 'vendor_os_id', \@currSystems);
+}
+
sub addSystem
{
my $self = shift;
diff --git a/config-db/testConfDB.pl b/config-db/testConfDB.pl
index 4422aad2..ebf126f3 100755
--- a/config-db/testConfDB.pl
+++ b/config-db/testConfDB.pl
@@ -11,11 +11,27 @@ odlxInit();
my $odlxDB = connectConfigDB();
+addVendorOS($odlxDB, {
+ 'name' => "suse-93-minimal",
+ 'descr' => "SuSE 9.3 minimale Installation",
+});
+
+addVendorOS($odlxDB, {
+ 'name' => "suse-93-KDE",
+ 'descr' => "SuSE 9.3 grafische Installation mit KDE",
+});
+
+addVendorOS($odlxDB, {
+ 'name' => "debian-31",
+ 'descr' => "Debian 3.1 Default-Installation",
+});
+
my @systems;
foreach my $id (1..10) {
push @systems, {
'name' => "name of $id",
'descr' => "descr of $id",
+ 'vendor_os_id' => 1 + $id % 3,
};
}
addSystem($odlxDB, \@systems);