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);