diff options
-rw-r--r-- | config-db/ODLX/ConfigDB.pm | 242 | ||||
-rw-r--r-- | config-db/ODLX/DBSchema.pm | 8 | ||||
-rw-r--r-- | config-db/ODLX/MetaDB/Base.pm | 60 | ||||
-rw-r--r-- | config-db/ODLX/MetaDB/DBI.pm | 135 |
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); } ################################################################################ |