Provided by: mysqltcl_3.052-4ubuntu1_amd64 bug

NAME

       mysqltcl - MySQL server access commands for Tcl

SYNOPSIS

       package require Tcl  8.4

       package require mysqltcl  3.0

       ::mysql::connect ?option value...?

       ::mysql::use handle database

       ::mysql::sel handle sql-statement ?-list|-flatlist?

       ::mysql::fetch handle

       ::mysql::exec handle sql-statement

       ::mysql::query handle sql-select-statement

       ::mysql::endquery query-handle

       ::mysql::map handle binding-list script

       ::mysql::receive handle sql-statment binding-list script

       ::mysql::seek handle row-index

       ::mysql::col handle table-name option

       ::mysql::col handle table-name optionkist

       ::mysql::col handle ?option...?

       ::mysql::info handle option

       ::mysql::baseinfo option

       ::mysql::ping handle

       ::mysql::changeuser user password ?database?

       ::mysql::result handle option

       ::mysql::state handle ?-numeric?

       ::mysql::close ?handle?

       ::mysql::insertid handle

       ::mysql::escape ?handle? string

       ::mysql::autocommit handle boolean

       ::mysql::commit handle

       ::mysql::rollback handle

       ::mysql::nextresult handle

       ::mysql::moreresult handle

       ::mysql::warningcount handle

       ::mysql::isnull value

       ::mysql::newnull

       ::mysql::setserveroption handle option

       ::mysql::shutdown handle

       ::mysql::encoding handle ?encoding?

_________________________________________________________________

DESCRIPTION

       MySQLTcl  is  a  collection  of Tcl commands and a Tcl global array that provide access to MySQL database
       servers.

       MySQLTcl is nothing more than a patched version of a patched version of Hakan Soderstrom's patch  of  Tom
       Poindexter's Sybtcl.

       Mysqltcl  is  binary  Tcl library (extension) written in C language that use direkt official MySQL C-API.
       Almost all Tcl commands correspond to MySQL C-API functions.  For detail documentation see official MySQL
       C-API manual.

