Re: [sqlite] Can't commit transaction - SQL statements in progress

2005-12-13 Thread John Stanton
You have pointers to the compiled SQL statements.  You should be able to 
track when the destination of those pointers changes.  I haven't had the 
need to do it, but it is where I would go if careful examination of the 
code did not reveal the error.

JS

Eric Scouten wrote:
If it were easy to boil down to a simple code snippet, I would have 
happily done so. :-) Unfortunately, the error is probably caused 
somewhere inside a relatively complex home-grown wrapper for SQLite and 
is not easily distilled into something I can share here.


The question really boils down to "can SQLite offer enough information 
to help me diagnose the problem it's telling me I have?"


Or to put it another way, this is essentially a memory leak problem. 
SQLite obviously knows that I've lost track of one or more prepared 
statements that haven't run to completion, it isn't telling me *what* 
statements those are. I'm wondering if there is any way of getting that 
information. Armed with that knowledge, I can probably fix my code 
fairly quickly.


At this point, I don't have any reason to suspect that SQLite itself is 
failing.


-Eric


Robert L Cochran wrote:

You really need to post specific code snippets, you can't expect a 
definitive solution including the complete diagnosis and corrected 
code from an 11-word problem statement and then a 2-line guess as to 
the cause. Please show your code. Others on this forum will help you. 
(I lack the expertise.)


Bob Cochran
Greenbelt, Maryland, USA


Eric Scouten wrote:

I'm getting this error periodically when attempting to commit a 
transaction.


What I believe is happening is that my database abstraction layer has 
lost track of one or more compiled statements that it created at some 
earlier time. Is there any way to find out *what* transactions are 
still operating at the time this error is issued?


That would help my debugging efforts greatly.

-Eric










Re: [sqlite] Can't commit transaction - SQL statements in progress

2005-12-12 Thread Eric Scouten

[EMAIL PROTECTED] wrote:


Eric Scouten <[EMAIL PROTECTED]> wrote:
 

The question really boils down to "can SQLite offer enough information 
to help me diagnose the problem it's telling me I have?"


Or to put it another way, this is essentially a memory leak problem. 
SQLite obviously knows that I've lost track of one or more prepared 
statements that haven't run to completion, it isn't telling me *what* 
statements those are. I'm wondering if there is any way of getting that 
information. Armed with that knowledge, I can probably fix my code 
fairly quickly.


   



If you have a symbolic debugger and you compile with -g, then you
can look inside the internal SQLite data structures and figure this
out.  Each "sqlite*" connection object contains a linked list of
pending statements.  Just follow the list.  If you compile with
-DSQLITE_DEBUG=1 (I think) then the VDBE code on each statement will
be terminated by a Noop instruction whose P3 argument is the original
text of the SQL statement.  You can use that to figure out which
statement is which.

I'm afraid there is no easier way.
 



Richard, thanks. I just filed a low-priority feature request (ticket 
#1558) to make this process easier for the next person who encounters 
this problem.


In the meantime, this should be enough info to help me find my bug. 
Thanks for the tip!


-Eric


--
Eric Scouten | [EMAIL PROTECTED] | Photography: www.ericscouten.com



Re[2]: [sqlite] Can't commit transaction - SQL statements in progress

2005-12-12 Thread Teg
Hello Eric,

I'd be inclined to throw it on the debugger and see what's going on.
If it's too complicated to debug, then maybe you need to re-think the
design. In my case, my code's littered with assertions and sanity
checks that kick out when I attempt to do something wrong. Sometimes
I'll implement the same thing two different ways, run both and check
them against each other (in debug mode that is).

For example, if I attempt to open a DB with the same object when it's
already open, I get an immediate assertion telling me I'm screwing up.
My transactions commit automatically when they go out of scope and
with assertion, if it fails to commit, the code stops in it's tracks
and I can look at the call stack and parameters. I also trash values
on purpose when something gets destructed so, if I attempt to use it
after destruction, it croaks.

I don't care how slow it runs in debug mode and all of my sanity
checking is removed automatically in a release build.

Just a thought. You know, debug mode logging works well too. It
timing's important, I'll just log it's execution and line numbers to a
disk file and trace through it when something fails.

C



Monday, December 12, 2005, 6:01:45 PM, you wrote:

ES> If it were easy to boil down to a simple code snippet, I would have
ES> happily done so. :-) Unfortunately, the error is probably caused 
ES> somewhere inside a relatively complex home-grown wrapper for SQLite and
ES> is not easily distilled into something I can share here.

ES> The question really boils down to "can SQLite offer enough information
ES> to help me diagnose the problem it's telling me I have?"

ES> Or to put it another way, this is essentially a memory leak problem.
ES> SQLite obviously knows that I've lost track of one or more prepared
ES> statements that haven't run to completion, it isn't telling me *what*
ES> statements those are. I'm wondering if there is any way of getting that
ES> information. Armed with that knowledge, I can probably fix my code
ES> fairly quickly.

