Changeset 1907


Ignore:
Timestamp:
01/03/17 23:34:54 (8 years ago)
Author:
nanardon
Message:

Add cache for object alias, then allow search trought them

Location:
trunk/LATMOS-Accounts
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LATMOS-Accounts/bin/la-sql-upgrade.in

    r1867 r1907  
    11361136            COST 100; 
    11371137            }, 
     1138        ], 
     1139    }, 
     1140    { 
     1141        ver => 25, 
     1142        sql => [ 
     1143            'ALTER TABLE objects ADD COLUMN oaliascache text', 
    11381144        ], 
    11391145    }, 
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql.pm

    r1872 r1907  
    203203            return; 
    204204        }; 
     205        $refotype eq $otype or do { 
     206            $self->log(LA_DEBUG, "Oalias %s (%s): Attribute does not reference same object type", 
     207                $otype, $oalias, $refotype); 
     208            return; 
     209        }; 
    205210        my $robj = $self->get_object($aliasotype, $aliasoname) or do { 
    206211            $self->log(LA_DEBUG, "Oalias %s (%s): can fetch object %s/%s", 
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/User.pm

    r1898 r1907  
    14251425 
    14261426    my $stAddAlias = $base->db->prepare_cached( 
    1427         q{INSERT INTO "user" (name, uidnumber,            gidnumber, oalias) values 
    1428                              (?,    -nextval('ikey_seq'), ?,         ?)} 
     1427        q{INSERT INTO "user" (name, uidnumber,            gidnumber, oalias, oaliascache) values 
     1428                             (?,    -nextval('ikey_seq'), ?,         ?,      ?)} 
    14291429    ); 
    14301430 
    1431     my $res = $stAddAlias->execute($name, -1, $for); 
     1431    my $res = $stAddAlias->execute($name, -1, $for, $base->_derefObject($for)); 
    14321432    return $res ? 1 : 0; 
    14331433} 
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/objects.pm

    r1906 r1907  
    164164                my ($self, $value) = @_; 
    165165                $self->object->_update_aliases_ptr(); 
     166                $self->object->_update_aliases_cache(); 
    166167            }, 
    167168            checkinput => sub { 
     
    192193                return 1; 
    193194            }, 
     195        }, 
     196        oaliascache => { 
     197            inline  => 1, 
     198            reference => $class->type, 
     199            label => 'Cache for oalias data', 
     200            hide => 1, 
    194201        }, 
    195202        internobject => { 
     
    716723    } 
    717724 
     725    delete($self->base->{__cache}{"_" . $self->type}{$self->id}); 
    718726 
    719727    foreach my $attr (@updated_attributes) { 
    720728        my $oattr = $self->attribute($attr); 
    721729        my $ref = $oattr->reference or next; 
    722         my $attrref = sprintf('oalias=%s.%s.%s', $self->type, $self->id, $attr); 
     730        my $refname = sprintf('%s.%s.%s', $self->type, $self->id, $attr); 
     731        my $attrref = "oalias=$refname"; 
     732        warn "$ref, $refname"; 
    723733        foreach my $alias ($self->base->search_objects($ref, $attrref)) { 
    724             my $olias = $self->base->GetAlias($ref, $alias) or next; 
    725             $olias->_update_aliases_ptr; 
    726         } 
    727     } 
    728  
    729     delete($self->base->{__cache}{"_" . $self->type}{$self->id}); 
     734            my $oalias = $self->base->GetAlias($ref, $alias) or next; 
     735            warn $oalias; 
     736            $oalias->_update_aliases_cache; 
     737            $oalias->_update_aliases_ptr; 
     738        } 
     739    } 
     740 
    730741    scalar(@updated_attributes); 
    731742} 
     743 
    732744 
    733745=head2 SetNoDelete($value) 
     
    10311043        my @oaliases = (); 
    10321044        if ($attr ne 'oalias' && $attribute->reference) { 
    1033             @oaliases = $base->search_objects($attribute->reference, "oalias=$value"); 
     1045            @oaliases = $base->search_objects($attribute->reference, "oaliascache=$value"); 
    10341046            $base->log(LA_DEBUG, "Uniq search will match oaliases: %s", join(' ', @oaliases) || '(none)'); 
    10351047        } 
     
    11101122                my @oaliases = (); 
    11111123                if ($attr ne 'oalias' && $attribute->reference) { 
    1112                     @oaliases = $base->search_objects($attribute->reference, "oalias=$val"); 
     1124                    @oaliases = $base->search_objects($attribute->reference, "oaliascache=$val"); 
    11131125                    $base->log(LA_DEBUG, "Uniq search will match oaliases for %s: %s", $val, join(' ', @oaliases) || '(none)'); 
    11141126                } 
     
    12951307} 
    12961308 
     1309sub _update_aliases_cache { 
     1310    my ($self) = @_; 
     1311 
     1312    my $getoalias = $self->base->db->prepare( 
     1313        sprintf( 
     1314            q{ select * from %s where %s = ? }, 
     1315            $self->base->db->quote_identifier($self->_object_table), 
     1316            $self->base->db->quote_identifier($self->_key_field), 
     1317        ) 
     1318    ); 
     1319    $getoalias->execute($self->id); 
     1320    my $res = $getoalias->fetchrow_hashref or do { 
     1321        $self->base->log(LA_ERR, "Cannot find alias %s / %s", $self->type, $self->id); 
     1322        return; 
     1323    }; 
     1324    $getoalias->finish; 
     1325 
     1326    my $ref = $self->base->_derefObject($self->type, $res->{oalias}); 
     1327 
     1328    if (($ref->id || '') ne ($res->{oaliascache} || '')) { 
     1329        my $upd = $self->base->db->prepare( 
     1330            sprintf( 
     1331                q{update %s set oaliascache = ? where %s = ?}, 
     1332                $self->base->db->quote_identifier($self->_object_table), 
     1333                $self->base->db->quote_identifier($self->_key_field), 
     1334            ) 
     1335        ); 
     1336        $self->base->log(LA_DEBUG, "Updating Cache for alias %s => %s", $self->id, $ref->id); 
     1337        return $upd->execute($ref->id, $self->id); 
     1338    } 
     1339} 
     1340 
    129713411; 
    12981342 
Note: See TracChangeset for help on using the changeset viewer.