[ic] Accessing $Db or $Sql in Jobs?

Ethan Rowe ethan at endpoint.com
Thu Jan 6 07:49:55 EST 2005


Jeff Fearn wrote:

>On Thu, 6 Jan 2005 15:23:16 +1000, Jeff Fearn <jefffearn at gmail.com> wrote:
>  
>
>>On Wed, 05 Jan 2005 18:22:32 -0800, John Young <john_young at sonic.net> wrote:
>>    
>>
>>>Ethan Rowe wrote:
>>>      
>>>
>>>>Jeff Fearn wrote:
>>>>
>>>>        
>>>>
>>>>>Hi, how do you make $Db or $Sql accessable to usertags run using the
>>>>>jobs functionality?
>>>>>
>>>>>I have a job which uses a new usertag, however $Db and $Sql are empty.
>>>>>
>>>>>I have used $Db and $Sql in another usertag; which is used in the
>>>>>order routing; without a problem. I am assuming this is something to
>>>>>do with this tag being used via the job queue ... this may be a very
>>>>>bad assumption :}
>>>>>
>>>>>I have tried setting "AllowGlobal foundation" in interchange.cfg,
>>>>>which I really don't want to do, with no effect.
>>>>>
>>>>>The job just contains:
>>>>>
>>>>>[x12_945]
>>>>>
>>>>>The tag code is:
>>>>>UserTag x12_945 Routine <<EOR
>>>>>sub
>>>>>{
>>>>>       # Make sure we have the EDI module installed
>>>>>       eval
>>>>>       {
>>>>>               use X12::Base;
>>>>>       };
>>>>>
>>>>>       if($@)
>>>>>       {
>>>>>               ::logError("Could not load X12::Base Module. X12-945
>>>>>processing failed!\n");
>>>>>               return(1);
>>>>>       }
>>>>>
>>>>>       # Both of these always die
>>>>>       my $dbh = $Sql{orderline} or die("No SQL orderline database!\n");
>>>>>       my $ref = $Db{orderline} or die("No orderline database!\n");
>>>>>
>>>>>       .....
>>>>>}
>>>>>
>>>>>TIA, Jeff.
>>>>>__
>>>>>
>>>>>          
>>>>>
>>>>Having not yet used IC jobs myself, I may be totally useless.  That said:
>>>>Is the usertag defined for a single catalog, or as an Interchange global
>>>>tag?
>>>>
>>>>The $Db and $Sql objects aren't available at the global level.  You can
>>>>effectively access the $Db object for a particular table at the global
>>>>level, however, via:
>>>>my $dbh = database_exists_ref( $tablename );
>>>>$dbh = $dbh->ref();
>>>>
>>>> From there, $dbh gives you access to functions like query().
>>>>
>>>>I hope this is of some use.
>>>>   - Ethan
>>>>        
>>>>
>>>The following link might help, as well, if you are not already familiar
>>>with its content:
>>>
>>>http://www.icdevgroup.org/pipermail/interchange-users/2004-December/041551.html
>>>
>>>
>>>-John Young
>>>      
>>>
>>I had not seen that, thanks :)
>>
>>I had thought from reading that link that all I had to do was add:
>>
>>$Tag->perl({tables => 'orderline'});
>>
>>above my existing code. However both attempts to get refs to orderline
>>still die.
>>
>>I have played around with what Ethan sent and I get " Can't call
>>method "ref" on unblessed reference" errors :{
>>    
>>
>
>Method was actually "prepare" ... need more caffine.
>  
>
>The tag is defined for a single catalog, appended to the require
>UserTag line of catalog.cfg.
>
>The tag file is in the  /usr/lib/interchange/code/UserTag/ directory.
>  
>
Hmm.  I would expect any usertag defined in VENDROOT/code/UserTag to be 
an Interchange global usertag rather than a catalog-level usertag.  But 
I'm obviously not familiar with your setup.

>>These jobs are making me thirsty :}
>>    
>>
What version of IC are you on?  Not that I expect it to make a difference...

If Perl is complaining that database_exist_ref is giving you an 
unblessed reference, it sounds to me like it's failing to actually see 
Interchange's table object.

Try:
my $dbh = database_exist_ref( $tablename ) or die "Couldn't get handle 
to table '$tablename'!";

If the table object isn't accessible for whatever reason, you'll get an 
error at this step rather than later on.

Incidentally, the prepare() method won't work on the object (if you 
manage to get said object); the object is equivalent to the $Db object, 
which gives you a query() method but no prepare().

Regarding using $Tag->perl within a usertag to effectively grant 
permission to a particular table, that certainly works, but is only 
necessary in a catalog-level usertag rather than a global one.  Global 
code (tags, subs, actionmaps, etc.) are omnisciently omnipotent.

Can I ask a possibly stupid question? (yes.)  Have you tested the 
usertag outside the context of jobs?  Like, in a simple page?

I'm curious to see where this goes, as I'll very likely be setting up 
Interchange jobs for the first time in a few weeks.

- Ethan

-- 
Ethan Rowe
End Point Corporation
ethan at endpoint.com



More information about the interchange-users mailing list