ES> At this point, I don't have any reason to suspect that SQLite itself is
ES> failing.

ES> -Eric


ES> Robert L Cochran wrote:

>> You really need to post specific code snippets, you can't expect a 
>> definitive solution including the complete diagnosis and corrected 
>> code from an 11-word problem statement and then a 2-line guess as to
>> the cause. Please show your code. Others on this forum will help you.
>> (I lack the expertise.)
>>
>> Bob Cochran
>> Greenbelt, Maryland, USA
>>
>>
>> Eric Scouten wrote:
>>
>>> I'm getting this error periodically when attempting to commit a 
>>> transaction.
>>>
>>> What I believe is happening is that my database abstraction layer has
>>> lost track of one or more compiled statements that it created at some
>>> earlier time. Is there any way to find out *what* transactions are
>>> still operating at the time this error is issued?
>>>
>>> That would help my debugging efforts greatly.
>>>
>>> -Eric
>>>
>>





-- 
Best regards,
 Tegmailto:[EMAIL PROTECTED]



Re: [sqlite] Can't commit transaction - SQL statements in progress

2005-12-12 Thread Nathan Kurz
On Mon, Dec 12, 2005 at 06:55:24PM -0500, [EMAIL PROTECTED] wrote:
> Eric Scouten <[EMAIL PROTECTED]> wrote:
> > Or to put it another way, this is essentially a memory leak problem. 
> > SQLite obviously knows that I've lost track of one or more prepared 
> > statements that haven't run to completion, it isn't telling me *what* 
> > statements those are. I'm wondering if there is any way of getting that 
> > information. Armed with that knowledge, I can probably fix my code 
> > fairly quickly.

If you happen to be running on Linux, you might try using 'valgrind'
(http://www.valgrind.org).  Among other things, it's a link time
memory debugger that does a good job of catching lost pointers.  I've
used it for similar problems with SQLite custom code with great success.

--nate


Re: [sqlite] Can't commit transaction - SQL statements in progress

2005-12-12 Thread Dennis Cote

Eric Scouten wrote:

The question really boils down to "can SQLite offer enough information 
to help me diagnose the problem it's telling me I have?"


Or to put it another way, this is essentially a memory leak problem. 
SQLite obviously knows that I've lost track of one or more prepared 
statements that haven't run to completion, it isn't telling me *what* 
statements those are. I'm wondering if there is any way of getting 
that information. Armed with that knowledge, I can probably fix my 
code fairly quickly.



Eric,

I don't think there is an API to let you check this directly, but one of 
the fields in the sqlite3 structure (yes it is supposed to be opaque, 
but it can be useful to look inside it for debugging purposes) pointed 
at by the pointer returned from sqlite3_open is a pointer to a list of 
prepared VMs. It is called pVdbe in the sqlite source.  It is followed 
by a count of the number of currently executing VMs, called activeVdbeCnt.


 struct sqlite3 {
 ...
 struct Vdbe *pVdbe;   /* List of active virtual machines */
 int activeVdbeCnt;/* Number of vdbes currently executing */
 ...
 }

You should be able to locate this pointer by checking for a value that 
matches the statement pointer returned from sqlite3_prepare(). It should 
be about 16 or 17 words (32 bit) into the structure but may be elsewhere 
depending upon the compiler. Once you know where this pointer is, you 
can use it to locate all the outstanding VMs at any time, including 
after your error. Each VM structure returned from sqlite3_prepare() 
begins with a pointer to the sqlite3 structure above, and a pointer to 
the next VM on this linked list.


 struct Vdbe {
 sqlite3 *db;/* The whole database */
 Vdbe *pPrev,*pNext; /* Linked list of VDBEs with the same Vdbe.db */
 ...
 }

Simply follow the linked list to get the addresses of the active VMs. 
You can compare these to the addresses returned when the statements were 
prepared.


It might be easier (if you are using C++ anyway) to simply create a 
global vector of structures like this


 struct stmt {
   sqlite3_stmt* s;
   char* file; // fill with __FILE__
   int line;//fill with __LINE__
   string sql;
 };

 vector stmts;

Then simply add each statement to the vector when it is prepared, and 
delete it from the vector when the statement is finalized. Anything left 
on the vector when you get your error is what you are looking for.


HTH
Dennis Cote



Re: [sqlite] Can't commit transaction - SQL statements in progress

2005-12-12 Thread drh
Eric Scouten <[EMAIL PROTECTED]> wrote:
> 
> The question really boils down to "can SQLite offer enough information 
> to help me diagnose the problem it's telling me I have?"
> 
> Or to put it another way, this is essentially a memory leak problem. 
> SQLite obviously knows that I've lost track of one or more prepared 
> statements that haven't run to completion, it isn't telling me *what* 
> statements those are. I'm wondering if there is any way of getting that 
> information. Armed with that knowledge, I can probably fix my code 
> fairly quickly.
> 

If you have a symbolic debugger and you compile with -g, then you
can look inside the internal SQLite data structures and figure this
out.  Each "sqlite*" connection object contains a linked list of
pending statements.  Just follow the list.  If you compile with
-DSQLITE_DEBUG=1 (I think) then the VDBE code on each statement will
be terminated by a Noop instruction whose P3 argument is the original
text of the SQL statement.  You can use that to figure out which
statement is which.

I'm afraid there is no easier way.

--
D. Richard Hipp <[EMAIL PROTECTED]>



Re: [sqlite] Can't commit transaction - SQL statements in progress

2005-12-12 Thread Robert L Cochran
Show your prepared statements and the code you are using to execute 
them. There is always a simple cause to seemingly complex problems.


Bob

Eric Scouten wrote:

If it were easy to boil down to a simple code snippet, I would have 
happily done so. :-) Unfortunately, the error is probably caused 
somewhere inside a relatively complex home-grown wrapper for SQLite 
and is not easily distilled into something I can share here.


