[fpc-pascal] PostgreSQL notifications broken
Mark Morgan Lloyd
markMLl.fpc-pascal at telemetry.co.uk
Mon Sep 28 16:03:03 CEST 2015
Michael Van Canneyt wrote:
> On Mon, 28 Sep 2015, Mark Morgan Lloyd wrote:
>
>> Michael Van Canneyt wrote:
>>> On Fri, 11 Sep 2015, Mark Morgan Lloyd wrote:
>>>
>>>> PostgreSQL has a useful feature where application programs can send
>>>> notifications to each other, this tends to be much "cheaper" than
>>>> periodically polling a table for changes.
>>>>
>>>> I've had this working on various CPUs and OSes in a number of
>>>> programs since at least 2.2.4, but it appears to have been broken at
>>>> some point between 2.6.0 and 2.6.4 with problems persisting through
>>>> to 3.0.0-rc1 and trunk. The specific fragment of code that's failing
>>>> looks like this:
>>>>
>>>> result := badPoll;
>>>> if PQStatus(DbTF.PQConnection1.Handle) <> CONNECTION_OK then
>>>> exit;
>>>> pqConsumeResult := PQconsumeInput(DbTF.PQConnection1.Handle);
>>>> if PQStatus(DbTF.PQConnection1.Handle) <> CONNECTION_OK then
>>>> exit;
>>>
>>> If DbTF.PQConnection1 is of type TPQConnection then I think this is
>>> your problem. The low-level handle has been moved to the transaction.
>>> DbTF.PQConnection1.Handle is then a stub, of no value.
>>
>> Any chance of a hint where to find the new long-life handle, i.e. the
>> one that corresponds to the connect action with username, password
>> etc. properties?
>
> pqconnection, start of the unit:
>
> { TPQTrans }
>
> TPQTrans = Class(TSQLHandle)
> protected
> PGConn : PPGConn;
> FList : TThreadList;
> Procedure RegisterCursor(Cursor : TPQCursor);
> Procedure UnRegisterCursor(Cursor : TPQCursor);
> Public
> Constructor Create;
> Destructor Destroy; override;
> end;
>
> PGConn is what you're looking for.
>
> TPQTrans is referenced in :
>
> TPQCursor = Class(TSQLCursor)
> protected
> Statement : string;
> StmtName : string;
> tr : TPQTrans;
Thanks, I'll take another look but one of the handles I'm tracking is
that PGConn field.
I can see handles changing state in debug output from both
lazarus-1.0.0+2.6.0 and lazarus-1.0.14+2.6.4 (intermediate versions e.g.
lazarus-1.0.8+2.6.2 are more of a problem), and can see them behaving
differently. Knowing that there isn't a third one that I've not yet
located is a big help.
>> The change was between 2.6.2 and 2.6.4, I've been looking at sqldb.pp
>> and related files but so far haven't tracked it down.
>>
>> Discussing this sort of thing elsewhere, at least PostgreSQL,
>> Firebird/Interbase and Oracle provide comparable notification/event
>> features with varying degrees of functionality. If encapsulating this
>> sort of thing in libraries or components, it would be highly desirable
>> to be able to rely on the availability of a persistent handle.
>
> The above should be sufficient ?
>
> But the mechanisms are different for each DB, so a unified mechanism is
> not something we are considering, to my knowledge.
>
> If you look at the pqeventmonitor unit, you will see that it bypasses
> completely the usual TSQLConnection mechanisms.
--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk
[Opinions above are the author's, not those of his employers or colleagues]
More information about the fpc-pascal
mailing list