That line stops it from running the ping if $needping is false.  The "or"
and "||" operators in Perl are sometimes called "short circuit" operators
because of this.

- Perrin


On Thu, Nov 7, 2013 at 4:18 PM, Xinhuan Zheng <xzh...@christianbook.com>wrote:

>  That's fine. I can do more debugging.
>
>  But I have hard time to understand this line of code:
>
>  200     if ($Connected{$Idx} and (!$needping or
> eval{$Connected{$Idx}->ping})) {
>
>  Should this be:
>
>  200     if ($Connected{$Idx} and ($needping and
> eval{$Connected{$Idx}->ping})) {
>
>  What's the difference between the two? Why the code in favor of "or"
> instead of "and"?
>
>  - xinhuan
>
>   From: Perrin Harkins <phark...@gmail.com>
> Date: Thursday, November 7, 2013 3:05 PM
>
> To: Xinhuan Zheng <xzh...@christianbook.com>
> Cc: Adam Prime <adam.pr...@utoronto.ca>, "modperl@perl.apache.org" <
> modperl@perl.apache.org>
> Subject: Re: Apache::DBI connect
>
>   Sorry, I can't determine the problem from your log.  You'll need to
> either run it in the debugger or add some debugging print statements to
> figure out where it's having trouble.  All I can say from that output is
> that it it's not succeeding in making a new connection after the ping
> fails, because it doesn't say "new connect..." after that.  I also wonder
> where that disconnect() call is coming from.
>
>  - Perrin
>
>
> On Thu, Nov 7, 2013 at 1:07 PM, Xinhuan Zheng <xzh...@christianbook.com>wrote:
>
>>  I only looked at Apache::DBI not DBI document.
>>
>>  My test program works. It reconnects to database OK. I ran it multiple
>> times and every time it reconnects OK. But Apache::DBI doesn't work. You
>> saw the previous debugging info. Where is the problem?
>>
>>  - xinhuan
>>
>>   From: Perrin Harkins <phark...@gmail.com>
>> Date: Thursday, November 7, 2013 1:00 PM
>> To: Xinhuan Zheng <xzh...@christianbook.com>
>> Cc: Adam Prime <adam.pr...@utoronto.ca>, "modperl@perl.apache.org" <
>> modperl@perl.apache.org>
>>
>> Subject: Re: Apache::DBI connect
>>
>>   It is in the DBI documentation.  Search for "0E0".
>>
>>  - Perrin
>>
>>
>> On Thu, Nov 7, 2013 at 12:41 PM, Xinhuan Zheng 
>> <xzh...@christianbook.com>wrote:
>>
>>> So it returns string '0E0'? The document didn't say that.
>>>
>>> - xinhuan
>>>
>>> On 11/7/13 11:44 AM, "Adam Prime" <adam.pr...@utoronto.ca> wrote:
>>>
>>> >perl -e "if ('0E0') { print qq[hi\n] }"
>>> >hi
>>> >
>>> >OE0 as a string evaluates to true.  If you use it as a bareword /
>>> >numeric then it's false, which is what your eval example below is doing.
>>> >
>>> >Adam
>>> >
>>> >
>>> >On 13-11-07 11:29 AM, Xinhuan Zheng wrote:
>>> >> one correct - In both cases, the return value is evaluated to false.
>>> >>
>>> >> How do you distinguish?
>>> >>
>>> >> - xinhuan
>>> >>
>>> >> From: Xinhuan Zheng <xzh...@christianbook.com
>>> >> <mailto:xzh...@christianbook.com>>
>>> >> Date: Thursday, November 7, 2013 11:12 AM
>>> >> To: Perrin Harkins <phark...@gmail.com <mailto:phark...@gmail.com>>
>>> >> Cc: mod_perl list <modperl@perl.apache.org
>>> >><mailto:modperl@perl.apache.org>>
>>> >> Subject: Re: Apache::DBI connect
>>> >>
>>> >>> I don't actually understand why you did that.  What was wrong with
>>> the
>>> >>>normal ping?
>>> >>
>>> >> With Oracle DRCP, even though ping succeeds, the connection to the
>>> >> server process is actually terminated. Or ora_ping() may return 0E0
>>> >> "zero but true" and undef. I don't know. ora_ping() is foreign to me.
>>> I
>>> >> made the change based on what Apache::DBI the document said.
>>> >>
>>> >>> In any case, there's no need to change the Apache::DBI code, even
>>> with
>>> >>>your "select 1 from dual" test.   It returns a true value (0E0) if it
>>> >>>succeeds and a false value (undef) if it fails.
>>> >>
>>> >> In both cases, the return value is evaluated to true:
>>> >>
>>> >> 200: if ($Connected{$Idx} and (!$needping or
>>> >>eval{$Connected{$Idx}->ping}))
>>> >>
>>> >> eval{0E0} and eval{undef} both return true. I did test that. How do
>>> you
>>> >> distinguish?
>>> >>
>>> >>> Did your script succeed in reconnecting after it lost the connection?
>>> >>
>>> >> Yes.
>>> >>
>>> >>> Yes, I haven't forgotten about that, but I haven't had time to work
>>> on
>>> >>>it yet.  You can try fixing it yourself by looking at the code in
>>> >>>Apache::DBI that checks if the server is starting under apache 1.x.
>>> >>>Otherwise, I will eventually get to it.
>>> >>
>>> >> I don't understand that piece of code. I can't do the change. Hope you
>>> >> can help.
>>> >>
>>> >> - xinhuan
>>> >>
>>> >> From: Perrin Harkins <phark...@gmail.com <mailto:phark...@gmail.com>>
>>> >> Date: Thursday, November 7, 2013 11:00 AM
>>> >> To: Xinhuan Zheng <xzh...@christianbook.com
>>> >> <mailto:xzh...@christianbook.com>>
>>> >> Cc: mod_perl list <modperl@perl.apache.org
>>> >><mailto:modperl@perl.apache.org>>
>>> >> Subject: Re: Apache::DBI connect
>>> >>
>>> >> On Thu, Nov 7, 2013 at 9:46 AM, Xinhuan Zheng <
>>> xzh...@christianbook.com
>>> >> <mailto:xzh...@christianbook.com>> wrote:
>>> >>>The $ok is undef. In the case if the test does succeed (like the first
>>> >>>select), $ok returns 0E0.
>>> >>
>>> >> That all sounds good.  0E0 is a true value in Perl.  It means "zero
>>> but
>>> >> true."  And undef is a false value.  You don't need to test for undef.
>>> >>
>>> >>> Since I changed DBD::Oracle subroutine ping to use 'select 1 from
>>> >>>dual',
>>> >>
>>> >> I don't actually understand why you did that.  What was wrong with the
>>> >> normal ping?
>>> >>
>>> >> In any case, there's no need to change the Apache::DBI code, even with
>>> >> your "select 1 from dual" test.  It returns a true value (0E0) if it
>>> >> succeeds and a false value (undef) if it fails.
>>> >>
>>> >> Did your script succeed in reconnecting after it lost the connection?
>>> >>
>>> >>> I have another request. The Apache::DBI cached a dead database handle
>>> >>>for apache version 1.3.42 if  startup.pl <http://startup.pl> create a
>>> >>>database handle. The apache
>>> >> child processes inherits this dead handle. It doesn't cause
>>> application
>>> >> error but it does take memory space. If there is many apache
>>> processes,
>>> >> that's not good. Can you please identify and change the code for this
>>> >> problem?
>>> >>
>>> >> Yes, I haven't forgotten about that, but I haven't had time to work on
>>> >> it yet.  You can try fixing it yourself by looking at the code in
>>> >> Apache::DBI that checks if the server is starting under apache 1.x.
>>> >>   Otherwise, I will eventually get to it.
>>> >>
>>> >> - Perrin
>>> >>
>>> >
>>>
>>>
>>
>

Reply via email to