The question really boils down to "can SQLite offer enough information 
to help me diagnose the problem it's telling me I have?"


Or to put it another way, this is essentially a memory leak problem. 
SQLite obviously knows that I've lost track of one or more prepared 
statements that haven't run to completion, it isn't telling me *what* 
statements those are. I'm wondering if there is any way of getting 
that information. Armed with that knowledge, I can probably fix my 
code fairly quickly.


At this point, I don't have any reason to suspect that SQLite itself 
is failing.


-Eric


Robert L Cochran wrote:

You really need to post specific code snippets, you can't expect a 
definitive solution including the complete diagnosis and corrected 
code from an 11-word problem statement and then a 2-line guess as to 
the cause. Please show your code. Others on this forum will help you. 
(I lack the expertise.)


Bob Cochran
Greenbelt, Maryland, USA


Eric Scouten wrote:

I'm getting this error periodically when attempting to commit a 
transaction.


What I believe is happening is that my database abstraction layer 
has lost track of one or more compiled statements that it created at 
some earlier time. Is there any way to find out *what* transactions 
are still operating at the time this error is issued?


That would help my debugging efforts greatly.

-Eric










Re: [sqlite] Can't commit transaction - SQL statements in progress

2005-12-12 Thread Eric Scouten
If it were easy to boil down to a simple code snippet, I would have 
happily done so. :-) Unfortunately, the error is probably caused 
somewhere inside a relatively complex home-grown wrapper for SQLite and 
is not easily distilled into something I can share here.


The question really boils down to "can SQLite offer enough information 
to help me diagnose the problem it's telling me I have?"


Or to put it another way, this is essentially a memory leak problem. 
SQLite obviously knows that I've lost track of one or more prepared 
statements that haven't run to completion, it isn't telling me *what* 
statements those are. I'm wondering if there is any way of getting that 
information. Armed with that knowledge, I can probably fix my code 
fairly quickly.


At this point, I don't have any reason to suspect that SQLite itself is 
failing.


-Eric


Robert L Cochran wrote:

You really need to post specific code snippets, you can't expect a 
definitive solution including the complete diagnosis and corrected 
code from an 11-word problem statement and then a 2-line guess as to 
the cause. Please show your code. Others on this forum will help you. 
(I lack the expertise.)


Bob Cochran
Greenbelt, Maryland, USA


Eric Scouten wrote:

I'm getting this error periodically when attempting to commit a 
transaction.


What I believe is happening is that my database abstraction layer has 
lost track of one or more compiled statements that it created at some 
earlier time. Is there any way to find out *what* transactions are 
still operating at the time this error is issued?


That would help my debugging efforts greatly.

-Eric






--
Eric Scouten | [EMAIL PROTECTED] | Photography: www.ericscouten.com



Re: [sqlite] Can't commit transaction - SQL statements in progress

2005-12-12 Thread Robert L Cochran
You really need to post specific code snippets, you can't expect a 
definitive solution including the complete diagnosis and corrected code 
from an 11-word problem statement and then a 2-line guess as to the 
cause. Please show your code. Others on this forum will help you. (I 
lack the expertise.)


Bob Cochran
Greenbelt, Maryland, USA


Eric Scouten wrote:

I'm getting this error periodically when attempting to commit a 
transaction.


What I believe is happening is that my database abstraction layer has 
lost track of one or more compiled statements that it created at some 
earlier time. Is there any way to find out *what* transactions are 
still operating at the time this error is issued?


That would help my debugging efforts greatly.

-Eric





[sqlite] Can't commit transaction - SQL statements in progress

2005-12-12 Thread Eric Scouten

I'm getting this error periodically when attempting to commit a transaction.

What I believe is happening is that my database abstraction layer has 
lost track of one or more compiled statements that it created at some 
earlier time. Is there any way to find out *what* transactions are still 
operating at the time this error is issued?


That would help my debugging efforts greatly.

-Eric

--
Eric Scouten | [EMAIL PROTECTED] | Photography: www.ericscouten.com