source: main/trunk/greenstone2/perllib/cgiactions/metadataaction.pm@ 21564

Last change on this file since 21564 was 21564, checked in by mdewsnip, 14 years ago

Changed lots of occurrences of "GDBM" in comments, variable names and function names, where the code isn't GDBM-specific. Part of making the code less GDBM-specific.

File size: 21.8 KB
Line 
1###########################################################################
2#
3# metadataaction.pm --
4# A component of the Greenstone digital library software
5# from the New Zealand Digital Library Project at the
6# University of Waikato, New Zealand.
7#
8# Copyright (C) 2009 New Zealand Digital Library Project
9#
10# This program is free software; you can redistr te it and/or modify
11# it under the terms of the GNU General Public License as published by
12# the Free Software Foundation; either version 2 of the License, or
13# (at your option) any later version.
14#
15# This program is distributed in the hope that it will be useful,
16# but WITHOUT ANY WARRANTY; without even the implied warranty of
17# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18# GNU General Public License for more details.
19#
20# You should have received a copy of the GNU General Public License
21# along with this program; if not, write to the Free Software
22# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23#
24###########################################################################
25
26package metadataaction;
27
28use strict;
29
30use cgiactions::baseaction;
31
32use dbutil;
33use ghtml;
34
35
36BEGIN {
37 unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan/perl-5.8");
38 require XML::Rules;
39}
40
41
42@metadataaction::ISA = ('baseaction');
43
44
45
46my $action_table =
47{
48 "get-live-metadata" => { 'compulsory-args' => [ "d", "metaname" ],
49 'optional-args' => [] },
50
51 "get-metadata" => { 'compulsory-args' => [ "d", "metaname" ],
52 'optional-args' => [ "metapos" ] },
53
54 "set-live-metadata" => { 'compulsory-args' => [ "d", "metaname", "metavalue" ],
55 'optional-args' => [ ] },
56
57 "set-metadata" => { 'compulsory-args' => [ "d", "metaname", "metavalue" ],
58 'optional-args' => [ "metapos" ] },
59
60 "set-archives-metadata" => { 'compulsory-args' => [ "d", "metaname", "metavalue" ],
61 'optional-args' => [ "metapos" ]
62
63 },
64
65 "set-import-metadata" => { 'compulsory-args' => [ "metaname", "metavalue" ],
66 'optional-args' => [ "d", "f", "metamode" ]
67 # metamode can be "accumulate", "override", or "unique-id"
68 },
69
70
71 "remove-live-metadata" => { 'compulsory-args' => [ "d", "metaname" ],
72 'optional-args' => [ ] },
73
74 "remove-metadata" => { 'compulsory-args' => [ "d", "metaname" ],
75 'optional-args' => [ "metapos" ] }
76};
77
78
79sub new
80{
81 my $class = shift (@_);
82 my ($gsdl_cgi,$iis6_mode) = @_;
83
84 my $self = new baseaction($action_table,$gsdl_cgi,$iis6_mode);
85
86 return bless $self, $class;
87}
88
89
90
91sub get_live_metadata
92{
93 my $self = shift @_;
94
95 my $username = $self->{'username'};
96 my $collect = $self->{'collect'};
97 my $gsdl_cgi = $self->{'gsdl_cgi'};
98 my $gsdlhome = $self->{'gsdlhome'};
99
100 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
101# $gsdl_cgi->checked_chdir($collect_dir);
102
103
104 # Make sure the collection isn't locked by someone else
105 $self->lock_collection($username, $collect);
106
107 # look up additional args
108
109 my $docid = $self->{'d'};
110 if ((!defined $docid) || ($docid =~ m/^\s*$/)) {
111 $gsdl_cgi->generate_error("No docid (d=...) specified.");
112 }
113
114 my $metaname = $self->{'metaname'};
115
116 my $dbkey = "$docid.$metaname";
117
118 my $collect_tail = $collect;
119 $collect_tail =~ s/^.*[\/|\\]//;
120
121 my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
122 my $gdbm_db = &util::filename_cat($index_text_directory,"live-$collect_tail.gdb");
123
124 my $cmd = "gdbmget $gdbm_db $dbkey";
125
126 if (open(GIN,"$cmd |") == 0) {
127 my $mess = "Failed to get metadata key: $metaname\n";
128 $mess .= "$!\n";
129
130 $gsdl_cgi->generate_error($mess);
131 }
132
133 else {
134 my $metavalue = "";
135
136 my $line;
137 while (defined ($line=<GIN>)) {
138 $metavalue .= $line;
139 }
140 close(GIN);
141
142 chomp($metavalue);
143
144 $gsdl_cgi->generate_ok_message("$metavalue");
145 }
146}
147
148
149
150sub get_metadata
151{
152 my $self = shift @_;
153
154 my $username = $self->{'username'};
155 my $collect = $self->{'collect'};
156 my $gsdl_cgi = $self->{'gsdl_cgi'};
157 my $gsdlhome = $self->{'gsdlhome'};
158
159
160 if ($baseaction::authentication_enabled) {
161 # Ensure the user is allowed to edit this collection
162 &authenticate_user($gsdl_cgi, $username, $collect);
163 }
164
165 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
166# $gsdl_cgi->checked_chdir($collect_dir);
167
168
169 # Make sure the collection isn't locked by someone else
170 $self->lock_collection($username, $collect);
171
172 # look up additional args
173
174 my $docid = $self->{'d'};
175 my $metaname = $self->{'metaname'};
176 my $metapos = $self->{'metapos'};
177
178 my $collect_tail = $collect;
179 $collect_tail =~ s/^.*[\/\\]//;
180
181 my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
182 my $gdbm_db = &util::filename_cat($index_text_directory,"$collect_tail.gdb");
183
184 my $doc_rec_string = &dbutil::read_infodb_entry("gdbm", $gdbm_db, $docid);
185 my $doc_rec = &dbutil::convert_infodb_string_to_hash($doc_rec_string);
186 foreach my $k (keys %$doc_rec) {
187 my @escaped_v = ();
188 foreach my $v (@{$doc_rec->{$k}}) {
189 my $ev = &ghtml::unescape_html($v);
190 push(@escaped_v, $ev);
191 }
192
193 $doc_rec->{$k} = \@escaped_v;
194 }
195
196 $metapos = 0 if (!defined $metapos);
197
198 my $metavalue = $doc_rec->{$metaname}->[$metapos];
199
200 $gsdl_cgi->generate_ok_message("$metavalue");
201
202}
203
204
205
206
207sub set_live_metadata
208{
209 my $self = shift @_;
210
211 my $username = $self->{'username'};
212 my $collect = $self->{'collect'};
213 my $gsdl_cgi = $self->{'gsdl_cgi'};
214 my $gsdlhome = $self->{'gsdlhome'};
215
216
217 # don't user authenticate for now
218 if ($baseaction::authentication_enabled) {
219 # Ensure the user is allowed to edit this collection
220 &authenticate_user($gsdl_cgi, $username, $collect);
221 }
222
223 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
224# $gsdl_cgi->checked_chdir($collect_dir);
225
226
227 # Make sure the collection isn't locked by someone else
228 $self->lock_collection($username, $collect);
229
230 # look up additional args
231
232 my $docid = $self->{'d'};
233 my $metaname = $self->{'metaname'};
234 my $metavalue = $self->{'metavalue'};
235
236 my $dbkey = "$docid.$metaname";
237
238 my $collect_tail = $collect;
239 $collect_tail =~ s/^.*[\/\\]//;
240
241 my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
242 my $gdbm_db = &util::filename_cat($index_text_directory,"live-$collect_tail.gdb");
243
244 my $cmd = "gdbmset \"$gdbm_db\" \"$dbkey\" \"$metavalue\"";
245
246 my $status = system($cmd);
247
248 if ($status != 0) {
249 my $mess = "Failed to set metadata key: $dbkey\n";
250
251 $mess .= "PATH: $ENV{'PATH'}\n";
252 $mess .= "cmd = $cmd\n";
253 $mess .= "Exit status: $status\n";
254 $mess .= "System Error Message: $!\n";
255
256 $gsdl_cgi->generate_error($mess);
257 }
258 else {
259 $gsdl_cgi->generate_ok_message("set-live-metadata successful: Key[$metaname]=$metavalue");
260 }
261
262}
263
264
265sub set_metadata
266{
267 my $self = shift @_;
268
269 my $username = $self->{'username'};
270 my $collect = $self->{'collect'};
271 my $gsdl_cgi = $self->{'gsdl_cgi'};
272 my $gsdlhome = $self->{'gsdlhome'};
273
274
275 # don't user authenticate for now
276 if ($baseaction::authentication_enabled) {
277 # Ensure the user is allowed to edit this collection
278 &authenticate_user($gsdl_cgi, $username, $collect);
279 }
280
281 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
282# $gsdl_cgi->checked_chdir($collect_dir);
283
284
285 # Make sure the collection isn't locked by someone else
286 $self->lock_collection($username, $collect);
287
288 # look up additional args
289
290 my $docid = $self->{'d'};
291 my $metaname = $self->{'metaname'};
292 my $metapos = $self->{'metapos'};
293 my $metavalue = $self->{'metavalue'};
294
295 my $collect_tail = $collect;
296 $collect_tail =~ s/^.*[\/\\]//;
297
298 my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
299 my $gdbm_db = &util::filename_cat($index_text_directory,"$collect_tail.gdb");
300
301 my $doc_rec_string = &dbutil::read_infodb_entry("gdbm", $gdbm_db, $docid);
302 my $doc_rec = &dbutil::convert_infodb_string_to_hash($doc_rec_string);
303 foreach my $k (keys %$doc_rec) {
304 my @escaped_v = ();
305 foreach my $v (@{$doc_rec->{$k}}) {
306 if ($k eq "contains") {
307 # protect quotes in ".2;".3 etc
308 $v =~ s/\"/\\\"/g;
309 push(@escaped_v, $v);
310 }
311 else {
312 my $ev = &ghtml::unescape_html($v);
313 $ev =~ s/\"/\\\"/g;
314 push(@escaped_v, $ev);
315 }
316 }
317
318 $doc_rec->{$k} = \@escaped_v;
319 }
320
321 ## print STDERR "**** metavalue = $metavalue\n";
322
323 $metavalue =~ s/\"/\\\"/g;
324
325 if (defined $metapos) {
326 $doc_rec->{$metaname}->[$metapos] = $metavalue;
327 }
328 else {
329 $doc_rec->{$metaname} = [ $metavalue ];
330 }
331
332 ## print STDERR "**** metavalue = $metavalue\n";
333
334 my $serialized_doc_rec = &dbutil::convert_infodb_hash_to_string($doc_rec);
335
336 ## print STDERR "**** ser dr\n$serialized_doc_rec\n\n\n";
337
338 my $cmd = "gdbmset \"$gdbm_db\" \"$docid\" \"$serialized_doc_rec\"";
339
340 my $status = system($cmd);
341
342 if ($status != 0) {
343 my $mess = "Failed to set metadata key: $docid\n";
344
345 $mess .= "PATH: $ENV{'PATH'}\n";
346 $mess .= "cmd = $cmd\n";
347 $mess .= "Exit status: $status\n";
348 $mess .= "System Error Message: $!\n";
349
350 $gsdl_cgi->generate_error($mess);
351 }
352 else {
353 my $mess = "set-document-metadata successful: Key[$docid]\n";
354 $mess .= " $metaname";
355 $mess .= "->[$metapos]" if (defined $metapos);
356 $mess .= " = $metavalue";
357
358 $gsdl_cgi->generate_ok_message($mess);
359 }
360
361}
362
363
364
365sub dxml_metadata
366{
367
368 my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_;
369
370
371 my $metaname = $parser->{'parameters'}->{'metaname'};
372 my $metamode = $parser->{'parameters'}->{'metamode'};
373
374 my $name_attr = $attrHash->{'name'};
375
376 if (($name_attr eq $metaname) && ($metamode eq "override")) {
377
378 my $metavalue = $parser->{'parameters'}->{'metavalue'};
379
380 $attrHash->{'_content'} = $metavalue;
381
382 # Don't want it to wipe out any other pieces of metadata
383 $parser->{'parameters'}->{'metamode'} = "done";
384
385 }
386
387 # raw extended
388 return (':'.$tagname => $attrHash, [$tagname => $attrHash]);
389}
390
391
392sub dxml_description
393{
394
395 my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_;
396
397 my $metamode = $parser->{'parameters'}->{'metamode'};
398
399
400 if ($metamode eq "accumulate") {
401 # tack a new metadata tag on to the end of the <Metadata>+ block
402
403 my $metaname = $parser->{'parameters'}->{'metaname'};
404 my $metavalue = $parser->{'parameters'}->{'metavalue'};
405
406
407 my $metadata_attr = { '_content' => $metavalue,
408 'name' => $metaname,
409 'mode' => "accumulate" };
410
411 my $append_metadata = [ "Metadata" => $metadata_attr ];
412
413 my $description_content = $attrHash->{'_content'};
414
415 push(@$description_content," ", $append_metadata ,"\n ");
416
417 }
418
419 # raw
420 return $tagname => $attrHash;
421}
422
423sub edit_xml_file
424{
425 my $self = shift @_;
426
427 my ($gsdl_cgi, $filename, $rules, $options) = @_;
428
429 # use XML::Rules to add it in (read in and out again)
430
431 my $parser = XML::Rules->new(rules => $rules,
432 style => 'filter' );
433
434 my $xml_in = "";
435 if (!open(MIN,"<$filename")) {
436 $gsdl_cgi->generate_error("Unable to read in $filename: $!");
437 }
438 else {
439 my $line;
440 while (defined ($line=<MIN>)) {
441 $xml_in .= $line;
442 }
443 close(MIN);
444
445
446 my $xml_out = "";
447 $parser->filter($xml_in,\$xml_out, $options);
448
449 if (!open(MOUT,">$filename")) {
450 $gsdl_cgi->generate_error("Unable to write out to $filename: $!");
451 }
452 else {
453 print MOUT $xml_out;
454 close(MOUT);
455
456 }
457 }
458}
459
460
461
462sub edit_doc_xml
463{
464 my $self = shift @_;
465
466 my ($gsdl_cgi, $doc_xml_filename, $metaname, $metavalue, $metapos) = @_;
467
468 # use XML::Rules to add it in (read in and out again)
469
470 my @rules =
471 ( _default => 'raw extended',
472 'Metadata' => \&dxml_metadata,
473 'Description' => \&dxml_description );
474
475 my $options = { 'metaname' => $metaname,
476 'metapos' => $metapos,
477 'metavalue' => $metavalue };
478
479 $self->edit_xml_file($gsdl_cgi,$doc_xml_filename,\@rules,$options);
480}
481
482
483sub set_archives_metadata
484{
485 my $self = shift @_;
486
487 my $username = $self->{'username'};
488 my $collect = $self->{'collect'};
489 my $gsdl_cgi = $self->{'gsdl_cgi'};
490 my $gsdlhome = $self->{'gsdlhome'};
491
492
493 # don't user authenticate for now
494 if ($baseaction::authentication_enabled) {
495 # Ensure the user is allowed to edit this collection
496 $self->authenticate_user($username, $collect);
497 }
498
499 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
500# $gsdl_cgi->checked_chdir($collect_dir);
501
502 my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives");
503
504 # Make sure the collection isn't locked by someone else
505 $self->lock_collection($username, $collect);
506
507 # look up additional args
508
509 my $docid = $self->{'d'};
510
511 my $metaname = $self->{'metaname'};
512 my $metavalue = $self->{'metavalue'};
513 my $metapos = $self->{'metapos'};
514
515 $metapos = 0 if (!defined $metapos);
516
517 my $doc_db = "archiveinf-doc.gdb";
518 my $arcinfo_doc_filename = &util::filename_cat ($archive_dir, $doc_db);
519
520 my $doc_rec_string = &dbutil::read_infodb_entry("gdbm", $arcinfo_doc_filename, $docid);
521 my $doc_rec = &dbutil::convert_infodb_string_to_hash($doc_rec_string);
522
523 my $doc_xml_file = $doc_rec->{'doc-file'}->[0];
524
525
526 my $archives_dir = &util::filename_cat($collect_dir,$collect,"archives");
527
528 my $doc_xml_filename = &util::filename_cat($archives_dir,$doc_xml_file);
529
530
531 $self->edit_doc_xml($gsdl_cgi,$doc_xml_filename,
532 $metaname,$metavalue,$metapos);
533
534}
535
536
537
538
539sub mxml_metadata
540{
541
542 my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_;
543
544
545 my $metaname = $parser->{'parameters'}->{'metaname'};
546 my $metamode = $parser->{'parameters'}->{'metamode'};
547
548 my $name_attr = $attrHash->{'name'};
549
550 if (($name_attr eq $metaname) && ($metamode eq "override")) {
551
552 my $metavalue = $parser->{'parameters'}->{'metavalue'};
553
554 $attrHash->{'_content'} = $metavalue;
555
556 # Don't want it to wipe out any other pieces of metadata
557 $parser->{'parameters'}->{'metamode'} = "done";
558
559 }
560
561 # raw extended
562 return (':'.$tagname => $attrHash, [$tagname => $attrHash]);
563}
564
565
566sub mxml_description
567{
568
569 my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_;
570
571 my $metamode = $parser->{'parameters'}->{'metamode'};
572
573
574 if ($metamode eq "accumulate") {
575 # tack a new metadata tag on to the end of the <Metadata>+ block
576
577 my $metaname = $parser->{'parameters'}->{'metaname'};
578 my $metavalue = $parser->{'parameters'}->{'metavalue'};
579
580
581 my $metadata_attr = { '_content' => $metavalue,
582 'name' => $metaname,
583 'mode' => "accumulate" };
584
585 my $append_metadata = [ "Metadata" => $metadata_attr ];
586
587 my $description_content = $attrHash->{'_content'};
588
589 push(@$description_content," ", $append_metadata ,"\n ");
590
591 }
592
593 # raw
594 return $tagname => $attrHash;
595}
596
597sub edit_metadata_xml
598{
599 my $self = shift @_;
600
601 my ($gsdl_cgi, $metadata_xml_filename, $metaname, $metavalue, $metamode) = @_;
602
603 # use XML::Rules to add it in (read in and out again)
604
605 my @rules =
606 ( _default => 'raw extended',
607 'Metadata' => \&mxml_metadata,
608 'Description' => \&mxml_description );
609
610
611 my $parser = XML::Rules->new(rules => \@rules,
612 style => 'filter' );
613
614
615 my $xml_in = "";
616 if (!open(MIN,"<$metadata_xml_filename")) {
617 $gsdl_cgi->generate_error("Unable to read in $metadata_xml_filename: $!");
618 }
619 else {
620 my $line;
621 while (defined ($line=<MIN>)) {
622 $xml_in .= $line;
623 }
624 close(MIN);
625
626
627 my $xml_out = "";
628 $parser->filter($xml_in,\$xml_out, { metaname => $metaname,
629 metavalue => $metavalue,
630 metamode => $metamode } );
631
632 if (!open(MOUT,">$metadata_xml_filename")) {
633 $gsdl_cgi->generate_error("Unable to write out to $metadata_xml_filename: $!");
634 }
635 else {
636 print MOUT $xml_out;
637 close(MOUT);
638
639 }
640 }
641}
642
643
644sub set_import_metadata
645{
646 my $self = shift @_;
647
648 my $username = $self->{'username'};
649 my $collect = $self->{'collect'};
650 my $gsdl_cgi = $self->{'gsdl_cgi'};
651 my $gsdlhome = $self->{'gsdlhome'};
652
653
654 # don't user authenticate for now
655 if ($baseaction::authentication_enabled) {
656 # Ensure the user is allowed to edit this collection
657 $self->authenticate_user($username, $collect);
658 }
659
660 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
661# $gsdl_cgi->checked_chdir($collect_dir);
662
663 my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives");
664
665
666 # Make sure the collection isn't locked by someone else
667 $self->lock_collection($username, $collect);
668
669 # look up additional args
670
671 # want either d= or f=
672 my $docid = $self->{'d'};
673 my $import_file = $self->{'f'};
674
675 if ((!defined $docid) && (!defined $import_file)) {
676 $gsdl_cgi->generate_error("No docid (d=...) or import file (f=) specified.");
677 }
678
679 my $metaname = $self->{'metaname'};
680 my $metavalue = $self->{'metavalue'};
681 my $metamode = $self->{'metamode'};
682
683 if ((!defined $metamode) || ($metamode =~ m/^\s*$/)) {
684 # make "accumulate" the default (less destructive, as won't actually
685 # delete any existing values)
686
687 $metamode = "accumulate";
688 }
689
690 my $metadata_xml_file;
691
692 my $import_filename = undef;
693
694 if (defined $docid) {
695
696 my $doc_db = "archiveinf-doc.gdb";
697 my $arcinfo_doc_filename = &util::filename_cat ($archive_dir, $doc_db);
698
699 my $doc_rec_string = &dbutil::read_infodb_entry("gdbm", $arcinfo_doc_filename, $docid);
700 my $doc_rec = &dbutil::convert_infodb_string_to_hash($doc_rec_string);
701
702 # This now stores the full pathname
703 $import_filename = $doc_rec->{'src-file'}->[0];
704 }
705 else {
706 $import_filename = &util::filename_cat($collect_dir,$collect,$import_file);
707 }
708
709 # figure out correct metadata.xml file
710
711 my ($import_tailname, $import_dirname)
712 = File::Basename::fileparse($import_filename);
713
714 my $metadata_xml_filename = &util::filename_cat($import_dirname,"metadata.xml");
715
716 $self->edit_metadata_xml($gsdl_cgi,$metadata_xml_filename,
717 $metaname,$metavalue,$metamode);
718
719}
720
721
722
723
724
725sub remove_live_metadata
726{
727 my $self = shift @_;
728
729 my $username = $self->{'username'};
730 my $collect = $self->{'collect'};
731 my $gsdl_cgi = $self->{'gsdl_cgi'};
732 my $gsdlhome = $self->{'gsdlhome'};
733
734
735 if ($baseaction::authentication_enabled) {
736 # Ensure the user is allowed to edit this collection
737 &authenticate_user($gsdl_cgi, $username, $collect);
738 }
739
740 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
741# $gsdl_cgi->checked_chdir($collect_dir);
742
743
744 # Make sure the collection isn't locked by someone else
745 $self->lock_collection($username, $collect);
746
747 # look up additional args
748
749 my $docid = $self->{'d'};
750 my $metaname = $self->{'metaname'};
751
752 my $dbkey = "$docid.$metaname";
753
754 my $collect_tail = $collect;
755 $collect_tail =~ s/^.*[\/\\]//;
756
757 my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
758 my $gdbm_db = &util::filename_cat($index_text_directory,"live-$collect_tail.gdb");
759
760 my $cmd = "gdbmdel \"$gdbm_db\" \"$dbkey\"";
761
762 my $status = system($cmd);
763
764 if ($status != 0) {
765 my $mess = "Failed to set metadata key: $dbkey\n";
766
767 $mess .= "PATH: $ENV{'PATH'}\n";
768 $mess .= "cmd = $cmd\n";
769 $mess .= "Exit status: $status\n";
770 $mess .= "System Error Message: $!\n";
771
772 $gsdl_cgi->generate_error($mess);
773 }
774 else {
775 $gsdl_cgi->generate_ok_message("DB remove successful: Key[$metaname]");
776 }
777
778}
779
780
781sub remove_metadata
782{
783 my $self = shift @_;
784
785 my $username = $self->{'username'};
786 my $collect = $self->{'collect'};
787 my $gsdl_cgi = $self->{'gsdl_cgi'};
788 my $gsdlhome = $self->{'gsdlhome'};
789
790
791 # don't user authenticate for now
792 if ($baseaction::authentication_enabled) {
793 # Ensure the user is allowed to edit this collection
794 &authenticate_user($gsdl_cgi, $username, $collect);
795 }
796
797 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
798# $gsdl_cgi->checked_chdir($collect_dir);
799
800
801 # Make sure the collection isn't locked by someone else
802 $self->lock_collection($username, $collect);
803
804 # look up additional args
805
806 my $docid = $self->{'d'};
807 my $metaname = $self->{'metaname'};
808 my $metapos = $self->{'metapos'};
809
810 my $collect_tail = $collect;
811 $collect_tail =~ s/^.*[\/\\]//;
812
813 my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
814 my $gdbm_db = &util::filename_cat($index_text_directory,"$collect_tail.gdb");
815
816 my $doc_rec_string = &dbutil::read_infodb_entry("gdbm", $gdbm_db, $docid);
817 my $doc_rec = &dbutil::convert_infodb_string_to_hash($doc_rec_string);
818 foreach my $k (keys %$doc_rec) {
819 my @escaped_v = ();
820 foreach my $v (@{$doc_rec->{$k}}) {
821 if ($k eq "contains") {
822 # protect quotes in ".2;".3 etc
823 $v =~ s/\"/\\\"/g;
824 push(@escaped_v, $v);
825 }
826 else {
827 my $ev = &ghtml::unescape_html($v);
828 $ev =~ s/\"/\\\"/g;
829 push(@escaped_v, $ev);
830 }
831 }
832
833 $doc_rec->{$k} = \@escaped_v;
834 }
835
836 $metapos = 0 if (!defined $metapos);
837
838 # consider check key is defined before deleting?
839
840 my $filtered_metadata = [];
841 my $num_metadata_vals = scalar(@{$doc_rec->{$metaname}});
842
843 for (my $i=0; $i<$num_metadata_vals; $i++) {
844 my $metavalue = shift(@{$doc_rec->{$metaname}});
845
846 if ($i != $metapos) {
847 push(@$filtered_metadata,$metavalue)
848 }
849 }
850
851 $doc_rec->{$metaname} = $filtered_metadata;
852
853 my $serialized_doc_rec = &dbutil::convert_infodb_hash_to_string($doc_rec);
854
855 my $cmd = "gdbmset \"$gdbm_db\" \"$docid\" \"$serialized_doc_rec\"";
856
857 my $status = system($cmd);
858
859 if ($status != 0) {
860 my $mess = "Failed to set metadata key: $docid\n";
861
862 $mess .= "PATH: $ENV{'PATH'}\n";
863 $mess .= "cmd = $cmd\n";
864 $mess .= "Exit status: $status\n";
865 $mess .= "System Error Message: $!\n";
866
867 $gsdl_cgi->generate_error($mess);
868 }
869 else {
870 my $mess = "DB set (with item deleted) successful: Key[$docid]\n";
871 $mess .= " $metaname";
872 $mess .= "->[$metapos]" if (defined $metapos);
873
874 $gsdl_cgi->generate_ok_message($mess);
875 }
876
877}
878
879
880
881
882
883
8841;
Note: See TracBrowser for help on using the repository browser.