cvsuser     02/04/05 14:00:12

  Modified:    P5EEx/Blue/P5EEx/Blue Repository.pm
  Log:
  fixed many things in the caching routines to finally support update capability from 
the Widget::HTML::DataTable class
  
  Revision  Changes    Path
  1.11      +92 -18    p5ee/P5EEx/Blue/P5EEx/Blue/Repository.pm
  
  Index: Repository.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/Repository.pm,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -w -r1.10 -r1.11
  --- Repository.pm     19 Mar 2002 22:39:02 -0000      1.10
  +++ Repository.pm     5 Apr 2002 22:00:12 -0000       1.11
  @@ -1,6 +1,6 @@
   
   #############################################################################
  -## $Id: Repository.pm,v 1.10 2002/03/19 22:39:02 spadkins Exp $
  +## $Id: Repository.pm,v 1.11 2002/04/05 22:00:12 spadkins Exp $
   #############################################################################
   
   package P5EEx::Blue::Repository;
  @@ -1280,8 +1280,15 @@
   # $row = $rep->get_row ($table, $key);
   sub get_row {
       my ($self, $table, $key) = @_;
  +    $self->load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
       my ($row, $keycolidxref, $cacherows, $cacherowidx, $cacheparamvalues, $rowidx, 
$cachecolumns);
   
  +    $keycolidxref = $self->{table}{$table}{prikeyidx};
  +    if (!$keycolidxref) {
  +       $self->{context}->add_message("Table '$table' not configured for cached 
access ('prikey' not set in get_row())");
  +       return [];
  +    }
  +
       $cacherows    = $self->{table}{$table}{cache}{rows};
       $cacherowidx  = $self->{table}{$table}{cache}{rowidx};
   
  @@ -1298,7 +1305,6 @@
       else {
           my (%paramvalues, $i, @key, $keycolidx);
   
  -        $keycolidxref = $self->{table}{$table}{prikeyidx};
           $cachecolumns = $self->{table}{$table}{cache}{columns};
   
           @key = split(/,/,$key);
  @@ -1351,8 +1357,15 @@
   
   sub get_rows {
       my ($self, $table, $colsref, $paramvalueshashref, $keysref) = @_;
  +    $self->load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
       my ($rows, $row, $keycolidxref, $cacherows, $cacherowidx, $cachecolumns, $key);
   
  +    $keycolidxref = $self->{table}{$table}{prikeyidx};
  +    if (!$keycolidxref) {
  +       $self->{context}->add_message("Table '$table' not configured for cached 
access ('prikey' not set in get_rows())");
  +       return [];
  +    }
  +
       #print "rep->get_rows(", ($colsref ? join(",", @$colsref) : "undef"), ")\n";
       $self->add_columns_fetched($table, $colsref) if (defined $colsref);
   
  @@ -1360,10 +1373,10 @@
       #print "rep->get_rows(", ($cachecolumns ? join(",", @$cachecolumns) : "undef"), 
")\n";
       $rows = $self->select_rows($table, $cachecolumns, undef, $paramvalueshashref);
   
  -    $keycolidxref = $self->{table}{$table}{prikeyidx};
       $cacherows    = $self->{table}{$table}{cache}{rows};
       $cacherowidx  = $self->{table}{$table}{cache}{rowidx};
   
  +
       if (defined $keycolidxref) { # can't cache the rows by key unless we know the 
key
           foreach $row (@$rows) {
               $key = join(",", @{$row}[@$keycolidxref]);
  @@ -1399,11 +1412,17 @@
   # $rep->set_rows  ($table, \@cols, \@rows);
   sub set_rows {
       my ($self, $table, $colsref, $rows) = @_;
  +    $self->load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
       my (@colidx, $row, $i, $cacherowidx, $prikeyidx, $update_first);
  -    $self->add_columns_fetched($table, $colsref, \@colidx);
   
       $prikeyidx = $self->{table}{$table}{prikeyidx};
  -    $prikeyidx = \@colidx if (!defined $prikeyidx);
  +    if (!$prikeyidx) {
  +       $self->{context}->add_message("Table '$table' not configured for updating 
('prikey' not set in set_rows())");
  +       return 0;
  +    }
  +
  +    $self->add_columns_fetched($table, $colsref, \@colidx);
  +
       $update_first = 1;
   
       $self->store_rows ($table, $colsref, $rows, $prikeyidx, $update_first);
  @@ -1443,6 +1462,7 @@
   # @idx  = $rep->get_column_idx($table, \@cols);
   sub get_column_idx {
       my ($self, $table, $colsref) = @_;
  +    $self->load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
       my (@idx);
   }
   
  @@ -1491,6 +1511,7 @@
   
   sub get_value {
       my ($self, $table, $key, $column) = @_;
  +    $self->load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
       my ($value, $row, $colidx);
       $colidx = $self->{table}{$table}{cache}{columnidx}{$column};
       if (!defined $colidx) {
  @@ -1526,6 +1547,7 @@
   
   sub get_values {
       my ($self, $table, $key, $colsref) = @_;
  +    $self->load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
       my (@colidx, $row);
       $self->add_columns_fetched($table, $colsref, \@colidx);
       $row = $self->get_row($table, $key);
  @@ -1572,7 +1594,15 @@
   
   sub set_value {
       my ($self, $table, $key, $column, $value) = @_;
  -    my ($row, $colidx, $cacherowidx);
  +    $self->load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
  +    my ($row, $colidx, $cacherowidx, $prikeyidx);
  +
  +    $prikeyidx = $self->{table}{$table}{prikeyidx};
  +    if (!$prikeyidx) {
  +       $self->{context}->add_message("Table '$table' not configured for updating 
('prikey' not set in set_value())");
  +       return 0;
  +    }
  +
       $colidx = $self->{table}{$table}{cache}{columnidx}{$column};
       if (!defined $colidx) {
           $self->add_columns_fetched($table, [ $column ]);
  @@ -1617,9 +1647,24 @@
   
   sub set_values {
       my ($self, $table, $key, $colsref, $valuesref) = @_;
  -    my (@colidx, $row, $i, $cacherowidx);
  +    $self->load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
  +
  +    $self->{context}->dbgprint("Rep::DBI->set_values($table, $key, [", 
join(",",@$colsref), "], [",
  +        join(",",@$valuesref), "])")
  +        if ($P5EEx::Blue::DEBUG && $self->{context}->dbg(2));
  +
  +    my (@colidx, $row, $i, $cacherowidx, $prikeyidx);
  +
  +    $prikeyidx = $self->{table}{$table}{prikeyidx};
  +
  +    if (!$prikeyidx) {
  +       $self->{context}->add_message("Table '$table' not configured for updating 
('prikey' not set in set_values())");
  +       return 0;
  +    }
  +
       $self->add_columns_fetched($table, $colsref, \@colidx);
       $cacherowidx = $self->{table}{$table}{cache}{rowidx}{$key};
  +
       if (defined $cacherowidx) {
           $row = $self->{table}{$table}{cache}{rows}[$cacherowidx];
       }
  @@ -1627,9 +1672,11 @@
           $row = $self->get_row($table, $key);
           $cacherowidx = $self->{table}{$table}{cache}{rowidx}{$key};
       }
  +
       for ($i = 0; $i <= $#$colsref; $i++) {
           $row->[$colidx[$i]] = $valuesref->[$i];
       }
  +
       $self->{table}{$table}{cache}{rowchange}[$cacherowidx] = "U";
   }
   
  @@ -1666,6 +1713,8 @@
   
   sub get_key {
       my ($self, $table, $colsref, $valueref, $keycolidxref) = @_;
  +    $self->load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
  +
       #my (@keys);
       #$self->get_rows($table, undef, $paramvalueshashref, \@keys);
       #if (wantarray) {
  @@ -1697,6 +1746,7 @@
   
   sub get_keys {
       my ($self, $table, $paramvalueshashref) = @_;
  +    $self->load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
       my (@keys);
       $self->get_rows($table, undef, $paramvalueshashref, \@keys);
       if (wantarray) {
  @@ -1732,6 +1782,7 @@
   # TODO:
   sub get_related_keys {
       my ($self, $table, $key, $related_table, $relation) = @_;
  +    $self->load_table_metadata($table) if (!defined $self->{table}{$table}{loaded});
       my (@keys);
   }
   
  @@ -1817,6 +1868,22 @@
       $rep->add_columns_fetched ($table, \@cols);
       $rep->add_columns_fetched ($table, \@cols, \@colidx);
   
  +Tables may have a huge number of valid columns.
  +It may be prohibitively expensive to request all columns of a table
  +whenever the contents of a single column are required.
  +
  +The add_columns_fetched() method is the way that the Repository
  +can be alerted that the specified columns will be required.
  +
  +All of the cached row operations operate with a set of columns which is
  +the union of all of the columns submitted at various times
  +via the add_columns_fetched() method.
  +
  +The add_columns_fetched() method is used to ensure that the
  +required columns will be in the cache.  As a result, the indexes
  +of those columns may be returned in the (optional) reference
  +to an array ($colidx).
  +
   =cut
   
   sub add_columns_fetched {
  @@ -1873,9 +1940,11 @@
       my ($self, $table) = @_;
       my ($prikeycolumns, @prikeyidx);
       $prikeycolumns = $self->{table}{$table}{prikey};
  +    if (ref($prikeycolumns) eq "ARRAY") {
       $self->add_columns_fetched($table, $prikeycolumns, \@prikeyidx);
       $self->{table}{$table}{prikeyidx} = \@prikeyidx;
   }
  +}
   
   #############################################################################
   # clear_columns_fetched()
  @@ -2001,12 +2070,22 @@
   sub commit {
       my $self = shift;
       my ($table, $rows, $rowidx, $rowchange, $change, $colref, $prikeyidx);
  +
       foreach $table (@{$self->{tables}}) {
  +
  +        $rowchange = $self->{table}{$table}{cache}{rowchange};
  +
  +        if ($rowchange && $#$rowchange > -1) {
  +
           $prikeyidx = $self->{table}{$table}{prikeyidx};
  +            if (!$prikeyidx) {
  +                $self->{context}->add_message("Table '$table' not configured for 
updating ('prikey' not set in commit())");
  +                next;
  +            }
  +
           $rows      = $self->{table}{$table}{cache}{rows};
  -        $rowchange = $self->{table}{$table}{cache}{rowchange};
           $colref    = $self->{table}{$table}{cache}{columns};
  -        if ($#$rowchange > -1) {
  +
               for ($rowidx = 0; $rowidx <= $#$rows; $rowidx++) {
                   $change = $rowchange->[$rowidx];
                   next if (!defined $change);
  @@ -2316,11 +2395,6 @@
   
           $table_def->{column_labels}{$column} = $column_def->{label};
       }
  -
  -    # if a primary key is not defined, assume it is the first column
  -    #if (!defined $table_def->{prikey}) {
  -    #    $table_def->{prikey} = [ $table_def->{columns}[0] ];
  -    #}
   
       # predefine that certain required columns will be in the result set
       $self->set_required_columns_fetched($table);
  
  
  


Reply via email to