package SRU::Response::Diagnostic; use strict; use warnings; use SRU::Utils::XML qw( element elementNoEscape ); use base qw( Class::Accessor ); ## these are standard diagnostics for use in ## newFromCode() our %DIAG = ( ## general diagnostics 1 => 'General System Error', 2 => 'System temporarily unavailable', 3 => 'Authentication error', 4 => 'Unsupported operation', 5 => 'Unsupported version', 6 => 'Unsupported parameter value', 7 => 'Mandatory parameter not supplied', 8 => 'Unsupported parameter', 10 => 'Query syntax error', ## diagnostics relating to CQL 13 => 'Invalid or unsupported use of parentheses', 15 => 'Unsupported context set', 16 => 'Unsupported index', 18 => 'Unsupported combination of indexes', 19 => 'Unsupported relation', 20 => 'Unsupported relation modifier', 21 => 'Unsupported combination of relation modifiers', 22 => 'Unsupported combination of relation and index', 23 => 'Too many characters in term', 24 => 'Unsupported combination of relation and term', 26 => 'Non special character escaped in term', 27 => 'Empty term unsupported', 28 => 'Masking character not supported', 29 => 'Masked words too short', 30 => 'Too many masked characters in term', 31 => 'Anchoring character not supported', 32 => 'Anchoring character in unsupported position', 33 => 'Combination of proximity/adjacency and masking characters not supported', 34 => 'Combination of proximity/adjacency and anchoring characters not supported', 35 => 'Term contains only stopwords', 36 => 'Term ininvalid format for index or relation', 37 => 'Unsupported boolean operator', 38 => 'Too many boolean operators in query', 39 => 'Proximity not supported', 40 => 'Unsupported proximity relation', 41 => 'Unsupported proximity distance', 42 => 'Unsupported proximity unit', 43 => 'Unsupported proximity ordering', 44 => 'Unsupported combination of proximity modifiers', 46 => 'Unsupported boolean modifier', ## Diagnostics relating to result sets 50 => 'Result sets not supported', 51 => 'Result set does not exist', 52 => 'Result set temporarily unavailable', 53 => 'Result sets only supported for retrieval', 55 => 'Combination of result sets with search terms not supported', 58 => 'Result set created with unpredictable partial results available', 59 => 'Result set created with valid partial results available', 60 => 'Result set not created: too man matching records', ## Diagnostics relating to records 61 => 'First record position out of range', 64 => 'Record temporarily unavailable', 65 => 'Record does not exist', 66 => 'Unknown schema for retrieval', 67 => 'Record not available in this schema', 68 => 'Not authorized to send record', 69 => 'Not authorized to send record in this schema', 70 => 'Record too large to send', 71 => 'Unsupported record packing', 72 => 'XPath retrieval unsupported', 73 => 'XPath expression contains unsupported feature', 74 => 'Unable to evaluate XPath expression', ## Diagnostics related to sorting 80 => 'Sort not supported', 82 => 'Unsupported sort sequence', 83 => 'Too many records to sort', 86 => 'Cannot sort: incompatible record formats', 87 => 'Unsupported schema for sort', 88 => 'Unsupported path for sort', 89 => 'Path unsupported for schema', 90 => 'Unsupported direction', 91 => 'Unsupported case', 92 => 'Unsupported missing value action', ## Diagnostics relating to stylesheets 110 => 'Stylesheet not supported', 111 => 'Unsupported stylesheet', ## Diagnostics related to Scan 120 => 'Response portion out of range', ); =head1 NAME SRU::Response::Diagnostic - An SRU diagnostic message =head1 SYNOPSIS my $d = SRU::Response::Diagnostic->new( uri => '', details => '' message => '' ); print $d->asXML(); =head1 DESCRIPTION You probably won't need to use this class since it used interally to store diagnostic messages. =head1 METHOD =cut =head2 new() Pass in uri, details and message attributes as needed. You'll probably find using newFromCode() easier to work with. =cut sub new { my ($class,%args) = @_; my $self = $class->SUPER::new( \%args ); return $self; } =head2 newFromCode() Create a SRU::Response::Diagnostic object from a code. For a complete list of the codes see the SRW/SRU documentation. =cut sub newFromCode { my ($class,$code,$details) = @_; return error( "no such diagnostic code ($code)" ) if ! exists $DIAG{$code}; my $desc = $DIAG{$code}; return $class->new( uri => 'info:srw/diagnostic/1/' . $code, message => $desc, details => $details ); } =head2 uri() =head2 details() =head2 message() =cut SRU::Response::Diagnostic->mk_accessors( qw( uri details message ) ); =head2 asXML() =cut sub asXML { my $self = shift; my $xml = element( 'uri', $self->uri() ); $xml .= element( 'details', $self->details() ); $xml .= element( 'message', $self->message() ); return elementNoEscape( 'diagnostics', $xml ); } 1;