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

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

Changed all places explicitly using ".gdb" to use the dbutil::get_infodb_file_path() function... you know, the one that should have been used originally? In preparation for making it possible to use something other than GDBM, and part of making the code less GDBM-specific.

File size: 22.0 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 $infodb_file_path = &dbutil::get_infodb_file_path("gdbm", "live-$collect_tail", $index_text_directory);
123
124 my $cmd = "gdbmget $infodb_file_path $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 $infodb_file_path = &dbutil::get_infodb_file_path("gdbm", $collect_tail, $index_text_directory);
183 my $doc_rec_string = &dbutil::read_infodb_entry("gdbm", $infodb_file_path, $docid);
184 my $doc_rec = &dbutil::convert_infodb_string_to_hash($doc_rec_string);
185 foreach my $k (keys %$doc_rec) {
186 my @escaped_v = ();
187 foreach my $v (@{$doc_rec->{$k}}) {
188 my $ev = &ghtml::unescape_html($v);
189 push(@escaped_v, $ev);
190 }
191
192 $doc_rec->{$k} = \@escaped_v;
193 }
194
195 $metapos = 0 if (!defined $metapos);
196
197 my $metavalue = $doc_rec->{$metaname}->[$metapos];
198
199 $gsdl_cgi->generate_ok_message("$metavalue");
200
201}
202
203
204
205
206sub set_live_metadata
207{
208 my $self = shift @_;
209
210 my $username = $self->{'username'};
211 my $collect = $self->{'collect'};
212 my $gsdl_cgi = $self->{'gsdl_cgi'};
213 my $gsdlhome = $self->{'gsdlhome'};
214
215
216 # don't user authenticate for now
217 if ($baseaction::authentication_enabled) {
218 # Ensure the user is allowed to edit this collection
219 &authenticate_user($gsdl_cgi, $username, $collect);
220 }
221
222 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
223# $gsdl_cgi->checked_chdir($collect_dir);
224
225
226 # Make sure the collection isn't locked by someone else
227 $self->lock_collection($username, $collect);
228
229 # look up additional args
230
231 my $docid = $self->{'d'};
232 my $metaname = $self->{'metaname'};
233 my $metavalue = $self->{'metavalue'};
234
235 my $dbkey = "$docid.$metaname";
236
237 my $collect_tail = $collect;
238 $collect_tail =~ s/^.*[\/\\]//;
239
240 my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
241 my $infodb_file_path = &dbutil::get_infodb_file_path("gdbm", "live-$collect_tail", $index_text_directory);
242
243 my $cmd = "gdbmset \"$infodb_file_path\" \"$dbkey\" \"$metavalue\"";
244
245 my $status = system($cmd);
246
247 if ($status != 0) {
248 my $mess = "Failed to set metadata key: $dbkey\n";
249
250 $mess .= "PATH: $ENV{'PATH'}\n";
251 $mess .= "cmd = $cmd\n";
252 $mess .= "Exit status: $status\n";
253 $mess .= "System Error Message: $!\n";
254
255 $gsdl_cgi->generate_error($mess);
256 }
257 else {
258 $gsdl_cgi->generate_ok_message("set-live-metadata successful: Key[$metaname]=$metavalue");
259 }
260
261}
262
263
264sub set_metadata
265{
266 my $self = shift @_;
267
268 my $username = $self->{'username'};
269 my $collect = $self->{'collect'};
270 my $gsdl_cgi = $self->{'gsdl_cgi'};
271 my $gsdlhome = $self->{'gsdlhome'};
272
273
274 # don't user authenticate for now
275 if ($baseaction::authentication_enabled) {
276 # Ensure the user is allowed to edit this collection
277 &authenticate_user($gsdl_cgi, $username, $collect);
278 }
279
280 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
281# $gsdl_cgi->checked_chdir($collect_dir);
282
283
284 # Make sure the collection isn't locked by someone else
285 $self->lock_collection($username, $collect);
286
287 # look up additional args
288
289 my $docid = $self->{'d'};
290 my $metaname = $self->{'metaname'};
291 my $metapos = $self->{'metapos'};
292 my $metavalue = $self->{'metavalue'};
293
294 my $collect_tail = $collect;
295 $collect_tail =~ s/^.*[\/\\]//;
296
297 my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
298 my $infodb_file_path = &dbutil::get_infodb_file_path("gdbm", $collect_tail, $index_text_directory);
299 my $doc_rec_string = &dbutil::read_infodb_entry("gdbm", $infodb_file_path, $docid);
300 my $doc_rec = &dbutil::convert_infodb_string_to_hash($doc_rec_string);
301 foreach my $k (keys %$doc_rec) {
302 my @escaped_v = ();
303 foreach my $v (@{$doc_rec->{$k}}) {
304 if ($k eq "contains") {
305 # protect quotes in ".2;".3 etc
306 $v =~ s/\"/\\\"/g;
307 push(@escaped_v, $v);
308 }
309 else {
310 my $ev = &ghtml::unescape_html($v);
311 $ev =~ s/\"/\\\"/g;
312 push(@escaped_v, $ev);
313 }
314 }
315
316 $doc_rec->{$k} = \@escaped_v;
317 }
318
319 ## print STDERR "**** metavalue = $metavalue\n";
320
321 $metavalue =~ s/\"/\\\"/g;
322
323 if (defined $metapos) {
324 $doc_rec->{$metaname}->[$metapos] = $metavalue;
325 }
326 else {
327 $doc_rec->{$metaname} = [ $metavalue ];
328 }
329
330 ## print STDERR "**** metavalue = $metavalue\n";
331
332 my $serialized_doc_rec = &dbutil::convert_infodb_hash_to_string($doc_rec);
333
334 ## print STDERR "**** ser dr\n$serialized_doc_rec\n\n\n";
335
336 my $cmd = "gdbmset \"$infodb_file_path\" \"$docid\" \"$serialized_doc_rec\"";
337
338 my $status = system($cmd);
339
340 if ($status != 0) {
341 my $mess = "Failed to set metadata key: $docid\n";
342
343 $mess .= "PATH: $ENV{'PATH'}\n";
344 $mess .= "cmd = $cmd\n";
345 $mess .= "Exit status: $status\n";
346 $mess .= "System Error Message: $!\n";
347
348 $gsdl_cgi->generate_error($mess);
349 }
350 else {
351 my $mess = "set-document-metadata successful: Key[$docid]\n";
352 $mess .= " $metaname";
353 $mess .= "->[$metapos]" if (defined $metapos);
354 $mess .= " = $metavalue";
355
356 $gsdl_cgi->generate_ok_message($mess);
357 }
358
359}
360
361
362
363sub dxml_metadata
364{
365
366 my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_;
367
368
369 my $metaname = $parser->{'parameters'}->{'metaname'};
370 my $metamode = $parser->{'parameters'}->{'metamode'};
371
372 my $name_attr = $attrHash->{'name'};
373
374 if (($name_attr eq $metaname) && ($metamode eq "override")) {
375
376 my $metavalue = $parser->{'parameters'}->{'metavalue'};
377
378 $attrHash->{'_content'} = $metavalue;
379
380 # Don't want it to wipe out any other pieces of metadata
381 $parser->{'parameters'}->{'metamode'} = "done";
382
383 }
384
385 # raw extended
386 return (':'.$tagname => $attrHash, [$tagname => $attrHash]);
387}
388
389
390sub dxml_description
391{
392
393 my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_;
394
395 my $metamode = $parser->{'parameters'}->{'metamode'};
396
397
398 if ($metamode eq "accumulate") {
399 # tack a new metadata tag on to the end of the <Metadata>+ block
400
401 my $metaname = $parser->{'parameters'}->{'metaname'};
402 my $metavalue = $parser->{'parameters'}->{'metavalue'};
403
404
405 my $metadata_attr = { '_content' => $metavalue,
406 'name' => $metaname,
407 'mode' => "accumulate" };
408
409 my $append_metadata = [ "Metadata" => $metadata_attr ];
410
411 my $description_content = $attrHash->{'_content'};
412
413 push(@$description_content," ", $append_metadata ,"\n ");
414
415 }
416
417 # raw
418 return $tagname => $attrHash;
419}
420
421sub edit_xml_file
422{
423 my $self = shift @_;
424
425 my ($gsdl_cgi, $filename, $rules, $options) = @_;
426
427 # use XML::Rules to add it in (read in and out again)
428
429 my $parser = XML::Rules->new(rules => $rules,
430 style => 'filter' );
431
432 my $xml_in = "";
433 if (!open(MIN,"<$filename")) {
434 $gsdl_cgi->generate_error("Unable to read in $filename: $!");
435 }
436 else {
437 my $line;
438 while (defined ($line=<MIN>)) {
439 $xml_in .= $line;
440 }
441 close(MIN);
442
443
444 my $xml_out = "";
445 $parser->filter($xml_in,\$xml_out, $options);
446
447 if (!open(MOUT,">$filename")) {
448 $gsdl_cgi->generate_error("Unable to write out to $filename: $!");
449 }
450 else {
451 print MOUT $xml_out;
452 close(MOUT);
453
454 }
455 }
456}
457
458
459
460sub edit_doc_xml
461{
462 my $self = shift @_;
463
464 my ($gsdl_cgi, $doc_xml_filename, $metaname, $metavalue, $metapos) = @_;
465
466 # use XML::Rules to add it in (read in and out again)
467
468 my @rules =
469 ( _default => 'raw extended',
470 'Metadata' => \&dxml_metadata,
471 'Description' => \&dxml_description );
472
473 my $options = { 'metaname' => $metaname,
474 'metapos' => $metapos,
475 'metavalue' => $metavalue };
476
477 $self->edit_xml_file($gsdl_cgi,$doc_xml_filename,\@rules,$options);
478}
479
480
481sub set_archives_metadata
482{
483 my $self = shift @_;
484
485 my $username = $self->{'username'};
486 my $collect = $self->{'collect'};
487 my $gsdl_cgi = $self->{'gsdl_cgi'};
488 my $gsdlhome = $self->{'gsdlhome'};
489
490
491 # don't user authenticate for now
492 if ($baseaction::authentication_enabled) {
493 # Ensure the user is allowed to edit this collection
494 $self->authenticate_user($username, $collect);
495 }
496
497 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
498# $gsdl_cgi->checked_chdir($collect_dir);
499
500 my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives");
501
502 # Make sure the collection isn't locked by someone else
503 $self->lock_collection($username, $collect);
504
505 # look up additional args
506
507 my $docid = $self->{'d'};
508
509 my $metaname = $self->{'metaname'};
510 my $metavalue = $self->{'metavalue'};
511 my $metapos = $self->{'metapos'};
512
513 $metapos = 0 if (!defined $metapos);
514
515 my $arcinfo_doc_filename = &dbutil::get_infodb_file_path("gdbm", "archiveinf-doc", $archive_dir);
516
517 my $doc_rec_string = &dbutil::read_infodb_entry("gdbm", $arcinfo_doc_filename, $docid);
518 my $doc_rec = &dbutil::convert_infodb_string_to_hash($doc_rec_string);
519
520 my $doc_xml_file = $doc_rec->{'doc-file'}->[0];
521
522
523 my $archives_dir = &util::filename_cat($collect_dir,$collect,"archives");
524
525 my $doc_xml_filename = &util::filename_cat($archives_dir,$doc_xml_file);
526
527
528 $self->edit_doc_xml($gsdl_cgi,$doc_xml_filename,
529 $metaname,$metavalue,$metapos);
530
531}
532
533
534
535
536sub mxml_metadata
537{
538
539 my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_;
540
541
542 my $metaname = $parser->{'parameters'}->{'metaname'};
543 my $metamode = $parser->{'parameters'}->{'metamode'};
544
545 my $name_attr = $attrHash->{'name'};
546
547 if (($name_attr eq $metaname) && ($metamode eq "override")) {
548
549 my $metavalue = $parser->{'parameters'}->{'metavalue'};
550
551 $attrHash->{'_content'} = $metavalue;
552
553 # Don't want it to wipe out any other pieces of metadata
554 $parser->{'parameters'}->{'metamode'} = "done";
555
556 }
557
558 # raw extended
559 return (':'.$tagname => $attrHash, [$tagname => $attrHash]);
560}
561
562
563sub mxml_description
564{
565
566 my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_;
567
568 my $metamode = $parser->{'parameters'}->{'metamode'};
569
570
571 if ($metamode eq "accumulate") {
572 # tack a new metadata tag on to the end of the <Metadata>+ block
573
574 my $metaname = $parser->{'parameters'}->{'metaname'};
575 my $metavalue = $parser->{'parameters'}->{'metavalue'};
576
577
578 my $metadata_attr = { '_content' => $metavalue,
579 'name' => $metaname,
580 'mode' => "accumulate" };
581
582 my $append_metadata = [ "Metadata" => $metadata_attr ];
583
584 my $description_content = $attrHash->{'_content'};
585
586 push(@$description_content," ", $append_metadata ,"\n ");
587
588 }
589
590 # raw
591 return $tagname => $attrHash;
592}
593
594sub edit_metadata_xml
595{
596 my $self = shift @_;
597
598 my ($gsdl_cgi, $metadata_xml_filename, $metaname, $metavalue, $metamode) = @_;
599
600 # use XML::Rules to add it in (read in and out again)
601
602 my @rules =
603 ( _default => 'raw extended',
604 'Metadata' => \&mxml_metadata,
605 'Description' => \&mxml_description );
606
607
608 my $parser = XML::Rules->new(rules => \@rules,
609 style => 'filter' );
610
611
612 my $xml_in = "";
613 if (!open(MIN,"<$metadata_xml_filename")) {
614 $gsdl_cgi->generate_error("Unable to read in $metadata_xml_filename: $!");
615 }
616 else {
617 my $line;
618 while (defined ($line=<MIN>)) {
619 $xml_in .= $line;
620 }
621 close(MIN);
622
623
624 my $xml_out = "";
625 $parser->filter($xml_in,\$xml_out, { metaname => $metaname,
626 metavalue => $metavalue,
627 metamode => $metamode } );
628
629 if (!open(MOUT,">$metadata_xml_filename")) {
630 $gsdl_cgi->generate_error("Unable to write out to $metadata_xml_filename: $!");
631 }
632 else {
633 print MOUT $xml_out;
634 close(MOUT);
635
636 }
637 }
638}
639
640
641sub set_import_metadata
642{
643 my $self = shift @_;
644
645 my $username = $self->{'username'};
646 my $collect = $self->{'collect'};
647 my $gsdl_cgi = $self->{'gsdl_cgi'};
648 my $gsdlhome = $self->{'gsdlhome'};
649
650
651 # don't user authenticate for now
652 if ($baseaction::authentication_enabled) {
653 # Ensure the user is allowed to edit this collection
654 $self->authenticate_user($username, $collect);
655 }
656
657 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
658# $gsdl_cgi->checked_chdir($collect_dir);
659
660 my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives");
661
662
663 # Make sure the collection isn't locked by someone else
664 $self->lock_collection($username, $collect);
665
666 # look up additional args
667
668 # want either d= or f=
669 my $docid = $self->{'d'};
670 my $import_file = $self->{'f'};
671
672 if ((!defined $docid) && (!defined $import_file)) {
673 $gsdl_cgi->generate_error("No docid (d=...) or import file (f=) specified.");
674 }
675
676 my $metaname = $self->{'metaname'};
677 my $metavalue = $self->{'metavalue'};
678 my $metamode = $self->{'metamode'};
679
680 if ((!defined $metamode) || ($metamode =~ m/^\s*$/)) {
681 # make "accumulate" the default (less destructive, as won't actually
682 # delete any existing values)
683
684 $metamode = "accumulate";
685 }
686
687 my $metadata_xml_file;
688
689 my $import_filename = undef;
690
691 if (defined $docid) {
692 my $arcinfo_doc_filename = &dbutil::get_infodb_file_path("gdbm", "archiveinf-doc", $archive_dir);
693 my $doc_rec_string = &dbutil::read_infodb_entry("gdbm", $arcinfo_doc_filename, $docid);
694 my $doc_rec = &dbutil::convert_infodb_string_to_hash($doc_rec_string);
695
696 # This now stores the full pathname
697 $import_filename = $doc_rec->{'src-file'}->[0];
698 }
699 else {
700 $import_filename = &util::filename_cat($collect_dir,$collect,$import_file);
701 }
702
703 # figure out correct metadata.xml file
704
705 my ($import_tailname, $import_dirname)
706 = File::Basename::fileparse($import_filename);
707
708 my $metadata_xml_filename = &util::filename_cat($import_dirname,"metadata.xml");
709
710 $self->edit_metadata_xml($gsdl_cgi,$metadata_xml_filename,
711 $metaname,$metavalue,$metamode);
712
713}
714
715
716
717
718
719sub remove_live_metadata
720{
721 my $self = shift @_;
722
723 my $username = $self->{'username'};
724 my $collect = $self->{'collect'};
725 my $gsdl_cgi = $self->{'gsdl_cgi'};
726 my $gsdlhome = $self->{'gsdlhome'};
727
728
729 if ($baseaction::authentication_enabled) {
730 # Ensure the user is allowed to edit this collection
731 &authenticate_user($gsdl_cgi, $username, $collect);
732 }
733
734 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
735# $gsdl_cgi->checked_chdir($collect_dir);
736
737
738 # Make sure the collection isn't locked by someone else
739 $self->lock_collection($username, $collect);
740
741 # look up additional args
742
743 my $docid = $self->{'d'};
744 my $metaname = $self->{'metaname'};
745
746 my $dbkey = "$docid.$metaname";
747
748 my $collect_tail = $collect;
749 $collect_tail =~ s/^.*[\/\\]//;
750
751 my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
752 my $infodb_file_path = &dbutil::get_infodb_file_path("gdbm", "live-$collect_tail", $index_text_directory);
753
754 my $cmd = "gdbmdel \"$infodb_file_path\" \"$dbkey\"";
755
756 my $status = system($cmd);
757
758 if ($status != 0) {
759 my $mess = "Failed to set metadata key: $dbkey\n";
760
761 $mess .= "PATH: $ENV{'PATH'}\n";
762 $mess .= "cmd = $cmd\n";
763 $mess .= "Exit status: $status\n";
764 $mess .= "System Error Message: $!\n";
765
766 $gsdl_cgi->generate_error($mess);
767 }
768 else {
769 $gsdl_cgi->generate_ok_message("DB remove successful: Key[$metaname]");
770 }
771
772}
773
774
775sub remove_metadata
776{
777 my $self = shift @_;
778
779 my $username = $self->{'username'};
780 my $collect = $self->{'collect'};
781 my $gsdl_cgi = $self->{'gsdl_cgi'};
782 my $gsdlhome = $self->{'gsdlhome'};
783
784
785 # don't user authenticate for now
786 if ($baseaction::authentication_enabled) {
787 # Ensure the user is allowed to edit this collection
788 &authenticate_user($gsdl_cgi, $username, $collect);
789 }
790
791 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
792# $gsdl_cgi->checked_chdir($collect_dir);
793
794
795 # Make sure the collection isn't locked by someone else
796 $self->lock_collection($username, $collect);
797
798 # look up additional args
799
800 my $docid = $self->{'d'};
801 my $metaname = $self->{'metaname'};
802 my $metapos = $self->{'metapos'};
803
804 my $collect_tail = $collect;
805 $collect_tail =~ s/^.*[\/\\]//;
806
807 my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text");
808 my $infodb_file_path = &dbutil::get_infodb_file_path("gdbm", $collect_tail, $index_text_directory);
809 my $doc_rec_string = &dbutil::read_infodb_entry("gdbm", $infodb_file_path, $docid);
810 my $doc_rec = &dbutil::convert_infodb_string_to_hash($doc_rec_string);
811 foreach my $k (keys %$doc_rec) {
812 my @escaped_v = ();
813 foreach my $v (@{$doc_rec->{$k}}) {
814 if ($k eq "contains") {
815 # protect quotes in ".2;".3 etc
816 $v =~ s/\"/\\\"/g;
817 push(@escaped_v, $v);
818 }
819 else {
820 my $ev = &ghtml::unescape_html($v);
821 $ev =~ s/\"/\\\"/g;
822 push(@escaped_v, $ev);
823 }
824 }
825
826 $doc_rec->{$k} = \@escaped_v;
827 }
828
829 $metapos = 0 if (!defined $metapos);
830
831 # consider check key is defined before deleting?
832
833 my $filtered_metadata = [];
834 my $num_metadata_vals = scalar(@{$doc_rec->{$metaname}});
835
836 for (my $i=0; $i<$num_metadata_vals; $i++) {
837 my $metavalue = shift(@{$doc_rec->{$metaname}});
838
839 if ($i != $metapos) {
840 push(@$filtered_metadata,$metavalue)
841 }
842 }
843
844 $doc_rec->{$metaname} = $filtered_metadata;
845
846 my $serialized_doc_rec = &dbutil::convert_infodb_hash_to_string($doc_rec);
847
848 my $cmd = "gdbmset \"$infodb_file_path\" \"$docid\" \"$serialized_doc_rec\"";
849
850 my $status = system($cmd);
851
852 if ($status != 0) {
853 my $mess = "Failed to set metadata key: $docid\n";
854
855 $mess .= "PATH: $ENV{'PATH'}\n";
856 $mess .= "cmd = $cmd\n";
857 $mess .= "Exit status: $status\n";
858 $mess .= "System Error Message: $!\n";
859
860 $gsdl_cgi->generate_error($mess);
861 }
862 else {
863 my $mess = "DB set (with item deleted) successful: Key[$docid]\n";
864 $mess .= " $metaname";
865 $mess .= "->[$metapos]" if (defined $metapos);
866
867 $gsdl_cgi->generate_ok_message($mess);
868 }
869
870}
871
872
873
874
875
876
8771;
Note: See TracBrowser for help on using the repository browser.