.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.43) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "Biblio::COUNTER 3pm" .TH Biblio::COUNTER 3pm "2023-02-04" "perl v5.36.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" Biblio::COUNTER \- COUNTER Codes of Practice report processing .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 1 \& # \-\-\- Process a report \& \& # (1) Using Biblio::COUNTER \& $report = Biblio::COUNTER\->report(\e*STDIN)\->process; \& $report = Biblio::COUNTER\->report($file)\->process; \& \& # (2) Using Biblio::COUNTER::Processor or a subclass \& $processor = Biblio::COUNTER::Processor::Default\->new;\e \& $report = $processor\->run(\e*STDIN); \& $report = $processor\->run($file); \& $report = $processor\->run(Biblio::COUNTER\->new(\e*STDIN)); \& \& # \-\-\- Access information in a processed report \& \& warn "Invalid report" unless $report\->is_valid; \& \& # Access data in the report \& $name = $report\->name; \& # e.g., "Database Report 2 (R2)" \& $descrip = $report\->description; \& # e.g., "Turnaways by Month and Database" \& $date_run = $report\->date_run; \& # e.g., "2008\-04\-11" \& $criteria = $report\->criteria; \& $publisher = $report\->publisher; \& $platform = $report\->platform; \& $periods = $report\->periods; \& # e.g., [ "2008\-01", "2008\-02", "2008\-03" ] \& \& foreach $rec ($report\->records) { \& $title = $rec\->{title}; \& $publisher = $rec\->{publisher}; \& $platform = $rec\->{platform}; \& $count = $rec\->{count}; \& foreach $period (@periods) { \& $period_count = $count\->{$period}; \& while (($metric, $n) = each %$period_count) { \& # e.g., ("turnaways", 3) \& } \& } \& } .Ve .SH "NOTE" .IX Header "NOTE" Because the \s-1COUNTER\s0 Codes of Practice are so poorly written and documented, with incomplete specifications and inconsistent terminology, it has been necessary to make certain assumptions and normalizations in the code and documentation of this module. .PP First, all reports must be in plain text, tab\- or comma-delimited format; Excel spreadsheets are not allowed. (To convert an Excel spreadsheet to tab-delimited text, consider using Spreadsheet::ParseExcel::Simple. .PP (\s-1XML\s0 formats may be handled in a future version of this module.) .PP Some terminology notes are in order: .IP "\fBname\fR" 4 .IX Item "name" The \fBname\fR of a report fully denotes the report's type and the version of the \s-1COUNTER\s0 Codes of Practice that defines it. For example, \&\f(CW\*(C`Journal Report 1 (R2)\*(C'\fR. \s-1COUNTER\s0 sometimes refers to this as the report \fItitle\fR. .IP "\fBdescription\fR" 4 .IX Item "description" This is the phrase, also defined by the \s-1COUNTER\s0 Codes of Practice, that describes the contents of a report. For example, \fBJournal Report 1\fR is described as \f(CW\*(C`Number of Successful Full\-Text Article Requests by Month and Journal\*(C'\fR. .IP "\fBcode\fR" 4 .IX Item "code" This is the term I use for the short name that identifies the type, \&\fBbut not the version\fR, of a \s-1COUNTER\s0 report. For example, \f(CW\*(C`JR1\*(C'\fR is the code for \fBJournal Report 1\fR reports. .IP "\fBmetric\fR" 4 .IX Item "metric" A metric is a particular measure of usage (or non-usage), including the number of searches or sessions in a database or the number of full-text articles in a journal downloaded successfully. .SH "METHODS" .IX Header "METHODS" .IP "\fBreport\fR(\fI\f(CI$how\fI\fR, [\fI\f(CI%args\fI\fR])" 4 .IX Item "report($how, [%args])" Create a new report instance. .Sp Set \fI\f(CI$how\fI\fR to a glob ref (e.g., \f(CW\*(C`\e*STDIN\*(C'\fR) to specify a filehandle from which an existing report will be read. .Sp Specify a report name in \fI\f(CI$how\fI\fR (e.g., \f(CW\*(C`Database Report 2 (R2)\*(C'\fR) to instantiate a new, empty report. (Report generation is not yet implemented.) .Sp \&\fI\f(CI%args\fI\fR may contain any of the following: .RS 4 .IP "\fBtreat_blank_counts_as_zero\fR" 4 .IX Item "treat_blank_counts_as_zero" If set to a true value, a blank cell where a count was expected is treated as if it contained a zero; otherwise, blank counts are silently ignored (the default). .IP "\fBchange_not_available_to_blank\fR" 4 .IX Item "change_not_available_to_blank" If set to a true value (the default), the value \f(CW\*(C`n/a\*(C'\fR) in a count field will be changed to the empty string. It will \fBnever\fR be treated as if it were zero, regardless of the \fBtreat_blank_counts_as_zero\fR setting. .IP "\fBcallback\fR" 4 .IX Item "callback" Get or set a reference to a hash of (\fI\f(CI$event\fI\fR, \fI\f(CI$code\fI\fR) pairs specifying what to do for each of the events described under \&\s-1CALLBACKS\s0. .Sp Each \fI\f(CI$code\fI\fR must be a coderef, not the name of a function or method. .Sp If an event is not specified in this hash, then the default action for the event will be taken. .RE .RS 4 .RE .IP "\fBname\fR" 4 .IX Item "name" Get or set the report's name: this is the official name defined by the \s-1COUNTER\s0 codes of practice. See \*(L"\s-1REPORTS SUPPORTED\*(R"\s0 for a complete list of the reports supported by this version of Biblio::COUNTER. .IP "\fBcode\fR" 4 .IX Item "code" Get or set the report's code: this is the short string (e.g., \f(CW\*(C`JR1\*(C'\fR) that identifies the type, \fBbut not the version\fR, of a \s-1COUNTER\s0 report. .IP "\fBdescription\fR" 4 .IX Item "description" Get or set the report's description: this is the official description defined by the \s-1COUNTER\s0 codes of practice. For example, the \f(CW\*(C`Journal Report 1 (R2)\*(C'\fR report has the description \f(CW\*(C`Number of Successful Full\-Text Article Requests by Month and Journal\*(C'\fR. .IP "\fBdate_run\fR" 4 .IX Item "date_run" Get or set the date on which the report was run. The date, if valid, is in the \s-1ISO8601\s0 standard form \f(CW\*(C`YYYY\-MM\-DD\*(C'\fR. .IP "\fBcriteria\fR" 4 .IX Item "criteria" Get or set the report criteria. This is a free text field. .IP "\fBperiods\fR" 4 .IX Item "periods" Get or set the periods for which the report contains counts. To simplify things, periods are returned (and must be set) in the \s-1ISO 8601\s0 standard form \f(CW\*(C`YYYY\-MM\*(C'\fR. .IP "\fBpublisher\fR" 4 .IX Item "publisher" Get or set the publisher common to all of the resources in the report. .IP "\fBplatform\fR" 4 .IX Item "platform" Get or set the platform common to all of the resources in the report. .SH "CALLBACKS" .IX Header "CALLBACKS" While processing a report, a number of different \fBevents\fR occur. For example, a \fBfixed\fR event occurs when a field whose value is invalid is corrected. For event different kind of event, a \fBcallback\fR may be specified that is triggered each time the event occurs; see the \fBreport\fR method for how to specify a callback. .PP Callbacks must be coderefs, not function or method names. .PP For example, the following callbacks may be used to provide an indication of the progress in processing it: .PP .Vb 10 \& $record_number = 0; \& %callbacks = ( \& \*(Aqbegin_report\*(Aq => sub { \& print STDERR "Beginning report: "; \& }, \& \*(Aqend_header\*(Aq => sub { \& my ($report, $header) = @_; \& print STDERR $report\->name, "\en"; \& } \& \*(Aqend_record\*(Aq => sub { \& my ($report, $record) = @_; \& ++$record_number; \& print STDERR "$record_number " \& if $record_number % 20 == 0; \& print STDERR "\en" \& if $record_number % 200 == 0; \& }, \& \*(Aqend_report\*(Aq => sub { \& my ($report) = @_; \& if ($report\->is_valid) { \& print STDERR "OK\en"; \& } \& else { \& print STDERR "INVALID\en"; \& } \& }, \& ); .Ve .PP By default, the only callback defined is for \fBoutput\fR; it prints each line of input (corrected, if there were correctable problems) to standard output. (Spurious blank lines are not printed.) .PP Events fall into four broad categories: \fBstructure\fR, \fBvalidation\fR, \&\fBtracing\fR, and \fBdata\fR. .SS "Structure" .IX Subsection "Structure" Logically, a \s-1COUNTER\s0 report has the following structure: .PP .Vb 6 \& report \& header \& body \& record \& record \& ... .Ve .IP "\fBbegin_file\fR(\fI\f(CI$report\fI\fR, \fI\f(CI$file\fI\fR)" 4 .IX Item "begin_file($report, $file)" Parsing of the given file is beginning. This is always the first event triggered. At the time this callback is invoked, the report has not yet been identified. .IP "\fBend_file\fR(\fI\f(CI$report\fI\fR, \fI\f(CI$file\fI\fR)" 4 .IX Item "end_file($report, $file)" Parsing of the given file has ended. This is always the last event triggered. .IP "\fBbegin_report\fR(\fI\f(CI$report\fI\fR)" 4 .IX Item "begin_report($report)" Processing of the report is beginning. At the time this callback is invoked, the report has not yet been identified. .IP "\fBend_report\fR(\fI\f(CI$report\fI\fR)" 4 .IX Item "end_report($report)" Processing of the report has ended. This is always the last event triggered. .IP "\fBbegin_header\fR(\fI\f(CI$report\fI\fR, \fI\f(CI$header\fI\fR)" 4 .IX Item "begin_header($report, $header)" Processing of the report's header is beginning. The header is everything before the first data row. .Sp \&\fI\f(CI$header\fI\fR is a reference to an empty hash; the callback code may, if it wishes, put something into this hash. .IP "\fBend_header\fR(\fI\f(CI$report\fI\fR, \fI\f(CI$header\fI\fR)" 4 .IX Item "end_header($report, $header)" Processing of the report's header is complete. .Sp \&\fI\f(CI$header\fI\fR is a reference to the same hash referenced in the \fBbegin_header\fR callback, but which now contains one or more of the elements listed below. (These elements are described under \fB\s-1METHODS\s0\fR above): .RS 4 .IP "\fBdate_run\fR" 4 .IX Item "date_run" The date on which the report was run, in the \s-1ISO8601\s0 standard form \&\f(CW\*(C`YYYY\-MM\-DD\*(C'\fR. .IP "\fBcriteria\fR" 4 .IX Item "criteria" The report criteria. .IP "\fBdescription\fR" 4 .IX Item "description" The report's description (e.g., \f(CW\*(C`Turnaways by Month and Database\*(C'\fR). .IP "\fBperiods\fR" 4 .IX Item "periods" The periods for which the report contains counts, in the \s-1ISO 8601\s0 standard form \f(CW\*(C`YYYY\-MM\*(C'\fR. .IP "\fBpublisher\fR" 4 .IX Item "publisher" The publisher common to all of the resources in the report. .IP "\fBplatform\fR" 4 .IX Item "platform" The platform common to all of the resources in the report. .RE .RS 4 .RE .IP "\fBbegin_body\fR(\fI\f(CI$report\fI\fR)" 4 .IX Item "begin_body($report)" Processing of the report's body is beginning. The body is the part of the report that contains data rows. .IP "\fBend_body\fR(\fI\f(CI$report\fI\fR)" 4 .IX Item "end_body($report)" Processing of the report's body is complete. .IP "\fBbegin_record\fR(\fI\f(CI$report\fI\fR, \fI\f(CI$record\fI\fR)" 4 .IX Item "begin_record($report, $record)" Processing of a new record is beginning. (In some \s-1COUNTER\s0 reports, a record occupies more than one row.) .Sp \&\fI\f(CI$record\fI\fR is a reference to a hash, which is empty at the time the event is triggered. .IP "\fBend_record\fR(\fI\f(CI$report\fI\fR, \fI\f(CI$record\fI\fR)" 4 .IX Item "end_record($report, $record)" \&\fI\f(CI$record\fI\fR is a reference to a hash that contains the data found in the record (title, publisher, counts, etc.). Fields that are invalid and uncorrectable will \fBnot\fR be represented in the hash \*(-- e.g., if a title is blank then there will be no \fBtitle\fR element in the hash. .SS "Validation" .IX Subsection "Validation" Each of these events is triggered when a cell (or, in the case of \&\fBskip_blank_row\fR, a row) is validated. .PP The cell's row and column (e.g., \f(CW\*(C`D7\*(C'\fR) may be retrieved by calling \&\f(CW\*(C`$report\->current_position\*(C'\fR. .PP Note that a single cell may trigger more than one validation event \*(-- e.g., a cell may be trimmed and then deleted \*(-- and there is no guarantee that these events will occur in any particular order. .IP "\fBok\fR(\fI\f(CI$report\fI\fR, \fI\f(CI$field_name\fI\fR, \fI\f(CI$value\fI\fR)" 4 .IX Item "ok($report, $field_name, $value)" A cell's value is valid. .IP "\fBtrimmed\fR(\fI\f(CI$report\fI\fR, \fI\f(CI$field_name\fI\fR, \fI\f(CI$value\fI\fR)" 4 .IX Item "trimmed($report, $field_name, $value)" Whitespace has been trimmed from the beginning and/or end of a cell. .IP "\fBfixed\fR(\fI\f(CI$report\fI\fR, \fI\f(CI$field_name\fI\fR, \fI\f(CI$old_value\fI\fR, \fI\f(CI$new_value\fI\fR)" 4 .IX Item "fixed($report, $field_name, $old_value, $new_value)" A cell's value was invalid but has been corrected. .IP "\fBcant_fix\fR(\fI\f(CI$report\fI\fR, \fI\f(CI$field_name\fI\fR, \fI\f(CI$value\fI\fR, \fI\f(CI$expected\fI\fR)" 4 .IX Item "cant_fix($report, $field_name, $value, $expected)" A cell's value is invalid and cannot be corrected. The expected value may be an exact string (e.g., \f(CW\*(C`EBSCOhost\*(C'\fR) or merely a general hint (e.g., \&\f(CW\*(C`\*(C'\fR). .IP "\fBdeleted\fR(\fI\f(CI$report\fI\fR, \fI\f(CI$value\fI\fR)" 4 .IX Item "deleted($report, $value)" A spurious cell has been deleted. (A this time, this only occurs for blank cells at the end of a row.) .IP "\fBskip_blank_row\fR(\fI\f(CI$report\fI\fR)" 4 .IX Item "skip_blank_row($report)" A blank row that doesn't belong here has been skipped. .SS "Tracing" .IX Subsection "Tracing" .IP "\fBinput\fR(\fI\f(CI$line\fI\fR)" 4 .IX Item "input($line)" A line of input has been read. .IP "\fBline\fR(\fI\f(CI$line_number\fI\fR)" 4 .IX Item "line($line_number)" The report processor has moved to the next line of input. .IP "\fBoutput\fR(\fI\f(CI$line\fI\fR)" 4 .IX Item "output($line)" A new line of output is ready. The default is to print the line to standard output. Both valid and invalid lines, including invalid lines that could not be corrected as well as those that could be corrected, trigger an output event. Blank lines that have been skipped do not. .SS "Data" .IX Subsection "Data" .IP "\fBcount\fR(\fI\f(CI$report\fI\fR, \fI\f(CI$scope\fI\fR, \fI\f(CI$metric\fI\fR, \fI\f(CI$period\fI\fR, \fI\f(CI$value\fI\fR)" 4 .IX Item "count($report, $scope, $metric, $period, $value)" A valid count has been identified within the report. .Sp \&\fI\f(CI$scope\fI\fR is either \f(CW\*(C`report\*(C'\fR (for summary counts that appear at the top of the report) or \f(CW\*(C`record\*(C'\fR (for counts that occur within the body of the report). .Sp \&\fI\f(CI$metric\fI\fR is the type of event being counted, and is always one of the following: .RS 4 .ie n .IP """requests""" 4 .el .IP "\f(CWrequests\fR" 4 .IX Item "requests" .PD 0 .ie n .IP """searches""" 4 .el .IP "\f(CWsearches\fR" 4 .IX Item "searches" .ie n .IP """sessions""" 4 .el .IP "\f(CWsessions\fR" 4 .IX Item "sessions" .ie n .IP """turnaways""" 4 .el .IP "\f(CWturnaways\fR" 4 .IX Item "turnaways" .RE .RS 4 .PD .Sp \&\fI\f(CI$period\fI\fR is a year and month, in the \s-1ISO8601\s0 form \f(CW\*(C`YYYY\-MM\*(C'\fR. .Sp \&\fI\f(CI$value\fI\fR is the number of requests (or searches, or whatever). .Sp \&\fBcount\fR events are \fBnot\fR triggered for blank counts unless the \&\fBtreat_blank_counts_as_zero\fR option was set to a true value when the report was instantiated. .RE .IP "\fBcount_ytd\fR(\fI\f(CI$report\fI\fR, \fI\f(CI$scope\fI\fR, \fI\f(CI$metric\fI\fR, \fI\f(CI$value\fI\fR) =item \fBcount_ytd_html\fR(\fI\f(CI$report\fI\fR, \fI\f(CI$scope\fI\fR, \fI\f(CI$metric\fI\fR, \fI\f(CI$value\fI\fR) =item \fBcount_ytd_pdf\fR(\fI\f(CI$report\fI\fR, \fI\f(CI$scope\fI\fR, \fI\f(CI$metric\fI\fR, \fI\f(CI$value\fI\fR)" 4 .IX Item "count_ytd($report, $scope, $metric, $value) =item count_ytd_html($report, $scope, $metric, $value) =item count_ytd_pdf($report, $scope, $metric, $value)" A valid \s-1YTD\s0 count has been identified. .Sp \&\fI\f(CI$scope\fI\fR is either \f(CW\*(C`report\*(C'\fR (for summary counts that appear at the top of the report) or \f(CW\*(C`record\*(C'\fR (for counts that occur within the body of the report). .SH "REPORTS SUPPORTED" .IX Header "REPORTS SUPPORTED" Biblio::COUNTER implements processing of text-format (comma\- or tab-delimited) \&\s-1COUNTER\s0 reports only. \s-1XML\s0 formats are not supported at this time. .PP The following is a list of \s-1COUNTER\s0 reports, with full name and description, that are supported by this version of Biblio::COUNTER: .ie n .IP """Journal Report 1 (R2)""" 4 .el .IP "\f(CWJournal Report 1 (R2)\fR" 4 .IX Item "Journal Report 1 (R2)" Number of Successful Full-Text Article Requests by Month and Journal .ie n .IP """Journal Report 1a (R2)""" 4 .el .IP "\f(CWJournal Report 1a (R2)\fR" 4 .IX Item "Journal Report 1a (R2)" Number of Successful Full-Text Article Requests from an Archive by Month and Journal .ie n .IP """Journal Report 2 (R2)""" 4 .el .IP "\f(CWJournal Report 2 (R2)\fR" 4 .IX Item "Journal Report 2 (R2)" Turnaways by Month and Journal .ie n .IP """Database Report 1 (R2)""" 4 .el .IP "\f(CWDatabase Report 1 (R2)\fR" 4 .IX Item "Database Report 1 (R2)" Total Searches and Sessions by Month and Database .ie n .IP """Database Report 2 (R2)""" 4 .el .IP "\f(CWDatabase Report 2 (R2)\fR" 4 .IX Item "Database Report 2 (R2)" Turnaways by Month and Database .ie n .IP """Database Report 3 (R2)""" 4 .el .IP "\f(CWDatabase Report 3 (R2)\fR" 4 .IX Item "Database Report 3 (R2)" Total Searches and Sessions by Month and Service .PP Other reports, including Release 3 reports, will be supported in the future. .SH "SEE ALSO" .IX Header "SEE ALSO" .SH "AUTHOR" .IX Header "AUTHOR" Paul Hoffman (nkuitse \s-1AT\s0 cpan \s-1DOT\s0 org). .SH "COPYRIGHT" .IX Header "COPYRIGHT" Copyright 2008 Paul M. Hoffman. .PP This is free software, and is made available under the same terms as Perl itself.