summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-db/ODLX/ConfigDB.pm242
-rw-r--r--config-db/ODLX/DBSchema.pm8
-rw-r--r--config-db/ODLX/MetaDB/Base.pm60
-rw-r--r--config-db/ODLX/MetaDB/DBI.pm135
4 files changed, 412 insertions, 33 deletions
diff --git a/config-db/ODLX/ConfigDB.pm b/config-db/ODLX/ConfigDB.pm
index eb5a6c98..6bf8ab86 100644
--- a/config-db/ODLX/ConfigDB.pm
+++ b/config-db/ODLX/ConfigDB.pm
@@ -20,12 +20,23 @@ use Exporter;
my @accessExports = qw(
connectConfigDB disconnectConfigDB
- fetchSystemsByFilter fetchSystemsById fetchAllSystemsOfClient
- fetchClientsByFilter fetchClientsById fetchAllClientsForSystem
+ fetchSystemsByFilter fetchSystemsById fetchAllSystemIDsOfClient
+ fetchAllSystemIDsOfGroup
+ fetchClientsByFilter fetchClientsById fetchAllClientIDsOfSystem
+ fetchAllClientIDsOfGroup
+ fetchGroupsByFilter fetchGroupsById fetchAllGroupIDsOfClient
+ fetchAllGroupIDsOfSystem
);
my @manipulationExports = qw(
addSystem removeSystem changeSystem
+ setClientIDsOfSystem addClientIDsToSystem removeClientIDsFromSystem
+ setGroupIDsOfSystem addGroupIDsToSystem removeGroupIDsFromSystem
addClient removeClient changeClient
+ setSystemIDsOfClient addSystemIDsToClient removeSystemIDsFromClient
+ setGroupIDsOfClient addGroupIDsToClient removeGroupIDsFromClient
+ addGroup removeGroup changeGroup
+ setClientIDsOfGroup addClientIDsToGroup removeClientIDsFromGroup
+ setSystemIDsOfGroup addSystemIDsToGroup removeSystemIDsFromGroup
);
@EXPORT = @accessExports;
@@ -170,13 +181,20 @@ sub fetchSystemsById
return wantarray() ? @systems : shift @systems;
}
-sub fetchAllSystemIDsForClient
+sub fetchAllSystemIDsOfClient
{
my $confDB = shift;
my $clientID = shift;
- my @systemIDs = $confDB->{'meta-db'}->fetchAllSystemIDsOfClient($clientID);
- return @systemIDs;
+ return $confDB->{'meta-db'}->fetchAllSystemIDsOfClient($clientID);
+}
+
+sub fetchAllSystemIDsOfGroup
+{
+ my $confDB = shift;
+ my $groupID = shift;
+
+ return $confDB->{'meta-db'}->fetchAllSystemIDsOfClient($groupID);
}
sub fetchClientsByFilter
@@ -198,13 +216,20 @@ sub fetchClientsById
return wantarray() ? @clients : shift @clients;
}
-sub fetchAllClientIDsForSystem
+sub fetchAllClientIDsOfSystem
{
my $confDB = shift;
my $systemID = shift;
- my @clientIDs = $confDB->{'meta-db'}->fetchAllClientIDsOfSystem($systemID);
- return @clientIDs;
+ return $confDB->{'meta-db'}->fetchAllClientIDsOfSystem($systemID);
+}
+
+sub fetchAllClientIDsOfGroup
+{
+ my $confDB = shift;
+ my $groupID = shift;
+
+ return $confDB->{'meta-db'}->fetchAllClientIDsOfGroup($groupID);
}
################################################################################
@@ -235,7 +260,7 @@ sub changeSystem
return $confDB->{'meta-db'}->changeSystem($systemIDs, $valRows);
}
-sub setClientIDsForSystem
+sub setClientIDsOfSystem
{
my $confDB = shift;
my $systemID = shift;
@@ -243,8 +268,8 @@ sub setClientIDsForSystem
my %seen;
my @uniqueClientIDs = grep { !$seen{$_}++ } @$clientIDs;
- return $confDB->{'meta-db'}->setClientIDsForSystem($systemID,
- \@uniqueClientIDs);
+ return $confDB->{'meta-db'}->setClientIDsOfSystem($systemID,
+ \@uniqueClientIDs);
}
sub addClientIDsToSystem
@@ -253,10 +278,9 @@ sub addClientIDsToSystem
my $systemID = shift;
my $newClientIDs = _aref(shift);
- my @clientIDs
- = $confDB->{'meta-db'}->fetchAllClientIDsOfSystem($systemID);
+ my @clientIDs = $confDB->{'meta-db'}->fetchAllClientIDsOfSystem($systemID);
push @clientIDs, @$newClientIDs;
- return setClientIDsForSystem($confDB, $systemID, \@clientIDs);
+ return setClientIDsOfSystem($confDB, $systemID, \@clientIDs);
}
sub removeClientIDsFromSystem
@@ -269,8 +293,45 @@ sub removeClientIDsFromSystem
@toBeRemoved{@$removedClientIDs} = ();
my @clientIDs
= grep { !exists $toBeRemoved{$_} }
- $confDB->{'meta-db'}->fetchAllClientIDsOfSystem($systemID);
- return setClientIDsForSystem($confDB, $systemID, \@clientIDs);
+ $confDB->{'meta-db'}->fetchAllClientIDsOfSystem($systemID);
+ return setClientIDsOfSystem($confDB, $systemID, \@clientIDs);
+}
+
+sub setGroupIDsOfSystem
+{
+ my $confDB = shift;
+ my $systemID = shift;
+ my $groupIDs = _aref(shift);
+
+ my %seen;
+ my @uniqueGroupIDs = grep { !$seen{$_}++ } @$groupIDs;
+ return $confDB->{'meta-db'}->setGroupIDsOfSystem($systemID,
+ \@uniqueGroupIDs);
+}
+
+sub addGroupIDsToSystem
+{
+ my $confDB = shift;
+ my $systemID = shift;
+ my $newGroupIDs = _aref(shift);
+
+ my @groupIDs = $confDB->{'meta-db'}->fetchAllGroupIDsOfSystem($systemID);
+ push @groupIDs, @$newGroupIDs;
+ return setGroupIDsOfSystem($confDB, $systemID, \@groupIDs);
+}
+
+sub removeGroupIDsFromSystem
+{
+ my $confDB = shift;
+ my $systemID = shift;
+ my $toBeRemovedGroupIDs = _aref(shift);
+
+ my %toBeRemoved;
+ @toBeRemoved{@$toBeRemovedGroupIDs} = ();
+ my @groupIDs
+ = grep { !exists $toBeRemoved{$_} }
+ $confDB->{'meta-db'}->fetchAllGroupIDsOfSystem($systemID);
+ return setGroupIDsOfSystem($confDB, $systemID, \@groupIDs);
}
sub addClient
@@ -298,7 +359,7 @@ sub changeClient
return $confDB->{'meta-db'}->changeClient($clientIDs, $valRows);
}
-sub setSystemIDsForClient
+sub setSystemIDsOfClient
{
my $confDB = shift;
my $clientID = shift;
@@ -306,7 +367,7 @@ sub setSystemIDsForClient
my %seen;
my @uniqueSystemIDs = grep { !$seen{$_}++ } @$systemIDs;
- return $confDB->{'meta-db'}->setSystemIDsForClient($clientID,
+ return $confDB->{'meta-db'}->setSystemIDsOfClient($clientID,
\@uniqueSystemIDs);
}
@@ -316,10 +377,9 @@ sub addSystemIDsToClient
my $clientID = shift;
my $newSystemIDs = _aref(shift);
- my @systemIDs
- = $confDB->{'meta-db'}->fetchAllSystemIDsForClient($clientID);
+ my @systemIDs = $confDB->{'meta-db'}->fetchAllSystemIDsOfClient($clientID);
push @systemIDs, @$newSystemIDs;
- return setSystemIDsForClient($confDB, $clientID, \@systemIDs);
+ return setSystemIDsOfClient($confDB, $clientID, \@systemIDs);
}
sub removeSystemIDsFromClient
@@ -332,8 +392,144 @@ sub removeSystemIDsFromClient
@toBeRemoved{@$removedSystemIDs} = ();
my @systemIDs
= grep { !exists $toBeRemoved{$_} }
- $confDB->{'meta-db'}->fetchAllSystemIDsForClient($clientID);
- return setSystemIDsForClient($confDB, $clientID, \@systemIDs);
+ $confDB->{'meta-db'}->fetchAllSystemIDsOfClient($clientID);
+ return setSystemIDsOfClient($confDB, $clientID, \@systemIDs);
+}
+
+sub setGroupIDsOfClient
+{
+ my $confDB = shift;
+ my $clientID = shift;
+ my $groupIDs = _aref(shift);
+
+ my %seen;
+ my @uniqueGroupIDs = grep { !$seen{$_}++ } @$groupIDs;
+ return $confDB->{'meta-db'}->setGroupIDsOfClient($clientID,
+ \@uniqueGroupIDs);
+}
+
+sub addGroupIDsToClient
+{
+ my $confDB = shift;
+ my $clientID = shift;
+ my $newGroupIDs = _aref(shift);
+
+ my @groupIDs = $confDB->{'meta-db'}->fetchAllGroupIDsOfClient($clientID);
+ push @groupIDs, @$newGroupIDs;
+ return setGroupIDsOfClient($confDB, $clientID, \@groupIDs);
+}
+
+sub removeGroupIDsFromClient
+{
+ my $confDB = shift;
+ my $clientID = shift;
+ my $toBeRemovedGroupIDs = _aref(shift);
+
+ my %toBeRemoved;
+ @toBeRemoved{@$toBeRemovedGroupIDs} = ();
+ my @groupIDs
+ = grep { !exists $toBeRemoved{$_} }
+ $confDB->{'meta-db'}->fetchAllGroupIDsOfClient($clientID);
+ return setGroupIDsOfClient($confDB, $clientID, \@groupIDs);
+}
+
+sub addGroup
+{
+ my $confDB = shift;
+ my $valRows = _aref(shift);
+
+ return $confDB->{'meta-db'}->addGroup($valRows);
+}
+
+sub removeGroup
+{
+ my $confDB = shift;
+ my $groupIDs = _aref(shift);
+
+ return $confDB->{'meta-db'}->removeGroup($groupIDs);
+}
+
+sub changeGroup
+{
+ my $confDB = shift;
+ my $groupIDs = _aref(shift);
+ my $valRows = _aref(shift);
+
+ return $confDB->{'meta-db'}->changeGroup($groupIDs, $valRows);
+}
+
+sub setClientIDsOfGroup
+{
+ my $confDB = shift;
+ my $groupID = shift;
+ my $clientIDs = _aref(shift);
+
+ my %seen;
+ my @uniqueClientIDs = grep { !$seen{$_}++ } @$clientIDs;
+ return $confDB->{'meta-db'}->setClientIDsOfGroup($groupID,
+ \@uniqueClientIDs);
+}
+
+sub addClientIDsToGroup
+{
+ my $confDB = shift;
+ my $groupID = shift;
+ my $newClientIDs = _aref(shift);
+
+ my @clientIDs = $confDB->{'meta-db'}->fetchAllClientIDsOfGroup($groupID);
+ push @clientIDs, @$newClientIDs;
+ return setClientIDsOfGroup($confDB, $groupID, \@clientIDs);
+}
+
+sub removeClientIDsFromGroup
+{
+ my $confDB = shift;
+ my $groupID = shift;
+ my $removedClientIDs = _aref(shift);
+
+ my %toBeRemoved;
+ @toBeRemoved{@$removedClientIDs} = ();
+ my @clientIDs
+ = grep { !exists $toBeRemoved{$_} }
+ $confDB->{'meta-db'}->fetchAllClientIDsOfGroup($groupID);
+ return setClientIDsOfGroup($confDB, $groupID, \@clientIDs);
+}
+
+sub setSystemIDsOfGroup
+{
+ my $confDB = shift;
+ my $groupID = shift;
+ my $systemIDs = _aref(shift);
+
+ my %seen;
+ my @uniqueSystemIDs = grep { !$seen{$_}++ } @$systemIDs;
+ return $confDB->{'meta-db'}->setSystemIDsOfGroup($groupID,
+ \@uniqueSystemIDs);
+}
+
+sub addSystemIDsToGroup
+{
+ my $confDB = shift;
+ my $groupID = shift;
+ my $newSystemIDs = _aref(shift);
+
+ my @systemIDs = $confDB->{'meta-db'}->fetchAllSystemIDsOfGroup($groupID);
+ push @systemIDs, @$newSystemIDs;
+ return setSystemIDsOfGroup($confDB, $groupID, \@systemIDs);
+}
+
+sub removeSystemIDsFromGroup
+{
+ my $confDB = shift;
+ my $groupID = shift;
+ my $removedSystemIDs = _aref(shift);
+
+ my %toBeRemoved;
+ @toBeRemoved{@$removedSystemIDs} = ();
+ my @systemIDs
+ = grep { !exists $toBeRemoved{$_} }
+ $confDB->{'meta-db'}->fetchAllSystemIDsOfGroup($groupID);
+ return setSystemIDsOfGroup($confDB, $groupID, \@systemIDs);
}
1;
diff --git a/config-db/ODLX/DBSchema.pm b/config-db/ODLX/DBSchema.pm
index 865e80b1..ff3fefb1 100644
--- a/config-db/ODLX/DBSchema.pm
+++ b/config-db/ODLX/DBSchema.pm
@@ -83,7 +83,7 @@ $DbSchema = {
@sharedAttributes,
],
'client' => [
- # a client is a PC booting via net
+ # a client is a PC booting via network
'id:pk', # primary key
'name:s.128', # official name of PC (e.g. as given by sticker
# on case)
@@ -114,6 +114,12 @@ $DbSchema = {
'group_id:fk', # foreign key
'client_id:fk', # foreign key
],
+ 'group_system_ref' => [
+ # groups referring to the systems each of their clients should
+ # offer for booting
+ 'group_id:fk', # foreign key
+ 'system_id:fk', # foreign key
+ ],
},
};
diff --git a/config-db/ODLX/MetaDB/Base.pm b/config-db/ODLX/MetaDB/Base.pm
index 72c5676a..aac97dfa 100644
--- a/config-db/ODLX/MetaDB/Base.pm
+++ b/config-db/ODLX/MetaDB/Base.pm
@@ -229,7 +229,11 @@ sub fetchSystemsById
{
}
-sub fetchAllSystemIDsForClient
+sub fetchAllSystemIDsOfClient
+{
+}
+
+sub fetchAllSystemIDsOfGroup
{
}
@@ -241,7 +245,27 @@ sub fetchClientsById
{
}
-sub fetchAllClientIDsForSystem
+sub fetchAllClientIDsOfSystem
+{
+}
+
+sub fetchAllClientIDsOfGroup
+{
+}
+
+sub fetchGroupsByFilter
+{
+}
+
+sub fetchGroupsById
+{
+}
+
+sub fetchAllGroupIDsOfClient
+{
+}
+
+sub fetchAllGroupIDsOfSystem
{
}
@@ -269,7 +293,11 @@ sub changeSystem
{
}
-sub setClientIDsForSystem
+sub setClientIDsOfSystem
+{
+}
+
+sub setGroupIDsOfSystem
{
}
@@ -285,7 +313,31 @@ sub changeClient
{
}
-sub setSystemIDsForClient
+sub setSystemIDsOfClient
+{
+}
+
+sub setGroupIDsOfClient
+{
+}
+
+sub addGroup
+{
+}
+
+sub removeGroup
+{
+}
+
+sub changeGroup
+{
+}
+
+sub setClientIDsOfGroup
+{
+}
+
+sub setSystemIDsOfGroup
{
}
diff --git a/config-db/ODLX/MetaDB/DBI.pm b/config-db/ODLX/MetaDB/DBI.pm
index 0b524e93..9a654744 100644
--- a/config-db/ODLX/MetaDB/DBI.pm
+++ b/config-db/ODLX/MetaDB/DBI.pm
@@ -102,7 +102,7 @@ sub fetchSystemsById
return $self->fetchSystemsByFilter({'id' => $id}, $resultCols);
}
-sub fetchAllSystemIDsForClient
+sub fetchAllSystemIDsOfClient
{
my $self = shift;
my $clientID = shift;
@@ -140,7 +140,7 @@ sub fetchClientsById
return $self->fetchClientsByFilter({'id' => $id}, $resultCols);
}
-sub fetchAllClientIDsForSystem
+sub fetchAllClientIDsOfSystem
{
my $self = shift;
my $clientID = shift;
@@ -166,6 +166,11 @@ sub _doInsert
my $valRow = (@$valRows)[0];
return if !defined $valRow;
+ if ($table =~ m[_ref$]) {
+ # reference tables do not have IDs:
+ $ignoreIDs = 1;
+ }
+
my $needToGenerateIDs = $self->generateNextIdForTable(undef);
if (!$ignoreIDs && $needToGenerateIDs) {
# DB requires pre-specified IDs, so we add the 'id' column:
@@ -203,14 +208,16 @@ sub _doDelete
my $self = shift;
my $table = shift;
my $IDs = shift;
+ my $idCol = shift;
my $dbh = $self->{'dbh'};
$IDs = [undef] unless defined $IDs;
+ $idCol = 'id' unless defined $idCol;
foreach my $id (@$IDs) {
my $sql = "DELETE FROM $table";
if (defined $id) {
- $sql .= " WHERE id = ".$self->quote($id);
+ $sql .= " WHERE $idCol = ".$self->quote($id);
}
my $sth = $dbh->prepare($sql)
or confess _tr(q[Can't delete from table <%s> (%s)], $table,
@@ -220,6 +227,7 @@ sub _doDelete
or confess _tr(q[Can't delete from table <%s> (%s)], $table,
$dbh->errstr);
}
+ return 1;
}
sub _doUpdate
@@ -256,6 +264,40 @@ sub _doUpdate
or confess _tr(q[Can't update table <%s> (%s)], $table,
$dbh->errstr);
}
+ return 1;
+}
+
+sub _updateRefTable
+{
+ my $self = shift;
+ my $table = shift;
+ my $keyID = shift;
+ my $newValueIDs = shift;
+ my $keyCol = shift;
+ my $valueCol = shift;
+ my $oldValueIDs = shift;
+
+ my %lastValueIDs;
+ @lastValueIDs{@$oldValueIDs} = ();
+
+ foreach my $valueID (@$newValueIDs) {
+ if (!exists $lastValueIDs{$valueID}) {
+ # value-ID is new, create it
+ my $valRow = {
+ $keyCol => $keyID,
+ $valueCol => $valueID,
+ };
+ $self->_doInsert($table, [$valRow]);
+ } else {
+ # value-ID already exists, leave as is, but remove from hash:
+ delete $lastValueIDs{$valueID};
+ }
+ }
+
+ # all the remaining value-IDs need to be removed:
+ if (scalar keys %lastValueIDs) {
+ $self->_doDelete($table, keys %lastValueIDs, $valueCol);
+ }
}
sub addSystem
@@ -283,8 +325,26 @@ sub changeSystem
return $self->_doUpdate('system', $systemIDs, $valRows);
}
-sub setClientIDsForSystem
+sub setClientIDsOfSystem
+{
+ my $self = shift;
+ my $systemID = shift;
+ my $clientIDs = shift;
+
+ my @currClients = $self->fetchAllClientIDsOfSystem($systemID);
+ $self->_updateRefTable('client_system_ref', $systemID, $clientIDs,
+ 'system_id', 'client_id', \@currClients);
+}
+
+sub setGroupIDsOfSystem
{
+ my $self = shift;
+ my $systemID = shift;
+ my $groupIDs = shift;
+
+ my @currGroups = $self->fetchAllGroupIDsOfSystem($systemID);
+ $self->_updateRefTable('grop_system_ref', $systemID, $groupIDs,
+ 'system_id', 'group_id', \@currGroups);
}
sub addClient
@@ -312,8 +372,73 @@ sub changeClient
return $self->_doUpdate('client', $clientIDs, $valRows);
}
-sub setSystemIDsForClient
+sub setSystemIDsOfClient
+{
+ my $self = shift;
+ my $clientID = shift;
+ my $systemIDs = shift;
+
+ my @currSystems = $self->fetchAllSystemsOfClient($clientID);
+ $self->_updateRefTable('client_system_ref', $clientID, $systemIDs,
+ 'client_id', 'system_id', \@currSystems);
+}
+
+sub setGroupIDsOfClient
+{
+ my $self = shift;
+ my $clientID = shift;
+ my $groupIDs = shift;
+
+ my @currGroups = $self->fetchAllGroupsOfClient($clientID);
+ $self->_updateRefTable('group_client_ref', $clientID, $groupIDs,
+ 'client_id', 'group_id', \@currGroups);
+}
+
+sub addGroup
+{
+ my $self = shift;
+ my $valRows = shift;
+
+ return $self->_doInsert('group', $valRows);
+}
+
+sub removeGroup
+{
+ my $self = shift;
+ my $groupIDs = shift;
+
+ return $self->_doDelete('group', $groupIDs);
+}
+
+sub changeGroup
{
+ my $self = shift;
+ my $groupIDs = shift;
+ my $valRows = shift;
+
+ return $self->_doUpdate('group', $groupIDs, $valRows);
+}
+
+sub setClientIDsOfGroup
+{
+ my $self = shift;
+ my $groupID = shift;
+ my $clientIDs = shift;
+
+ my @currClients = $self->fetchAllClientsOfGroup($groupID);
+ $self->_updateRefTable('group_client_ref', $groupID, $clientIDs,
+ 'group_id', 'client_id', \@currClients);
+}
+
+sub setSystemIDsOfGroup
+{
+ my $self = shift;
+ my $groupID = shift;
+ my $systemIDs = shift;
+
+ my @currSystems = $self->fetchAllSystemsOfGroup($groupID);
+ $self->_updateRefTable('group_system_ref', $groupID, $systemIDs,
+ 'group_id', 'system_id', \@currSystems);
}
################################################################################