bionic (3) mysqltcl.3.gz

Provided by: mysqltcl_3.052-2_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 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 immadiatly 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 aviable 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)