[LON-CAPA-cvs] cvs: loncom / lonsql
raeburn
lon-capa-cvs-allow@mail.lon-capa.org
Wed, 25 Jul 2007 22:40:00 -0000
raeburn Wed Jul 25 18:40:00 2007 EDT
Modified files:
/loncom lonsql
Log:
- Add support for query set to 'usersearch'
- Searches an allusers MySQL table containing: username, domain, lastname, firstname, middlename, generation, id and permanentemail for all users in the domain.
- Can search by username, lastname or lastname,firstname
- Seach can require exact match, or can look for cases where search term is part of a longer string.
- Add support for query set to 'allusers'
- Updates MySQL table with new information for a particular user.
- Added subroutine: allusers_table_update() to access subroutines in LONCAPA::lonmetadata used to update the allusers table.
Index: loncom/lonsql
diff -u loncom/lonsql:1.81 loncom/lonsql:1.82
--- loncom/lonsql:1.81 Wed Apr 11 20:00:55 2007
+++ loncom/lonsql Wed Jul 25 18:40:00 2007
@@ -3,7 +3,7 @@
# The LearningOnline Network
# lonsql - LON TCP-MySQL-Server Daemon for handling database requests.
#
-# $Id: lonsql,v 1.81 2007/04/12 00:00:55 albertel Exp $
+# $Id: lonsql,v 1.82 2007/07/25 22:40:00 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -441,6 +441,57 @@
if ($locresult) {
$result .= &escape(join(':',map{$_.'='.$replies{$_}} keys %replies));
}
+ } elsif ($query eq 'usersearch') {
+ my $srchdomain = &unescape($arg1);
+ my @items = split(/%%/,$arg2);
+ my ($srchby,$srchtype) = map {&unescape($_)} @items;
+ my $srchterm = &unescape($arg3);
+ my $quoted_dom = $dbh->quote( $srchdomain );
+ my ($query,$quoted_srchterm,@fields);
+ my ($table_columns,$table_indices) =
+ &LONCAPA::lonmetadata::describe_metadata_storage('allusers');
+ foreach my $coldata (@{$table_columns}) {
+ push(@fields,$coldata->{'name'});
+ }
+ my $fieldlist = join(',',@fields);
+ $query = "SELECT $fieldlist FROM allusers WHERE (domain = $quoted_dom AND ";
+ if ($srchby eq 'lastfirst') {
+ my ($fraglast,$fragfirst) = split(/,/,$srchterm);
+ if ($srchtype eq 'exact') {
+ $query .= 'lastname = '.$dbh->quote($fraglast).
+ ' AND firstname = '.$dbh->quote($fragfirst);
+ } else {
+ $query .= 'lastname LIKE '.$dbh->quote('%'.$fraglast.'%').' AND firstname LIKE '.$dbh->quote('%'.$fragfirst.'%');
+ }
+ } else {
+ my %srchfield = (
+ uname => 'username',
+ lastname => 'lastname',
+ );
+ if ($srchtype eq 'exact') {
+ $query .= $srchfield{$srchby}.' = '.$dbh->quote($srchterm);
+ } else {
+ $query .= $srchfield{$srchby}.' LIKE '.$dbh->quote('%'.$srchterm.'%');
+ }
+ }
+ $query .= ") ORDER BY username ";
+ my $sth = $dbh->prepare($query);
+ if ($sth->execute()) {
+ my @results;
+ while (my @row = $sth->fetchrow_array) {
+ my @items;
+ for (my $i=0; $i<@row; $i++) {
+ push(@items,&escape($fields[$i]).'='.&escape($row[$i]));
+ }
+ push(@results,join(":", @items));
+ }
+ $sth->finish;
+ $result = &escape(join("&",@results));
+ } else {
+ &logthis('<font color="blue">'.
+ 'WARNING: Could not retrieve from database:'.
+ $sth->errstr().'</font>');
+ }
} elsif ($query eq 'prepare activity log') {
my ($cid,$domain) = map {&unescape($_);} ($arg1,$arg2);
&logthis('preparing activity log tables for '.$cid);
@@ -459,6 +510,17 @@
($query eq 'portfolio_access')) {
$result = &portfolio_table_update($query,$arg1,$arg2,
$arg3);
+ } elsif ($query eq 'allusers') {
+ my ($uname,$udom) = map {&unescape($_);} ($arg1,$arg2);
+ my %userdata;
+ my (@data) = split(/\%\%/,$arg3);
+ foreach my $item (@data) {
+ my ($key,$value) = split(/=/,$item);
+ $userdata{$key} = &unescape($value);
+ }
+ $userdata{'username'} = $uname;
+ $userdata{'domain'} = $udom;
+ $result = &allusers_table_update($query,$uname,$udom,\%userdata);
} else {
# Do an sql query
$result = &do_sql_query($query,$arg1,$arg2,$searchdomain);
@@ -736,6 +798,34 @@
return %access;
}
+sub allusers_table_update {
+ my ($query,$uname,$udom,$userdata) = @_;
+ my %tablenames = (
+ 'allusers' => 'allusers',
+ );
+ my $result = 'ok';
+ my $tablechk = &check_table($query);
+ if ($tablechk == 0) {
+ my $request =
+ &LONCAPA::lonmetadata::create_metadata_storage($query,$query);
+ $dbh->do($request);
+ if ($dbh->err) {
+ &logthis("create $query".
+ " ERROR: ".$dbh->errstr);
+ $result = 'error';
+ }
+ }
+ if ($result eq 'ok') {
+ my %loghash =
+ &LONCAPA::lonmetadata::process_allusers_data($dbh,undef,
+ \%tablenames,$uname,$udom,$userdata,'update');
+ foreach my $key (keys(%loghash)) {
+ &logthis($loghash{$key});
+ }
+ }
+ return $result;
+}
+
###########################################
sub check_table {
my ($table_id) = @_;