Changeset 19499


Ignore:
Timestamp:
2009-05-18T11:01:40+12:00 (15 years ago)
Author:
davidb
Message:

Additional work on supporting Greenstone CGI-based API

Location:
gsdl/trunk/perllib
Files:
4 edited

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;
Note: See TracChangeset for help on using the changeset viewer.