MySQL Egg for Chicken Scheme

MySQL Egg for the Chicken Scheme system.

mysql.scm,v 1.4 2005/08/04 10:09:26 tbutzon Exp

Author: Toby Butzon (toby@butzon.com)
Revisions: 2005.08.04 Initial release.

This egg provides the MySQL C API via Chicken's foreign function
interface. The function names in the MySQL C API are uniformly
exported with "foreign-" prefixed to the name, and underscores are
mapped to the more Scheme-ish dash; e.g., the MySQL C API's
mysql_query is provided by this egg as foreign-mysql-query. Although
these functions are exported, they are not verbosely documented in
the egg documentation simply because the MySQL C API is already
documented in full on MySQL's website:

http://dev.mysql.com/doc/mysql/en/c.html

Further, this egg provides a layer on top of the foreign API to
provide a simpler API that is appropriate to Scheme. These functions
are _not_ prefixed with "foreign-" -- instead they are named according
to the closest MySQL C API analog, if one exists. For example, the
provided mysql-connect is briefer, yet provides the same functionality
as, the C API sequence mysql_init, mysql_real_connect, and returns a
Scheme-friendly record instead of a FFI C pointer.

Please report bugs to <toby@butzon.com>.

Copyright (c) 2005 Toby Butzon.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.



Interface to C API
Foreign type definitions.
m: define-foreign-enum
Foreign function definitions from MySQL C API.
f: foreign-mysql-affected-rows
f: foreign-mysql-change-user
f: foreign-mysql-character-set-name
f: foreign-mysql-close
f: foreign-mysql-connect
f: foreign-mysql-create-db
f: foreign-mysql-data-seek
f: foreign-mysql-debug
f: foreign-mysql-drop-db
f: foreign-mysql-dump-debug-info
f: foreign-mysql-eof
f: foreign-mysql-errno
f: foreign-mysql-error
f: foreign-mysql-escape-string
f: foreign-mysql-fetch-field
f: foreign-mysql-fetch-fields
f: foreign-mysql-fetch-field-direct
f: foreign-mysql-fetch-lengths
f: foreign-mysql-fetch-row
f: foreign-mysql-field-count
f: foreign-mysql-field-seek
f: foreign-mysql-field-tell
f: foreign-mysql-free-result
f: foreign-mysql-get-client-info
f: foreign-mysql-get-client-version
f: foreign-mysql-get-host-info
f: foreign-mysql-get-proto-info
f: foreign-mysql-get-server-info
f: foreign-mysql-get-server-version
f: foreign-mysql-hex-string
f: foreign-mysql-info
f: foreign-mysql-init
f: foreign-mysql-insert-id
f: foreign-mysql-kill
f: foreign-mysql-library-init
f: foreign-mysql-library-end
f: foreign-mysql-list-dbs
f: foreign-mysql-list-fields
f: foreign-mysql-list-processes
f: foreign-mysql-list-tables
f: foreign-mysql-num-fields
f: foreign-mysql-num-rows
f: foreign-mysql-options
f: foreign-mysql-ping
f: foreign-mysql-query
f: foreign-mysql-real-connect
f: foreign-mysql-real-escape-string
f: foreign-mysql-real-query
f: foreign-mysql-reload
f: foreign-mysql-row-seek
f: foreign-mysql-row-tell
f: foreign-mysql-select-db
f: foreign-mysql-set-character-set
f: foreign-mysql-set-server-option
f: foreign-mysql-shutdown
f: foreign-mysql-sqlstate
f: foreign-mysql-ssl-set
f: foreign-mysql-stat
f: foreign-mysql-store-result
f: foreign-mysql-thread-id
f: foreign-mysql-use-result
f: foreign-mysql-warning-count
f: foreign-mysql-commit
f: foreign-mysql-rollback
f: foreign-mysql-autocommit
f: foreign-mysql-more-results
f: foreign-mysql-next-result
Foreign function definitions for mysqlaux functions.
f: foreign-mysqlaux-column-idx
f: foreign-mysqlaux-column-name

Provided Scheme API.
MySQL "Connection" record type definition.
The "base" MySQL/Scheme API.
f: mysql-affected-rows
f: mysql-change-user
f: mysql-character-set-name
f: mysql-close
f: mysql-connect
f: mysql-debug
f: mysql-dump-debug-info
f: mysql-errno
f: mysql-error
f: mysql-escape-string
f: mysql-fetch-row
f: mysql-field-count
f: mysql-free-result
f: mysql-get-client-info
f: mysql-get-client-version
f: mysql-get-host-info
f: mysql-get-proto-version
f: mysql-get-server-info
f: mysql-get-server-version
f: mysql-info
f: mysql-insert-id
f: mysql-kill
f: mysql-list-dbs
f: mysql-list-processes
f: mysql-list-tables
f: mysql-num-fields
f: mysql-num-rows
f: mysql-options
f: mysql-ping
f: mysql-query
f: mysql-select-db
f: mysql-stat
f: mysql-store-result
f: mysql-thread-id
The "extended" MySQL/Scheme API.
f: mysql-rewind
f: mysql-foreach-row
f: mysql-query-foreach

Interface to C API

The entire C API is mapped using Chicken's foreign function interface.


Foreign type definitions.


define-foreign-enum

(define-macro (define-foreign-enum . items)
... Full Code ... )
this macro brought to you by the chicken manual :)



Foreign function definitions from MySQL C API.

I've copied the listing of MySQL C API functions straight from the
MySQL manual. They are in alphabetical order, exactly as they appear
in the manual. Further, the C function signature is copied below the
manual entry. Finally, the Scheme foreign lambda mapping follows the
C function signature.

foreign-mysql-affected-rows

(define foreign-mysql-affected-rows
... Full Code ... )
24.2.3.1. mysql_affected_rows()
my_ulonglong mysql_affected_rows(MYSQL *mysql)
note: my_ulonglong is (possibly incorrectly) mapped directly to 
unsigned-long. it should be a long long, but i'm not sure how to get
closer to that than this for now.


foreign-mysql-change-user

(define foreign-mysql-change-user
... Full Code ... )
24.2.3.2. mysql_change_user()
my_bool mysql_change_user(MYSQL *mysql, const char *user, 
const char *password, const char *db)


foreign-mysql-character-set-name

(define foreign-mysql-character-set-name
... Full Code ... )
24.2.3.3. mysql_character_set_name()
const char *mysql_character_set_name(MYSQL *mysql)


foreign-mysql-close

(define foreign-mysql-close
... Full Code ... )
24.2.3.4. mysql_close()
void mysql_close(MYSQL *mysql)


foreign-mysql-connect

(define foreign-mysql-connect
... Full Code ... )
24.2.3.5. mysql_connect()
MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, 
const char *passwd)


foreign-mysql-create-db

