#!/usr/local/bin/webwork-perl #################################################################### # Copyright @ 1995-1999 University of Rochester # All Rights Reserved #################################################################### use lib '.'; use webworkInit; # WeBWorKInitLine use CGI qw(:standard); use Global; use Auth; use strict; use GDBM_File; # begin Timing code use Benchmark; my $beginTime = new Benchmark; # end Timing code &CGI::ReadParse; my %inputs =%main::in; # get information from CGI inputs (see also below for additional information) my $Course = $inputs{'course'}; my $User = $inputs{'user'}; my $Session_key = $inputs{'key'}; # verify that information has been received unless($Course && $User && $Session_key) { &wwerror("$0","The script did not receive the proper input data.","",""); } # establish environment for this script &Global::getCourseEnvironment($inputs{'course'}); my $cgiURL = getWebworkCgiURL; my $scriptDirectory = getWebworkScriptDirectory; require "${scriptDirectory}$Global::FILE_pl"; require "${scriptDirectory}$Global::HTMLglue_pl"; # log access &Global::log_info('', query_string); my $permissionsFile = &Global::getCoursePermissionsFile($inputs{'course'}); my $permissions = &get_permissions($inputs{'user'}, $permissionsFile); my $keyFile = &Global::getCourseKeyFile($inputs{'course'}); #verify session key &verify_key($inputs{'user'}, $inputs{'key'}, $keyFile, $inputs{'course'}); # verify permissions are correct if ($permissions != $Global::instructor_permissions ) { print "permissions = $permissions instructor_permissions = $Global::instructor_permissions\n"; print &html_NO_PERMISSION; exit(0); } # Directory paths my $databaseDirectory = getCourseDatabaseDirectory(); my $databaseFile = $Global::database; ## exit unless the course uses gdbm for the webwork database unless ($Global::DBtie_file eq 'gdbm_tie.pl') { wwerror("Wrong database type", "Compress works only for gdbm databases. No changes have been made to your non gdbm database"); } my $mode = &GDBM_WRCREAT(); my $permission = $Global::standard_tie_permission; my ($db, %hash, $tries); my $TieMaxTries =30; # try to tie() 30 times, then fail my $TieSleepInterval =2; # sleep 2 sec after failed tie() &tie_hash(); $db->reorganize(); untie($db); chmod($permission,"${databaseDirectory}${databaseFile}") or warn("$0 error", " Can't do chmod($permission, ${databaseDirectory}${databaseFile})"); chown(-1,$Global::numericalGroupID,"${databaseDirectory}${databaseFile}") or warn("$0 error", " Can't do chown(-1,$Global::numericalGroupID,${databaseDirectory}${databaseFile})"); &compressSuccess(); exit; sub tie_hash { for ($tries = 0; $tries < $TieMaxTries; $tries++) { return 1 if ($db = tie(%hash, "GDBM_File", "${databaseDirectory}${databaseFile}", $mode, $permission)); sleep($TieSleepInterval); } &wwerror("Key database error", "Can't tie ${databaseDirectory}${databaseFile}: $!"); } sub compressSuccess { print"content-type:\n\n