Skip to content

Commit

Permalink
Item11088: cache database exists/names
Browse files Browse the repository at this point in the history
Every listener hit was polling mongo for a complete list of all databases,
and then iterating over them all to check to see if a DB-by-name exists in the map.

Cache-o-matic 5000

git-svn-id: http://svn.foswiki.org/trunk/MongoDBPlugin@12864 0b4bb1d4-4e5a-0410-9cc4-b2b747904278
  • Loading branch information
PaulHarvey authored and PaulHarvey committed Oct 24, 2011
1 parent db3642b commit f33f1d2
Showing 1 changed file with 51 additions and 26 deletions.
77 changes: 51 additions & 26 deletions lib/Foswiki/Plugins/MongoDBPlugin/DB.pm
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ use Time::HiRes ();
use Tie::IxHash ();
use Foswiki::Func();
use Digest::MD5 qw(md5_hex);
use boolean();

#lets declare it ok to run queries on slaves.
#http://search.cpan.org/~kristina/MongoDB-0.42/lib/MongoDB/Cursor.pm#slave_okay
Expand Down Expand Up @@ -335,6 +336,8 @@ sub remove {
print STDERR "...........Dropping $web\n" if MONITOR;
my $db = $self->_getDatabase($web);
$db->drop();
$self->_primeDatabaseNames();
delete $self->{dbsbywebname}{$web};
}
else {
my $collection = $self->_getCollection( $web, $collectionName );
Expand All @@ -352,6 +355,7 @@ sub updateSystemJS {
my $web = shift;
my $functionname = shift;
my $sourcecode = shift;
my $dbname = $self->getDatabaseName($web);

if ( not $self->databaseNameSafeToUse($web) ) {
print STDERR
Expand All @@ -372,61 +376,82 @@ sub updateSystemJS {
);

#update our webmap.
$self->_primeDatabaseNames();
$self->{dbsbywebname}{$web} = $dbname;
$collection = $self->_getCollection( 'webs', 'map' );
$collection->save(
{
_id => $web,
hash => $self->getDatabaseName($web)
hash => $dbname
}
);

return;
}

sub _primeDatabaseNames {
my $self = shift;

if (not (ref($self->{dbsbywebname}) and scalar(keys %{$self->{dbsbywebname}}))) {
my $collection = $self->_getCollection( 'webs', 'map' );
my $cursor = $collection->find( { 'hash' => { '$exists' => boolean::true}});

while ($cursor->has_next()) {
my $document = $cursor->next();

$self->{dbsbywebname}{$document->{'_id'}} = $document->{'hash'};
}
if (MONITOR) {
require Data::Dumper;
print STDERR "Primed database names: " . Data::Dumper->Dump([$self->{dbsbywebname}]);
}
}

return;
}

#######################################################
sub getDatabaseName {
my $self = shift;
my $web = shift;
my $name;

if ($web eq 'webs') {
$name = $web;
} else {
$self->_primeDatabaseNames();
if (exists $self->{dbsbywebname}{$web}) {
$name = $self->{dbsbywebname}{$web};
} else {
$name = 'web_' . md5_hex($web);
}
}

return $web if ( $web eq 'webs' );
return 'web_' . md5_hex($web);

#using webname as database name, so we need to sanitise
#replace / with __ and pre-pend foswiki__ ?
#$web =~ s/\//__/g;

#remove the 'dots' too.
#$web =~ s/\./__/g;
#return 'foswiki__' . $web;
return $name;
}

sub databaseExists {
my $self = shift;
my $web = shift;

my $name = $self->getDatabaseName($web);
$self->_primeDatabaseNames();

my $connection = $self->_connect();
my @dbs = $connection->database_names;
foreach my $db_name (@dbs) {
return 1 if ( $name eq $db_name );
}
return;
return (exists $self->{dbsbywebname}{$web});
}

#MongoDB appears to fail when same spelling different case us used for database/collection names
sub databaseNameSafeToUse {
my $self = shift;
my $web = shift;

my $name = $self->getDatabaseName($web);

my $connection = $self->_connect();
my @dbs = $connection->database_names;
foreach my $db_name (@dbs) {
return 1 if ( $name eq $db_name );
return if ( lc($name) eq lc($db_name) );
}
# my $name = $self->getDatabaseName($web);
#
# my $connection = $self->_connect();
# my @dbs = $connection->database_names;
# foreach my $db_name (@dbs) {
# return 1 if ( $name eq $db_name );
# return if ( lc($name) eq lc($db_name) );
# }
return 1;
}

Expand Down

0 comments on commit f33f1d2

Please sign in to comment.