(define foreign-mysql-create-db
... Full Code ... )
24.2.3.6. mysql_create_db()
int mysql_create_db(MYSQL *mysql, const char *db)


foreign-mysql-data-seek

(define foreign-mysql-data-seek
... Full Code ... )
24.2.3.7. mysql_data_seek()
void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset)


foreign-mysql-debug

(define foreign-mysql-debug
... Full Code ... )
24.2.3.8. mysql_debug()
void mysql_debug(const char *debug)


foreign-mysql-drop-db

(define foreign-mysql-drop-db
... Full Code ... )
24.2.3.9. mysql_drop_db()
int mysql_drop_db(MYSQL *mysql, const char *db) 


foreign-mysql-dump-debug-info

(define foreign-mysql-dump-debug-info
... Full Code ... )
24.2.3.10. mysql_dump_debug_info()
int mysql_dump_debug_info(MYSQL *mysql)


foreign-mysql-eof

(define foreign-mysql-eof
... Full Code ... )
24.2.3.11. mysql_eof()
my_bool mysql_eof(MYSQL_RES *result)


foreign-mysql-errno

(define foreign-mysql-errno
... Full Code ... )
24.2.3.12. mysql_errno()
unsigned int mysql_errno(MYSQL *mysql)


foreign-mysql-error

(define foreign-mysql-error
... Full Code ... )
24.2.3.13. mysql_error()
const char *mysql_error(MYSQL *mysql)


foreign-mysql-escape-string

(define foreign-mysql-escape-string
... Full Code ... )
24.2.3.14. mysql_escape_string()
unsigned long mysql_escape_string(char *to, const char *from, 
unsigned long length)


foreign-mysql-fetch-field

(define foreign-mysql-fetch-field
... Full Code ... )
24.2.3.15. mysql_fetch_field()
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)


foreign-mysql-fetch-fields

(define foreign-mysql-fetch-fields
... Full Code ... )
24.2.3.16. mysql_fetch_fields()
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)


foreign-mysql-fetch-field-direct

(define foreign-mysql-fetch-field-direct
... Full Code ... )
24.2.3.17. mysql_fetch_field_direct()
MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int fieldnr)


foreign-mysql-fetch-lengths

(define (foreign-mysql-fetch-lengths . args)
... Full Code ... )
24.2.3.18. mysql_fetch_lengths()


foreign-mysql-fetch-row

(define foreign-mysql-fetch-row
... Full Code ... )
24.2.3.19. mysql_fetch_row()
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)


foreign-mysql-field-count

(define foreign-mysql-field-count
... Full Code ... )
24.2.3.20. mysql_field_count()
unsigned int mysql_field_count(MYSQL *mysql)


foreign-mysql-field-seek

(define foreign-mysql-field-seek
... Full Code ... )
24.2.3.21. mysql_field_seek()
MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, 
MYSQL_FIELD_OFFSET offset)


foreign-mysql-field-tell

(define foreign-mysql-field-tell
... Full Code ... )
24.2.3.22. mysql_field_tell()
MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result)


foreign-mysql-free-result

(define foreign-mysql-free-result
... Full Code ... )
24.2.3.23. mysql_free_result()
void mysql_free_result(MYSQL_RES *result)


foreign-mysql-get-client-info

(define foreign-mysql-get-client-info
... Full Code ... )
24.2.3.24. mysql_get_character_set_info() -- only in MySQL > 5.0.10 
24.2.3.25. mysql_get_client_info()
char *mysql_get_client_info(void)


foreign-mysql-get-client-version

(define foreign-mysql-get-client-version
... Full Code ... )
24.2.3.26. mysql_get_client_version()
unsigned long mysql_get_client_version(void)


foreign-mysql-get-host-info

(define foreign-mysql-get-host-info
... Full Code ... )
24.2.3.27. mysql_get_host_info()
char *mysql_get_host_info(MYSQL *mysql)


foreign-mysql-get-proto-info

(define foreign-mysql-get-proto-info
... Full Code ... )
24.2.3.28. mysql_get_proto_info()
unsigned int mysql_get_proto_info(MYSQL *mysql)


foreign-mysql-get-server-info

(define foreign-mysql-get-server-info
... Full Code ... )
24.2.3.29. mysql_get_server_info()
char *mysql_get_server_info(MYSQL *mysql)


foreign-mysql-get-server-version

(define foreign-mysql-get-server-version
... Full Code ... )
24.2.3.30. mysql_get_server_version()
unsigned long mysql_get_server_version(MYSQL *mysql) 


foreign-mysql-hex-string

(define foreign-mysql-hex-string
... Full Code ... )
24.2.3.31. mysql_hex_string()
unsigned long mysql_hex_string(char *to, const char *from, 
unsigned long length)


foreign-mysql-info

(define foreign-mysql-info
... Full Code ... )
24.2.3.32. mysql_info()
char *mysql_info(MYSQL *mysql)


foreign-mysql-init

(define foreign-mysql-init
... Full Code ... )
24.2.3.33. mysql_init()
MYSQL *mysql_init(MYSQL *mysql)


foreign-mysql-insert-id

(define foreign-mysql-insert-id
... Full Code ... )
24.2.3.34. mysql_insert_id()
my_ulonglong mysql_insert_id(MYSQL *mysql)


foreign-mysql-kill

(define foreign-mysql-kill
... Full Code ... )
24.2.3.35. mysql_kill()
int mysql_kill(MYSQL *mysql, unsigned long pid)


foreign-mysql-library-init

(define foreign-mysql-library-init
... Full Code ... )
24.2.3.36. mysql_library_init()
int mysql_library_init(int argc, char **argv, char **groups)


foreign-mysql-library-end

(define foreign-mysql-library-end
... Full Code ... )
24.2.3.37. mysql_library_end()
void mysql_library_end(void)


foreign-mysql-list-dbs

(define foreign-mysql-list-dbs
... Full Code ... )
24.2.3.38. mysql_list_dbs()
MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)


foreign-mysql-list-fields

(define foreign-mysql-list-fields
... Full Code ... )
24.2.3.39. mysql_list_fields()
MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, 
const char *wild) 


foreign-mysql-list-processes

(define foreign-mysql-list-processes
... Full Code ... )
24.2.3.40. mysql_list_processes()
MYSQL_RES *mysql_list_processes(MYSQL *mysql)


foreign-mysql-list-tables

(define foreign-mysql-list-tables
... Full Code ... )
24.2.3.41. mysql_list_tables()
MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)


foreign-mysql-num-fields

(define foreign-mysql-num-fields
... Full Code ... )
24.2.3.42. mysql_num_fields()
unsigned int mysql_num_fields(MYSQL_RES *result)


foreign-mysql-num-rows

(define foreign-mysql-num-rows
... Full Code ... )
24.2.3.43. mysql_num_rows()
my_ulonglong mysql_num_rows(MYSQL_RES *result)


foreign-mysql-options