MYSQLTCL COMMANDS

       ::mysql::connect ?option value...?
              Connect to a MySQL server.  A handle is returned which should be used in other  mysqltcl  commands
              using   this   connection.    ::mysql::connect  raises  a  Tcl  error  if  the  connection  fails.
              ::mysql::connect read first the options from my.cnf file group mysqltcl.  See MySQL  documentation
              chapter "options files".  Possible connection options are:

              -host hostname
                     The host on which the server is located. The local host is used by default.

              -user user
                     The  user  whose  name  is  used for the connection.  The current Unix user-name is used by
                     default.

              -password password
                     The password that must be used for the connection.  If it is not present, the connection is
                     possible only for users with no password on the server.

              -db db If this option is present, db is used as current database, with  no  need  for  a  call  to
                     mysql::use.

              -port port
                     The port number for the TCP/IP connection, if it's different from the default.

              -socket socket
                     The socket or named pipe for the connection.

              -encoding encodingname
                     The  option  works  similar  to  -encoding  option  in  fconfigure. It support also special
                     encoding name binary. By option -binary no converting will be done be  reading  or  writing
                     to/from  MySQL.  If option is not set the system encoding (see utf-8) is used.  Please test
                     all input and outputs with another program to check that all is the way you expect  it.  If
                     option  binary  is  not  used  the system procedures Tcl_ExternalToUtfDString (writing) and
                     Tcl_ExternalToUtf   (reading)   will   be   used   by   option    binary    the    function
                     Tcl_GetByteArrayFromObj and Tcl_NewByteArrayObj are used.  If you want to manipulate binary
                     date  use  -encoding  binary. By handling textes set your special encoding that you want to
                     use in your database. Consider what another system access the database  and  what  encoding
                     they  expect. It can useful to use -encoding utf-8. That is standard encoding in some linux
                     distributions and newer systems.

              -compress boolean
                     Use compression protocol. Default is false

              -odbc boolean
                     The client is an ODBC client. This changes mysqld to  be  more  ODBC-friendly.  Default  is
                     false

              -noschema boolean
                     Don't allow the db_name.tbl_name.col_name syntax. This is for ODBC. It causes the parser to
                     generate  an  error  if you use that syntax, which is useful for trapping bugs in some ODBC
                     programs. This changes mysqld to be more ODBC-friendly. Default is false

              -multistatement boolean
                     Tell the server that the client may send multiple-row-queries (separated by `;').  If  this
                     flag is not set, multiple-row-queries are disabled. Default is false.

              -multiresult boolean
                     Tell  the  server  that  the  client  can handle multiple-result sets from multi-queries or
                     stored procedures.  This is automatically set if CLIENT_MULTI_STATEMENTS is set.

              -localfiles boolean
                     Enable LOAD DATA LOCAL handling. Default is false.

              -foundrows boolean
                     Return the number of found (matched) rows, not the number of  affected  rows.   Default  is
                     false.

              -interactive boolean
                     Allow  interactive_timeout  seconds  (instead of wait_timeout seconds) of inactivity before
                     closing the connection.  The client's session wait_timeout variable  will  be  set  to  the
                     value of the session interactive_timeout variable.  Default is false.

              -ssl boolean
                     Switch to SSL after handshake. Default is  false

              -sslkey string
                     is the pathname to the key file.  Used if -ssl is true

              -sslcert string
                     is the pathname to the certificate file.  Used if -ssl is true

              -sslca string
                     is the pathname to the certificate authority file.  Used if -ssl is true

              -sslcapath string
                     is  the  pathname  to  a directory that contains trusted SSL CA certificates in pem format.
                     Used if -ssl is true

              -sslcipher string
                     is a list of allowable ciphers to use for SSL encryption.  Used if -ssl is true

              -reconnect boolean
                     default is false.

       ::mysql::use handle database
              Associate a connected handle with a particular database.  handle must be a valid handle previously
              obtained from ::mysql::connect.  mysql::use raises a Tcl error if the handle is not  valid  or  if
              the database name specified could not be used.

              Consider  you can use mysqltcl without to specify the database, in this case you must use explizit
              schema notation to specify the table in sql.

              ::mysql::sel $handle {select * from uni.student}

              with option connection -noschema you can prohibit such syntax.

       ::mysql::sel handle sql-statement ?-list|-flatlist?
              Send sql-statement to the server.

              If sql-statement is a SELECT statement and no -list or -flatlist option is specified, the  command
              returns  the  number of rows returned as the result of the query.  The rows can be obtained by the
              ::mysql::fetch and/or the ::mysql::map commands.   The  resulting  rows  are  called  the  pending
              result.

              If  sql-statement  is  a SELECT statement and -list or -flatlist is specified, the command returns
              the full list of rows returned as the result of the query in one of two possible formats:

              -list  generates a list of lists, in which each element is a row of the result.

              -flatlist
                     generates the concatenation of all rows in a single list, which is useful for scanning with
                     a single foreach.
       Example:

       % ::mysql::sel $db "SELECT ID, NAME FROM FRIENDS" -list
       {1 Joe} {2 Phil} {3 John}
       % ::mysql::sel $db "SELECT ID, NAME FROM FRIENDS" -flatlist
       {1 Joe 2 Phil 3 John}

       Note that both list syntaxes are faster than something like

       % ::mysql::sel $db "SELECT ID, NAME FROM FRIENDS"
       % ::mysql::map $db {id name} {lappend result $id $name}
       % set $result
       {1 Joe 2 Phil 3 John}

       If sql-statement is a valid MySQL statement, but not a SELECT statement, the  command  returns  -1  after
       executing  the  statement,  or  an  empty string if -list or -flatlist is specified.  There is no pending
       result in this case.

       In any case ::mysql::sel implicitly cancels any previous result still pending for the handle.

       ::mysql::fetch handle
              Returns the next row from result set as Tcl list.  mysql::fetch raises a Tcl error if there is  no
              pending result for handle.  mysql::fetch was former named mysqlnext.

       ::mysql::exec handle sql-statement
              Send  sql-statement,  a  MySQL  non-SELECT  statement,  to  the server.  The handle must be in use
              (through ::mysql::connect and ::mysql::use).

              ::mysql::exec implicitly cancels any previous result pending for the handle.

              If sql-statement is a valid MySQL SELECT statement, the statement is executed, but the  result  is
              discarded.   No  Tcl  error  is generated.  This amounts to a (potentially costly) no-op.  Use the
              ::mysql::sel command for SELECT statements.

              ::mysql::exec returns the number of affected rows (DELETE, UPDATE).  In case of multiple statement
              ::mysql::exec returns a list of number of affected rows.

       ::mysql::query handle sql-select-statement
              Send sql-select-statement to the server.

              mysql::query allow one to send multiple nested queries on one handle (without need  to  build  new
              handle  or  caching  results).   mysql::query  return a query handle that can be used as handle in
              commands as (mysql::fetch, ::mysql::map, mysql::seek, mysql::col,  mysql::result).   After  result
              proceeding all query must be freed with ::mysql::endquery query-hanlde command.

              Example:

              set query1 [::mysql::query $db {SELECT ID, NAME FROM FRIENDS}\]
              while {[set row [::mysql::fetch $query1]]!=""} {
                  set id [lindex $row 0]
                  set query2 [::mysql::query $db "SELECT ADDRESS FROM ADDRESS WHERE FRIENDID=$ID"]
                  ::mysql::map $query2 address { puts "address = $address" }
                  ::mysql::endquery $query2
              }
              ::mysql::endquery $query1

              In  most  cases  one  should  use sql-joins and avoid nested queries.  SQL-sever can optimize such
              queries.  But in some applications (GUI-Forms) where the results are  used  long  time  the  inner
              query is not known before.

       ::mysql::endquery query-handle
              free  result  memory  after  ::mysql::query command.  You must invoke ::mysql::endquery after each
              mysqlquery to not cause memory leaks. See mysqlquery command.

              Using ::mysql::endquery on db-handle will free also memory  (pending  result)  after  ::mysql::sel
              command.

       ::mysql::map handle binding-list script
              Iterate  a  script over the rows of the pending result.  ::mysql::map may consume all rows or only
              some of the rows  of  the  pending  result.   Any  remaining  rows  may  be  obtained  by  further
              ::mysql::fetch or ::mysql::map commands.

              handle  must be a handle with a pending result from a previous ::mysql::sel command.  binding-list
              must be a list of one or more variable names.  script must be a Tcl script.  It may be empty,  but
              usually it contains one or more commands.

              ::mysql::map  processes one row at a time from the pending result.  For each row the column values
              are bound to the variables in the binding list, then the script is executed.  Binding is  strictly
              positional.   The  first variable in the binding list is bound to the first column of the row, and
              so on.  The variables are created in the current context  (if  they  do  not  already  exist).   A
              variable  name  beginning  with  a  hyphen is not bound; it serves as a placeholder in the binding
              list.  If there are more columns than variables the extra columns are ignored.

              The ::mysql::map command is similar to an ordinary foreach.  A foreach iterates over the  elements
              of  a  list,  ::mysql::map iterates over the rows of a pending result.  In both cases iteration is
              affected by break and continue Tcl commands.  The binding list variables retain their last  values
              after the command has completed.

              A simple example follows.  Assume $db is a handle in use.

              ::mysql::sel $db {
                  select lname, fname, area, phone from friends order by lname, fname
              }
              ::mysql::map $db {ln fn - phone} {
                 if {$phone == {}} continue
                 puts [format "%16s %-8s %s" $ln $fn $phone]
              }

              The  ::mysql::sel command gets and sorts all rows from table friends.  The ::mysql::map command is
              used to format and print the result in a  way  suitable  for  a  phone  list.   For  demonstration
              purposes  one  of  the  columns (area) is not used.  The script begins by skipping over rows which
              have no phone number.  The second command in the script formats and prints values from the row.

              ::mysql::map raises a Tcl error if there is no pending  result  for  handle,  or  if  binding-list
              contains more variables than there are columns in the pending result.

       ::mysql::receive handle sql-statment binding-list script
              This  command works the same way as the command mysqtclmap but it do not need leading ::mysql::sel
              command.  The main difference is internal  using  of  MySQL  client  library.   This  command  use
              mysql_use_result  from  C-API  that  do  not  store  result  on client but try to receive the rows
              directly from server.  There is also no client cache.  This command can  be  faster  as  using  of
              ::mysql::sel and by very big resultset will not overload client machine.  The scipt should process
              the result immediately because it can block table (or tables) for another clients.  If performance
              matter please test all alternatives separately.  You must consider two aspects: memory consumption
              and performance.

       ::mysql::seek handle row-index
              Moves  the  current  position among the rows in the pending result.  This may cause ::mysql::fetch
              and ::mysql::map to re-read rows, or to skip over rows.

              Row index 0 is the position just before the first row in the pending result; row index  1  is  the
              position  just before the second row, and so on.  You may specify a negative row index.  Row index
              -1 is the position just before the last row; row index -2 is the position just before  the  second
              last  row,  and so on.  An out-of-bounds row index will cause ::mysql::seek to set the new current
              position either just before the first row (if the index is too negative), or just after  the  last
              row (if the index exceeds the number of rows).  This is not an error condition.

              ::mysql::seek  returns  the  number  of  rows  that  can be read sequentially from the new current
              position.  ::mysql::seek raises a Tcl error if there is no pending result for handle.

              Portability note: The functionality of ::mysql::seek is frequently absent in other Tcl  extensions
              for  SQL.   That  is because MySQL C-API client library ofers own result set caching functionality
              that lacks another SQL-APIs.  That increase the performance because all rows are received at  once
              and  the  query does not block the server for another clienst , on the other hand you works on the
              cached data can use a lot of memory and are up to date only in the moment of query but not fetch.

       ::mysql::col handle table-name option

       ::mysql::col handle table-name optionkist

       ::mysql::col handle ?option...?
              Return information about the columns of a table.  handle must be in use.  table-name must  be  the
              name  of  a  table;  it may be a table name or -current if there is a pending result.  One or more
              options control what information to return.  Each option must be one of the following keywords.

              name Return the name of a column.

              type   Return the type of a column; one of the strings decimal, tiny, short, long, float,  double,
                     null,  timestamp,  long long, int24, date, time, date time, year, new date, enum, set, tiny
                     blob, medium blob, long blob, blob, var string, or string.  Note that a column of type char
                     will return tiny, while they are represented equally.

              length Return the length of a column in bytes.

              table Return the name of the table in which this column occurs.

              non_null Return the string "1" if the column is non-null; otherwise "0".

              prim_key Return the string "1" if the column is part of the primary key;
                     otherwise "0".

              numeric Return the string "1" if the column is numeric; otherwise "0".

              decimals Return the string "1" if the column is non-null; otherwise "0".
       The three forms of this command generate their result in a particular way.

              [1]    If a single option is present the result is a simple list of values; one for each column.

              [2]    If the options are given in the form of an option list the result is a list of lists.  Each
                     sublist corresponds to a column and contains the information specified by the options.

              [3]    If several options are given, but not in a list, the result is also a list  of  lists.   In
                     this case each sublist corresponds to an option and contains one value for each column.
       The  following is a sample interactive session containing all forms of the ::mysql::col command and their
       results.  The last command uses the -current option.  It  could  alternatively  specify  the  table  name
       explicitly.

       %::mysql::col $db friends name
       name lname area phone
       % ::mysql::col $db friends {name type length}
       {fname char 12} {lname char 20} {area char 5} {phone char 12}
       % ::mysql::sel $db {select * from friends}
       % ::mysql::col $db -current name type length
       {fname lname area phone} {char char char char} {12 20 5 12}]

       ::mysql::info handle option
              Return  various  database  information  depending  on  the  option.  The option must be one of the
              following keywords.

              info   Return a String with information about last operation.  "Records: 3 Duplicates: 0 Warnings:
                     0" by INSERT or "Rows matched: 40 Changed: 40 Warnings: 0" by UPDATE statements  (read  the
                     manual for mysql_info in MySQL C API documentation)

              databases
                     Return a list of all database names known to the server.  The handle must be connected.

              dbname Return the name of the database with which the handle is associated.  The handle must be in
                     use.

              dbname?
                     Return the name of the database with which the handle is associated; an empty string if the
                     handle is connected, but not in use.

              host   Return  the  name  of  the  host  to  which  the  handle  is connected.  The handle must be
                     connected.

              host   Return the name of the host to which the handle is connected; an empty string if the handle
                     is not valid.

              tables Return a list of all table names in the database with which the handle is associated.   The
                     handle must be in use.

              serverversion
                     Returns the version number of the server as a string.

              serverversionid
                     Returns the version number of the server as an integer.

              sqlstate
                     Returns  a  string  containing  the SQLSTATE error code for the last error.  The error code
                     consists of five characters. '00000' means ``no error.''  The values are specified by  ANSI
                     SQL  and  ODBC.   Note  that  not all MySQL errors are yet mapped to SQLSTATE's.  The value
                     'HY000' (general error) is used for unmapped errors.

              state  Returns a  character  string  containing  information  similar  to  that  provided  by  the
                     mysqladmin  status  command.   This  includes  uptime  in seconds and the number of running
                     threads, questions, reloads, and open tables.

       ::mysql::baseinfo option
              return information information that do not need handle.

              connectparameters
                     return all supported connecting options

              clientversion
                     return the version of underlying MYSQL C-API library

       ::mysql::ping handle
              Checks whether the connection to the server  is  working.  If  it  has  gone  down,  an  automatic
              reconnection is attempted.

              This  function  can  be  used  by  clients that remain idle for a long while, to check whether the
              server has closed the connection and reconnect if necessary.

              Return True if server is alive

       ::mysql::changeuser user password ?database?
              Changes the user and causes the database specified by database to  become  the  default  (current)
              database on the connection specified by MySQL. In subsequent queries, this database is the default
              for table references that do not include an explicit database specifier.

              ::mysql::changeuser  fails  unless  the  connected user can be authenticated or if he doesn't have
              permission to use the database. In this case the user and database are not changed

              if database parameter may be set were is no default database.

              Cause Error if operation is not succesed

       ::mysql::result handle option
              Return information about the pending result.  Note that a result is pending until  canceled  by  a
              ::mysql::exec  command,  even  if  no rows remain to be read.  Option must be one of the following
              keywords.

              cols   Return the number of columns in the pending result.  There must be a pending result.

              cols   Return the number of columns in the pending  result;  an  empty  string  if  no  result  is
                     pending.

              current
                     Return  the current position in the pending result; a non-negative integer.  This value can
                     be used as row-index in the ::mysql::seek command.  An error  is  raised  if  there  is  no
                     pending result.

              current?
                     As above, but returns an empty string if there is no pending result.

              rows   Return  the  number  of rows that can be read sequentially from the current position in the
                     pending result.  There must be a pending result.

              rows   Return the number of rows that can be read sequentially from the current  position  in  the
                     pending result; an empty string if no result is pending.

                     [::mysql::result  $db  current] + [::mysql::result $db rows] always equals the total number
                     of rows in the pending result.

       ::mysql::state handle ?-numeric?
              Return the state of a handle as a string or in numeric form.  There is no requirement  on  handle;
              it  may  be  any  string.   The return value is one of the following strings, or the corresponding
              numeric value if -numeric is specified.  The states form a progression where each state builds  on
              the previous.

              NOT_A_HANDLE (0)
                     The string supplied for handle is not a mysqltcl handle at all.

              UNCONNECTED (1)
                     The string supplied for handle is one of the possible mysqltcl handles, but it is not valid
                     to any server.

              CONNECTED (2)
                     The handle is connected to a server, but not associated with a database.

              IN_USE (3)
                     The handle is connected and associated with a database, but there is no pending result.

              RESULT_PENDING (4)
                     The handle is connected, associated with a database, and there is a pending result.

       ::mysql::close ?handle?
              Closes  the  server  connection  associated  with handle, causing it to go back to the unconnected
              state.  Closes all connections if handle is omitted.  Returns  an  empty  string.   ::mysql::close
              raises a Tcl error if a handle is specified which is not valid.

       ::mysql::insertid handle
              Returns the auto increment id of the last INSERT statement.

       ::mysql::escape ?handle? string
              Returns the content of string, with all special characters escaped, so that it is suitable for use
              in  an  SQL  statement.  This  is  simpler (faster) than using a general regexp or string map.  If
              handle is specified C-API function mysql_real_escape_string is  used.   This  is  the  recommended
              usage because in this case current character set is respected.

       ::mysql::autocommit handle boolean
              Sets autocommit mode on if mode is 1, off if mode is 0.

       ::mysql::commit handle
              Commits the current transaction.

       ::mysql::rollback handle
              Rollback the current transaction.

       ::mysql::nextresult handle
              If  more  query  results  exist,  mysql::nextresult() reads the next query results and returns the
              status back to application.  returns -1 if no result or number of rows in the result set.

       ::mysql::moreresult handle
              Returns true if more results exist from the currently executed query,  and  the  application  must
              call mysql::result to fetch the results.

       ::mysql::warningcount handle
              Returns the number of warnings generated during execution of the previous SQL statement.

       ::mysql::isnull value
              Null  handling  is  a known problem with Tcl, especially with DB interaction.  The mysql "varchar"
              type has two valid blank values, NULL and an empty string. This is where the problem  arises;  Tcl
              is not able to differentiate between the two because of the way it handles strings.  Mysql has new
              internal   Tcl   type   for   null   that   string   representation  is  stored  in  global  array
              mysqltcl(nullvalue) and as default empty string.  mysql::isnull can be used  for  safe  check  for
              null  value.   Warning  mysql::isnull  works  only  reliable  if there are no type conversation on
              returned rows.  Consider row is always Tcl list even when there are only one column in the row.

              set row [::mysql::next $handle]
              if {[mysql::isnull [lindex $row 1]]} {
                 puts "2. column of $row is null"
              }
              if {[mysql::isnull $row]} {
                 puts "this does not work, because of type conversation list to string"
              }

       ::mysql::newnull
              create new null object. It can be used to simulate returned row contents.

       ::mysql::setserveroption handle option
              there are only 2 options now: -multi_statment_on and -multi_statment_off

       ::mysql::shutdown handle
              Asks the database server to shut down. The connected user must have SHUTDOWN privileges.

       ::mysql::encoding handle ?encoding?
              Ask or change a encoding of connection.  There are  special  encoding  "binary"  for  binary  data
              transfers.

STATUS INFORMATION

       Mysqltcl  creates  and  maintains  a  Tcl  global  array  to  provide  status  information.   Its name is
       mysqlstatus.

       Mysqlstatus elements:

       code   A numeric conflict code set after every mysqltcl command.  Zero means no conflict; non-zero  means
              some kind of conflict.  All conflicts also generate a Tcl error.

              All MySQL server conflicts set mysqlstatus(code) to the numeric code of the MySQL error.

              Any other conflict sets mysqlstatus(code) to -1.

       command
              The last failing mysqltcl command.  Not updated for successful commands.

       message
              Message  string  for the last conflict detected.  The same string is returned as the result of the
              failing mysqltcl command.  Not updated for successful commands.

       nullvalue
              The string to use in query results to represent the SQL null value.   The  empty  string  is  used
              initially.  You may set it to another value.

Backward compatibility

       Up  from  version  3.0  all  mysql  commands  are  declared  in ::mysql namespace.  All names for example
       mysqlconnect are also available but deprecated.  All old commands have the name pattern  mysql{name}  and
       the most of them are now mysql::{name}.  The exception is mysqlnext, which  was renamed to mysql::fetch.

BUGS & POSSIBLE MISFEATURES

       Deleting any of the mysqltcl commands closes all connections.

AUTHORS

       •      Tobias Ritzau

       •      Paolo Brutti

       •      Artur Trzewik (mail@xdobry.de) - active maintainer

       MySQLTcl  is  derived  from  a patch of msql by Hakan Soderstrom, Soderstrom Programvaruverkstad, S-12242
       Enskede, Sweden.  msql is derived from Sybtcl by Tom Poindexter.  There are  many  contributors  and  bug
       reporter that are not mentioned.  If you have contributed to mysqltcl and wants to be on the list contact
       Artur Trzewik.

                                                       3.0                                           mysqltcl(3)