--- loncom/metadata_database/LONCAPA/lonmetadata.pm 2007/06/15 23:02:09 1.22 +++ loncom/metadata_database/LONCAPA/lonmetadata.pm 2007/07/25 23:17:49 1.23 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonmetadata.pm,v 1.22 2007/06/15 23:02:09 albertel Exp $ +# $Id: lonmetadata.pm,v 1.23 2007/07/25 23:17:49 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -32,7 +32,7 @@ use strict; use DBI; use HTML::TokeParser; use vars qw($Metadata_Table_Description $Portfolio_metadata_table_description -$Portfolio_access_table_description $Fulltext_indicies $Portfolio_metadata_indices $Portfolio_access_indices $Portfolio_addedfields_table_description $Portfolio_addedfields_indices); +$Portfolio_access_table_description $Fulltext_indicies $Portfolio_metadata_indices $Portfolio_access_indices $Portfolio_addedfields_table_description $Portfolio_addedfields_indices $Allusers_table_description $Allusers_indices); ###################################################################### ###################################################################### @@ -247,6 +247,26 @@ $Portfolio_addedfields_indices = [qw/ ###################################################################### ###################################################################### +$Allusers_table_description = + [ + { name => 'username', type=>'TEXT', restrictions => 'NOT NULL' }, + { name => 'domain', type=>'TEXT', restrictions => 'NOT NULL' }, + { name => 'lastname', type=>'TEXT',}, + { name => 'firstname', type=>'TEXT'}, + { name => 'middlename', type=>'TEXT'}, + { name => 'generation', type=>'TEXT'}, + { name => 'permanentemail', type=>'TEXT'}, + { name => 'id', type=>'TEXT'}, + ]; + +$Allusers_indices = [qw/ + username + domain + lastname + firstname/]; + +###################################################################### +###################################################################### =pod @@ -268,12 +288,14 @@ sub describe_metadata_storage { portfolio_metadata => $Portfolio_metadata_table_description, portfolio_access => $Portfolio_access_table_description, portfolio_addedfields => $Portfolio_addedfields_table_description, + allusers => $Allusers_table_description, ); my %index_description = ( metadata => $Fulltext_indicies, portfolio_metadata => $Portfolio_metadata_indices, portfolio_access => $Portfolio_access_indices, portfolio_addedfields => $Portfolio_addedfields_indices, + allusers => $Allusers_indices, ); if ($tabletype eq 'portfolio_search') { my @portfolio_search_table = @{$table_description{portfolio_metadata}}; @@ -466,7 +488,7 @@ sub store_metadata { =pod -=item lookup_metadata() +=item () Inputs: database handle ($dbh) and a hash or hash reference containing metadata which will be used for a search. @@ -516,7 +538,8 @@ Removes a single metadata record, based Inputs: $dbh, the database handler. $tablename, the name of the metadata table to remove from. default: 'metadata' -$url, the url of the resource to remove from the metadata database. +$delitem, the resource to remove from the metadata database, in the form: + url = quoted url Returns: undef on success, dbh errorstr on failure. @@ -525,14 +548,17 @@ Returns: undef on success, dbh errorstr ###################################################################### ###################################################################### sub delete_metadata { - my ($dbh,$tablename,$url) = @_; + my ($dbh,$tablename,$delitem) = @_; $tablename = 'metadata' if (! defined($tablename)); - my $error; - my $delete_command = 'DELETE FROM '.$tablename.' WHERE url='. - $dbh->quote($url); - $dbh->do($delete_command); - if ($dbh->err) { - $error = $dbh->errstr(); + my ($error,$delete_command); + if ($delitem eq '') { + $error = 'deletion aborted - no resource specified'; + } else { + $delete_command = 'DELETE FROM '.$tablename.' WHERE '.$delitem; + $dbh->do($delete_command); + if ($dbh->err) { + $error = $dbh->errstr(); + } } return $error; } @@ -553,7 +579,10 @@ Inputs: $dbh, database handle $newmetadata, hash reference containing the new metadata $tablename, metadata table name. Defaults to 'metadata'. -$tabletype, type of table (metadata, portfolio_metadata, portfolio_access) +$tabletype, type of table (metadata, portfolio_metadata, portfolio_access, + allusers) +$conditions, optional hash of conditions to use in SQL queries; + default used if none provided. Returns: $error on failure. undef on success. @@ -563,20 +592,32 @@ $error on failure. undef on success. ###################################################################### ###################################################################### sub update_metadata { - my ($dbh,$tablename,$tabletype,$newmetadata)=@_; - my $error; + my ($dbh,$tablename,$tabletype,$newmetadata,$conditions)=@_; + my ($error,$condition); $tablename = 'metadata' if (! defined($tablename)); $tabletype = 'metadata' if (! defined($tabletype)); - if (! exists($newmetadata->{'url'})) { - $error = 'Unable to update: no url specified'; + if (ref($conditions) eq 'HASH') { + my @items; + foreach my $key (keys(%{$conditions})) { + if (! exists($newmetadata->{$key})) { + $error .= "Unable to update: no $key specified"; + } else { + push(@items,"$key = ".$dbh->quote($newmetadata->{$key})); + } + } + $condition = join(' AND ',@items); + } else { + if (! exists($newmetadata->{'url'})) { + $error = 'Unable to update: no url specified'; + } else { + $condition = 'url = '.$dbh->quote($newmetadata->{'url'}); + } } return $error if (defined($error)); # # Retrieve current values my $row; - ($error,$row) = &lookup_metadata($dbh, - ' url='.$dbh->quote($newmetadata->{'url'}), - undef,$tablename); + ($error,$row) = &lookup_metadata($dbh,$condition,undef,$tablename); return $error if ($error); my %metadata = &LONCAPA::lonmetadata::metadata_col_to_hash($tabletype,@{$row->[0]}); # @@ -586,7 +627,7 @@ sub update_metadata { } # # Delete old data (deleting a nonexistant record does not produce an error. - $error = &delete_metadata($dbh,$tablename,$newmetadata->{'url'}); + $error = &delete_metadata($dbh,$tablename,$condition); return $error if (defined($error)); # # Store updated metadata @@ -1013,7 +1054,13 @@ sub process_portfolio_access_data { my %loghash; if ($caller eq 'update') { # Delete old data (no error if deleting non-existent record). - my $error=&delete_metadata($dbh,$newnames->{'access'},$url); + my $error; + if ($url eq '') { + $error = 'No url specified'; + } else { + my $delitem = 'url = '.$dbh->quote($url); + $error=&delete_metadata($dbh,$newnames->{'access'},$delitem); + } if (defined($error)) { $loghash{'access'}{'err'} = "MySQL Error Delete: ".$error; return %loghash; @@ -1055,13 +1102,19 @@ sub process_portfolio_metadata { my %loghash; if ($caller eq 'update') { # Delete old data (no error if deleting non-existent record). - my $error=&delete_metadata($dbh,$newnames->{'portfolio'},$url); + my ($error,$delitem); + if ($url eq '') { + $error = 'No url specified'; + } else { + $delitem = 'url = '.$dbh->quote($url); + $error=&delete_metadata($dbh,$newnames->{'portfolio'},$delitem); + } if (defined($error)) { $loghash{'metadata'}{'err'} = "MySQL Error delete metadata: ". $error; return %loghash; } - $error=&delete_metadata($dbh,$newnames->{'addedfields'},$url); + $error=&delete_metadata($dbh,$newnames->{'addedfields'},$delitem); if (defined($error)) { $loghash{'addedfields'}{'err'}="MySQL Error delete addedfields: ".$error; } @@ -1119,6 +1172,44 @@ sub process_portfolio_metadata { } } return %loghash; +} + +sub process_allusers_data { + my ($dbh,$simulate,$newnames,$uname,$udom,$userdata,$caller) = @_; + my %loghash; + if ($caller eq 'update') { + # Delete old data (no error if deleting non-existent record). + my ($error,$delitem); + if ($udom eq '' || $uname eq '' ) { + $error = 'No domain and/or username specified'; + } else { + $delitem = 'domain = '.$dbh->quote($udom).' AND username = '. + $dbh->quote($uname); + $error=&delete_metadata($dbh,$newnames->{'allusers'},$delitem); + } + if (defined($error)) { + $loghash{'err'} = 'MySQL Error in allusers delete: '.$error; + return %loghash; + } + } + if (!$simulate) { + if ($udom ne '' && $uname ne '') { + my ($count,$err) = &store_metadata($dbh,$newnames->{'allusers'}, + 'allusers',$userdata); + if ($err) { + $loghash{'err'} = 'MySQL Error in allusers insert: '.$err; + } + if ($count < 1) { + $loghash{'count'} = + 'Unable to insert record into MySQL allusers database for '. + $uname.' in '.$udom; + } + } else { + $loghash{'err'} = + 'MySQL Error allusrs insert: missing username and/or domain'; + } + } + return %loghash; } ######################################################################