--- loncom/metadata_database/LONCAPA/lonmetadata.pm 2004/01/12 15:07:08 1.1 +++ loncom/metadata_database/LONCAPA/lonmetadata.pm 2004/01/12 21:32:20 1.2 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonmetadata.pm,v 1.1 2004/01/12 15:07:08 matthew Exp $ +# $Id: lonmetadata.pm,v 1.2 2004/01/12 21:32:20 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -165,8 +165,8 @@ my @Fulltext_indicies = qw/ Input: None -Returns: An array of hash references describing the columns and rows -of the metadata table. +Returns: An array of hash references describing the columns and indicies +of the metadata table(s). =cut @@ -250,7 +250,63 @@ Returns: 1 on success, 0 on failure to s ###################################################################### ###################################################################### +{ + ## + ## WARNING: The following cleverness may cause trouble in cases where + ## the dbi connection is dropped and recreated - a stale statement + ## handler may linger around and cause trouble. + ## + ## In most scripts, this will work fine. If the dbi is going to be + ## dropped and (possibly) later recreated, call &clear_sth. Yes it + ## is annoying but $sth appearantly does not have a link back to the + ## $dbh, so we can't check our validity. + ## + my $sth = undef; + +sub create_statement_handler { + my $dbh = shift(); + my $request = 'INSERT INTO metadata VALUES('; + foreach (@Metadata_Table_Description) { + $request .= '?,'; + } + chop $request; + $request.= ')'; + $sth = $dbh->prepare($request); + return; +} + +sub clear_sth { $sth=undef; } + sub store_metadata { + my $dbh = shift(); + my $errors = ''; + if (! defined($sth)) { + &create_statement_handler($dbh); + } + my $successcount = 0; + while (my $mdata = shift()) { + next if (ref($mdata) ne "HASH"); + my @MData; + foreach my $field (@Metadata_Table_Description) { + if (exists($mdata->{$field->{'name'}})) { + push(@MData,$mdata->{$field->{'name'}}); + } else { + push(@MData,undef); + } + } + $sth->execute(@MData); + if (! $sth->err) { + $successcount++; + } else { + $errors = join(',',$errors,$sth->errstr); + } + } + if (wantarray()) { + return ($successcount,$errors); + } else { + return $successcount; + } +} } @@ -264,13 +320,38 @@ sub store_metadata { Inputs: database handle ($dbh) and a hash or hash reference containing metadata which will be used for a search. -Returns: +Returns: scalar with error string on failure, array reference on success. +The array reference is the same one returned by $sth->fetchall_arrayref(). =cut ###################################################################### ###################################################################### -sub lookup_metadata {} +sub lookup_metadata { + my ($dbh,$condition,$fetchparameter) = @_; + my $error; + my $returnvalue=[]; + my $request = 'SELECT * FROM metadata'; + if (defined($condition)) { + $request .= ' WHERE '.$condition; + } + my $sth = $dbh->prepare($request); + if ($sth->err) { + $error = $sth->errstr; + } + if (! $error) { + $sth->execute(); + if ($sth->err) { + $error = $sth->errstr; + } else { + $returnvalue = $sth->fetchall_arrayref($fetchparameter); + if ($sth->err) { + $error = $sth->errstr; + } + } + } + return ($error,$returnvalue); +} ###################################################################### ######################################################################