Re: [Catalyst] Multiple DB, single instance of Cat

2008-09-11 Thread Nigel Stuckey

Matt

I stand corrected on DBIx! Yes, indeed I mean DBIx::Class.

The code is in and works, but has a couple of issues. Firstly, it  
creates new classes and carries out a DB connect every time there is  
a request. Is there a way to make it more efficient by caching the  
classes and DB connects once there is a successful authentication?


Secondly, there are loads of 'ACCEPT_CONTEXT redefined' messages, one  
per DB table defined to the DBIC model. When initialising, I have to  
give the 'dynamic' model an initial configuration to allow Catalyst o  
start.


Once the code is working I will pop it on the wiki.

cheers

Nigel

On 17 Aug 2008, at 8:08pm, Matt S Trout wrote:


On Fri, Aug 15, 2008 at 11:05:03AM +0100, Nigel Stuckey wrote:

Another question about multiple databases.

I have an existing application that uses a DBIx DB in the  
conventional

way: as a model initialised at run time. All great so far...


DBIx is the CPAN namespace for DBI extensions. There are hundres of
packages in there and you haven't told us which one of them you're  
using.


I'm going to assume you mean DBIx::Class but if you want to abbreviate
that please use 'DBIC' - it's really unfair to the authors of other
DBIx:: modules otherwise (compare to people saying Linux 9 when they
actually mean Red Hat Linux 9 or whatever :)


However, I now need to make the application multi-organisation in the
same instance of catalyst: users will select their organisation or
repository when they login or it will be stored as a preference, etc.
Due to the size of the repository, this is implemented as multiple
databases. Thus a single running Catalyst instance will need to open
several DBs sharing the same schema, dynamically after run time. Then
it will have to close unused connections after a while.

What is the best way to do this with DBIx and where is the best place
to store the handles/class references? A key to the active DB can be
stored in the session.


Something like the following (please write this up on the wiki once  
you've

got a working version, mine's typed straight into mutt and obviously
isn't -quite- complete :)

package MyApp::Model::DBIC;

use Moose;

extends 'Catalyst::Model::DBIC::Schema';

with 'Catalyst::Component::InstancePerContext';

sub build_per_context_instance {
  my ($self, $c) = @_;
  my $db_name = $c-session-{db_name};
  my $new = $self-new({ %$self });
  do something here to make @connect_info from $db_name and config
  $new-schema($self-schema-connect(@connect_info));
  return $new;
}

1;

--
  Matt S Trout   Need help with your Catalyst or  
DBIx::Class project?
   Technical Directorhttp://www.shadowcat.co.uk/ 
catalyst/
 Shadowcat Systems Ltd.  Want a managed development or deployment  
platform?
http://chainsawblues.vox.com/http://www.shadowcat.co.uk/ 
servers/


___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/ 
catalyst@lists.scsys.co.uk/

Dev site: http://dev.catalyst.perl.org/



___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] Multiple DB, single instance of Cat

2008-09-11 Thread Andrew Rodland
On Thursday 11 September 2008 05:58:31 pm Nigel Stuckey wrote:
 Matt

 I stand corrected on DBIx! Yes, indeed I mean DBIx::Class.

 The code is in and works, but has a couple of issues. Firstly, it
 creates new classes and carries out a DB connect every time there is
 a request. Is there a way to make it more efficient by caching the
 classes and DB connects once there is a successful authentication?

If you know what all of the possible organizations are, then write a model 
that instantiates all the DB connections (schemas, whatever) at 'new' time, 
then returns the appropriate one at ACCEPT_CONTEXT time. It's the here's one 
we prepared earlier approach. If that's not feasible, it should be obvious 
how to change it to doing nothing at startup, creating connections on demand, 
and caching them for the life of the process.

Andrew


___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/