Changeset 38193


Ignore:
Timestamp:
2023-09-24T21:11:36+13:00 (8 months ago)
Author:
anupama
Message:
  1. Added remove_metadata_array methods: general one that calls the others, index, live, import and archives. But as I'm not sure how live is supposed to work, I just based it on the behaviour of set_live_metadata_array and remove_live_metadata. 2. Refactored remove_x_metadata to call remove_x_metadta_entry, so that the remove_x_metadata_array methods can call the latter too, as set_metadata_array methods call set_metadata_entry methods. 3. Some things I'm not too sure off, such as why metamode still exists for remove_import and remove_archives. I can see that rfmxml (remove from file metadata) uses it when set_import_metadata or set_archives_metadata is called with metamode override but no metapos or metavalue defined to set, in which case it empties all values for a given metaname, setting that metaname to an empty array. But remove_import_metadata and remove_archives_metadata always default to metapos=0 for safety reasons when metapos and metavalue is not defined, and I would like to keep that behaviour for remove_meta (and not change the existing behaviour for set_meta which also makes sense), but this then still leaves the question of what metamode means for remove_import_meta and remove_archives_meta. I've left the code as is, it doesn't really have any effect at present regardless of whether metamode is set to accumulate or override since metapos will always be set to 0 at least. Remove_import_meta_array and remove_archives_meta_array follow existing remove_meta code for import and archives in this: calling the same underlying remove_meta_entry function for import/archives. So if we decide to change the behaviour there in future, it will change it universally for remove_import and remove_archives methods.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone2/perllib/cgiactions/modmetadataaction.pm

    r38192 r38193  
    133133        '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
    134134
    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       
    136158    #REMOVE MULTIPLE (REMOVE ALL MATCHING METANAME AT DOCID)
    137159    "erase-import-metadata" => {
     
    611633    $self->authenticate_user($username, $collect); #&authenticate_user($gsdl_cgi, $username, $collect);
    612634    }
    613 
     635   
    614636    # Not sure if the checked_chdir into the collect directory is necessary,
    615637    # 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
    617639    my $site = $self->{'site'};
    618640    my $collect_dir = $gsdl_cgi->get_collection_dir($site);
     
    15001522    my $metavalue = $self->{'metavalue'};
    15011523
     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
     1548sub remove_archives_metadata_entry
     1549{
     1550    my $self = shift @_;
     1551    my ($gsdl_cgi, $archive_dir, $infodbtype, $docid, $dv, $metaname, $metapos, $metavalue, $metamode) = @_;
     1552   
    15021553    $metapos = undef if(defined $metapos && ($metapos =~ m/^\s*$/));
    15031554    $metavalue = undef if(defined $metavalue && ($metavalue =~ m/^\s*$/)); # necessary to force fallback to undef here
     
    15351586    my $status = $self->remove_from_doc_xml($gsdl_cgi, $doc_filename, $metaname, $metapos, $metavalue, $docid_secnum, $metamode);
    15361587#   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;
    15571590}
    15581591
     
    22322265    # look up additional args
    22332266    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); 
    22382269   
    22392270    my $metaname = $self->{'metaname'};
    22402271    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/&lt;(.*?)&gt;/<$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
    22512274    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
     2289sub 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/&lt;(.*?)&gt;/<$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*$/));
    22532304
    22542305    # import works with metadata.xml which can have inherited metadata
     
    22662317    my $metadata_xml_file;
    22672318    my $import_filename = undef;
    2268     if (defined $docid)
     2319    if ((!defined $docid) || ($docid =~ m/^\s*$/))
    22692320    {
    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 {       
    22712323        my $doc_rec = &dbutil::read_infodb_entry($infodbtype, $arcinfo_doc_filename, $docid);
    22722324
     
    22882340   
    22892341    $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;
    22982344}
    22992345
     
    23942440
    23952441        # 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
    23962443        if ((defined $parser->{'parameters'}->{'metamode'}) && ($parser->{'parameters'}->{'metamode'} eq "override") && (!defined $parser->{'parameters'}->{'metapos'}) && (!defined $parser->{'parameters'}->{'metavalue'})) {
    23972444            return [];
     
    25422589    my $metavalue = $self->{'metavalue'};
    25432590
     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
     2614sub remove_index_metadata_entry
     2615{
     2616    my $self = shift @_;
     2617    my ($collect_dir,$collect,$infodbtype,$docid,$metaname,$metapos,$metavalue) = @_;
     2618
    25442619    $metapos = undef if(defined $metapos && ($metapos =~ m/^\s*$/));
    25452620    $metavalue = undef if(defined $metavalue && ($metavalue =~ m/^\s*$/)); # necessary to force fallback to undef here
    2546 
     2621   
    25472622    # To people who know $collect_tail please add some comments
    25482623    # -> In collection groups, I think collect_tailname is the subcollection name,
     
    25902665    my $status = &dbutil::set_infodb_entry($infodbtype, $infodb_file_path, $docid, $doc_rec);
    25912666
    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;
    26112668}
    26122669
     
    32413298
    32423299
     3300#############################################################
     3301
     3302
     3303sub 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
     3348sub _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
     3430sub 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
     3463sub _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
     3548sub 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
     3577sub 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
     3607sub _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/&lt;(.*?)&gt;/<$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
     3706sub _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/&lt;(.*?)&gt;/<$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
     3809sub 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
    32433840# not returning 1; here since this file is conditionally included by metadataction.pm
    32443841# and not otherwise meant to be used on its own
Note: See TracChangeset for help on using the changeset viewer.