From ab88dd0ca8a52782931439387c5e43316cd772c6 Mon Sep 17 00:00:00 2001 From: Oliver Tappe Date: Wed, 16 Aug 2006 13:06:25 +0000 Subject: * added all vendor_os-related functions to DB-interface and -implementation * more cleanup git-svn-id: http://svn.openslx.org/svn/openslx/trunk@305 95ad53e4-c205-0410-b2fa-d234c58c8868 --- config-db/ODLX/ConfigDB.pm | 107 +++++++++++++++++++++++++++++++++-- config-db/ODLX/DBSchema.pm | 2 +- config-db/ODLX/MetaDB/Base.pm | 28 ++++++++++ config-db/ODLX/MetaDB/DBI.pm | 127 ++++++++++++++++++++++++++++++++++++------ config-db/testConfDB.pl | 16 ++++++ 5 files changed, 255 insertions(+), 25 deletions(-) (limited to 'config-db') 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); -- cgit v1.2.3-55-g7522