Changeset 19499

Show
Ignore:
Timestamp:
18.05.2009 11:01:40 (10 years ago)
Author:
davidb
Message:

Additional work on supporting Greenstone CGI-based API

Location:
gsdl/trunk/perllib
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • gsdl/trunk/perllib/GDBMUtils.pm

    r18658 r19499  
    5252 
    5353    return $rec; 
     54} 
     55 
     56sub serializeHash 
     57{ 
     58    my ($hash) = @_; 
     59 
     60    my $shash = ""; 
     61     
     62    foreach my $metaname (keys %$hash) { 
     63    my $metavals = $hash->{$metaname}; 
     64    foreach my $metaval (@$metavals) { 
     65        # need to escape chars HTML entities ?? 
     66        $shash .= "<$metaname>$metaval\n"; 
     67    } 
     68    } 
     69 
     70    return $shash; 
    5471} 
    5572 
  • gsdl/trunk/perllib/cgiactions/baseaction.pm

    r19293 r19499  
    2929 
    3030use strict; 
    31 use serverutil; 
    3231 
    3332our $authenication_enabled = 0; 
     
    6766    $err_mess .= "\nPossible actions are:\n"; 
    6867 
    69     $err_mess .= "  cofiguration-check\n\n"; 
     68    $err_mess .= "  check-installation\n\n"; 
    7069 
    7170    foreach my $a (keys %$action_table) { 
     
    9493    # The check-installation command has no arguments 
    9594    if ($action eq "check-installation") { 
    96     &serverutil::check_installation($gsdl_cgi,$iis6_mode); 
     95    $self->check_installation($gsdl_cgi,$iis6_mode); 
    9796    return; 
    9897    } 
     
    157156 
    158157    # Locate and store optional args if present 
    159     my $opt_args = $action_table->{$action}->{'option-args'}; 
     158    my $opt_args = $action_table->{$action}->{'optional-args'}; 
    160159    foreach my $oa (@$opt_args) { 
    161160    if (defined $gsdl_cgi->{$oa}) { 
  • gsdl/trunk/perllib/cgiactions/imageaction.pm

    r19293 r19499  
    3737    "fit-screen" => { 'compulsory-args' => [ "pageWidth", "pageHeight",  
    3838                         "assocDir", "assocFile" ], 
    39               'optional-args'   => [] }, 
     39              'optional-args'   => [ "orientation" ] }, 
    4040 
    4141}; 
     
    9393 
    9494 
    95     # don't user authenticate for now 
    9695    if ($baseaction::authentication_enabled) { 
    9796    # Ensure the user is allowed to edit this collection 
     
    105104#    # Make sure the collection isn't locked by someone else 
    106105# 
    107     &serverutil::lock_collection($gsdl_cgi, $username, $collect); 
     106 
     107    $self->lock_collection($username, $collect); 
    108108 
    109109    # look up additional args 
     
    113113    my $assocDir   = $self->{'assocDir'}; 
    114114    my $assocFile  = $self->{'assocFile'}; 
     115 
     116    my $orientation = $self->{'orientation'}; 
     117    $orientation = "portrait" if (!defined $orientation); 
    115118 
    116119    my $toplevel_assoc_dir 
     
    122125    my $dst_height = $pageHeight; 
    123126 
    124     my $dst_file = $dst_width."x".$dst_height."-".$assocFile; 
     127    my $opt_ls = ($orientation eq "landscape") ? "-r" : ""; 
     128     
     129    my $dst_file = $dst_width."x".$dst_height."$opt_ls-$assocFile"; 
    125130 
    126131    my $dst_full_assoc_filename 
     
    151156 
    152157 
    153     my $cmd = "convert \"$src_full_assoc_filename\" $resize \"$dst_full_assoc_filename\""; 
     158    my $cmd = "convert \"$src_full_assoc_filename\" "; 
     159    $cmd .= "-rotate 90 " if ($orientation eq "landscape"); 
     160 
     161    $cmd .= "$resize \"$dst_full_assoc_filename\""; 
     162 
    154163    `$cmd`; 
    155164 
  • gsdl/trunk/perllib/cgiactions/metadataaction.pm

    r19293 r19499  
    3030use cgiactions::baseaction; 
    3131 
     32use GDBMUtils; 
     33use ghtml; 
    3234 
    3335BEGIN { 
     
    4345my $action_table = 
    4446{  
    45     "get-live-metadata"   => { 'compulsory-args' => [ "d", "metaname" ], 
    46                    'optional-args'   => [] },  
    47     "set-live-metadata"   => { 'compulsory-args' => [ "d", "metaname", "metavalue" ], 
    48                    'optional-args'   => [] }, 
    49     "set-import-metadata" => { 'compulsory-args' => [ "metaname", "metavalue" ], 
    50                    'optional-args'   => [ "d", "f", "metamode" ] 
     47    "get-live-metadata"    => { 'compulsory-args' => [ "d", "metaname" ], 
     48                    'optional-args'   => [] },  
     49 
     50    "get-metadata"         => { 'compulsory-args' => [ "d", "metaname" ], 
     51                    'optional-args'   => [ "metapos" ] },  
     52 
     53    "set-live-metadata"    => { 'compulsory-args' => [ "d", "metaname", "metavalue" ], 
     54                    'optional-args'   => [ ] }, 
     55 
     56    "set-metadata"         => { 'compulsory-args' => [ "d", "metaname", "metavalue" ], 
     57                    'optional-args'   => [ "metapos" ] }, 
     58 
     59    "set-import-metadata"  => { 'compulsory-args' => [ "metaname", "metavalue" ], 
     60                    'optional-args'   => [ "d", "f", "metamode" ] 
    5161                   # metamode can be "accumulate", "override", or "unique-id" 
    52                    } 
     62                }, 
     63    "remove-live-metadata" => { 'compulsory-args' => [ "d", "metaname" ], 
     64                    'optional-args'   => [ ] }, 
     65 
     66    "remove-metadata"      => { 'compulsory-args' => [ "d", "metaname" ], 
     67                    'optional-args'   => [ "metapos" ] } 
    5368}; 
    5469 
     
    116131    } 
    117132    close(GIN); 
    118            
     133 
     134    chomp($metavalue); 
     135 
    119136    $gsdl_cgi->generate_ok_message("$metavalue"); 
    120137    } 
    121  
     138} 
     139 
     140 
     141 
     142sub get_metadata 
     143{ 
     144    my $self = shift @_; 
     145 
     146    my $username  = $self->{'username'}; 
     147    my $collect   = $self->{'collect'}; 
     148    my $gsdl_cgi  = $self->{'gsdl_cgi'}; 
     149    my $gsdlhome  = $self->{'gsdlhome'}; 
     150 
     151 
     152    if ($baseaction::authentication_enabled) { 
     153    # Ensure the user is allowed to edit this collection 
     154    &authenticate_user($gsdl_cgi, $username, $collect); 
     155    } 
     156 
     157    my $collect_dir = &util::filename_cat($gsdlhome, "collect"); 
     158#    $gsdl_cgi->checked_chdir($collect_dir); 
     159 
     160 
     161    # Make sure the collection isn't locked by someone else 
     162    $self->lock_collection($username, $collect); 
     163 
     164    # look up additional args 
     165 
     166    my $docid     = $self->{'d'}; 
     167    my $metaname  = $self->{'metaname'}; 
     168    my $metapos   = $self->{'metapos'}; 
     169 
     170    my $collect_tail = $collect; 
     171    $collect_tail =~ s/^.*[\/\\]//; 
     172 
     173    my $gdbm_directory = &util::filename_cat($collect_dir,$collect,"index","text"); 
     174    my $gdbm_db = &util::filename_cat($gdbm_directory,"$collect_tail.gdb"); 
     175 
     176    my $doc_rec = GDBMUtils::gdbmRecordToHash($gdbm_db,$docid); 
     177    foreach my $k (keys %$doc_rec) { 
     178    my @escaped_v = (); 
     179    foreach my $v (@{$doc_rec->{$k}}) { 
     180        my $ev = &ghtml::unescape_html($v); 
     181        push(@escaped_v, $ev); 
     182    } 
     183 
     184    $doc_rec->{$k} = \@escaped_v; 
     185    } 
     186 
     187    $metapos = 0 if (!defined $metapos); 
     188 
     189    my $metavalue = $doc_rec->{$metaname}->[$metapos]; 
     190 
     191    $gsdl_cgi->generate_ok_message("$metavalue"); 
    122192 
    123193} 
     
    175245    $mess .= "System Error Message: $!\n"; 
    176246 
    177     $gsdl_cgi->generate_error($mess ); 
     247    $gsdl_cgi->generate_error($mess); 
    178248    } 
    179249    else { 
    180     $gsdl_cgi->generate_ok_message("DB set successful: Key[$metaname]=$metavalue"); 
    181     } 
    182  
    183 } 
     250    $gsdl_cgi->generate_ok_message("set-live-metadata successful: Key[$metaname]=$metavalue"); 
     251    } 
     252 
     253} 
     254 
     255 
     256sub set_metadata 
     257{ 
     258    my $self = shift @_; 
     259 
     260    my $username  = $self->{'username'}; 
     261    my $collect   = $self->{'collect'}; 
     262    my $gsdl_cgi  = $self->{'gsdl_cgi'}; 
     263    my $gsdlhome  = $self->{'gsdlhome'}; 
     264 
     265 
     266    # don't user authenticate for now 
     267    if ($baseaction::authentication_enabled) { 
     268    # Ensure the user is allowed to edit this collection 
     269    &authenticate_user($gsdl_cgi, $username, $collect); 
     270    } 
     271 
     272    my $collect_dir = &util::filename_cat($gsdlhome, "collect"); 
     273#    $gsdl_cgi->checked_chdir($collect_dir); 
     274 
     275 
     276    # Make sure the collection isn't locked by someone else 
     277    $self->lock_collection($username, $collect); 
     278 
     279    # look up additional args 
     280 
     281    my $docid     = $self->{'d'}; 
     282    my $metaname  = $self->{'metaname'}; 
     283    my $metapos   = $self->{'metapos'}; 
     284    my $metavalue = $self->{'metavalue'}; 
     285 
     286    my $collect_tail = $collect; 
     287    $collect_tail =~ s/^.*[\/\\]//; 
     288 
     289    my $gdbm_directory = &util::filename_cat($collect_dir,$collect,"index","text"); 
     290    my $gdbm_db = &util::filename_cat($gdbm_directory,"$collect_tail.gdb"); 
     291 
     292    my $doc_rec = GDBMUtils::gdbmRecordToHash($gdbm_db,$docid); 
     293    foreach my $k (keys %$doc_rec) { 
     294    my @escaped_v = (); 
     295    foreach my $v (@{$doc_rec->{$k}}) { 
     296        if ($k eq "contains") { 
     297        # protect quotes in ".2;".3 etc 
     298        $v =~ s/\"/\\\"/g; 
     299        push(@escaped_v, $v); 
     300        } 
     301        else { 
     302        my $ev = &ghtml::unescape_html($v); 
     303        $ev =~ s/\"/\\\"/g; 
     304        push(@escaped_v, $ev); 
     305        } 
     306    } 
     307 
     308    $doc_rec->{$k} = \@escaped_v; 
     309    } 
     310 
     311    ## print STDERR "**** metavalue = $metavalue\n"; 
     312 
     313    $metavalue =~ s/\"/\\\"/g; 
     314 
     315    if (defined $metapos) { 
     316    $doc_rec->{$metaname}->[$metapos] = $metavalue; 
     317    } 
     318    else { 
     319    $doc_rec->{$metaname} = [ $metavalue ]; 
     320    } 
     321 
     322    ## print STDERR "**** metavalue = $metavalue\n"; 
     323 
     324    my $serialized_doc_rec = GDBMUtils::serializeHash($doc_rec); 
     325 
     326    print STDERR "**** ser dr\n$serialized_doc_rec\n\n\n"; 
     327 
     328    my $cmd = "gdbmset \"$gdbm_db\" \"$docid\" \"$serialized_doc_rec\""; 
     329 
     330    my $status = system($cmd); 
     331 
     332    if ($status != 0) { 
     333    my $mess = "Failed to set metadata key: $docid\n"; 
     334     
     335    $mess .= "PATH: $ENV{'PATH'}\n"; 
     336    $mess .= "cmd = $cmd\n"; 
     337    $mess .= "Exit status: $status\n"; 
     338    $mess .= "System Error Message: $!\n"; 
     339 
     340    $gsdl_cgi->generate_error($mess); 
     341    } 
     342    else { 
     343    my $mess = "set-document-metadata successful: Key[$docid]\n"; 
     344    $mess .= "  $metaname"; 
     345    $mess .= "->[$metapos]" if (defined $metapos); 
     346    $mess .= " = $metavalue"; 
     347 
     348    $gsdl_cgi->generate_ok_message($mess); 
     349    } 
     350 
     351} 
     352 
    184353 
    185354 
     
    374543 
    375544 
     545 
     546 
     547 
     548sub remove_live_metadata 
     549{ 
     550    my $self = shift @_; 
     551 
     552    my $username  = $self->{'username'}; 
     553    my $collect   = $self->{'collect'}; 
     554    my $gsdl_cgi  = $self->{'gsdl_cgi'}; 
     555    my $gsdlhome  = $self->{'gsdlhome'}; 
     556 
     557 
     558    if ($baseaction::authentication_enabled) { 
     559    # Ensure the user is allowed to edit this collection 
     560    &authenticate_user($gsdl_cgi, $username, $collect); 
     561    } 
     562 
     563    my $collect_dir = &util::filename_cat($gsdlhome, "collect"); 
     564#    $gsdl_cgi->checked_chdir($collect_dir); 
     565 
     566 
     567    # Make sure the collection isn't locked by someone else 
     568    $self->lock_collection($username, $collect); 
     569 
     570    # look up additional args 
     571 
     572    my $docid     = $self->{'d'}; 
     573    my $metaname  = $self->{'metaname'}; 
     574 
     575    my $dbkey = "$docid.$metaname"; 
     576 
     577    my $collect_tail = $collect; 
     578    $collect_tail =~ s/^.*[\/\\]//; 
     579 
     580    my $gdbm_directory = &util::filename_cat($collect_dir,$collect,"index","text"); 
     581    my $gdbm_db = &util::filename_cat($gdbm_directory,"live-$collect_tail.gdb"); 
     582 
     583    my $cmd = "gdbmdel \"$gdbm_db\" \"$dbkey\""; 
     584 
     585    my $status = system($cmd); 
     586 
     587    if ($status != 0) { 
     588    my $mess = "Failed to set metadata key: $dbkey\n"; 
     589     
     590    $mess .= "PATH: $ENV{'PATH'}\n"; 
     591    $mess .= "cmd = $cmd\n"; 
     592    $mess .= "Exit status: $status\n"; 
     593    $mess .= "System Error Message: $!\n"; 
     594 
     595    $gsdl_cgi->generate_error($mess); 
     596    } 
     597    else { 
     598    $gsdl_cgi->generate_ok_message("DB remove successful: Key[$metaname]"); 
     599    } 
     600 
     601} 
     602 
     603 
     604sub remove_metadata 
     605{ 
     606    my $self = shift @_; 
     607 
     608    my $username  = $self->{'username'}; 
     609    my $collect   = $self->{'collect'}; 
     610    my $gsdl_cgi  = $self->{'gsdl_cgi'}; 
     611    my $gsdlhome  = $self->{'gsdlhome'}; 
     612 
     613 
     614    # don't user authenticate for now 
     615    if ($baseaction::authentication_enabled) { 
     616    # Ensure the user is allowed to edit this collection 
     617    &authenticate_user($gsdl_cgi, $username, $collect); 
     618    } 
     619 
     620    my $collect_dir = &util::filename_cat($gsdlhome, "collect"); 
     621#    $gsdl_cgi->checked_chdir($collect_dir); 
     622 
     623 
     624    # Make sure the collection isn't locked by someone else 
     625    $self->lock_collection($username, $collect); 
     626 
     627    # look up additional args 
     628 
     629    my $docid     = $self->{'d'}; 
     630    my $metaname  = $self->{'metaname'}; 
     631    my $metapos   = $self->{'metapos'}; 
     632 
     633    my $collect_tail = $collect; 
     634    $collect_tail =~ s/^.*[\/\\]//; 
     635 
     636    my $gdbm_directory = &util::filename_cat($collect_dir,$collect,"index","text"); 
     637    my $gdbm_db = &util::filename_cat($gdbm_directory,"$collect_tail.gdb"); 
     638 
     639    my $doc_rec = GDBMUtils::gdbmRecordToHash($gdbm_db,$docid); 
     640    foreach my $k (keys %$doc_rec) { 
     641    my @escaped_v = (); 
     642    foreach my $v (@{$doc_rec->{$k}}) { 
     643        if ($k eq "contains") { 
     644        # protect quotes in ".2;".3 etc 
     645        $v =~ s/\"/\\\"/g; 
     646        push(@escaped_v, $v); 
     647        } 
     648        else { 
     649        my $ev = &ghtml::unescape_html($v); 
     650        $ev =~ s/\"/\\\"/g; 
     651        push(@escaped_v, $ev); 
     652        } 
     653    } 
     654 
     655    $doc_rec->{$k} = \@escaped_v; 
     656    } 
     657 
     658    $metapos = 0 if (!defined $metapos); 
     659 
     660    # consider check key is defined before deleting? 
     661 
     662    my $filtered_metadata = []; 
     663    my $num_metadata_vals = scalar(@{$doc_rec->{$metaname}}); 
     664 
     665    for (my $i=0; $i<$num_metadata_vals; $i++) { 
     666    my $metavalue = shift(@{$doc_rec->{$metaname}}); 
     667 
     668    if ($i != $metapos) { 
     669        push(@$filtered_metadata,$metavalue) 
     670    } 
     671    } 
     672 
     673    $doc_rec->{$metaname} = $filtered_metadata; 
     674 
     675    my $serialized_doc_rec = GDBMUtils::serializeHash($doc_rec); 
     676 
     677    my $cmd = "gdbmset \"$gdbm_db\" \"$docid\" \"$serialized_doc_rec\""; 
     678 
     679    my $status = system($cmd); 
     680 
     681    if ($status != 0) { 
     682    my $mess = "Failed to set metadata key: $docid\n"; 
     683     
     684    $mess .= "PATH: $ENV{'PATH'}\n"; 
     685    $mess .= "cmd = $cmd\n"; 
     686    $mess .= "Exit status: $status\n"; 
     687    $mess .= "System Error Message: $!\n"; 
     688 
     689    $gsdl_cgi->generate_error($mess); 
     690    } 
     691    else { 
     692    my $mess = "DB set (with item deleted) successful: Key[$docid]\n"; 
     693    $mess .= "  $metaname"; 
     694    $mess .= "->[$metapos]" if (defined $metapos); 
     695 
     696    $gsdl_cgi->generate_ok_message($mess); 
     697    } 
     698 
     699} 
     700 
     701 
     702 
     703 
     704 
     705 
    3767061;