User:Gifti/Tcl

From Wikitech

From the Toolserver wiki. This page is not yet adapted to Tool Labs.

Database Access

MySQL access is provided by the mysqltcl package.

#!/usr/bin/tclsh
package require mysqltcl

set handle [mysqlconnect -host sql -db u_[exec whoami]]

If you run scripts manually/via cron then mysqltcl uses your .my.cnf directly. If you use mysql inside a web tool, you have to provide the password manually:

#!/usr/bin/tclsh
package require mysqltcl
package require inifile

set password [string trim [ini::value [set ini [ini::open /home/[exec whoami]/.my.cnf r]] client password][ini::close $ini] {"}]
set handle [mysqlconnect -host sql -db u_[exec whoami] -password $password]

FastCGI

The following example shows how to use Tcl with FastCGI. For HTML output you can use the packages cgi or htmlgen.

#!/usr/bin/tclsh
package require cgi
package require Fcgi

set index 0

while {[FCGI_Accept] >= 0} {
    incr index
    cgi_eval {
        title {Tcl FastCGI cgi example}
        body {
            h1 "Tcl FastCGI cgi example, process #[pid]"
            p "Invocation #$index"
            cgi_parray env
        }
    }
}
#!/usr/bin/tclsh
package require htmlgen
package require Fcgi

namespace import htmlgen::*

set index 0

while {[FCGI_Accept] >= 0} {
    incr index
    puts {Content-type: text/html}
    puts {}
    title - "Tcl FastCGI htmlgen example, process #[pid]"
    body ! {
        p - "Invocation #$index"
        pre + {[parray env]}
    }
}

To prevent MySQL connections from being opened and closed repeatedly inside the while loop, make the database handle variable global:


set handle [mysqlconnect ]
global handle

Installing packages locally

If you must install packages locally (package is too specialized or you don't want to wait it to be available), you must provide a path to the package location, i.e. the direct parent directory of the directory containing the pkgIndex.tcl file.

Say you installed package foo into ~/foo and write a script in ~/public_html:

#!/usr/bin/tclsh
lappend auto_path ..

package require foo