On Mar 28, 2008, at 4:35 PM, Noah Hart wrote:
> A general question for the TCL experts....
>
> There is no problem, I'm just trying to understand how TCL works.
>
> In tester.tcl,v 1.79, at line 60, there is the following section:
>
> # Create a test database
> #
> catch {db close}
> file delete -force test.db
> file delete -force test.db-journal
> sqlite3 db ./test.db
> set ::DB [sqlite3_connection_pointer db]
>
> My question is: Why is the last line not "set ::DB db"
>
> What does sqlite3_connection_pointer do?
> Since this is not a tcl verb, or defined by sqlite3, where does this  
> get
> defined?
>

There are countless new TCL verbs implemented in C code and found
in SQLite source files whose names begin with "test".  The
sqlite3_connection_pointer verb is but one of many.

(BTW, in TCL lingo, one would normally call this a "command" not a
"verb".  But if you are more comfortable with "verb", that terminology
works for me too.)

The sqlite3_connection_pointer verb is an anachronism.  The various
new TCL verbs that interface to SQLite (example: sqlite3_prepare,
sqlite3_steo, etc.) often require a database connection as a parameter.
Originally, the implementations of these commands required that the
parameter be the hexadecimal representation of the actually sqlite3*
pointer.  But when you use the "sqlite3" command to open a database
connection, you get back a TCL object, not a pointer.  The
sqlite3_connection_pointer verb would translate the TCL database
object into the appropriate pointer.

The statement:

     set ::DB [sqlite3_connection_pointer db]

translates the TCL database object "db" into a hexadecimal pointer
value and stores that value in the global variable "DB".  Subsequent
commands in the same script would then use the value as "$::DB".

This is all an anachronism because at this point, most of the other
TCL commands have been upgraded and can accept the TCL database
object directly.  So instead of saying:

      sqlite3_prepare $::DB ...

we can now say:

     sqlite3_prepare db ...

which is much more convenient.  However, the test scripts have been
generated incrementally over the past 8 years and most of them have not
been upgraded to take advantage of the new syntax.  So there are still
many calls to [sqlite3_connection_pointer] and uses of $::DB even though
they are not needed.


D. Richard Hipp
[EMAIL PROTECTED]



_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to