On Mon, 7 Aug 2000, Shimon Rura wrote:

> Hi,
> 
> I'm working on updating some disgusting hack CGI scripts to use mod_perl and
> DBI.  The database backend is Informix, but the web structure is designed to
> allow accessing different database configurations from different virtual
> hosts.  For example, http://dev:9040/ might be integrated with the main
> working database, while http://dev:9041/ works with a testing or training
> database.  This separation is crucial in development and client use.
> 
> Unfortunately, Informix and one of our own libraries depends on environment
> variables to distinguish this connection information (there is probably a
> workaround for DBD::Informix but our library is bad painful legacy code with
> awful and immutable API).  Therefore, I need to set environment variables,
> but the settings need to be somehow localized for each script.
> 
> The obvious solution is to put a bunch of assignments to $ENV{'blah'} at the
> top of each script.  This strikes me as rather ugly though, and forces our
> developers to type more.
> 
> PerlSetEnv is almost a solution; its failing is that is doesn't fake scope
> for environment variables (not that it should).  If I could put PerlSetEnv
> directives inside of <VirtualHost>  or <Location> tags for Apache, and that
> forced scoping upon them, that would be perfect.
> 
> Perhaps there is some way I can actually use reasonable Perl scoping to set
> a variable in the scope of a Virtual Host?  If so, then I could just specify
> a hash of environment variables called %myEnv in each <VirtualHost> or
> <Location> section, and the web scripts could just call a single function
> like envImport(%myEnv) at the top.  That would be great, as all
> virtualHost-specific configuration would exist in Apache configuration
> files.
> 
> The only other alternative I can think of is to store these settings in a
> file and call a function to parse the local configuration file for each
> script request.  This seems to add a lot of overhead though.  Files suck.
> 
> Any solutions from the mod_perl gurus out there?

How about creating vars scoped in packages and then building ENV vars from
the in the script. e.g:

 evironment_packages.pl
 ----------------------
 package My::script::foo
 my %env = (FOO => 1, BAR => 2);
 package My::script::bar
 my %env = (FOO => 22, BAR => 55);
 1;

loading this file at the server startup and then in the script:

1. figure out the name of the script (path or whatever you prefer,
e.g. __PACKAGE__)
2. build the package name using 1. so it'd comply with the above packages
3. use() this package
4. copy the %package::whatever::env into local %ENV

So the code that you will have to add won't be different from script to
script. Of course you can mangle the Apache::Registry and add this code
only once inside it without touching the scripts.

If you do that, you better inherit from Apache::RegistryNG and do whatever
you want to extend the functionality.

Voila

I'm sure there is a bunch of other more creative solutions...

_____________________________________________________________________
Stas Bekman              JAm_pH     --   Just Another mod_perl Hacker
http://stason.org/       mod_perl Guide  http://perl.apache.org/guide 
mailto:[EMAIL PROTECTED]   http://apachetoday.com http://jazzvalley.com
http://singlesheaven.com http://perlmonth.com   perl.org   apache.org


Reply via email to