| … | |
… | |
| 16 | use warnings; |
16 | use warnings; |
| 17 | use Apache::DB; |
17 | use Apache::DB; |
| 18 | use Date::Format; |
18 | use Date::Format; |
| 19 | use Date::Parse; |
19 | use Date::Parse; |
| 20 | use Errno; |
20 | use Errno; |
|
|
21 | use File::Path qw(rmtree); |
| 21 | |
22 | |
| 22 | use constant MKDIR_ATTEMPTS => 10; |
23 | use constant MKDIR_ATTEMPTS => 10; |
| 23 | |
24 | |
| 24 | our @EXPORT = (); |
25 | our @EXPORT = (); |
| 25 | our @EXPORT_OK = qw( |
26 | our @EXPORT_OK = qw( |
| 26 | runtime_use |
27 | runtime_use |
| 27 | backtrace |
28 | backtrace |
| 28 | readFile |
29 | readFile |
|
|
30 | readDirectory |
| 29 | formatDateTime |
31 | formatDateTime |
| 30 | parseDateTime |
32 | parseDateTime |
| 31 | writeLog |
33 | writeLog |
| 32 | writeTimingLogEntry |
34 | writeTimingLogEntry |
| 33 | list2hash |
35 | list2hash |
| 34 | max |
36 | max |
| 35 | readDirectory |
|
|
| 36 | dbDecode |
37 | dbDecode |
| 37 | dbEncode |
38 | dbEncode |
| 38 | decodeAnswers |
39 | decodeAnswers |
| 39 | encodeAnswers |
40 | encodeAnswers |
| 40 | ref2string |
41 | ref2string |
| 41 | sortByName |
42 | sortByName |
| 42 | makeTempDirectory |
43 | makeTempDirectory |
|
|
44 | removeTempDirectory |
| 43 | pretty_print_rh |
45 | pretty_print_rh |
| 44 | ); |
46 | ); |
| 45 | |
47 | |
| 46 | sub runtime_use($) { |
48 | sub runtime_use($) { |
| 47 | return unless @_; |
49 | return unless @_; |
| … | |
… | |
| 65 | } |
67 | } |
| 66 | } |
68 | } |
| 67 | |
69 | |
| 68 | sub readFile($) { |
70 | sub readFile($) { |
| 69 | my $fileName = shift; |
71 | my $fileName = shift; |
| 70 | local *INPUTFILE; |
72 | local $/ = undef; # slurp the whole thing into one string |
| 71 | open INPUTFILE, "<", $fileName |
73 | open my $dh, "<", $fileName |
| 72 | or die "Failed to read $fileName: $!"; |
74 | or die "failed to read file $fileName: $!"; |
| 73 | local $/ = undef; |
75 | my $result = <$dh>; |
| 74 | my $result = <INPUTFILE>; |
76 | close $dh; |
| 75 | close INPUTFILE; |
|
|
| 76 | return $result; |
77 | return $result; |
| 77 | } |
78 | } |
| 78 | |
79 | |
| 79 | sub readDirectory($) { |
80 | sub readDirectory($) { |
| 80 | my ($dirname) = @_; |
81 | my $dirName = shift; |
| 81 | |
82 | opendir my $dh, $dirName |
| 82 | opendir my $dirhandle, $dirname or die "couldn't open directory $dirname: $!"; |
83 | or die "failed to read directory $dirName: $!"; |
| 83 | my @contents = readdir $dirhandle; |
84 | my @result = readdir $dh; |
| 84 | closedir $dirhandle; |
85 | close $dh; |
| 85 | return @contents; |
86 | return @result; |
| 86 | } |
87 | } |
| 87 | |
88 | |
| 88 | sub formatDateTime($) { |
89 | sub formatDateTime($) { |
| 89 | my $dateTime = shift; |
90 | my $dateTime = shift; |
| 90 | # "standard" WeBWorK date/time format (for set definition files): |
91 | # "standard" WeBWorK date/time format (for set definition files): |
| … | |
… | |
| 284 | die "Failed to create directory $fullPath: $!" |
285 | die "Failed to create directory $fullPath: $!" |
| 285 | unless $success; |
286 | unless $success; |
| 286 | return $fullPath; |
287 | return $fullPath; |
| 287 | } |
288 | } |
| 288 | |
289 | |
|
|
290 | sub removeTempDirectory($) { |
|
|
291 | my ($dir) = @_; |
|
|
292 | rmtree($dir, 0, 0); |
|
|
293 | } |
|
|
294 | |
| 289 | sub pretty_print_rh { |
295 | sub pretty_print_rh { |
| 290 | my $rh = shift; |
296 | my $rh = shift; |
| 291 | foreach my $key (sort keys %{$rh}) { |
297 | foreach my $key (sort keys %{$rh}) { |
| 292 | warn " $key => ",$rh->{$key},"\n"; |
298 | warn " $key => ",$rh->{$key},"\n"; |
| 293 | } |
299 | } |