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

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

Changed calls to GDBMUtils::serializeHash() to dbutil::convert_infodb_hash_to_string(). Part of removing GDBMUtils.pm and making the code less GDBM-specific.

File size: 21.3 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 = GDBMUtils::gdbmRecordToHash($gdbm_db,$docid);
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 $gdbm_directory = &util::filename_cat($collect_dir,$collect,"index","text");
241 my $gdbm_db = &util::filename_cat($gdbm_directory,"live-$collect_tail.gdb");
242
243 my $cmd = "gdbmset \"$gdbm_db\" \"$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 $gdbm_directory = &util::filename_cat($collect_dir,$collect,"index","text");
298 my $gdbm_db = &util::filename_cat($gdbm_directory,"$collect_tail.gdb");
299
300 my $doc_rec = GDBMUtils::gdbmRecordToHash($gdbm_db,$docid);
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 \"$gdbm_db\" \"$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 $doc_db = "archiveinf-doc.gdb";
516 my $arcinfo_doc_filename = &util::filename_cat ($archive_dir, $doc_db);
517
518 my $doc_rec = GDBMUtils::gdbmRecordToHash($arcinfo_doc_filename,$docid);
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
693 my $doc_db = "archiveinf-doc.gdb";
694 my $arcinfo_doc_filename = &util::filename_cat ($archive_dir, $doc_db);
695
696 my $doc_rec = GDBMUtils::gdbmRecordToHash($arcinfo_doc_filename,$docid);
697
698 # This now stores the full pathname
699 $import_filename = $doc_rec->{'src-file'}->[0];
700 }
701 else {
702 $import_filename = &util::filename_cat($collect_dir,$collect,$import_file);
703 }
704
705 # figure out correct metadata.xml file
706
707 my ($import_tailname, $import_dirname)
708 = File::Basename::fileparse($import_filename);
709
710 my $metadata_xml_filename = &util::filename_cat($import_dirname,"metadata.xml");
711
712 $self->edit_metadata_xml($gsdl_cgi,$metadata_xml_filename,
713 $metaname,$metavalue,$metamode);
714
715}
716
717
718
719
720
721sub remove_live_metadata
722{
723 my $self = shift @_;
724
725 my $username = $self->{'username'};
726 my $collect = $self->{'collect'};
727 my $gsdl_cgi = $self->{'gsdl_cgi'};
728 my $gsdlhome = $self->{'gsdlhome'};
729
730
731 if ($baseaction::authentication_enabled) {
732 # Ensure the user is allowed to edit this collection
733 &authenticate_user($gsdl_cgi, $username, $collect);
734 }
735
736 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
737# $gsdl_cgi->checked_chdir($collect_dir);
738
739
740 # Make sure the collection isn't locked by someone else
741 $self->lock_collection($username, $collect);
742
743 # look up additional args
744
745 my $docid = $self->{'d'};
746 my $metaname = $self->{'metaname'};
747
748 my $dbkey = "$docid.$metaname";
749
750 my $collect_tail = $collect;
751 $collect_tail =~ s/^.*[\/\\]//;
752
753 my $gdbm_directory = &util::filename_cat($collect_dir,$collect,"index","text");
754 my $gdbm_db = &util::filename_cat($gdbm_directory,"live-$collect_tail.gdb");
755
756 my $cmd = "gdbmdel \"$gdbm_db\" \"$dbkey\"";
757
758 my $status = system($cmd);
759
760 if ($status != 0) {
761 my $mess = "Failed to set metadata key: $dbkey\n";
762
763 $mess .= "PATH: $ENV{'PATH'}\n";
764 $mess .= "cmd = $cmd\n";
765 $mess .= "Exit status: $status\n";
766 $mess .= "System Error Message: $!\n";
767
768 $gsdl_cgi->generate_error($mess);
769 }
770 else {
771 $gsdl_cgi->generate_ok_message("DB remove successful: Key[$metaname]");
772 }
773
774}
775
776
777sub remove_metadata
778{
779 my $self = shift @_;
780
781 my $username = $self->{'username'};
782 my $collect = $self->{'collect'};
783 my $gsdl_cgi = $self->{'gsdl_cgi'};
784 my $gsdlhome = $self->{'gsdlhome'};
785
786
787 # don't user authenticate for now
788 if ($baseaction::authentication_enabled) {
789 # Ensure the user is allowed to edit this collection
790 &authenticate_user($gsdl_cgi, $username, $collect);
791 }
792
793 my $collect_dir = &util::filename_cat($gsdlhome, "collect");
794# $gsdl_cgi->checked_chdir($collect_dir);
795
796
797 # Make sure the collection isn't locked by someone else
798 $self->lock_collection($username, $collect);
799
800 # look up additional args
801
802 my $docid = $self->{'d'};
803 my $metaname = $self->{'metaname'};
804 my $metapos = $self->{'metapos'};
805
806 my $collect_tail = $collect;
807 $collect_tail =~ s/^.*[\/\\]//;
808
809 my $gdbm_directory = &util::filename_cat($collect_dir,$collect,"index","text");
810 my $gdbm_db = &util::filename_cat($gdbm_directory,"$collect_tail.gdb");
811
812 my $doc_rec = GDBMUtils::gdbmRecordToHash($gdbm_db,$docid);
813 foreach my $k (keys %$doc_rec) {
814 my @escaped_v = ();
815 foreach my $v (@{$doc_rec->{$k}}) {
816 if ($k eq "contains") {
817 # protect quotes in ".2;".3 etc
818 $v =~ s/\"/\\\"/g;
819 push(@escaped_v, $v);
820 }
821 else {
822 my $ev = &ghtml::unescape_html($v);
823 $ev =~ s/\"/\\\"/g;
824 push(@escaped_v, $ev);
825 }
826 }
827
828 $doc_rec->{$k} = \@escaped_v;
829 }
830
831 $metapos = 0 if (!defined $metapos);
832
833 # consider check key is defined before deleting?
834
835 my $filtered_metadata = [];
836 my $num_metadata_vals = scalar(@{$doc_rec->{$metaname}});
837
838 for (my $i=0; $i<$num_metadata_vals; $i++) {
839 my $metavalue = shift(@{$doc_rec->{$metaname}});
840
841 if ($i != $metapos) {
842 push(@$filtered_metadata,$metavalue)
843 }
844 }
845
846 $doc_rec->{$metaname} = $filtered_metadata;
847
848 my $serialized_doc_rec = &dbutil::convert_infodb_hash_to_string($doc_rec);
849
850 my $cmd = "gdbmset \"$gdbm_db\" \"$docid\" \"$serialized_doc_rec\"";
851
852 my $status = system($cmd);
853
854 if ($status != 0) {
855 my $mess = "Failed to set metadata key: $docid\n";
856
857 $mess .= "PATH: $ENV{'PATH'}\n";
858 $mess .= "cmd = $cmd\n";
859 $mess .= "Exit status: $status\n";
860 $mess .= "System Error Message: $!\n";
861
862 $gsdl_cgi->generate_error($mess);
863 }
864 else {
865 my $mess = "DB set (with item deleted) successful: Key[$docid]\n";
866 $mess .= " $metaname";
867 $mess .= "->[$metapos]" if (defined $metapos);
868
869 $gsdl_cgi->generate_ok_message($mess);
870 }
871
872}
873
874
875
876
877
878
8791;
Note: See TracBrowser for help on using the repository browser.