(define foreign-mysql-options
... Full Code ... )
24.2.3.44. mysql_options()
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)


foreign-mysql-ping

(define foreign-mysql-ping
... Full Code ... )
24.2.3.45. mysql_ping()
int mysql_ping(MYSQL *mysql)


foreign-mysql-query

(define (foreign-mysql-query . args)
... Full Code ... )
24.2.3.46. mysql_query()


foreign-mysql-real-connect

(define foreign-mysql-real-connect
... Full Code ... )
24.2.3.47. mysql_real_connect()
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, 
const char *passwd, const char *db, unsigned int port, 
const char *unix_socket, unsigned long client_flag)


foreign-mysql-real-escape-string

(define foreign-mysql-real-escape-string
... Full Code ... )
24.2.3.48. mysql_real_escape_string()
unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, 
const char *from, unsigned long length)


foreign-mysql-real-query

(define foreign-mysql-real-query
... Full Code ... )
24.2.3.49. mysql_real_query()
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)


foreign-mysql-reload

(define (foreign-mysql-reload . args)
... Full Code ... )
24.2.3.50. mysql_reload()


foreign-mysql-row-seek

(define foreign-mysql-row-seek
... Full Code ... )
24.2.3.51. mysql_row_seek()
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset)


foreign-mysql-row-tell

(define foreign-mysql-row-tell
... Full Code ... )
24.2.3.52. mysql_row_tell()
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result)


foreign-mysql-select-db

(define foreign-mysql-select-db
... Full Code ... )
24.2.3.53. mysql_select_db()
int mysql_select_db(MYSQL *mysql, const char *db)


foreign-mysql-set-character-set

(define foreign-mysql-set-character-set
... Full Code ... )
24.2.3.54. mysql_set_character_set()
int mysql_set_character_set(MYSQL *mysql, char *csname)


foreign-mysql-set-server-option

(define foreign-mysql-set-server-option
... Full Code ... )
24.2.3.55. mysql_set_server_option()
int mysql_set_server_option(MYSQL *mysql, enum enum_mysql_set_option option)


foreign-mysql-shutdown

(define foreign-mysql-shutdown
... Full Code ... )
24.2.3.56. mysql_shutdown()
int mysql_shutdown(MYSQL *mysql, enum enum_shutdown_level shutdown_level) 


foreign-mysql-sqlstate

(define foreign-mysql-sqlstate
... Full Code ... )
24.2.3.57. mysql_sqlstate()
const char *mysql_sqlstate(MYSQL *mysql)


foreign-mysql-ssl-set

(define foreign-mysql-ssl-set
... Full Code ... )
24.2.3.58. mysql_ssl_set()
int mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert, 
const char *ca, const char *capath, const char *cipher)


foreign-mysql-stat

(define foreign-mysql-stat
... Full Code ... )
24.2.3.59. mysql_stat()
char *mysql_stat(MYSQL *mysql)


foreign-mysql-store-result

(define foreign-mysql-store-result
... Full Code ... )
24.2.3.60. mysql_store_result()
MYSQL_RES *mysql_store_result(MYSQL *mysql)


foreign-mysql-thread-id

(define foreign-mysql-thread-id
... Full Code ... )
24.2.3.61. mysql_thread_id()
unsigned long mysql_thread_id(MYSQL *mysql)


foreign-mysql-use-result

(define foreign-mysql-use-result
... Full Code ... )
24.2.3.62. mysql_use_result()
MYSQL_RES *mysql_use_result(MYSQL *mysql)


foreign-mysql-warning-count

(define foreign-mysql-warning-count
... Full Code ... )
24.2.3.63. mysql_warning_count()
unsigned int mysql_warning_count(MYSQL *mysql)


foreign-mysql-commit

(define foreign-mysql-commit
... Full Code ... )
24.2.3.64. mysql_commit()
my_bool mysql_commit(MYSQL *mysql)


foreign-mysql-rollback

(define foreign-mysql-rollback
... Full Code ... )
24.2.3.65. mysql_rollback()
my_bool mysql_rollback(MYSQL *mysql)


foreign-mysql-autocommit

(define foreign-mysql-autocommit
... Full Code ... )
24.2.3.66. mysql_autocommit()
my_bool mysql_autocommit(MYSQL *mysql, my_bool mode)


foreign-mysql-more-results

(define foreign-mysql-more-results
... Full Code ... )
24.2.3.67. mysql_more_results()
my_bool mysql_more_results(MYSQL *mysql)


foreign-mysql-next-result

(define foreign-mysql-next-result
... Full Code ... )
24.2.3.68. mysql_next_result()
int mysql_next_result(MYSQL *mysql)



Foreign function definitions for mysqlaux functions.


foreign-mysqlaux-column-idx

(define foreign-mysqlaux-column-idx
... Full Code ... )
char *mysqlaux_column_idx(MYSQL *, MYSQL_RES *, MYSQL_ROW, unsigned int);


foreign-mysqlaux-column-name

(define foreign-mysqlaux-column-name
... Full Code ... )
char *mysqlaux_column_name(MYSQL *, MYSQL_RES *, MYSQL_ROW, const char *);



Provided Scheme API.

This is an attempt at a Schemer-friendly API to MySQL. Much of the API
is the same, but the C API has been simplified where possible, and a
few additional features have been layered on.


MySQL "Connection" record type definition.

I've stuffed the raw FFI pointer into a slot in the mysql-connection
record. The record is here for a few reasons:

1) Instead of an ugly #<pointer>, I've defined a pretty printer
to demonstrate that we've actually got a MySQL connection. 
2) The C API is somewhat more verbose than what normal usage would
need. (For example, usually you don't care whether results are
all read into memory as fast as possible, or if they're read from
the network one-by-one. Thus, the mysql-query function provided
automatically reads the results into memory. For finer granularity,
you're always free to write your own version to use the "raw"
foreign-* functions. I suppose a contribution to determine this
behavior via a (make-parameter ...) parameter may also be 
accepted. ;)) Slots are provided in the mysql-connection record
type to allow for this sort of simplifying behavior.

All of the "Scheme API" MySQL functions take instances of this record
type, instead of a raw FFI pointer (as the foreign-* functions require).


The "base" MySQL/Scheme API.

This part of the API provides a slightly simplified version of the full
MySQL C API.

mysql-affected-rows

(define (mysql-affected-rows conn)
... Full Code ... )


mysql-change-user

