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

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

Changed calls to GDBMUtils::gdbmRecordToHash() to dbutil::read_infodb_entry() + dbutil::convert_infodb_string_to_hash(). Part of removing GDBMUtils.pm and making the code less GDBM-specific.

File size: 21.7 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 GDBMUtils;
34use ghtml;
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 $gdbm_directory = &util::filename_cat($collect_dir,$collect,"index","text");
122 my $gdbm_db = &util::filename_cat($gdbm_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 $gdbm_directory = &util::filename_cat($collect_dir,$collect,"index","text");
182 my $gdbm_db = &util::filename_cat($gdbm_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 $gdbm_directory = &util::filename_cat($collect_dir,$collect,"index","text");
242 my $gdbm_db = &util::filename_cat($gdbm_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 $gdbm_directory = &util::filename_cat($collect_dir,$collect,"index","text");
299 my $gdbm_db = &util::filename_cat($gdbm_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 $gdbm_directory = &util::filename_cat($collect_dir,$collect,"index","text");
758 my $gdbm_db = &util::filename_cat($gdbm_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 $gdbm_directory = &util::filename_cat($collect_dir,$collect,"index","text");
814 my $gdbm_db = &util::filename_cat($gdbm_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.