From cc87552a223a18e783f4cedb7785c610ef4dcba5 Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Mon, 31 May 2010 10:18:45 -0500 Subject: [PATCH] weaken all session refs --- lib/WebGUI/Asset.pm | 3 ++- lib/WebGUI/AssetExportHtml.pm | 21 ++++++++++++++++++--- lib/WebGUI/FormValidator.pm | 5 ++++- lib/WebGUI/Group.pm | 2 ++ lib/WebGUI/SQL.pm | 5 ++++- lib/WebGUI/Session.pm | 5 ++++- lib/WebGUI/Session/DateTime.pm | 5 ++++- lib/WebGUI/Session/ErrorHandler.pm | 9 ++++++++- lib/WebGUI/Session/Http.pm | 5 ++++- lib/WebGUI/Session/Icon.pm | 5 ++++- lib/WebGUI/Session/Id.pm | 5 ++++- lib/WebGUI/Session/Output.pm | 5 ++++- lib/WebGUI/Session/Privilege.pm | 5 ++++- lib/WebGUI/Session/Scratch.pm | 5 ++++- lib/WebGUI/Session/Setting.pm | 5 ++++- lib/WebGUI/Session/Stow.pm | 5 ++++- lib/WebGUI/Session/Style.pm | 5 ++++- lib/WebGUI/Session/Url.pm | 5 ++++- lib/WebGUI/Session/Var.pm | 2 ++ lib/WebGUI/User.pm | 2 ++ 20 files changed, 90 insertions(+), 19 deletions(-) diff --git a/lib/WebGUI/Asset.pm b/lib/WebGUI/Asset.pm index 48406cc9b..7215c3985 100644 --- a/lib/WebGUI/Asset.pm +++ b/lib/WebGUI/Asset.pm @@ -15,7 +15,7 @@ package WebGUI::Asset; =cut use Carp qw( croak confess ); -use Scalar::Util qw( blessed ); +use Scalar::Util qw( blessed weaken ); use Clone qw(clone); use JSON; use HTML::Packer; @@ -1826,6 +1826,7 @@ no revision date is available it will return undef. sub new { my ( $class, $session, $assetId, $className, $revisionDate ) = @_; + weaken( $session ); unless (defined $assetId) { $session->errorHandler->error("Asset constructor new() requires an assetId."); diff --git a/lib/WebGUI/AssetExportHtml.pm b/lib/WebGUI/AssetExportHtml.pm index a54566f59..7fcd0952b 100644 --- a/lib/WebGUI/AssetExportHtml.pm +++ b/lib/WebGUI/AssetExportHtml.pm @@ -312,20 +312,22 @@ sub exportBranch { my $indexFileName = $options->{indexFileName}; my $extrasUploadAction = $options->{extrasUploadAction}; my $rootUrlAction = $options->{rootUrlAction}; + my $exportedCount = 0; my $i18n; if ( $reportSession ) { $i18n = WebGUI::International->new($self->session, 'Asset'); } - my $exportedCount = 0; - my $assetIds = $self->exportGetDescendants(undef, $depth); - foreach my $assetId ( @{$assetIds} ) { + + my $exportAsset = sub { + my ( $assetId ) = @_; # Must be created once for each asset, since session is supposed to only handle # one main asset my $outputSession = $self->session->duplicate; my $osGuard = Scope::Guard->new(sub { $outputSession->close; + $outputSession = undef; }); my $asset = WebGUI::Asset->new($outputSession, $assetId); @@ -380,6 +382,16 @@ sub exportBranch { if ( $reportSession ) { $reportSession->output->print($i18n->get('done')); } + + #use Devel::Cycle; + #warn "CHECKING on " . ref( $asset ) . ' ID: ' . $asset->getId . "\n"; + #find_cycle( $asset ); + }; + + + my $assetIds = $self->exportGetDescendants(undef, $depth); + foreach my $assetId ( @{$assetIds} ) { + $exportAsset->( $assetId ); } # handle symlinking @@ -531,6 +543,9 @@ sub exportGetDescendants { orderByClause => 'assetData.url DESC', } ); + use Data::Dumper; + warn "Assets: " . scalar( @$assetIds ); + return $assetIds; } diff --git a/lib/WebGUI/FormValidator.pm b/lib/WebGUI/FormValidator.pm index 6c465c382..2b0491ddc 100644 --- a/lib/WebGUI/FormValidator.pm +++ b/lib/WebGUI/FormValidator.pm @@ -17,6 +17,7 @@ package WebGUI::FormValidator; use strict qw(vars subs); use WebGUI::HTML; use WebGUI::Pluggable; +use Scalar::Util qw( weaken ); =head1 NAME @@ -122,7 +123,9 @@ A reference to the current session. sub new { my $class = shift; my $session = shift; - bless {_session=>$session}, $class; + my $self = bless {_session=>$session}, $class; + weaken( $self->{_session} ); + return $self; } diff --git a/lib/WebGUI/Group.pm b/lib/WebGUI/Group.pm index 8d675f153..cc1e95b96 100644 --- a/lib/WebGUI/Group.pm +++ b/lib/WebGUI/Group.pm @@ -21,6 +21,7 @@ use WebGUI::Macro; use WebGUI::Utility; use WebGUI::Pluggable; use WebGUI::International; +use Scalar::Util qw( weaken ); =head1 NAME @@ -1519,6 +1520,7 @@ sub new { my $class = shift; $self->{_session} = shift; + weaken( $self->{_session} ); $self->{_groupId} = shift; my $override = shift; my $noAdmin = shift; diff --git a/lib/WebGUI/SQL.pm b/lib/WebGUI/SQL.pm index 0d5490284..bf271d9b6 100644 --- a/lib/WebGUI/SQL.pm +++ b/lib/WebGUI/SQL.pm @@ -15,6 +15,7 @@ package WebGUI::SQL; =cut use strict; +use Scalar::Util qw( weaken ); use DBI; use Tie::IxHash; use WebGUI::SQL::ResultSet; @@ -445,7 +446,9 @@ sub connect { $dbh->{$paramName} = $paramValue; } - bless {_dbh=>$dbh, _session=>$session}, $class; + my $self = bless {_dbh=>$dbh, _session=>$session}, $class; + weaken( $self->{_session} ); + return $self; } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Session.pm b/lib/WebGUI/Session.pm index 1ffcd69a5..09df92517 100644 --- a/lib/WebGUI/Session.pm +++ b/lib/WebGUI/Session.pm @@ -15,6 +15,7 @@ package WebGUI::Session; =cut use strict; +use Scalar::Util qw( weaken ); use WebGUI::Config; use WebGUI::SQL; use WebGUI::User; @@ -103,6 +104,7 @@ sub asset { my $asset = shift; if ($asset) { $self->{_asset} = $asset; + weaken( $self->{_asset} ); } return $self->{_asset}; } @@ -121,7 +123,8 @@ sub close { # Kill circular references. The literal list is so that the order # can be explicitly shuffled as necessary. - foreach my $key (qw/_asset _datetime _icon _slave _db _env _form _http _id _output _os _privilege _scratch _setting _stow _style _url _user _var _errorHandler/) { + # XXX Is this necessary when we have weakened session refs? + foreach my $key (qw/_asset _datetime _icon _slave _db _env _form _http _id _output _os _privilege _scratch _setting _stow _style _url _user _var _errorHandler _config /) { delete $self->{$key}; } } diff --git a/lib/WebGUI/Session/DateTime.pm b/lib/WebGUI/Session/DateTime.pm index a07f4f832..9128e6394 100644 --- a/lib/WebGUI/Session/DateTime.pm +++ b/lib/WebGUI/Session/DateTime.pm @@ -19,6 +19,7 @@ use DateTime; use DateTime::Format::Strptime; use DateTime::Format::Mail; use DateTime::TimeZone; +use Scalar::Util qw( weaken ); use Tie::IxHash; use WebGUI::International; use WebGUI::Utility; @@ -808,7 +809,9 @@ A reference to the current session. sub new { my $class = shift; my $session = shift; - bless {_session=>$session}, $class; + my $self = bless {_session=>$session}, $class; + weaken( $self->{_session} ); + return $self; } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Session/ErrorHandler.pm b/lib/WebGUI/Session/ErrorHandler.pm index 90a35467c..9384e08af 100644 --- a/lib/WebGUI/Session/ErrorHandler.pm +++ b/lib/WebGUI/Session/ErrorHandler.pm @@ -17,6 +17,7 @@ package WebGUI::Session::ErrorHandler; use strict; use Log::Log4perl; +use Scalar::Util qw( weaken ); #use Apache2::RequestUtil; use JSON; use HTML::Entities qw(encode_entities); @@ -161,6 +162,7 @@ The message you wish to add to the log. sub debug { my $self = shift; + return unless $self->canShowDebug || $self->getLogger->is_debug; my $message = shift; local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1; $self->getLogger->debug($message); @@ -197,6 +199,7 @@ The message you wish to add to the log. sub error { my $self = shift; + return unless $self->canShowDebug || $self->getLogger->is_error; my $message = shift; local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1; $self->getLogger->error($message); @@ -303,6 +306,7 @@ The message you wish to add to the log. sub info { my $self = shift; + return unless $self->canShowDebug || $self->getLogger->is_info; my $message = shift; local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1; $self->getLogger->info($message); @@ -326,7 +330,9 @@ sub new { my $session = shift; Log::Log4perl->init_once( $session->config->getWebguiRoot."/etc/log.conf" ); my $logger = Log::Log4perl->get_logger($session->config->getFilename); - bless {_queryCount=>0, _logger=>$logger, _session=>$session}, $class; + my $self = bless {_queryCount=>0, _logger=>$logger, _session=>$session}, $class; + weaken( $self->{_session} ); + return $self; } #---------------------------------------------------------------------------- @@ -471,6 +477,7 @@ The message you wish to add to the log. sub warn { my $self = shift; + return unless $self->canShowDebug || $self->getLogger->is_warn; my $message = shift; local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1; $self->getLogger->warn($message); diff --git a/lib/WebGUI/Session/Http.pm b/lib/WebGUI/Session/Http.pm index 220d1daf7..8cad25b1f 100644 --- a/lib/WebGUI/Session/Http.pm +++ b/lib/WebGUI/Session/Http.pm @@ -17,6 +17,7 @@ package WebGUI::Session::Http; use strict; use WebGUI::Utility; +use Scalar::Util qw( weaken ); =head1 NAME @@ -267,7 +268,9 @@ A reference to the current session. sub new { my $class = shift; my $session = shift; - bless {_session=>$session}, $class; + my $self = bless {_session=>$session}, $class; + weaken( $self->{_session} ); + return $self; } diff --git a/lib/WebGUI/Session/Icon.pm b/lib/WebGUI/Session/Icon.pm index ef8b0415e..4abfe3eb5 100644 --- a/lib/WebGUI/Session/Icon.pm +++ b/lib/WebGUI/Session/Icon.pm @@ -16,6 +16,7 @@ package WebGUI::Session::Icon; use strict; use WebGUI::International; +use Scalar::Util qw( weaken ); =head1 NAME @@ -510,7 +511,9 @@ A reference to the current session. sub new { my $class = shift; my $session = shift; - bless {_session=>$session}, $class; + my $self = bless {_session=>$session}, $class; + weaken( $self->{_session} ); + return $self; } diff --git a/lib/WebGUI/Session/Id.pm b/lib/WebGUI/Session/Id.pm index 950fd64c2..b8d31d72c 100644 --- a/lib/WebGUI/Session/Id.pm +++ b/lib/WebGUI/Session/Id.pm @@ -17,6 +17,7 @@ package WebGUI::Session::Id; use strict; use Digest::MD5; +use Scalar::Util qw( weaken ); use Time::HiRes qw( gettimeofday usleep ); use MIME::Base64; @@ -121,7 +122,9 @@ A reference to the current session. sub new { my $class = shift; my $session = shift; - bless {_session=>$session}, $class; + my $self = bless {_session=>$session}, $class; + weaken( $self->{_session} ); + return $self; } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Session/Output.pm b/lib/WebGUI/Session/Output.pm index fdff0c997..82f2abeeb 100644 --- a/lib/WebGUI/Session/Output.pm +++ b/lib/WebGUI/Session/Output.pm @@ -16,6 +16,7 @@ package WebGUI::Session::Output; use strict; use WebGUI::Macro; +use Scalar::Util qw( weaken ); =head1 NAME @@ -65,7 +66,9 @@ A reference to the current session. sub new { my $class = shift; my $session = shift; - bless {_session=>$session}, $class; + my $self = bless {_session=>$session}, $class; + weaken( $self->{_session} ); + return $self; } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Session/Privilege.pm b/lib/WebGUI/Session/Privilege.pm index c6b0b7161..07c6a9c18 100644 --- a/lib/WebGUI/Session/Privilege.pm +++ b/lib/WebGUI/Session/Privilege.pm @@ -15,6 +15,7 @@ package WebGUI::Session::Privilege; =cut use strict; +use Scalar::Util qw( weaken ); use WebGUI::International; use WebGUI::Operation::Auth; @@ -145,7 +146,9 @@ A reference to the current session. sub new { my $class = shift; my $session = shift; - bless {_session=>$session}, $class; + my $self = bless {_session=>$session}, $class; + weaken( $self->{_session} ); + return $self; } diff --git a/lib/WebGUI/Session/Scratch.pm b/lib/WebGUI/Session/Scratch.pm index d069fd694..6469b5673 100644 --- a/lib/WebGUI/Session/Scratch.pm +++ b/lib/WebGUI/Session/Scratch.pm @@ -16,6 +16,7 @@ package WebGUI::Session::Scratch; use strict; use WebGUI::International; +use Scalar::Util qw( weaken ); =head1 NAME @@ -191,7 +192,9 @@ sub new { my $class = shift; my $session = shift; my $data = $session->db->buildHashRef("select name,value from userSessionScratch where sessionId=?",[$session->getId], {noOrder => 1}); - bless {_session=>$session, _data=>$data}, $class; + my $self = bless {_session=>$session, _data=>$data}, $class; + weaken( $self->{_session} ); + return $self; } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Session/Setting.pm b/lib/WebGUI/Session/Setting.pm index 60f0c5bd2..f5915a518 100644 --- a/lib/WebGUI/Session/Setting.pm +++ b/lib/WebGUI/Session/Setting.pm @@ -15,6 +15,7 @@ package WebGUI::Session::Setting; =cut use strict; +use Scalar::Util qw( weaken ); =head1 NAME @@ -146,7 +147,9 @@ sub new { my $class = shift; my $session = shift; my $settings = $session->db->buildHashRef("select * from settings", [], {noOrder => 1}); - bless {_settings=>$settings, _session=>$session}, $class; + my $self = bless {_settings=>$settings, _session=>$session}, $class; + weaken( $self->{_session} ); + return $self; } diff --git a/lib/WebGUI/Session/Stow.pm b/lib/WebGUI/Session/Stow.pm index 5345b07cf..af81419e7 100644 --- a/lib/WebGUI/Session/Stow.pm +++ b/lib/WebGUI/Session/Stow.pm @@ -15,6 +15,7 @@ package WebGUI::Session::Stow; =cut use strict; +use Scalar::Util qw( weaken ); =head1 NAME @@ -156,7 +157,9 @@ A reference to the session. sub new { my $class = shift; my $session = shift; - bless {_session=>$session}, $class; + my $self = bless {_session=>$session}, $class; + weaken( $self->{_session} ); + return $self; } diff --git a/lib/WebGUI/Session/Style.pm b/lib/WebGUI/Session/Style.pm index ef5d536c5..503008429 100644 --- a/lib/WebGUI/Session/Style.pm +++ b/lib/WebGUI/Session/Style.pm @@ -17,6 +17,7 @@ package WebGUI::Session::Style; use strict; use Tie::CPHash; +use Scalar::Util qw( weaken ); use WebGUI::International; use WebGUI::Macro; use WebGUI::Asset::Template; @@ -181,7 +182,9 @@ A reference to the current session. sub new { my $class = shift; my $session = shift; - bless {_session=>$session}, $class; + my $self = bless {_session=>$session}, $class; + weaken( $self->{_session} ); + return $self; } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Session/Url.pm b/lib/WebGUI/Session/Url.pm index bcc5bf8f2..770fc08a8 100644 --- a/lib/WebGUI/Session/Url.pm +++ b/lib/WebGUI/Session/Url.pm @@ -18,6 +18,7 @@ package WebGUI::Session::Url; use strict; use URI; use URI::Escape; +use Scalar::Util qw( weaken ); use WebGUI::International; use WebGUI::Utility; @@ -425,7 +426,9 @@ A reference to the current session. sub new { my $class = shift; my $session = shift; - bless {_session=>$session}, $class; + my $self = bless {_session=>$session}, $class; + weaken( $self->{_session} ); + return $self; } #------------------------------------------------------------------- diff --git a/lib/WebGUI/Session/Var.pm b/lib/WebGUI/Session/Var.pm index 00eb08f7f..b431d4ec7 100644 --- a/lib/WebGUI/Session/Var.pm +++ b/lib/WebGUI/Session/Var.pm @@ -15,6 +15,7 @@ package WebGUI::Session::Var; =cut use strict; +use Scalar::Util qw( weaken ); =head1 NAME @@ -171,6 +172,7 @@ sub new { my $class = shift; my $session = shift; my $self = bless {_session=>$session}, $class; + weaken( $self->{_session} ); my $sessionId = shift; my $noFuss = shift; if ($sessionId eq "") { ##New session diff --git a/lib/WebGUI/User.pm b/lib/WebGUI/User.pm index 97ea00130..c13ed19f7 100644 --- a/lib/WebGUI/User.pm +++ b/lib/WebGUI/User.pm @@ -26,6 +26,7 @@ use WebGUI::Shop::AddressBook; use JSON; use WebGUI::Exception; use WebGUI::ProfileField; +use Scalar::Util qw( weaken ); =head1 NAME @@ -1077,6 +1078,7 @@ sub new { my $self = $cache->get || {}; bless $self, $class; $self->{_session} = $session; + weaken( $self->{_session} ); unless ($self->{_userId} && $self->{_user}{username}) { my %user; tie %user, 'Tie::CPHash';