(define (mysql-change-user conn #!key (user #f) (passwd #f) (db #f))
... Full Code ... )


mysql-character-set-name

(define (mysql-character-set-name conn)
... Full Code ... )


mysql-close

(define (mysql-close conn)
... Full Code ... )
Closes a mysql connection and invalidates the mysql connection object.
Returns (void). You should do this when you're done with the MySQL
connection; however, if you don't close it manually, it will be closed
upon termination.


mysql-connect

(define (mysql-connect #!key (host #f) (user #f) (passwd #f) (db #f) (port 0) (unix-socket #f) (client-flag 0))
... Full Code ... )
Returns a mysql connection object, or #f on failure.


mysql-debug

(define (mysql-debug debug)
... Full Code ... )


mysql-dump-debug-info

(define (mysql-dump-debug-info conn)
... Full Code ... )


mysql-errno

(define (mysql-errno conn)
... Full Code ... )


mysql-error

(define (mysql-error conn)
... Full Code ... )
Returns a string describing the last mysql error, or #f if no error
has occurred.


mysql-escape-string

(define (mysql-escape-string conn str)
... Full Code ... )


mysql-fetch-row

(define (mysql-fetch-row conn)
... Full Code ... )


mysql-field-count

(define (mysql-field-count conn)
... Full Code ... )


mysql-free-result

(define (mysql-free-result conn)
... Full Code ... )


mysql-get-client-info

(define (mysql-get-client-info)
... Full Code ... )


mysql-get-client-version

(define (mysql-get-client-version)
... Full Code ... )


mysql-get-host-info

(define (mysql-get-host-info conn)
... Full Code ... )


mysql-get-proto-version

(define (mysql-get-proto-version conn)
... Full Code ... )


mysql-get-server-info

(define (mysql-get-server-info conn)
... Full Code ... )


mysql-get-server-version

(define (mysql-get-server-version conn)
... Full Code ... )


mysql-info

(define (mysql-info conn)
... Full Code ... )


mysql-insert-id

(define (mysql-insert-id conn)
... Full Code ... )


mysql-kill

(define (mysql-kill conn pid)
... Full Code ... )


mysql-list-dbs

(define (mysql-list-dbs conn like)
... Full Code ... )


mysql-list-processes

(define (mysql-list-processes conn)
... Full Code ... )


mysql-list-tables

(define (mysql-list-tables conn wild)
... Full Code ... )


mysql-num-fields

(define (mysql-num-fields conn)
... Full Code ... )


mysql-num-rows

(define (mysql-num-rows conn)
... Full Code ... )


mysql-options

(define (mysql-options conn option arg)
... Full Code ... )


mysql-ping

(define (mysql-ping conn)
... Full Code ... )


mysql-query

(define (mysql-query conn query)
... Full Code ... )
returns #t if the query was successful, #f otherwise. 


mysql-select-db

(define (mysql-select-db conn db)
... Full Code ... )


mysql-stat

(define (mysql-stat conn)
... Full Code ... )


mysql-store-result

(define (mysql-store-result conn)
... Full Code ... )


mysql-thread-id

(define (mysql-thread-id conn)
... Full Code ... )



The "extended" MySQL/Scheme API.

This API provides some additional functionality for traversing results
in a Scheme-ish way.

mysql-rewind

(define (mysql-rewind conn)
... Full Code ... )
rewinds to the beginning of the result set. has no effect if there is no
current result set.


mysql-foreach-row

(define (mysql-foreach-row conn body)
... Full Code ... )
calls body on every row in the current result set. body should take 2
arguments: the row (as described for mysql-fetch-row) and the row index
(which starts with 1 and ends with (mysql-num-rows conn).
note: rewinds the result set before and after iterating over it; thus,
all rows are included, but you must call mysql-rewind if you later want
to iterate over the result set using mysql-fetch-row.


mysql-query-foreach

(define (mysql-query-foreach conn query body)
... Full Code ... )
executes query and then mysql-foreach-row with the given body. the body
must meet the contract specified for the body passed to mysql-foreach-row.


Code

define-foreign-type
Index
(define-foreign-type mysql-ptr (pointer "MYSQL"))
define-foreign-type
Index
(define-foreign-type mysql-res-ptr (pointer "MYSQL_RES"))
define-foreign-type
Index
(define-foreign-type mysql-rows-ptr (pointer "MYSQL_ROWS"))
define-foreign-type
Index
(define-foreign-type mysql-field-ptr (pointer "MYSQL_FIELD"))

define-foreign-type
Index
mysql-row-ptr represents the C type MYSQL_ROW, which is actually a char**,
but we're just going to pass it to other mysql functions, hence the generic
c-pointer.
(define-foreign-type mysql-row c-pointer)

define-foreign-enum
Index
this macro brought to you by the chicken manual :)
(define-macro (define-foreign-enum . items)
  `(begin
    ,@(map (match-lambda 
              [(name realname) `(define-foreign-variable ,name int ,realname)]
              [name `(define-foreign-variable ,name int)])
           items)))

define-foreign-enum
Index
(define-foreign-enum ; enum enum_mysql_set_option
  MYSQL_OPTION_MULTI_STATEMENTS_ON
  MYSQL_OPTION_MULTI_STATEMENTS_OFF)

define-foreign-enum
Index
(define-foreign-enum ; enum mysql_option
  MYSQL_OPT_CONNECT_TIMEOUT MYSQL_OPT_COMPRESS MYSQL_OPT_NAMED_PIPE
  MYSQL_INIT_COMMAND MYSQL_READ_DEFAULT_FILE MYSQL_READ_DEFAULT_GROUP
  MYSQL_SET_CHARSET_DIR MYSQL_SET_CHARSET_NAME MYSQL_OPT_LOCAL_INFILE
  MYSQL_OPT_PROTOCOL MYSQL_SHARED_MEMORY_BASE_NAME MYSQL_OPT_READ_TIMEOUT
  MYSQL_OPT_WRITE_TIMEOUT MYSQL_OPT_USE_RESULT
  MYSQL_OPT_USE_REMOTE_CONNECTION MYSQL_OPT_USE_EMBEDDED_CONNECTION
  MYSQL_OPT_GUESS_CONNECTION MYSQL_SET_CLIENT_IP MYSQL_SECURE_AUTH
  MYSQL_REPORT_DATA_TRUNCATION)


foreign-mysql-affected-rows

Index
24.2.3.1. mysql_affected_rows()
my_ulonglong mysql_affected_rows(MYSQL *mysql)
note: my_ulonglong is (possibly incorrectly) mapped directly to 
unsigned-long. it should be a long long, but i'm not sure how to get
closer to that than this for now.
(define foreign-mysql-affected-rows
  (foreign-lambda unsigned-long "mysql_affected_rows" mysql-ptr))

foreign-mysql-change-user

Index
24.2.3.2. mysql_change_user()
my_bool mysql_change_user(MYSQL *mysql, const char *user, 
const char *password, const char *db)
(define foreign-mysql-change-user
  (foreign-lambda bool "mysql_change_user" mysql-ptr c-string c-string 
                  c-string))

foreign-mysql-character-set-name

Index
24.2.3.3. mysql_character_set_name()
const char *mysql_character_set_name(MYSQL *mysql)
(define foreign-mysql-character-set-name
  (foreign-lambda c-string "mysql_character_set_name" mysql-ptr))

foreign-mysql-close

Index
24.2.3.4. mysql_close()
void mysql_close(MYSQL *mysql)
(define foreign-mysql-close
  (foreign-lambda void "mysql_close" mysql-ptr))

foreign-mysql-connect

Index
24.2.3.5. mysql_connect()
MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, 
const char *passwd)
(define foreign-mysql-connect
  (foreign-lambda mysql-ptr "mysql_connect" mysql-ptr c-string c-string
                  c-string))

foreign-mysql-create-db

Index
24.2.3.6. mysql_create_db()
int mysql_create_db(MYSQL *mysql, const char *db)
(define foreign-mysql-create-db
  (foreign-lambda integer "mysql_create_db" mysql-ptr c-string))

foreign-mysql-data-seek

Index
24.2.3.7. mysql_data_seek()
void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset)
(define foreign-mysql-data-seek
  (foreign-lambda void "mysql_data_seek" mysql-res-ptr unsigned-long))

foreign-mysql-debug

Index
24.2.3.8. mysql_debug()
void mysql_debug(const char *debug)
(define foreign-mysql-debug
  (foreign-lambda void "mysql_debug" c-string))

foreign-mysql-drop-db

Index
24.2.3.9. mysql_drop_db()
int mysql_drop_db(MYSQL *mysql, const char *db) 
(define foreign-mysql-drop-db
  (foreign-lambda integer "mysql_drop_db" mysql-ptr c-string))

foreign-mysql-dump-debug-info

Index
24.2.3.10. mysql_dump_debug_info()
int mysql_dump_debug_info(MYSQL *mysql)
(define foreign-mysql-dump-debug-info
  (foreign-lambda integer "mysql_dump_debug_info" mysql-ptr))

foreign-mysql-eof

Index
24.2.3.11. mysql_eof()
my_bool mysql_eof(MYSQL_RES *result)
(define foreign-mysql-eof
  (foreign-lambda bool "mysql_eof" mysql-res-ptr))

foreign-mysql-errno

Index
24.2.3.12. mysql_errno()
unsigned int mysql_errno(MYSQL *mysql)
(define foreign-mysql-errno 
  (foreign-lambda unsigned-integer "mysql_errno" mysql-ptr))

foreign-mysql-error

Index
24.2.3.13. mysql_error()
const char *mysql_error(MYSQL *mysql)
(define foreign-mysql-error
  (foreign-lambda c-string "mysql_error" mysql-ptr))

foreign-mysql-escape-string

Index
24.2.3.14. mysql_escape_string()
unsigned long mysql_escape_string(char *to, const char *from, 
unsigned long length)
(define foreign-mysql-escape-string
  (foreign-lambda unsigned-long "mysql_escape_string" c-string c-string
                  unsigned-long))

foreign-mysql-fetch-field

Index
24.2.3.15. mysql_fetch_field()
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
(define foreign-mysql-fetch-field
  (foreign-lambda mysql-field-ptr "mysql_fetch_field" mysql-res-ptr))

foreign-mysql-fetch-fields

Index
24.2.3.16. mysql_fetch_fields()
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
(define foreign-mysql-fetch-fields
  (foreign-lambda mysql-field-ptr "mysql_fetch_fields" mysql-res-ptr))

foreign-mysql-fetch-field-direct

Index
24.2.3.17. mysql_fetch_field_direct()
MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int fieldnr)
(define foreign-mysql-fetch-field-direct
  (foreign-lambda mysql-field-ptr "mysql_fetch_field_direct" mysql-res-ptr
                  unsigned-integer))

foreign-mysql-fetch-lengths

Index
24.2.3.18. mysql_fetch_lengths()
(define (foreign-mysql-fetch-lengths . args)
  (error 'foreign-mysql-fetch-lengths "UNIMPLEMENTED (req. ulong vector)"))

foreign-mysql-fetch-row

Index
24.2.3.19. mysql_fetch_row()
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
(define foreign-mysql-fetch-row
  (foreign-lambda mysql-row "mysql_fetch_row" mysql-res-ptr))

foreign-mysql-field-count

Index
24.2.3.20. mysql_field_count()
unsigned int mysql_field_count(MYSQL *mysql)
(define foreign-mysql-field-count
  (foreign-lambda unsigned-integer "mysql_field_count" mysql-ptr))

foreign-mysql-field-seek

Index
24.2.3.21. mysql_field_seek()
MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, 
MYSQL_FIELD_OFFSET offset)
(define foreign-mysql-field-seek
  (foreign-lambda unsigned-integer "mysql_field_seek" mysql-res-ptr 
                  unsigned-integer))

foreign-mysql-field-tell

Index
24.2.3.22. mysql_field_tell()
MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result)
(define foreign-mysql-field-tell
  (foreign-lambda unsigned-integer "mysql_field_tell" mysql-res-ptr))

foreign-mysql-free-result

Index
24.2.3.23. mysql_free_result()
void mysql_free_result(MYSQL_RES *result)
(define foreign-mysql-free-result
  (foreign-lambda void "mysql_free_result" mysql-res-ptr))

foreign-mysql-get-client-info

Index
24.2.3.24. mysql_get_character_set_info() -- only in MySQL > 5.0.10 
24.2.3.25. mysql_get_client_info()
char *mysql_get_client_info(void)
(define foreign-mysql-get-client-info
  (foreign-lambda c-string "mysql_get_client_info"))

foreign-mysql-get-client-version

Index
24.2.3.26. mysql_get_client_version()
unsigned long mysql_get_client_version(void)
(define foreign-mysql-get-client-version
  (foreign-lambda unsigned-long "mysql_get_client_version"))

foreign-mysql-get-host-info

Index
24.2.3.27. mysql_get_host_info()
char *mysql_get_host_info(MYSQL *mysql)
(define foreign-mysql-get-host-info
  (foreign-lambda c-string "mysql_get_host_info" mysql-ptr))

foreign-mysql-get-proto-info

Index
24.2.3.28. mysql_get_proto_info()
unsigned int mysql_get_proto_info(MYSQL *mysql)
(define foreign-mysql-get-proto-info
  (foreign-lambda unsigned-integer "mysql_get_proto_info" mysql-ptr))

foreign-mysql-get-server-info

Index
24.2.3.29. mysql_get_server_info()
char *mysql_get_server_info(MYSQL *mysql)
(define foreign-mysql-get-server-info
  (foreign-lambda c-string "mysql_get_server_info" mysql-ptr))

foreign-mysql-get-server-version

Index
24.2.3.30. mysql_get_server_version()
unsigned long mysql_get_server_version(MYSQL *mysql) 
(define foreign-mysql-get-server-version
  (foreign-lambda unsigned-long "mysql_get_server_version" mysql-ptr))

foreign-mysql-hex-string

Index
24.2.3.31. mysql_hex_string()
unsigned long mysql_hex_string(char *to, const char *from, 
unsigned long length)
(define foreign-mysql-hex-string
  (foreign-lambda unsigned-long "mysql_hex_string" c-string c-string
                  unsigned-long))

foreign-mysql-info

Index
24.2.3.32. mysql_info()
char *mysql_info(MYSQL *mysql)
(define foreign-mysql-info
  (foreign-lambda c-string "mysql_info" mysql-ptr))

foreign-mysql-init

Index
24.2.3.33. mysql_init()
MYSQL *mysql_init(MYSQL *mysql)
(define foreign-mysql-init 
  (foreign-lambda mysql-ptr "mysql_init" mysql-ptr))

foreign-mysql-insert-id

Index
24.2.3.34. mysql_insert_id()
my_ulonglong mysql_insert_id(MYSQL *mysql)
(define foreign-mysql-insert-id
  (foreign-lambda unsigned-long "mysql_insert_id" mysql-ptr))

foreign-mysql-kill

Index
24.2.3.35. mysql_kill()
int mysql_kill(MYSQL *mysql, unsigned long pid)
(define foreign-mysql-kill
  (foreign-lambda integer "mysql_kill" mysql-ptr unsigned-long))

foreign-mysql-library-init

Index
24.2.3.36. mysql_library_init()
int mysql_library_init(int argc, char **argv, char **groups)
(define foreign-mysql-library-init
  (foreign-lambda integer "mysql_library_init" integer c-pointer c-pointer))

foreign-mysql-library-end

Index
24.2.3.37. mysql_library_end()
void mysql_library_end(void)
(define foreign-mysql-library-end
  (foreign-lambda void "mysql_library_end"))

foreign-mysql-list-dbs

Index
24.2.3.38. mysql_list_dbs()
MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)
(define foreign-mysql-list-dbs
  (foreign-lambda mysql-res-ptr "mysql_list_dbs" mysql-ptr c-string))

foreign-mysql-list-fields

Index
24.2.3.39. mysql_list_fields()
MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, 
const char *wild) 
(define foreign-mysql-list-fields
  (foreign-lambda mysql-res-ptr "mysql_list_fields" mysql-ptr c-string 
                  c-string))

foreign-mysql-list-processes

Index
24.2.3.40. mysql_list_processes()
MYSQL_RES *mysql_list_processes(MYSQL *mysql)
(define foreign-mysql-list-processes
  (foreign-lambda mysql-res-ptr "mysql_list_processes" mysql-ptr))

foreign-mysql-list-tables

Index
24.2.3.41. mysql_list_tables()
MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)
(define foreign-mysql-list-tables
  (foreign-lambda mysql-res-ptr "mysql_list_tables" mysql-ptr c-string))

foreign-mysql-num-fields

Index
24.2.3.42. mysql_num_fields()
unsigned int mysql_num_fields(MYSQL_RES *result)
(define foreign-mysql-num-fields
  (foreign-lambda unsigned-integer "mysql_num_fields" mysql-res-ptr))

foreign-mysql-num-rows

Index
24.2.3.43. mysql_num_rows()
my_ulonglong mysql_num_rows(MYSQL_RES *result)
(define foreign-mysql-num-rows
  (foreign-lambda unsigned-long "mysql_num_rows" mysql-res-ptr))

foreign-mysql-options

Index
24.2.3.44. mysql_options()
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)
(define foreign-mysql-options
  (foreign-lambda integer "mysql_options" mysql-ptr unsigned-integer c-string))

foreign-mysql-ping

Index
24.2.3.45. mysql_ping()
int mysql_ping(MYSQL *mysql)
(define foreign-mysql-ping
  (foreign-lambda integer "mysql_ping" mysql-ptr))

foreign-mysql-query

Index
24.2.3.46. mysql_query()
(define (foreign-mysql-query . args)
  (error 'foreign-mysql-query "UNIMPLEMENTED (use mysql_real_query instead)"))

foreign-mysql-real-connect

Index
24.2.3.47. mysql_real_connect()
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, 
const char *passwd, const char *db, unsigned int port, 
const char *unix_socket, unsigned long client_flag)
(define foreign-mysql-real-connect 
  (foreign-lambda mysql-ptr "mysql_real_connect" mysql-ptr
                  c-string c-string c-string c-string ; host user pwd db
                  unsigned-integer ; port, 0 for default
                  c-string ; unix_socket, NULL for default
                  unsigned-long ; client_flag
                  ))

foreign-mysql-real-escape-string

Index
24.2.3.48. mysql_real_escape_string()
unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, 
const char *from, unsigned long length)
(define foreign-mysql-real-escape-string
  (foreign-lambda unsigned-long "mysql_real_escape_string" mysql-ptr
                  c-string c-string unsigned-long))

foreign-mysql-real-query

Index
24.2.3.49. mysql_real_query()
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)
(define foreign-mysql-real-query 
  (foreign-lambda unsigned-integer "mysql_real_query" mysql-ptr c-string 
                  unsigned-long))

foreign-mysql-reload

Index
24.2.3.50. mysql_reload()
(define (foreign-mysql-reload . args)
  (error 'foreign-mysql-reload "UNIMPLEMENTED (deprecated in MySQL C API)"))

foreign-mysql-row-seek

Index
24.2.3.51. mysql_row_seek()
MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset)
(define foreign-mysql-row-seek
  (foreign-lambda mysql-rows-ptr "mysql_row_seek" mysql-res-ptr mysql-rows-ptr))

foreign-mysql-row-tell

Index
24.2.3.52. mysql_row_tell()
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result)
(define foreign-mysql-row-tell
  (foreign-lambda mysql-rows-ptr "mysql_row_tell" mysql-res-ptr))

foreign-mysql-select-db

Index
24.2.3.53. mysql_select_db()
int mysql_select_db(MYSQL *mysql, const char *db)
(define foreign-mysql-select-db
  (foreign-lambda integer "mysql_select_db" mysql-ptr c-string))

foreign-mysql-set-character-set

Index
24.2.3.54. mysql_set_character_set()
int mysql_set_character_set(MYSQL *mysql, char *csname)
(define foreign-mysql-set-character-set
  (foreign-lambda integer "mysql_set_character_set" mysql-ptr c-string))

foreign-mysql-set-server-option

Index
24.2.3.55. mysql_set_server_option()
int mysql_set_server_option(MYSQL *mysql, enum enum_mysql_set_option option)
(define foreign-mysql-set-server-option
  (foreign-lambda integer "mysql_set_server_option" mysql-ptr integer))

foreign-mysql-shutdown

Index
24.2.3.56. mysql_shutdown()
int mysql_shutdown(MYSQL *mysql, enum enum_shutdown_level shutdown_level) 
(define foreign-mysql-shutdown
  (foreign-lambda integer "mysql_shutdown" mysql-ptr integer))

foreign-mysql-sqlstate

Index
24.2.3.57. mysql_sqlstate()
const char *mysql_sqlstate(MYSQL *mysql)
(define foreign-mysql-sqlstate
  (foreign-lambda c-string "mysql_sqlstate" mysql-ptr))

foreign-mysql-ssl-set

Index
24.2.3.58. mysql_ssl_set()
int mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert, 
const char *ca, const char *capath, const char *cipher)
(define foreign-mysql-ssl-set
  (foreign-lambda integer "mysql_ssl_set" mysql-ptr c-string c-string
                  c-string c-string c-string))

foreign-mysql-stat

Index
24.2.3.59. mysql_stat()
char *mysql_stat(MYSQL *mysql)
(define foreign-mysql-stat
  (foreign-lambda c-string "mysql_stat" mysql-ptr))

foreign-mysql-store-result

Index
24.2.3.60. mysql_store_result()
MYSQL_RES *mysql_store_result(MYSQL *mysql)
(define foreign-mysql-store-result
  (foreign-lambda mysql-res-ptr "mysql_store_result" mysql-ptr))

foreign-mysql-thread-id

Index
24.2.3.61. mysql_thread_id()
unsigned long mysql_thread_id(MYSQL *mysql)
(define foreign-mysql-thread-id
  (foreign-lambda unsigned-long "mysql_thread_id" mysql-ptr))

foreign-mysql-use-result

Index
24.2.3.62. mysql_use_result()
MYSQL_RES *mysql_use_result(MYSQL *mysql)
(define foreign-mysql-use-result
  (foreign-lambda mysql-res-ptr "mysql_use_result" mysql-ptr))

foreign-mysql-warning-count

Index
24.2.3.63. mysql_warning_count()
unsigned int mysql_warning_count(MYSQL *mysql)
(define foreign-mysql-warning-count
  (foreign-lambda unsigned-integer "mysql_warning_count" mysql-ptr))

foreign-mysql-commit

Index
24.2.3.64. mysql_commit()
my_bool mysql_commit(MYSQL *mysql)
(define foreign-mysql-commit
  (foreign-lambda bool "mysql_commit" mysql-ptr))

foreign-mysql-rollback

Index
24.2.3.65. mysql_rollback()
my_bool mysql_rollback(MYSQL *mysql)
(define foreign-mysql-rollback
  (foreign-lambda bool "mysql_rollback" mysql-ptr))

foreign-mysql-autocommit

Index
24.2.3.66. mysql_autocommit()
my_bool mysql_autocommit(MYSQL *mysql, my_bool mode)
(define foreign-mysql-autocommit
  (foreign-lambda bool "mysql_autocommit" mysql-ptr bool))

foreign-mysql-more-results

Index
24.2.3.67. mysql_more_results()
my_bool mysql_more_results(MYSQL *mysql)
(define foreign-mysql-more-results
  (foreign-lambda bool "mysql_more_results" mysql-ptr))

foreign-mysql-next-result

Index
24.2.3.68. mysql_next_result()
int mysql_next_result(MYSQL *mysql)
(define foreign-mysql-next-result
  (foreign-lambda integer "mysql_next_result" mysql-ptr))

foreign-mysqlaux-column-idx

Index
char *mysqlaux_column_idx(MYSQL *, MYSQL_RES *, MYSQL_ROW, unsigned int);
(define foreign-mysqlaux-column-idx
  (foreign-lambda c-string "mysqlaux_column_idx" mysql-ptr mysql-res-ptr
                  mysql-row unsigned-integer))

foreign-mysqlaux-column-name

Index
char *mysqlaux_column_name(MYSQL *, MYSQL_RES *, MYSQL_ROW, const char *);
(define foreign-mysqlaux-column-name
  (foreign-lambda c-string "mysqlaux_column_name" mysql-ptr mysql-res-ptr
                  mysql-row nonnull-c-string))

define-record
Index
(define-record mysql-connection 
  host user passwd db port unix-socket client-flag
  ptr
  result result-start)

define-record-printer
Index
(define-record-printer (mysql-connection conn out)
  (let [(host (mysql-connection-host conn))
        (user (mysql-connection-user conn))
        (passwd (mysql-connection-passwd conn))
        (db (mysql-connection-db conn))
        (tcp-port (mysql-connection-port conn))
        (unix-socket (mysql-connection-unix-socket conn))
        (client-flag (mysql-connection-client-flag conn))]
    (display (conc "(mysql-connect"
                   (if (not (mysql-connection-ptr conn)) 
                     " #!invalid)"
                     (conc 
                       (if host (conc " host: \"" host "\"") "")
                       (if user (conc " user: \"" user "\"") "")
                       (if passwd (conc " passwd: \"" passwd "\"") "")
                       (if db (conc " db: \"" db "\"") "")
                       (if (not (= 0 tcp-port)) (conc " port: " tcp-port) "")
                       (if unix-socket 
                         (conc " unix-socket: \"" unix-socket "\"") "")
                       (if (not (= 0 client-flag)) 
                          (conc " client-flag: " client-flag) "")
                       ")")))
             out)))

mysql-affected-rows

Index
(define (mysql-affected-rows conn)
  (foreign-mysql-affected-rows (mysql-connection-ptr conn)))

mysql-change-user

Index
(define (mysql-change-user conn #!key (user #f) (passwd #f) (db #f))
  (foreign-mysql-change-user (mysql-connection-ptr conn) user passwd db))

mysql-character-set-name

Index
(define (mysql-character-set-name conn)
  (foreign-mysql-character-set-name (mysql-connection-ptr conn)))

mysql-close

Index
Closes a mysql connection and invalidates the mysql connection object.
Returns (void). You should do this when you're done with the MySQL
connection; however, if you don't close it manually, it will be closed
upon termination.
(define (mysql-close conn)
  (mysql-free-result conn)
  (foreign-mysql-close (mysql-connection-ptr conn))
  (mysql-connection-ptr-set! conn #f))

mysql-connect

Index
Returns a mysql connection object, or #f on failure.
(define (mysql-connect #!key (host #f) (user #f) (passwd #f) (db #f) (port 0)
                       (unix-socket #f) (client-flag 0))
  (let [(mysql (foreign-mysql-init #f))]
    (if (not mysql) #f
      (let [(mysql-ptr (foreign-mysql-real-connect mysql host user passwd db
                                                   port unix-socket 
                                                   client-flag))]
        (if (not mysql-ptr)
          #f
          (make-mysql-connection host user passwd db port unix-socket
            client-flag mysql-ptr #f #f))))))

mysql-debug

Index
(define (mysql-debug debug)
  (foreign-mysql-debug debug))

mysql-dump-debug-info

Index
(define (mysql-dump-debug-info conn)
  (foreign-mysql-dump-debug-info (mysql-connection-ptr conn)))

mysql-errno

Index
(define (mysql-errno conn)
  (foreign-mysql-errno (mysql-connection-ptr conn)))

mysql-error

Index
Returns a string describing the last mysql error, or #f if no error
has occurred.
(define (mysql-error conn)
  (let [(errstr (foreign-mysql-error (mysql-connection-ptr conn)))]
    (if (string=? errstr "") #f errstr)))

mysql-escape-string

Index
(define (mysql-escape-string conn str)
  (letrec [(lolevel-string (allocate (+ 1 (* 2 (string-length str)))))]
    (foreign-mysql-real-escape-string 
      (mysql-connection-ptr conn) 
      lolevel-string
      str
      (string-length str))
    (let [(scm-str (pointer->object lolevel-string))]
      (free lolevel-string)
      scm-str)))

mysql-fetch-row

Index
(define (mysql-fetch-row conn)
  (let [(result (mysql-connection-result conn))]
    (if (not result) #f
     (let* [(row (foreign-mysql-fetch-row result))
            (row-lambda
             (lambda (field)
               (cond [(number? field) 
                      (foreign-mysqlaux-column-idx
                        (mysql-connection-ptr conn)
                        result row field)]
                     [else 
                      (foreign-mysqlaux-column-name 
                        (mysql-connection-ptr conn)
                        result row (->string field))])))]
      (if (not row) #f row-lambda)))))

mysql-field-count

Index
(define (mysql-field-count conn)
  (foreign-mysql-field-count (mysql-connection-ptr conn)))

mysql-free-result

Index
(define (mysql-free-result conn)
  (let [(res (mysql-connection-result conn))]
    (if res (foreign-mysql-free-result res)))
  (mysql-connection-result-set! conn #f)
  (mysql-connection-result-start-set! conn #f))

mysql-get-client-info

Index
(define (mysql-get-client-info)
  (foreign-mysql-get-client-info))

mysql-get-client-version

Index
(define (mysql-get-client-version)
  (foreign-mysql-get-client-version))

mysql-get-host-info

Index
(define (mysql-get-host-info conn)
  (foreign-mysql-get-host-info (mysql-connection-ptr conn)))

mysql-get-proto-version

Index
(define (mysql-get-proto-version conn)
  (foreign-mysql-get-proto-info (mysql-connection-ptr conn)))

mysql-get-server-info

Index
(define (mysql-get-server-info conn)
  (foreign-mysql-get-server-info (mysql-connection-ptr conn)))

mysql-get-server-version

Index
(define (mysql-get-server-version conn)
  (foreign-mysql-get-server-version (mysql-connection-ptr conn)))

mysql-info

Index
(define (mysql-info conn)
  (foreign-mysql-info (mysql-connection-ptr conn)))

mysql-insert-id

Index
(define (mysql-insert-id conn)
  (foreign-mysql-insert-id (mysql-connection-ptr conn)))

mysql-kill

Index
(define (mysql-kill conn pid)
  (foreign-mysql-kill (mysql-connection-ptr conn) pid))

mysql-list-dbs

Index
(define (mysql-list-dbs conn like)
  (mysql-free-result conn)
  (mysql-connection-result-set! conn
    (foreign-mysql-list-dbs (mysql-connection-ptr conn) like)))

mysql-list-processes

Index
(define (mysql-list-processes conn)
  (mysql-free-result conn)
  (mysql-connection-result-set! conn
    (foreign-mysql-list-processes (mysql-connection-ptr conn))))

mysql-list-tables

Index
(define (mysql-list-tables conn wild)
  (mysql-free-result conn)
  (mysql-connection-result-set! conn
    (foreign-mysql-list-tables (mysql-connection-ptr conn) wild)))

mysql-num-fields

Index
(define (mysql-num-fields conn)
  (foreign-mysql-num-fields (mysql-connection-result conn)))

mysql-num-rows

Index
(define (mysql-num-rows conn)
  (if (not (mysql-connection-result conn))
    #f
    (foreign-mysql-num-rows (mysql-connection-result conn))))

mysql-options

Index
(define (mysql-options conn option arg)
  (foreign-mysql-options (mysql-connection-ptr conn) option arg))

mysql-ping

Index
(define (mysql-ping conn)
  (foreign-mysql-ping (mysql-connection-ptr conn)))

mysql-query

Index
returns #t if the query was successful, #f otherwise. 
(define (mysql-query conn query)
  (let* [(mysql-ptr (mysql-connection-ptr conn))
         (result (= 0 ;; zero indicates success
            (foreign-mysql-real-query mysql-ptr query (string-length query))))]
    (if (not result) 
      (error (conc "mysql-query failed: " (mysql-error conn))) 
      (begin
        (mysql-store-result conn)
        #t))))

mysql-select-db

Index
(define (mysql-select-db conn db)
  (if (not (= 0 (foreign-mysql-select-db (mysql-connection-ptr conn) db)))
    (error (conc "mysql-select-db failed: " (mysql-error)))
    #t))

mysql-stat

Index
(define (mysql-stat conn)
  (foreign-mysql-stat (mysql-connection-ptr conn)))

mysql-store-result

Index
(define (mysql-store-result conn)
  (mysql-connection-result-set! 
    conn 
    (foreign-mysql-store-result (mysql-connection-ptr conn)))
  (mysql-connection-result-start-set! conn
    (if (mysql-connection-result conn)
      (foreign-mysql-row-tell (mysql-connection-result conn))
      #f)))

mysql-thread-id

Index
(define (mysql-thread-id conn)
  (foreign-mysql-thread-id (mysql-connection-ptr conn)))


mysql-rewind

Index
rewinds to the beginning of the result set. has no effect if there is no
current result set.
(define (mysql-rewind conn)
  (if (mysql-connection-result-start conn)
    (foreign-mysql-row-seek (mysql-connection-result conn)
                            (mysql-connection-result-start conn))))

mysql-foreach-row

Index
calls body on every row in the current result set. body should take 2
arguments: the row (as described for mysql-fetch-row) and the row index
(which starts with 1 and ends with (mysql-num-rows conn).
note: rewinds the result set before and after iterating over it; thus,
all rows are included, but you must call mysql-rewind if you later want
to iterate over the result set using mysql-fetch-row.
(define (mysql-foreach-row conn body)
  (mysql-rewind conn)
  (letrec [(foreach-row 
             (lambda (conn body rownum)
               (if (not conn) #f
                 (let [(row (mysql-fetch-row conn))]
                   (if (not row) #t
                     (begin
                       (body row rownum)
                       (foreach-row conn body (+ rownum 1))))))))]
    (foreach-row conn body 1)))

mysql-query-foreach

Index
executes query and then mysql-foreach-row with the given body. the body
must meet the contract specified for the body passed to mysql-foreach-row.
(define (mysql-query-foreach conn query body)
  (mysql-query conn query)
  (mysql-foreach-row conn body))