Hi John:

It's ironic how similar our applications seem!

I have a perl module that wraps around DBI, and
get this, it is called Db.pm also.  Not to worry,
it has a unique namespace prefix, so they will not
clash if ever they meet.  A good thing for modules
I think.  BTW -- I use the selective query tricks too.
It's a big help.

If you are able to use global vars (use vars) in
your subs with no problem, then I've some work ahead
of me.  I think it points to the fact that either I have
a systematic problem with my code or I have uncovered a
bug/feature in some of the underlying code.

I'm still open for suggestions on what might cause a
global to be unreliable in subs or other .asp
scripts.  Thanks again.

Regards,
Steve

> -----Original Message-----
> From: Brat Wizard [mailto:[EMAIL PROTECTED]]
> Sent: Tuesday, September 17, 2002 12:50 AM
> To: Stephen Bardsley; Apache::ASP Mailing List
> Subject: Re: dynamic module
> 
> 
> > I want my variable to be valid and defined for the duration of a Session.
> 
> Okay, that's what the session object is for, as you appear to already know. ;)
> 
> > > example) is to use Apache::DBI. Apache::DBI will override the normal DBI
> 
> > I am using and have used Apache::DBI with good results.  I'm sorry, I
> > didn't mean to imply "on-the-fly" as from one script to the next.  To be
> > more precise I meant from one Session to the next.
> 
> Okay-- so if I'm understanding you correctly, connecting to the database each 
> time the script is executed (a la Script_OnStart) is okay, so what is the 
> problem with say storing the datasource parameters as session data and then 
> using it to reconstitute the handle each time? You can't cache the handle 
> itself, but you _can_ cache the name of the database connected to (and 
> whatever host/user info you need) as session scalars (or a hash-- or even 
> just store the actual DBI data source string itself if that's all you really 
> need). Then just use that information the next time around to re-connect to 
> the database.. Basically check to see if we've been connected before (ie. is 
> $..dbname defined, or whatever). If not, store it. When you're done, close 
> the connection and zap the data in the session variable (or abandon the 
> session altogether). Then go through the process all over again for the next 
> session..
> 
> 
> You didn't say, but perhaps you are concerned about caching selected data from 
> a query and that's what the real bottom-line issue is?? (as in: why it would 
> be interesting/useful to be able to store a db handle in the session object 
> anyway...)
> 
> This is a trick I often use.. if the query is expensive (a full-text search or 
> something) and I don't want to have to rerun the query each time to get the 
> next chunk of data-- what I will do is run the query and ONLY select the 
> actual key(s) to the data itself in whatever order they're needed. (eg. 
> SELECT key_field FROM table WHERE blah blah ORDER BY blah blah) Then blast 
> the keys into a file-- several ways to do this quickly & effectively, the 
> easiest is to simply create a key array and use Storable to freeze it in a 
> file. Then you can just thaw it out later and use the list. 
> 
> By using a key array, you can construct a query retrieving _only_ the items 
> needed for the specific page which is generally very fast (much much faster 
> usually) compared to running the query all over again (eg. SELECT 
> fields_i_need FROM table WHERE key=key1 or key=key2 or key=key3..etc) They 
> are already in the correct order so you don't need the overhead of an "order 
> by" clause. 
> 
> When you're through, dump the key array whenever its convenient (or don't if 
> you don't care about disk space-- the frozen files are small, you can reap 
> them at your leisure). 
> 
> If I'm displaying paged data, a simple rule I often employ is that either a 
> new sort order (clicking on a column header for instance) or retrieving page 
> zero will dump the cache & rerun the query (making a new key array). It 
> generally works quite well, and I've been very pleasantly surprised at how 
> small the frozen cache files are, even for large queries. And slurping up a 
> frozen array is pretty darned quick. If you hide all the mechanical bits 
> inside functions, pretty soon you forget how horrible a kludge this really is 
> and it almost begins to seem normal :) ;)
> 
> 
> > > The next easiest thing to do is to figure out what database to connect to
> > > and open it each time the script runs (the Script_OnStart() function is a
> 
> >
> > This is kind of what I am doing now, and can't quite get things working.
> > It seems it may actually be an issue with variable scoping.  If I scope
> > my module's instance variable in the Script_OnStart things seem to work.
> > That is, I create the instance in Script_OnStart.  If I create the
> > instance in one of global.asa's sub's then it does not seem to work
> > reliably. Bear in mind I am using global variables in global.asa
> > by way of "use vars qw( $var2 $var2 $etc );".  If this is incorrect
> > or a better way exists, I'm all ears.  Thanks again for your time.
> 
> Hmm- interesting. I do it in subs all the time with no problems whatsoever. I 
> declare the global variable the same way you do, "use vars qw( $db ... blah 
> blah);" at the top of my global.asa file (and again in EVERY package file 
> that is not a separate module-- not a separate namespace-- I break a lot of 
> my code up into sub-files to keep it more manageable). The scope should be 
> global. Might you have some my variable someplace that's stomping on the 
> global version?? 
> 
> I have a Db.pm module that I wrote that basically encapsulates most of the DBI 
> stuff I use-- so keep that in mind in the short example below-- it isn't 
> exactly what you're used to but it will be similar enough. In one of my 
> global.asa files, the flow goes something like this:
> 
> package Apache::ASP::STORES;
> 
> use vars qw{ $db ... [more vars] };
> use lib Apache->request->dir_config('BaseDir')."/lib";
> 
> use Apache::ASP;
> use Db;
> 
> [more use statements]
> 
> sub Script_OnStart {
>       [..do stuff]
> 
>       connectToDB();
> 
>       [.. do more stuff.. ]
>       }
> 
> sub connectToDB {
>         my $dbname = <my dbname>; ## actually declared elsewhere
>         my $dbhost = <my host>; ## for me, but you get the idea 
>         return if ($db ne undef); ## got a handle thanks, don't need another
>         $db = new Db;
>         $db->Connect($dbname, $dbhost);
>         return $db;
>         }
> 
> 
> In this case, the $db handle that gets returned is of my own "db" style that I 
> mentioned. But it only wraps around the usual dbh handle and is mostly 
> exposed except for wrapping commonly used constructs to make slapping 
> together code quicker, easier, and a bit more mindless. Its pretty easy 
> actually, even my cat could do it... (as it happens, I walked into the 
> computer room one day and there he was sitting building a database cataloging 
> north american migratory birds and cross-referencing them by recipe... but 
> that's another story altogether ;)
> 
> 
> Hope this helps- 
> 
> John Whitten
> [EMAIL PROTECTED]
> Wizard.Org, Inc.
> 
> 
> 
> >
> > > The best way (but not necessarily the easiest) is to use some sort of
> > > middleware such as SQLrelay or something similar that will sit between
> > > your perl application and the database, maintain open connections and
> > > drop or establish new connections as demanded. SQLrelay is a neat thing
> > > but it is a pain-in-the-ass (IMO) to install and configure. (I should
> > > also point out that my experience with it is some 6+months old so a newer
> > > version which may address some of these issues may be available?)
> > > SQLrelay works with just about any database DBI can work with, and in
> > > addition can work across servers, and I *think* (perhaps it was a planned
> > > feature, in any case I never used it myself) it had auto-failover support
> > > in case one server didn't answer up-- won't swear to that though- perhaps
> > > it was on the to-do list. In any case, it is pretty clever software to
> > > say the least.
> > >
> > > On Monday 16 September 2002 05:11 pm, Stephen Bardsley spewed into the 
> ether:
> > > > Greetings:
> > > >
> > > > I have been struggling with something and I hope
> > > > someone can set me straight.
> > > >
> > > > <%
> > > > I have a perl module, which contains a database
> > > > handle (dbh).
> > > >
> > > > I would like to use this module under Apache::ASP.
> > > > I would like to have users dynamically define a database
> > > > for the module to connect to.  I can/will constrain
> > > > the lifetime of the module to that of an Apache::ASP
> > > > $Session.
> > > >
> > > > The trouble I am having is that I cannot maintain
> > > > the coherence of the dbh in the module.  Sometimes
> > > > the dbh is defined and sometimes not.  I have used
> > > > this module successfully in other Apache::ASP
> > > > applications, but the database has always been
> > > > statically defined to the module.
> > > >
> > > > Is there a way to allow the user to define the
> > > > database to the module?
> > > > %>
> > > >
> > > > Any suggestions will be greatly appreciated.
> > > >
> > > > Steve
> > > > _____________________
> > > > Stephen Bardsley
> > > > RLW Inc.
> > > > Malta, NY
> > > >
> > > > ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > > --
> > >
> > > -------------------------------------------------------------------------
> > >------- Check out http://www.Wizard.Org for great deals on Electronic
> > > Parts *NEW* Computer Parts & Accessories - Drives - LCD - Systems - Linux
> > > -------------------------------------------------------------------------
> > >------- ** Affordable Online Store w/Merchant Card Processing & Paypal **
> > > Write to us: [EMAIL PROTECTED]  --  Get your Store Online Today!
> > > -------------------------------------------------------------------------
> > >-------
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> 
> -- 
> 
> --------------------------------------------------------------------------------
> Check out http://www.Wizard.Org for great deals on Electronic Parts
> *NEW* Computer Parts & Accessories - Drives - LCD - Systems - Linux
> --------------------------------------------------------------------------------
> ** Affordable Online Store w/Merchant Card Processing & Paypal **
> Write to us: [EMAIL PROTECTED]  --  Get your Store Online Today!
> --------------------------------------------------------------------------------
> 
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to