Changeset 38193
- Timestamp:
- 2023-09-24T21:11:36+13:00 (8 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
main/trunk/greenstone2/perllib/cgiactions/modmetadataaction.pm
r38192 r38193 133 133 'optional-args' => [ "where", "dv", "metapos", "metavalue", "metamode" ] }, # metamode is optional since remove-metadata can call any of remove_import_meta and remove_archives_meta, remove_index_meta, of which the first two accept metamode as an optional param 134 134 135 135 #REMOVE METHODS (ARRAY) 136 "remove-metadata-array" => { 137 'compulsory-args' => [ "where", "json" ], 138 'optional-args' => [ ], 139 'help-string' => [ 140 "No remove-metadata-array examples yet." 141 ] }, 142 "remove-archives-metadata-array" => { 143 'compulsory-args' => [ "json" ], 144 'optional-args' => [ ] }, 145 146 "remove-import-metadata-array" => { 147 'compulsory-args' => [ "json" ], 148 'optional-args' => [ ] }, 149 150 "remove-index-metadata-array" => { 151 'compulsory-args' => [ "json" ], 152 'optional-args' => [ ] }, 153 154 "remove-live-metadata-array" => { 155 'compulsory-args' => [ "json" ], 156 'optional-args' => [ ] }, 157 136 158 #REMOVE MULTIPLE (REMOVE ALL MATCHING METANAME AT DOCID) 137 159 "erase-import-metadata" => { … … 611 633 $self->authenticate_user($username, $collect); #&authenticate_user($gsdl_cgi, $username, $collect); 612 634 } 613 635 614 636 # Not sure if the checked_chdir into the collect directory is necessary, 615 637 # since lock_collection does a further chdir into the collection directory anyway 616 # But including the stmt during this code reorganisation to preserve as-is what used to happe 638 # But including the stmt during this code reorganisation to preserve as-is what used to happen 617 639 my $site = $self->{'site'}; 618 640 my $collect_dir = $gsdl_cgi->get_collection_dir($site); … … 1500 1522 my $metavalue = $self->{'metavalue'}; 1501 1523 1524 my $status = $self->set_archives_metadata_entry($gsdl_cgi,$archive_dir, $infodbtype, 1525 $docid,$dv, $metaname,$metapos,$metavalue,$metamode,$prevmetavalue); 1526 1527 if ($status == 0) 1528 { 1529 my $mess = "\nremove-archives-metadata successful: \nKey[$docid]\n"; 1530 $mess .= " $metaname"; 1531 $mess .= "->[$metapos]" if (defined $metapos); 1532 $mess .= " ($metavalue)" if (defined $metavalue); 1533 $gsdl_cgi->generate_ok_message($mess); 1534 } 1535 else 1536 { 1537 my $mess .= "Failed to remove archives metadata key: $docid\n"; 1538 $mess .= "Exit status: $status\n"; 1539 $mess .= "System Error Message: $!\n"; 1540 $mess .= "-" x 20 . "\n"; 1541 1542 $gsdl_cgi->generate_error($mess); 1543 } 1544 1545 #return $status; # in case calling functions have a use for this 1546 } 1547 1548 sub remove_archives_metadata_entry 1549 { 1550 my $self = shift @_; 1551 my ($gsdl_cgi, $archive_dir, $infodbtype, $docid, $dv, $metaname, $metapos, $metavalue, $metamode) = @_; 1552 1502 1553 $metapos = undef if(defined $metapos && ($metapos =~ m/^\s*$/)); 1503 1554 $metavalue = undef if(defined $metavalue && ($metavalue =~ m/^\s*$/)); # necessary to force fallback to undef here … … 1535 1586 my $status = $self->remove_from_doc_xml($gsdl_cgi, $doc_filename, $metaname, $metapos, $metavalue, $docid_secnum, $metamode); 1536 1587 # my $status = $self->remove_from_doc_xml($gsdl_cgi, $doc_filename, $metaname, $metapos, undef, $docid_secnum); 1537 1538 if ($status == 0) 1539 { 1540 my $mess = "\nremove-archives-metadata successful: \nKey[$docid]\n"; 1541 $mess .= " $metaname"; 1542 $mess .= "->[$metapos]" if (defined $metapos); 1543 $mess .= " ($metavalue)" if (defined $metavalue); 1544 $gsdl_cgi->generate_ok_message($mess); 1545 } 1546 else 1547 { 1548 my $mess .= "Failed to remove archives metadata key: $docid\n"; 1549 $mess .= "Exit status: $status\n"; 1550 $mess .= "System Error Message: $!\n"; 1551 $mess .= "-" x 20 . "\n"; 1552 1553 $gsdl_cgi->generate_error($mess); 1554 } 1555 1556 #return $status; # in case calling functions have a use for this 1588 1589 return $status; 1557 1590 } 1558 1591 … … 2232 2265 # look up additional args 2233 2266 my $docid = $self->{'d'}; 2234 if ((!defined $docid) || ($docid =~ m/^\s*$/)) 2235 { 2236 $gsdl_cgi->generate_error("No docid (d=...) specified.\n"); 2237 } 2267 2268 my $arcinfo_doc_filename = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $archive_dir); 2238 2269 2239 2270 my $metaname = $self->{'metaname'}; 2240 2271 my $metapos = $self->{'metapos'}; 2241 my $metavalue = $self->{'metavalue'}; 2242 2243 $metapos = undef if(defined $metapos && ($metapos =~ m/^\s*$/)); 2244 $metavalue = undef if(defined $metavalue && ($metavalue =~ m/^\s*$/)); 2245 2246 if(defined $metavalue) { # metavalue is now a compulsory arg for remove_import_metadata() 2247 $metavalue =~ s/<(.*?)>/<$1>/g; 2248 } elsif (!defined $metapos) { # if given no metavalue or metapos to delete, default to deleting the 1st 2249 $metapos = 0; 2250 } 2272 my $metavalue = $self->{'metavalue'}; 2273 2251 2274 my $metamode = $self->{'metamode'}; 2252 $metamode = undef if(defined $metamode && ($metamode =~ m/^\s*$/)); 2275 2276 $self->remove_import_metadata_entry($gsdl_cgi, $arcinfo_doc_filename, $infodbtype, $docid, $metaname, $metapos, $metavalue, $metamode); 2277 2278 # any errors would have been reported inside the remove_import_metadata_entry 2279 2280 my $mess = "remove-import-metadata successful: Key[$docid] -> $metadata_xml_filename\n"; 2281 $mess .= " $metaname"; 2282 $mess .= " = $metavalue\n"; 2283 2284 $gsdl_cgi->generate_ok_message($mess); 2285 2286 #return $status; # in case calling functions have a use for this 2287 } 2288 2289 sub remove_import_metadata_entry 2290 { 2291 my $self = shift @_; 2292 my ($gsdl_cgi, $arcinfo_doc_filename, $infodbtype, $docid, $metaname, $metapos, $metavalue, $metamode) = @_; 2293 2294 $metapos = undef if(defined $metapos && ($metapos =~ m/^\s*$/)); 2295 $metavalue = undef if(defined $metavalue && ($metavalue =~ m/^\s*$/)); 2296 2297 if(defined $metavalue) { # metavalue is not a compulsory arg for remove_import_metadata() 2298 $metavalue =~ s/<(.*?)>/<$1>/g; 2299 } elsif (!defined $metapos) { # if given no metavalue or metapos to delete, default to deleting the 1st 2300 $metapos = 0; 2301 } 2302 2303 $metamode = undef if(defined $metamode && ($metamode =~ m/^\s*$/)); 2253 2304 2254 2305 # import works with metadata.xml which can have inherited metadata … … 2266 2317 my $metadata_xml_file; 2267 2318 my $import_filename = undef; 2268 if ( defined $docid)2319 if ((!defined $docid) || ($docid =~ m/^\s*$/)) 2269 2320 { 2270 my $arcinfo_doc_filename = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $archive_dir); 2321 $gsdl_cgi->generate_error("No docid (d=...) specified.\n"); 2322 } else { 2271 2323 my $doc_rec = &dbutil::read_infodb_entry($infodbtype, $arcinfo_doc_filename, $docid); 2272 2324 … … 2288 2340 2289 2341 $self->remove_from_metadata_xml($gsdl_cgi, $metadata_xml_filename, $metaname, $metapos, $metavalue, $import_tailname, $metamode); # metamode has no meaning for removing meta, but is used by set_meta when overriding All 2290 2291 my $mess = "remove-import-metadata successful: Key[$docid] -> $metadata_xml_filename\n"; 2292 $mess .= " $metaname"; 2293 $mess .= " = $metavalue\n"; 2294 2295 $gsdl_cgi->generate_ok_message($mess); 2296 2297 #return $status; # in case calling functions have a use for this 2342 2343 return $error_message; 2298 2344 } 2299 2345 … … 2394 2440 2395 2441 # if overriding but no metapos, then clear all the meta for this metaname 2442 # This is used by set_import_metadata_entry, so don't change this behaviour 2396 2443 if ((defined $parser->{'parameters'}->{'metamode'}) && ($parser->{'parameters'}->{'metamode'} eq "override") && (!defined $parser->{'parameters'}->{'metapos'}) && (!defined $parser->{'parameters'}->{'metavalue'})) { 2397 2444 return []; … … 2542 2589 my $metavalue = $self->{'metavalue'}; 2543 2590 2591 my $status = $self->remove_index_metadata_entry($collect_dir,$collect,$infodbtype,$docid,$metaname,$metapos,$metavalue); 2592 2593 if ($status != 0) { 2594 my $mess = "Failed to remove metadata key: $docid\n"; 2595 2596 $mess .= "PATH: $ENV{'PATH'}\n"; 2597 $mess .= "Exit status: $status\n"; 2598 $mess .= "System Error Message: $!\n"; 2599 2600 $gsdl_cgi->generate_error($mess); 2601 } 2602 else { 2603 my $mess = "DB remove successful: Key[$docid]\n"; 2604 $mess .= " $metaname"; 2605 $mess .= "->[$metapos]" if (defined $metapos); 2606 $mess .= " ($metavalue)" if (defined $metavalue); 2607 2608 $gsdl_cgi->generate_ok_message($mess); 2609 } 2610 2611 #return $status; # in case calling functions have a use for this 2612 } 2613 2614 sub remove_index_metadata_entry 2615 { 2616 my $self = shift @_; 2617 my ($collect_dir,$collect,$infodbtype,$docid,$metaname,$metapos,$metavalue) = @_; 2618 2544 2619 $metapos = undef if(defined $metapos && ($metapos =~ m/^\s*$/)); 2545 2620 $metavalue = undef if(defined $metavalue && ($metavalue =~ m/^\s*$/)); # necessary to force fallback to undef here 2546 2621 2547 2622 # To people who know $collect_tail please add some comments 2548 2623 # -> In collection groups, I think collect_tailname is the subcollection name, … … 2590 2665 my $status = &dbutil::set_infodb_entry($infodbtype, $infodb_file_path, $docid, $doc_rec); 2591 2666 2592 if ($status != 0) { 2593 my $mess = "Failed to set metadata key: $docid\n"; 2594 2595 $mess .= "PATH: $ENV{'PATH'}\n"; 2596 $mess .= "Exit status: $status\n"; 2597 $mess .= "System Error Message: $!\n"; 2598 2599 $gsdl_cgi->generate_error($mess); 2600 } 2601 else { 2602 my $mess = "DB set (with item deleted) successful: Key[$docid]\n"; 2603 $mess .= " $metaname"; 2604 $mess .= "->[$metapos]" if (defined $metapos); 2605 $mess .= " ($metavalue)" if (defined $metavalue); 2606 2607 $gsdl_cgi->generate_ok_message($mess); 2608 } 2609 2610 #return $status; # in case calling functions have a use for this 2667 return $status; 2611 2668 } 2612 2669 … … 3241 3298 3242 3299 3300 ############################################################# 3301 3302 3303 sub remove_metadata_array 3304 { 3305 my $self = shift @_; 3306 3307 my $where = $self->{'where'}; 3308 if(!$where || ($where =~ m/^\s*$/)) { 3309 $self->remove_index_metadata_array(@_); # mimic set_metadata_array for default behaviour 3310 return; 3311 } 3312 3313 my $username = $self->{'username'}; 3314 my $collect = $self->{'collect'}; 3315 my $gsdl_cgi = $self->{'gsdl_cgi'}; 3316 3317 if ($baseaction::authentication_enabled) { 3318 # Ensure the user is allowed to edit this collection 3319 $self->authenticate_user($username, $collect); #&authenticate_user($gsdl_cgi, $username, $collect); 3320 } 3321 3322 # Not sure if the checked_chdir is necessary, since lock_collection also does a chdir 3323 # But copied code from set_metadata_array 3324 my $site = $self->{'site'}; 3325 my $collect_dir = $gsdl_cgi->get_collection_dir($site); 3326 $gsdl_cgi->checked_chdir($collect_dir); 3327 3328 # Make sure the collection isn't locked by someone else 3329 $self->lock_collection($username, $collect); 3330 3331 if($where =~ m/import/) { 3332 $self->_remove_import_metadata_array(@_); 3333 } 3334 if($where =~ m/archives/) { 3335 $self->_remove_archives_metadata_array(@_); 3336 } 3337 if($where =~ m/index/) { 3338 $self->_remove_index_metadata_array(@_); 3339 } 3340 if($where =~ m/live/) { 3341 $self->_remove_live_metadata_array(@_); 3342 } 3343 3344 # Release the lock once it is done 3345 $self->unlock_collection($username, $collect); 3346 } 3347 3348 sub _remove_index_metadata_array 3349 { 3350 my $self = shift @_; 3351 3352 my $collect = $self->{'collect'}; 3353 my $gsdl_cgi = $self->{'gsdl_cgi'}; 3354 3355 # Obtain the collect dir 3356 my $site = $self->{'site'}; 3357 my $collect_dir = $gsdl_cgi->get_collection_dir($site); 3358 3359 # look up additional args 3360 3361 my $infodbtype = $self->{'infodbtype'}; 3362 3363 my $json_str = $self->{'json'}; 3364 my $doc_array = decode_json $json_str; 3365 3366 3367 my $global_status = 0; 3368 my $global_mess = ""; 3369 3370 my @all_docids = (); 3371 3372 foreach my $doc_array_rec ( @$doc_array ) { 3373 3374 my $status = -1; 3375 my $docid = $doc_array_rec->{'docid'}; 3376 3377 push(@all_docids,$docid); 3378 3379 my $metaname = $doc_array_rec->{'metaname'}; 3380 if(defined $metaname) { 3381 # metapos can be undef and if metaval is also undef, metapos=0 will be used 3382 my $metapos = $doc_array_rec->{'metapos'}; 3383 my $metavalue = $doc_array_rec->{'metavalue'}; 3384 # remove-import-metadata and remove-archives-metadata recognise metamode option 3385 # but not remove-index-metadata 3386 #my $metamode = $doc_array_rec->{'metamode'} || $self->{'metamode'}; 3387 3388 $status = $self->remove_index_metadata_entry($collect_dir,$collect,$infodbtype,$docid,$metaname,$metapos,$metavalue); 3389 } elsif (defined $doc_array_rec->{'metatable'}) { # if no metaname, we expect a metatable 3390 my $metatable = $doc_array_rec->{'metatable'}; # a subarray, or need to generate an error saying JSON structure is wrong 3391 3392 foreach my $metatable_rec ( @$metatable ) { # the subarray metatable is an array of hashmaps 3393 $metaname = $metatable_rec->{'metaname'}; 3394 #my $metamode = $metatable_rec->{'metamode'} || $doc_array_rec->{'metamode'} || $self->{'metamode'}; # metamode not used by remove_index_metadata 3395 my $metapos = $metatable_rec->{'metapos'} || $doc_array_rec->{'metapos'} || $self->{'metapos'} || undef; # try most-to-least specific metapos setting, and fallback on undef 3396 my $metavals = $metatable_rec->{'metavals'}; # a sub-subarray 3397 3398 foreach my $metavalue ( @$metavals ) { # metavals is an array 3399 $status = $self->remove_index_metadata_entry($collect_dir,$collect,$infodbtype,$docid,$metaname,$metapos,$metavalue); # how do we use metamode in set_meta_entry? 3400 3401 #if($metamode eq "override") { # now, having overridden the metavalue for the first, 3402 ## need to accumulate subsequent metavals for this metaname, else the just-assigned 3403 ## metavalue for this metaname will be lost 3404 #$metamode = "accumulate"; 3405 #} 3406 } 3407 } 3408 } 3409 3410 if ($status != 0) { 3411 # Catch error if set infodb entry failed 3412 $global_status = $status; 3413 $global_mess .= "Failed to remove metadata key: $docid\n"; 3414 $global_mess .= "Exit status: $status\n"; 3415 $global_mess .= "System Error Message: $!\n"; 3416 $global_mess .= "-" x 20; 3417 } 3418 } 3419 3420 if ($global_status != 0) { 3421 $global_mess .= "PATH: $ENV{'PATH'}\n"; 3422 $gsdl_cgi->generate_error($global_mess); 3423 } 3424 else { 3425 my $mess = "remove-metadata-array successful: Keys[ ".join(", ",@all_docids)."]\n"; 3426 $gsdl_cgi->generate_ok_message($mess); 3427 } 3428 } 3429 3430 sub remove_index_metadata_array 3431 { 3432 my $self = shift @_; 3433 3434 my $username = $self->{'username'}; 3435 my $collect = $self->{'collect'}; 3436 my $gsdl_cgi = $self->{'gsdl_cgi'}; 3437 3438 if ($baseaction::authentication_enabled) { 3439 # Ensure the user is allowed to edit this collection 3440 $self->authenticate_user($username, $collect); #&authenticate_user($gsdl_cgi, $username, $collect); 3441 } 3442 3443 # Obtain the collect dir 3444 my $site = $self->{'site'}; 3445 my $collect_dir = $gsdl_cgi->get_collection_dir($site); 3446 3447 # Skip this step as lock_collection does a chdir into final destination directory anyway? 3448 $gsdl_cgi->checked_chdir($collect_dir); 3449 3450 3451 # Make sure the collection isn't locked by someone else 3452 $self->lock_collection($username, $collect); 3453 3454 $self->_remove_index_metadata_array(@_); 3455 3456 # Release the lock once it is done 3457 $self->unlock_collection($username, $collect); 3458 } 3459 3460 # Untested, based on also untested experimental _set_live_metadata_array 3461 # TODO: How can we delete at a dbkey with a particular value or at a particular metapos? 3462 # Same question for sub remove_live_metadata 3463 sub _remove_live_metadata_array 3464 { 3465 my $self = shift @_; 3466 3467 my $collect = $self->{'collect'}; 3468 my $gsdl_cgi = $self->{'gsdl_cgi'}; 3469 3470 # Obtain the collect dir 3471 my $site = $self->{'site'}; 3472 my $collect_dir = $gsdl_cgi->get_collection_dir($site); 3473 3474 # look up additional args 3475 my $infodbtype = $self->{'infodbtype'}; 3476 # To people who know $collect_tail please add some comments 3477 # Obtain path to the database 3478 my $collect_tail = $collect; 3479 $collect_tail =~ s/^.*[\/|\\]//; 3480 my $index_text_directory = &util::filename_cat($collect_dir,$collect,"index","text"); 3481 my $infodb_file_path = &dbutil::get_infodb_file_path($infodbtype, "live-$collect_tail", $index_text_directory); 3482 3483 3484 my $json_str = $self->{'json'}; 3485 my $doc_array = decode_json $json_str; 3486 3487 3488 my $global_status = 0; 3489 my $global_mess = ""; 3490 3491 my @all_docids = (); 3492 3493 3494 foreach my $doc_array_rec ( @$doc_array ) { 3495 3496 my $status = -1; 3497 my $docid = $doc_array_rec->{'docid'}; 3498 3499 push(@all_docids,$docid); 3500 3501 my $metaname = $doc_array_rec->{'metaname'}; 3502 if(defined $metaname) { 3503 my $dbkey = "$docid.$metaname"; 3504 3505 # Remove the key 3506 #my $metavalue = $doc_array_rec->{'metavalue'}; 3507 #my $cmd = "gdbmdel \"$infodb_file_path\" \"$dbkey\" \"$metavalue\""; 3508 my $cmd = "gdbmdel \"$infodb_file_path\" \"$dbkey\""; 3509 $status = system($cmd); 3510 3511 } elsif (defined $doc_array_rec->{'metatable'}) { # if no metaname, we expect a metatable 3512 my $metatable = $doc_array_rec->{'metatable'}; # a subarray, or need to generate an error saying JSON structure is wrong 3513 foreach my $metatable_rec ( @$metatable ) { 3514 $metaname = $metatable_rec->{'metaname'}; 3515 my $dbkey = "$docid.$metaname"; 3516 3517 my $cmd = "gdbmdel \"$infodb_file_path\" \"$dbkey\""; 3518 $status = system($cmd); 3519 #my $metavals = $metatable_rec->{'metavals'}; # a sub-subarray 3520 #foreach my $metavalue ( @$metavals ) { 3521 #my $cmd = "gdbmdel \"$infodb_file_path\" \"$dbkey\" \"$metavalue\""; 3522 #$status = system($cmd); 3523 #} 3524 } 3525 3526 } 3527 3528 if ($status != 0) { 3529 # Catch error if gdbmdel failed 3530 $global_status = $status; 3531 $global_mess .= "Failed to delete metadata key: $dbkey\n"; # $dbkey 3532 $global_mess .= "Exit status: $status\n"; 3533 $global_mess .= "System Error Message: $!\n"; 3534 $global_mess .= "-" x 20; 3535 } 3536 } 3537 3538 if ($global_status != 0) { 3539 $global_mess .= "PATH: $ENV{'PATH'}\n"; 3540 $gsdl_cgi->generate_error($global_mess); 3541 } 3542 else { 3543 my $mess = "remove-live-metadata-array successful: Keys[ ".join(", ",@all_docids)."]\n"; 3544 $gsdl_cgi->generate_ok_message($mess); 3545 } 3546 } 3547 3548 sub remove_live_metadata_array 3549 { 3550 my $self = shift @_; 3551 3552 my $username = $self->{'username'}; 3553 my $collect = $self->{'collect'}; 3554 my $gsdl_cgi = $self->{'gsdl_cgi'}; 3555 3556 if ($baseaction::authentication_enabled) { 3557 # Ensure the user is allowed to edit this collection 3558 $self->authenticate_user($username, $collect); #&authenticate_user($gsdl_cgi, $username, $collect); 3559 } 3560 3561 # Obtain the collect dir 3562 my $site = $self->{'site'}; 3563 my $collect_dir = $gsdl_cgi->get_collection_dir($site); 3564 3565 $gsdl_cgi->checked_chdir($collect_dir); 3566 3567 # Make sure the collection isn't locked by someone else 3568 $self->lock_collection($username, $collect); 3569 3570 $self->_remove_live_metadata_array(@_); 3571 3572 # Release the lock once it is done 3573 $self->unlock_collection($username, $collect); 3574 } 3575 3576 3577 sub remove_import_metadata_array 3578 { 3579 my $self = shift @_; 3580 3581 my $username = $self->{'username'}; 3582 my $collect = $self->{'collect'}; 3583 my $gsdl_cgi = $self->{'gsdl_cgi'}; 3584 3585 if ($baseaction::authentication_enabled) { 3586 # Ensure the user is allowed to edit this collection 3587 $self->authenticate_user($username, $collect); #&authenticate_user($gsdl_cgi, $username, $collect); 3588 } 3589 3590 # Obtain the collect dir 3591 my $site = $self->{'site'}; 3592 my $collect_dir = $gsdl_cgi->get_collection_dir($site); 3593 3594 $gsdl_cgi->checked_chdir($collect_dir); 3595 3596 # Make sure the collection isn't locked by someone else 3597 $self->lock_collection($username, $collect); 3598 3599 $self->_remove_import_metadata_array(@_); 3600 3601 # Release the lock once it is done 3602 $self->unlock_collection($username, $collect); 3603 3604 } 3605 3606 3607 sub _remove_import_metadata_array 3608 { 3609 my $self = shift @_; 3610 3611 my $collect = $self->{'collect'}; 3612 my $gsdl_cgi = $self->{'gsdl_cgi'}; 3613 3614 # Obtain the collect dir 3615 my $site = $self->{'site'}; 3616 my $collect_dir = $gsdl_cgi->get_collection_dir($site); 3617 3618 # look up additional args 3619 3620 my $infodbtype = $self->{'infodbtype'}; 3621 3622 my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives"); 3623 my $arcinfo_doc_filename = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $archive_dir); 3624 3625 my $json_str = $self->{'json'}; 3626 my $doc_array = decode_json $json_str; 3627 3628 #my $global_status = 0; 3629 #my $global_mess = ""; 3630 3631 my @all_docids = (); 3632 3633 foreach my $doc_array_rec ( @$doc_array ) 3634 { 3635 my $status = -1; 3636 my $docid = $doc_array_rec->{'docid'}; 3637 3638 my ($docid_root,$docid_secnum); 3639 if(defined $docid) { 3640 ($docid_root,$docid_secnum) = ($docid =~ m/^(.*?)(\..*)?$/); 3641 # as yet no support for setting or removing subsection metadata in metadata.xml 3642 if ((defined $docid_secnum) && ($docid_secnum !~ m/^\s*$/)) { 3643 $gsdl_cgi->generate_message("*** docid: $docid. No support yet for deleting import metadata at subsections' level.\n"); 3644 next; # skip this docid in for loop 3645 } 3646 } 3647 3648 push(@all_docids,$docid); # docid_root rather 3649 3650 my $metaname = $doc_array_rec->{'metaname'}; 3651 if (defined $metaname) { 3652 my $metapos = $doc_array_rec->{'metapos'} || $self->{'metapos'}; 3653 my $metavalue = $doc_array_rec->{'metavalue'}; #|| $self->{'metavalue'}; 3654 my $metamode = $doc_array_rec->{'metamode'} || $self->{'metamode'} || undef; # see set_import_meta_array for fallback 3655 3656 $self->remove_import_metadata_entry($gsdl_cgi, $arcinfo_doc_filename, $infodbtype, $docid_root, $metaname, $metapos, $metavalue, $metamode); # at this point, docid_root = docid 3657 3658 } elsif (defined $doc_array_rec->{'metatable'}) { # if no metaname, we expect a metatable 3659 my $metatable = $doc_array_rec->{'metatable'}; # a subarray, or need to generate an error saying JSON structure is wrong 3660 3661 foreach my $metatable_rec ( @$metatable ) { 3662 $metaname = $metatable_rec->{'metaname'}; 3663 my $metamode = $metatable_rec->{'metamode'} || $doc_array_rec->{'metamode'} || $self->{'metamode'} || undef; 3664 3665 my $metapositions = $metatable_rec->{'metapositions'}; # a sub-subarray 3666 if(defined $metapositions) { 3667 foreach my $metapos ( @$metapositions ) { 3668 $metavalue = undef; 3669 3670 $self->remove_import_metadata_entry($gsdl_cgi, $arcinfo_doc_filename, $infodbtype, $docid_root, $metaname, $metapos, $metavalue, $metamode); # at this point, docid_root = docid 3671 3672 #if($metamode eq "override") { # now, having overridden the first metavalue of the metaname, 3673 # need to accumulate subsequent metavals for this metaname, else the just-assigned 3674 # metavalue for this metaname will be lost 3675 #$metamode = "accumulate"; 3676 #} 3677 } 3678 } 3679 else { 3680 my $metavals = $metatable_rec->{'metavals'}; # a sub-subarray 3681 next unless defined $metavals; 3682 foreach my $metavalue ( @$metavals ) { 3683 $metavalue =~ s/<(.*?)>/<$1>/g; 3684 $metapos = undef; 3685 3686 $self->remove_import_metadata_entry($gsdl_cgi, $arcinfo_doc_filename, $infodbtype, $docid_root, $metaname, $metapos, $metavalue, $metamode); # at this point, docid_root = docid 3687 3688 #if($metamode eq "override") { # now, having overridden the first metavalue of the metaname, 3689 # need to accumulate subsequent metavals for this metaname, else the just-assigned 3690 # metavalue for this metaname will be lost 3691 #$metamode = "accumulate"; 3692 #} 3693 } 3694 } 3695 } 3696 } 3697 } 3698 3699 3700 # always a success message, as any failure would have caused a call to die within remove_import_metadata_entry 3701 my $mess = "remove-import-metadata-array successful: Keys[ ".join(", ",@all_docids)."]\n"; 3702 $gsdl_cgi->generate_ok_message($mess); 3703 } 3704 3705 3706 sub _remove_archives_metadata_array 3707 { 3708 my $self = shift @_; 3709 3710 my $collect = $self->{'collect'}; 3711 my $gsdl_cgi = $self->{'gsdl_cgi'}; 3712 3713 # Obtain the collect dir 3714 my $site = $self->{'site'}; 3715 my $collect_dir = $gsdl_cgi->get_collection_dir($site); 3716 3717 # look up additional args 3718 3719 my $infodbtype = $self->{'infodbtype'}; 3720 3721 my $archive_dir = &util::filename_cat($collect_dir,$collect,"archives"); 3722 3723 my $json_str = $self->{'json'}; 3724 my $doc_array = decode_json $json_str; 3725 3726 3727 my $global_status = 0; 3728 my $global_mess = ""; 3729 3730 my @all_docids = (); 3731 3732 foreach my $doc_array_rec ( @$doc_array ) { 3733 my $status = -1; 3734 my $docid = $doc_array_rec->{'docid'}; 3735 my $dv = $doc_array_rec->{'dv'}; 3736 3737 push(@all_docids,$docid); 3738 3739 my $metaname = $doc_array_rec->{'metaname'}; 3740 if(defined $metaname) { 3741 3742 my $metapos = $doc_array_rec->{'metapos'}; 3743 my $metavalue = $doc_array_rec->{'metavalue'}; 3744 my $metamode = $doc_array_rec->{'metamode'} || $self->{'metamode'}; 3745 3746 $status = $self->remove_archives_metadata_entry($gsdl_cgi,$archive_dir,$infodbtype, 3747 $docid,$dv, $metaname,$metapos,$metavalue,$metamode); 3748 3749 } elsif (defined $doc_array_rec->{'metatable'}) { # if no metaname, we expect a metatable 3750 my $metatable = $doc_array_rec->{'metatable'}; # a subarray, or need to generate an error saying JSON structure is wrong 3751 3752 foreach my $metatable_rec ( @$metatable ) { 3753 $metaname = $metatable_rec->{'metaname'}; 3754 my $metamode = $metatable_rec->{'metamode'} || $doc_array_rec->{'metamode'} || $self->{'metamode'}; 3755 my $metapositions = $metatable_rec->{'metapositions'}; # a sub-subarray 3756 if(defined $metapositions) { 3757 foreach my $metapos ( @$metapositions ) { 3758 $metavalue = undef; 3759 3760 $self->remove_archives_metadata_entry($gsdl_cgi, $archive_dir, $infodbtype, 3761 $docid,$dv, $metaname, $metapos, $metavalue, $metamode); 3762 3763 #if($metamode eq "override") { # now, having overridden the first metavalue of the metaname, 3764 # need to accumulate subsequent metavals for this metaname, else the just-assigned 3765 # metavalue for this metaname will be lost 3766 #$metamode = "accumulate"; 3767 #} 3768 } 3769 } 3770 else { 3771 my $metavals = $metatable_rec->{'metavals'}; # a sub-subarray 3772 next unless defined $metavals; 3773 foreach my $metavalue ( @$metavals ) { 3774 $metavalue =~ s/<(.*?)>/<$1>/g; 3775 $metapos = undef; 3776 3777 $status = $self->remove_archives_metadata_entry($gsdl_cgi,$archive_dir,$infodbtype, 3778 $docid,$dv, $metaname,$metapos,$metavalue,$metamode); 3779 #if($metamode eq "override") { # now, having overridden the first metavalue of the metaname, 3780 # need to accumulate subsequent metavals for this metaname, else the just-assigned 3781 # metavalue for this metaname will be lost 3782 #$metamode = "accumulate"; 3783 #} 3784 } 3785 } 3786 } 3787 } 3788 3789 if ($status != 0) { 3790 # Catch error if set infodb entry failed 3791 $global_status = $status; 3792 $global_mess .= "Failed to remove archives metadata key: $docid\n"; 3793 $global_mess .= "Exit status: $status\n"; 3794 $global_mess .= "System Error Message: $!\n"; 3795 $global_mess .= "-" x 20 . "\n"; 3796 } 3797 } 3798 3799 if ($global_status != 0) { 3800 $global_mess .= "PATH: $ENV{'PATH'}\n"; 3801 $gsdl_cgi->generate_error($global_mess); 3802 } 3803 else { 3804 my $mess = "remove-archives-metadata-array successful: Keys[ ".join(", ",@all_docids)."]\n"; 3805 $gsdl_cgi->generate_ok_message($mess); 3806 } 3807 } 3808 3809 sub remove_archives_metadata_array 3810 { 3811 my $self = shift @_; 3812 3813 my $username = $self->{'username'}; 3814 my $collect = $self->{'collect'}; 3815 my $gsdl_cgi = $self->{'gsdl_cgi'}; 3816 3817 if ($baseaction::authentication_enabled) { 3818 # Ensure the user is allowed to edit this collection 3819 $self->authenticate_user($username, $collect); #&authenticate_user($gsdl_cgi, $username, $collect); 3820 } 3821 3822 # Obtain the collect dir 3823 my $site = $self->{'site'}; 3824 my $collect_dir = $gsdl_cgi->get_collection_dir($site); 3825 3826 $gsdl_cgi->checked_chdir($collect_dir); 3827 3828 # Make sure the collection isn't locked by someone else 3829 $self->lock_collection($username, $collect); 3830 3831 $self->_remove_archives_metadata_array(@_); 3832 3833 # Release the lock once it is done 3834 $self->unlock_collection($username, $collect); 3835 } 3836 3837 3838 ##################################### END REMOVE ARRAY METHODS ################# 3839 3243 3840 # not returning 1; here since this file is conditionally included by metadataction.pm 3244 3841 # and not otherwise meant to be used on its own
Note:
See TracChangeset
for help on using the changeset viewer.