- Added cache to settings which increased performance by .02 seconds per

page.
 - Added user cache which increased performance by more than .1 seconds per
   page.
 - Added some new indicies to make asset queries .01 to .1 seconds faster per query.
 - fix [ 1274488 ] Visitors language not recognized 6.7.2
This commit is contained in:
JT Smith 2005-09-10 15:37:03 +00:00
parent 1ca2a2718b
commit 62d1c58ae4
11 changed files with 230 additions and 89 deletions

View file

@ -20,6 +20,12 @@
- fix [ 1281516 ] Undefined subroutine &WebGUI::Asset::File::quote runHourly
- fix [ 1281430 ] www_restoreList should be in AssetTrash.pm
- fix help links on the Asset add/edit forms
- Added cache to settings which increased performance by .02 seconds per
page.
- Added user cache which increased performance by more than .1 seconds per
page.
- Added some new indicies to make asset queries .01 to .1 seconds faster per query.
- fix [ 1274488 ] Visitors language not recognized 6.7.2
6.7.3

View file

@ -4,6 +4,7 @@ use Getopt::Long;
use WebGUI::Session;
use WebGUI::SQL;
use WebGUI::Asset;
use WebGUI::Setting;
my $toVersion = "6.7.4";
my $configFile;
@ -14,10 +15,18 @@ start();
updatePageTemplates();
addDebug();
fixFutureDates();
makeQueriesFaster();
finish();
#-------------------------------------------------
sub makeQueriesFaster {
print "\tMaking queries a little faster.\n" unless ($quiet);
WebGUI::SQL->write("alter table assetData add index assetId_url_revisionDate_status_tagId (assetId,url,revisionDate,status,tagId)");
WebGUI::SQL->write("alter table asset add index className_assetId_state (className,assetId,state)");
}
#-------------------------------------------------
sub fixFutureDates {
print "\tFixing end dates which appear too far in the future.\n" unless ($quiet);
@ -27,8 +36,8 @@ sub fixFutureDates {
#-------------------------------------------------
sub addDebug {
print "\tAdding more debug options.\n" unless ($quiet);
WebGUI::SQL->write("insert into settings values ('debugIp','')");
WebGUI::SQL->write("insert into settings values ('showPerformanceIndicators','0')");
WebGUI::Setting::add("debugIp","");
WebGUI::Setting::add("showPerformanceIndicators","0");
}
#-------------------------------------------------

View file

@ -77,7 +77,7 @@ Flushes the caching system. Must be overridden.
=cut
sub flush {
rmtree($session{config}{uploadsPath}.$session{os}{slash}."temp");
rmtree($WebGUI::Session::session{config}{uploadsPath}.$WebGUI::Session::session{os}{slash}."temp");
}
#-------------------------------------------------------------------
@ -112,7 +112,7 @@ A subdivider to store this cache under. When building your own cache plug-in def
sub new {
my $cache;
my $class = shift;
if($session{config}{memcached_servers}) {
if($WebGUI::Session::session{config}{memcached_servers}) {
require WebGUI::Cache::Memcached;
return WebGUI::Cache::Memcached->new(@_);
} else {
@ -197,7 +197,7 @@ sub setByHTTP {
$userAgent->agent("WebGUI/".$WebGUI::VERSION);
$userAgent->timeout(30);
my $header = new HTTP::Headers;
my $referer = "http://webgui.http.request/".$session{env}{SERVER_NAME}.$session{env}{REQUEST_URI};
my $referer = "http://webgui.http.request/".$WebGUI::Session::session{env}{SERVER_NAME}.$WebGUI::Session::session{env}{REQUEST_URI};
chomp $referer;
$header->referer($referer);
my $request = new HTTP::Request (GET => $url, $header);

View file

@ -97,7 +97,7 @@ Retrieve content from the filesystem cache.
sub get {
my $self = shift;
return undef if ($session{config}{disableCache});
return undef if ($WebGUI::Session::session{config}{disableCache});
if (open(FILE,"<".$self->getFolder()."/expires")) {
my $expires = <FILE>;
close(FILE);
@ -136,10 +136,10 @@ Figures out what the cache root for this namespace should be. A class method.
sub getNamespaceRoot {
my $self = shift;
my $root = $session{config}{fileCacheRoot};
my $root = $WebGUI::Session::session{config}{fileCacheRoot};
unless ($root) {
if ($session{os}{windowsish}) {
$root = $session{env}{TEMP} || $session{env}{TMP} || "/temp";
if ($WebGUI::Session::session{os}{windowsish}) {
$root = $WebGUI::Session::session{env}{TEMP} || $WebGUI::Session::session{env}{TMP} || "/temp";
} else {
$root = "/tmp";
}
@ -205,7 +205,7 @@ sub new {
my $cache;
my $class = shift;
my $key = $class->parseKey(shift);
my $namespace = shift || $session{config}{configFile};
my $namespace = shift || $WebGUI::Session::session{config}{configFile};
bless {_key=>$key, _namespace=>$namespace}, $class;
}

View file

@ -89,7 +89,7 @@ Retrieve content from the filesystem cache.
=cut
sub get {
return undef if ($session{config}{disableCache});
return undef if ($WebGUI::Session::session{config}{disableCache});
return $_[0]->{_cache}->get($_[0]->{_key});
}
@ -113,14 +113,14 @@ sub new {
my $cache;
my $class = shift;
my $key = $class->parseKey(shift);
my $namespace = shift || $session{config}{configFile};
my $namespace = shift || $WebGUI::Session::session{config}{configFile};
# Overcome maximum key length of 255 characters
if(length($key.$namespace) > 255) {
$key = Digest::MD5::md5_base64($key);
}
my $servers = $session{config}{memcached_servers};
my $servers = $WebGUI::Session::session{config}{memcached_servers};
$servers = [ $servers ] unless (ref $servers);
my %options = (

View file

@ -20,6 +20,7 @@ use WebGUI::Icon;
use WebGUI::International;
use WebGUI::Privilege;
use WebGUI::Session;
use WebGUI::Setting;
use WebGUI::Style;
use WebGUI::SQL;
use WebGUI::URL;
@ -279,8 +280,7 @@ sub www_saveSettings {
next;
}
unless ($key eq "op") {
$session{setting}{$key} = $value;
WebGUI::SQL->write("update settings set value=".quote($value)." where name='$key'");
WebGUI::Setting::set($key,$value);
}
}
return www_editSettings();

View file

@ -16,7 +16,7 @@ use WebGUI::FormProcessor;
use WebGUI::HTMLForm;
use WebGUI::HTTP;
use WebGUI::Session;
use WebGUI::SQL;
use WebGUI::Setting;
use WebGUI::Style;
use WebGUI::User;
@ -91,10 +91,10 @@ sub www_setup {
$f->submit;
$output .= $f->print;
} elsif ($session{form}{step} eq "3") {
WebGUI::SQL->write("update settings set value=".quote(WebGUI::FormProcessor::text("companyName"))." where name='companyName'");
WebGUI::SQL->write("update settings set value=".quote(WebGUI::FormProcessor::url("companyURL"))." where name='companyURL'");
WebGUI::SQL->write("update settings set value=".quote(WebGUI::FormProcessor::email("companyEmail"))." where name='companyEmail'");
WebGUI::SQL->write("delete from settings where name='specialState'");
WebGUI::Setting::set('companyName',WebGUI::FormProcessor::text("companyName"));
WebGUI::Setting::set('companyURL',WebGUI::FormProcessor::url("companyURL"));
WebGUI::Setting::set('companyEmail',WebGUI::FormProcessor::email("companyEmail"));
WebGUI::Setting::remove('specialState');
WebGUI::HTTP::setRedirect($session{env}{SCRIPT_NAME});
return "";
} else {

View file

@ -24,7 +24,9 @@ use Tie::CPHash;
use WebGUI::Config;
use WebGUI::ErrorHandler;
use WebGUI::Id;
use WebGUI::Setting;
use WebGUI::SQL;
use WebGUI::User;
use WebGUI::Utility;
use URI::Escape;
@ -93,44 +95,20 @@ sub _setupSessionVars {
#-------------------------------------------------------------------
sub _setupUserInfo {
my (%default, $key, %user, $uid, %profile, $value);
tie %user, 'Tie::CPHash';
$uid = $_[0] || 1;
%user = WebGUI::SQL->quickHash("select * from users where userId=".quote($uid));
if ($user{userId} eq "") {
_setupUserInfo("1");
} else {
%profile = WebGUI::SQL->buildHash("select userProfileField.fieldName, userProfileData.fieldData
from userProfileData, userProfileField where userProfileData.fieldName=userProfileField.fieldName
and userProfileData.userId=".quote($user{userId}));
%user = (%user, %profile);
$user{language} = $session{page}{languageId} if ($user{userId} eq '1' || $user{language} eq '');
%default = WebGUI::SQL->buildHash("select fieldName, dataDefault from userProfileField where profileCategoryId='4'");
foreach $key (keys %default) {
if ($user{$key} eq "") {
$value = eval($default{$key});
if (ref $value eq "ARRAY") {
$user{$key} = $$value[0];
} else {
$user{$key} = $value;
}
}
}
$session{user} = \%user;
if ($session{env}{MOD_PERL}) {
my $r;
if ($mod_perl::VERSION >= 1.999023) {
$r = Apache2::RequestUtil->request;
} else {
$r = Apache->request;
}
if(defined($r)) {
$r->user($session{user}{username});
}
}
$session{user}{alias} = $session{user}{username} if ($session{user}{alias} =~ /^\W+$/);
$session{user}{alias} = $session{user}{username} if ($session{user}{alias} eq "");
}
my $u = WebGUI::User->new(shift);
%{$session{user}} = (%{$u->{_profile}}, %{$u->{_user}});
if ($session{env}{MOD_PERL}) {
my $r;
if ($mod_perl::VERSION >= 1.999023) {
$r = Apache2::RequestUtil->request;
} else {
$r = Apache->request;
}
if(defined($r)) {
$r->user($session{user}{username});
}
}
$session{user}{alias} = $session{user}{username} if ($session{user}{alias} =~ /^\W+$/ || $session{user}{alias} eq "");
}
#-------------------------------------------------------------------
@ -342,8 +320,15 @@ sub open {
}
}
###----------------------------
### evironment variables from web server
$session{env} = \%ENV;
### check to see if client is proxied and adjust remote_addr as necessary
if ($ENV{HTTP_X_FORWARDED_FOR} ne "") {
$session{env}{REMOTE_ADDR} = $ENV{HTTP_X_FORWARDED_FOR};
}
###----------------------------
### global system settings (from settings table)
$session{setting} = WebGUI::SQL->buildHashRef("select name,value from settings");
$session{setting} = WebGUI::Setting::get();
###----------------------------
### CGI object
$CGI::POST_MAX=1024 * $session{setting}{maxAttachmentSize};
@ -355,13 +340,6 @@ sub open {
$session{cgi} = CGI->new();
}
###----------------------------
### evironment variables from web server
$session{env} = \%ENV;
### check to see if client is proxied and adjust remote_addr as necessary
if ($ENV{HTTP_X_FORWARDED_FOR} ne "") {
$session{env}{REMOTE_ADDR} = $ENV{HTTP_X_FORWARDED_FOR};
}
###----------------------------
### form variables
foreach ($session{cgi}->param) {
$session{form}{$_} = $session{cgi}->param($_);

134
lib/WebGUI/Setting.pm Normal file
View file

@ -0,0 +1,134 @@
package WebGUI::Setting;
=head1 LEGAL
-------------------------------------------------------------------
WebGUI is Copyright 2001-2005 Plain Black Corporation.
-------------------------------------------------------------------
Please read the legal notices (docs/legal.txt) and the license
(docs/license.txt) that came with this distribution before using
this software.
-------------------------------------------------------------------
http://www.plainblack.com info@plainblack.com
-------------------------------------------------------------------
=cut
use strict;
use WebGUI::Session;
use WebGUI::SQL;
=head1 NAME
Package WebGUI::Setting;
=head1 DESCRIPTION
This package stores and retrieves settings. It is generally only used internally by WebGUI and not by external scripts.
=head1 SYNOPSIS
use WebGUI::Setting;
WebGUI::Setting::set($name,$value);
$hashRef = WebGUI::Setting::get();
=head1 FUNCTIONS
These subroutines are available from this package:
=cut
#-------------------------------------------------------------------
=head2 add ( name, value )
Creates a new setting.
=head3 name
The name of the setting to add.
=head3 value
The initial value of the setting.
=cut
sub add {
my $name = shift;
my $value = shift;
$WebGUI::Session::session{setting}{$name} = $value;
WebGUI::SQL->write("insert into settings values (".quote($name).",".quote($value).")");
WebGUI::Cache->new("settings")->delete;
}
#-------------------------------------------------------------------
=head2 get ( )
Returns a hash reference containing all the settings.
=cut
sub get {
my $cache = WebGUI::Cache->new("settings");
my $settings = $cache->get;
unless (defined $settings) {
$settings = WebGUI::SQL->buildHashRef("select * from settings");
$cache->set($settings,60*60*24);
}
return $settings;
}
#-------------------------------------------------------------------
=head2 remove ( name )
Removes a setting permanently.
=head3 name
The name of the setting to set.
=cut
sub remove {
my $name = shift;
WebGUI::SQL->write("delete from settings where name=".quote($name));
WebGUI::Cache->new("settings")->delete;
}
#-------------------------------------------------------------------
=head2 set ( name, value )
Sets the value of a setting.
=head3 name
The name of the setting to set.
=head3 value
The value of the setting.
=cut
sub set {
my $name = shift;
my $value = shift;
$WebGUI::Session::session{setting}{$name} = $value;
WebGUI::SQL->write("update settings set value=".quote($value)." where name=".quote($name));
WebGUI::Cache->new("settings")->delete;
}
1;

View file

@ -15,14 +15,11 @@ package WebGUI::User;
=cut
use strict;
use WebGUI::DateTime;
use WebGUI::Grouping;
use WebGUI::Cache;
use WebGUI::Id;
use WebGUI::International;
use WebGUI::Session;
use WebGUI::SQL;
use WebGUI::URL;
use WebGUI::Operation::Auth;
=head1 NAME
@ -60,6 +57,7 @@ These methods are available from this class:
sub _create {
my $userId = shift || WebGUI::Id::generate();
WebGUI::SQL->write("insert into users (userId,dateCreated) values (".quote($userId).",".time().")");
require WebGUI::Grouping;
WebGUI::Grouping::addUsersToGroups([$userId],[2,7]);
return $userId;
}
@ -81,6 +79,7 @@ An override for the default offset of the grouping. Specified in seconds.
=cut
sub addToGroups {
require WebGUI::Grouping;
WebGUI::Grouping::addUsersToGroups([$_[0]->{_userId}],$_[1],$_[2]);
}
@ -130,8 +129,10 @@ Deletes this user.
sub delete {
my $class = shift;
require WebGUI::Operation::Auth;
WebGUI::SQL->write("delete from users where userId=".quote($class->{_userId}));
WebGUI::SQL->write("delete from userProfileData where userId=".quote($class->{_userId}));
require WebGUI::Grouping;
WebGUI::Grouping::deleteUsersFromGroups([$class->{_userId}],WebGUI::Grouping::getGroupsForUser($class->{_userId}));
WebGUI::SQL->write("delete from messageLog where userId=".quote($class->{_userId}));
@ -157,6 +158,7 @@ An array reference containing a list of groups.
=cut
sub deleteFromGroups {
require WebGUI::Grouping;
WebGUI::Grouping::deleteUsersFromGroups([$_[0]->{_userId}],$_[1]);
}
@ -231,28 +233,39 @@ A unique ID to use instead of the ID that WebGUI will generate for you. It must
=cut
sub new {
my ($class, $userId, %default, $value, $key, %user, %profile);
tie %user, 'Tie::CPHash';
$class = shift;
$userId = shift || 1;
my $class = shift;
my $userId = shift || 1;
my $overrideId = shift;
$userId = _create($overrideId) if ($userId eq "new");
%user = WebGUI::SQL->quickHash("select * from users where userId=".quote($userId));
%profile = WebGUI::SQL->buildHash("select userProfileField.fieldName, userProfileData.fieldData
from userProfileField, userProfileData where userProfileField.fieldName=userProfileData.fieldName and
userProfileData.userId=".quote($user{userId}));
%default = WebGUI::SQL->buildHash("select fieldName, dataDefault from userProfileField where profileCategoryId=4");
foreach $key (keys %default) {
if ($profile{$key} eq "") {
$value = eval($default{$key});
if (ref $value eq "ARRAY") {
my $cache = WebGUI::Cache->new(["user",$userId]);
my $userData = $cache->get;
unless ($userData->{_userId}) {
my %user;
tie %user, 'Tie::CPHash';
%user = WebGUI::SQL->quickHash("select * from users where userId=".quote($userId));
my %profile = WebGUI::SQL->buildHash("select userProfileField.fieldName, userProfileData.fieldData
from userProfileField, userProfileData where userProfileField.fieldName=userProfileData.fieldName and
userProfileData.userId=".quote($user{userId}));
my %default = WebGUI::SQL->buildHash("select fieldName, dataDefault from userProfileField where profileCategoryId=4");
foreach my $key (keys %default) {
my $value;
if ($profile{$key} eq "") {
$value = eval($default{$key});
if (ref $value eq "ARRAY") {
$profile{$key} = $$value[0];
} else {
$profile{$key} = $value;
}
}
} else {
$profile{$key} = $value;
}
}
}
$userData = {
_userId => $userId,
_user => \%user,
_profile => \%profile
};
$cache->set($userData, 60*60*24);
}
bless {_userId => $userId, _user => \%user, _profile =>\%profile }, $class;
bless $userData, $class;
}
#-------------------------------------------------------------------

View file

@ -101,6 +101,7 @@ use WebGUI::Operation ();
use WebGUI::Paginator ();
use WebGUI::Privilege ();
use WebGUI::Session ();
use WebGUI::Setting ();
use WebGUI::SQL ();
use WebGUI::Storage ();
use WebGUI::Style ();