This is a (full [ACID]) [SQL] database and it is OpenSource. It comes with binding for many languages, including one for [Tcl]. The database has its home at http://www.postgresql.org (The server side of) Postgres is available for [Windows] only through [Cygwin]. ---- [[Explain special relation between PG and Tcl (also Python, PHP, ...). Explain pgintcl. Give recipe for first use. Mention connection between PG's asynchronous notification and Tcl's event loop. Distinguish client-side bindings and procedural DB language (also ...). t has Tcl support inside (procedural language) and outside (SQL client lib bindings) right out of the box. Lots of references. Win* ]] ---- This Tcl binding comes as a (shared and/or static) library and on a Linux-System you can easily build a package from that. You only need to create a directory under, say, /usr/lib/tcl (replace this by a path searched by your local Tcl/Tk installation), place a copy of the library there, and go ahead. Here's an example: > cd /usr/lib/tcl8.3 > mkdir postgresql > cp /usr/local/pgsql/lib/libpgtcl.so.2.2 postgresql/libpgtcl.so > cd postgresql > tclsh % pkg_mkIndex /usr/lib/tcl8.3/postgresql *.so % exit This produced a pkgIndex.tcl file with all needed information to use the [package]. I then use the package with a simple package require Pgtcl in my applications. ---- I found, that the syntax of the Pgtcl commands are not the Tcl way. So I wrote a little wrapper around the commands provided by the Pgtcl package to make them more tcl-like: proc pg {cmd args} { switch $cmd { connect {pg_connect [lindex $args end]} disconnect {pg_disconnect [lindex $args end]} execute {pg_exec [lindex $args 0] [lindex $args 1]} getrow {pg_result [lindex $args 0] -getTuple [lindex $args 1]} clear {pg_result [lindex $args 0] -clear} status {pg_result [lindex $args 0] -status} rowcount {pg_result [lindex $args 0] -numTuples} } } This adds a command pg to Tcl which I like far more than the original one. Instead of saying pg_connect "mydb" pg_disconnect $myHandle pg_result $myResult -clear I just type pg connect "mydb" pg disconnect $myHandle pg clear $myResult Please note, that there is no error handling and checking in the command pg and you can easily type in wrong things. It would be best to put this command in it's own namespace and provide for error checking etc. You could even add more funcionality like a loop command for query results like in nstcl ---- What: PostgreSQL Where: http://www.postgresql.org/ http://www.ids.net/%7Ebjepson/freeODBC/ http://www.openlinksw.com/ http://www.demon.co.uk/finder/postgres/ http://www.ucolick.org/%7Ede/tcl_syb/wisql.html ftp://rocker.sch.bme.hu/pub/mirrors/postgreSQL/ http://www.illustra.com/ http://aldev.8m.com/ http://aldev.webjump.com/ http://www3.bcity.com/aldev/ ftp://ftp.redhat.com/ http://www.pgsql.com/ http://www.askesis.nl/AskesisPostgresIndex.html http://members.spree.com/technology/aldev/ http://field.medicine.adelaide.edu.au/%7Ecolin/libtclpq/ ftp://field.medicine.adelaide.edu.au/pub/libtclpq/libtclpq.tgz Description: PostgreSQL is a derivitive of POSTGRES 4.2, converted to ANSI C. POSTGRES is a database management system. It is compliant with ANSI SQL92 and SQL89. It supports a number of enhancements, such as inheritance, declaritive queries, optimization, concurrency control, transactions, mult-user support, user defined operators, types, functions, and access methods. APIs exist for C, C++, Java, Perl4, Perl5, Python, SQL and Tcl. Free versions of drivers for ODBC and JDBC are under development. A commercial version of PostgreSQL is available via Illustra, Inc. The most recent version is 6.4.2-5. Updated: 04/1999 Contact: mailto:majordomo@postgres95.vnet.net (PostGres95 mailing list) ---- pgintcl is another Tcl interface to PostgreSQL, which is itself written entirely in Tcl and does not rely on libpq. http://gborg.postgresql.org/project/pgintcl/projdisplay.php ---- I got caught out by a problem using pg_execute. pg_execute evaluates the supplied script for each row of the result. I was appending each result to a list. The problem was that the speed scaled very poorly as the number of records increased. I boiled it down to this test case: set a "" time [list pg_execute pgsql5 "SELECT * FROM journal LIMIT 1000" { append a {23456789012345678901234567890123456789012345678901234567890}}] It turned out to be because append was, of course, returning the whole variable, which was quite big. pg_execute was internally doing something slow with what was returned. Changing the test case to: set a "" time [list pg_execute pgsql5 "SELECT * FROM journal LIMIT 1000" { append a {23456789012345678901234567890123456789012345678901234567890} ; list}] fixed the problem. This reduced the time to read 10,000 records from about half a minute to 170 milliseconds! 20031113 MB ---- ''Pronounced "post-grehs-Q-L", though in most other cases SQL is pronounced as "sequel" -[FW]'' ---- [Category Database]