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.
The entire C API is mapped using Chicken's foreign function interface.
this macro brought to you by the chicken manual :)
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.
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.
24.2.3.2. mysql_change_user() my_bool mysql_change_user(MYSQL *mysql, const char *user, const char *password, const char *db)
24.2.3.3. mysql_character_set_name() const char *mysql_character_set_name(MYSQL *mysql)
24.2.3.4. mysql_close() void mysql_close(MYSQL *mysql)
24.2.3.5. mysql_connect() MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd)
24.2.3.6. mysql_create_db() int mysql_create_db(MYSQL *mysql, const char *db)
24.2.3.7. mysql_data_seek() void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset)
24.2.3.8. mysql_debug() void mysql_debug(const char *debug)
24.2.3.9. mysql_drop_db() int mysql_drop_db(MYSQL *mysql, const char *db)
24.2.3.10. mysql_dump_debug_info() int mysql_dump_debug_info(MYSQL *mysql)
24.2.3.11. mysql_eof() my_bool mysql_eof(MYSQL_RES *result)
24.2.3.12. mysql_errno() unsigned int mysql_errno(MYSQL *mysql)
24.2.3.13. mysql_error() const char *mysql_error(MYSQL *mysql)
24.2.3.14. mysql_escape_string() unsigned long mysql_escape_string(char *to, const char *from, unsigned long length)
24.2.3.15. mysql_fetch_field() MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
24.2.3.16. mysql_fetch_fields() MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
24.2.3.17. mysql_fetch_field_direct() MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int fieldnr)
24.2.3.18. mysql_fetch_lengths()
24.2.3.19. mysql_fetch_row() MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
24.2.3.20. mysql_field_count() unsigned int mysql_field_count(MYSQL *mysql)
24.2.3.21. mysql_field_seek() MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset)
24.2.3.22. mysql_field_tell() MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result)
24.2.3.23. mysql_free_result() void mysql_free_result(MYSQL_RES *result)
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)
24.2.3.26. mysql_get_client_version() unsigned long mysql_get_client_version(void)
24.2.3.27. mysql_get_host_info() char *mysql_get_host_info(MYSQL *mysql)
24.2.3.28. mysql_get_proto_info() unsigned int mysql_get_proto_info(MYSQL *mysql)
24.2.3.29. mysql_get_server_info() char *mysql_get_server_info(MYSQL *mysql)
24.2.3.30. mysql_get_server_version() unsigned long mysql_get_server_version(MYSQL *mysql)
24.2.3.31. mysql_hex_string() unsigned long mysql_hex_string(char *to, const char *from, unsigned long length)
24.2.3.32. mysql_info() char *mysql_info(MYSQL *mysql)
24.2.3.33. mysql_init() MYSQL *mysql_init(MYSQL *mysql)
24.2.3.34. mysql_insert_id() my_ulonglong mysql_insert_id(MYSQL *mysql)
24.2.3.35. mysql_kill() int mysql_kill(MYSQL *mysql, unsigned long pid)
24.2.3.36. mysql_library_init() int mysql_library_init(int argc, char **argv, char **groups)
24.2.3.37. mysql_library_end() void mysql_library_end(void)
24.2.3.38. mysql_list_dbs() MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)
24.2.3.39. mysql_list_fields() MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)
24.2.3.40. mysql_list_processes() MYSQL_RES *mysql_list_processes(MYSQL *mysql)
24.2.3.41. mysql_list_tables() MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)
24.2.3.42. mysql_num_fields() unsigned int mysql_num_fields(MYSQL_RES *result)
24.2.3.43. mysql_num_rows() my_ulonglong mysql_num_rows(MYSQL_RES *result)
24.2.3.44. mysql_options() int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)
24.2.3.45. mysql_ping() int mysql_ping(MYSQL *mysql)
24.2.3.46. mysql_query()
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)
24.2.3.48. mysql_real_escape_string() unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length)
24.2.3.49. mysql_real_query() int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)
24.2.3.50. mysql_reload()
24.2.3.51. mysql_row_seek() MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset)
24.2.3.52. mysql_row_tell() MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result)
24.2.3.53. mysql_select_db() int mysql_select_db(MYSQL *mysql, const char *db)
24.2.3.54. mysql_set_character_set() int mysql_set_character_set(MYSQL *mysql, char *csname)
24.2.3.55. mysql_set_server_option() int mysql_set_server_option(MYSQL *mysql, enum enum_mysql_set_option option)
24.2.3.56. mysql_shutdown() int mysql_shutdown(MYSQL *mysql, enum enum_shutdown_level shutdown_level)
24.2.3.57. mysql_sqlstate() const char *mysql_sqlstate(MYSQL *mysql)
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)
24.2.3.59. mysql_stat() char *mysql_stat(MYSQL *mysql)
24.2.3.60. mysql_store_result() MYSQL_RES *mysql_store_result(MYSQL *mysql)
24.2.3.61. mysql_thread_id() unsigned long mysql_thread_id(MYSQL *mysql)
24.2.3.62. mysql_use_result() MYSQL_RES *mysql_use_result(MYSQL *mysql)
24.2.3.63. mysql_warning_count() unsigned int mysql_warning_count(MYSQL *mysql)
24.2.3.64. mysql_commit() my_bool mysql_commit(MYSQL *mysql)
24.2.3.65. mysql_rollback() my_bool mysql_rollback(MYSQL *mysql)
24.2.3.66. mysql_autocommit() my_bool mysql_autocommit(MYSQL *mysql, my_bool mode)
24.2.3.67. mysql_more_results() my_bool mysql_more_results(MYSQL *mysql)
24.2.3.68. mysql_next_result() int mysql_next_result(MYSQL *mysql)
char *mysqlaux_column_idx(MYSQL *, MYSQL_RES *, MYSQL_ROW, unsigned int);
char *mysqlaux_column_name(MYSQL *, MYSQL_RES *, MYSQL_ROW, const char *);
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.
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).
This part of the API provides a slightly simplified version of the full MySQL C API.
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.
Returns a mysql connection object, or #f on failure.
Returns a string describing the last mysql error, or #f if no error has occurred.
returns #t if the query was successful, #f otherwise.
This API provides some additional functionality for traversing results in a Scheme-ish way.
rewinds to the beginning of the result set. has no effect if there is no current result set.
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.
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-foreign-type mysql-ptr (pointer "MYSQL"))
(define-foreign-type mysql-res-ptr (pointer "MYSQL_RES"))
(define-foreign-type mysql-rows-ptr (pointer "MYSQL_ROWS"))
(define-foreign-type mysql-field-ptr (pointer "MYSQL_FIELD"))
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)
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 ; enum enum_mysql_set_option MYSQL_OPTION_MULTI_STATEMENTS_ON MYSQL_OPTION_MULTI_STATEMENTS_OFF)
(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)
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))
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))
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))
24.2.3.4. mysql_close() void mysql_close(MYSQL *mysql)
(define foreign-mysql-close (foreign-lambda void "mysql_close" mysql-ptr))
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))
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))
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))
24.2.3.8. mysql_debug() void mysql_debug(const char *debug)
(define foreign-mysql-debug (foreign-lambda void "mysql_debug" c-string))
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))
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))
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))
24.2.3.12. mysql_errno() unsigned int mysql_errno(MYSQL *mysql)
(define foreign-mysql-errno (foreign-lambda unsigned-integer "mysql_errno" mysql-ptr))
24.2.3.13. mysql_error() const char *mysql_error(MYSQL *mysql)
(define foreign-mysql-error (foreign-lambda c-string "mysql_error" mysql-ptr))
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))
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))
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))
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))
24.2.3.18. mysql_fetch_lengths()
(define (foreign-mysql-fetch-lengths . args) (error 'foreign-mysql-fetch-lengths "UNIMPLEMENTED (req. ulong vector)"))
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))
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))
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))
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))
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))
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"))
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"))
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))
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))
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))
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))
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))
24.2.3.32. mysql_info() char *mysql_info(MYSQL *mysql)
(define foreign-mysql-info (foreign-lambda c-string "mysql_info" mysql-ptr))
24.2.3.33. mysql_init() MYSQL *mysql_init(MYSQL *mysql)
(define foreign-mysql-init (foreign-lambda mysql-ptr "mysql_init" mysql-ptr))
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))
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))
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))
24.2.3.37. mysql_library_end() void mysql_library_end(void)
(define foreign-mysql-library-end (foreign-lambda void "mysql_library_end"))
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))
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))
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))
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))
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))
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))
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))
24.2.3.45. mysql_ping() int mysql_ping(MYSQL *mysql)
(define foreign-mysql-ping (foreign-lambda integer "mysql_ping" mysql-ptr))
24.2.3.46. mysql_query()
(define (foreign-mysql-query . args) (error 'foreign-mysql-query "UNIMPLEMENTED (use mysql_real_query instead)"))
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 ))
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))
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))
24.2.3.50. mysql_reload()
(define (foreign-mysql-reload . args) (error 'foreign-mysql-reload "UNIMPLEMENTED (deprecated in MySQL C API)"))
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))
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))
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))
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))
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))
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))
24.2.3.57. mysql_sqlstate() const char *mysql_sqlstate(MYSQL *mysql)
(define foreign-mysql-sqlstate (foreign-lambda c-string "mysql_sqlstate" mysql-ptr))
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))
24.2.3.59. mysql_stat() char *mysql_stat(MYSQL *mysql)
(define foreign-mysql-stat (foreign-lambda c-string "mysql_stat" mysql-ptr))
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))
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))
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))
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))
24.2.3.64. mysql_commit() my_bool mysql_commit(MYSQL *mysql)
(define foreign-mysql-commit (foreign-lambda bool "mysql_commit" mysql-ptr))
24.2.3.65. mysql_rollback() my_bool mysql_rollback(MYSQL *mysql)
(define foreign-mysql-rollback (foreign-lambda bool "mysql_rollback" mysql-ptr))
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))
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))
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))
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))
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 mysql-connection host user passwd db port unix-socket client-flag ptr result result-start)
(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)))
(define (mysql-affected-rows conn) (foreign-mysql-affected-rows (mysql-connection-ptr conn)))
(define (mysql-change-user conn #!key (user #f) (passwd #f) (db #f)) (foreign-mysql-change-user (mysql-connection-ptr conn) user passwd db))
(define (mysql-character-set-name conn) (foreign-mysql-character-set-name (mysql-connection-ptr conn)))
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))
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))))))
(define (mysql-debug debug) (foreign-mysql-debug debug))
(define (mysql-dump-debug-info conn) (foreign-mysql-dump-debug-info (mysql-connection-ptr conn)))
(define (mysql-errno conn) (foreign-mysql-errno (mysql-connection-ptr conn)))
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)))
(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)))
(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)))))
(define (mysql-field-count conn) (foreign-mysql-field-count (mysql-connection-ptr conn)))
(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))
(define (mysql-get-client-info) (foreign-mysql-get-client-info))
(define (mysql-get-client-version) (foreign-mysql-get-client-version))
(define (mysql-get-host-info conn) (foreign-mysql-get-host-info (mysql-connection-ptr conn)))
(define (mysql-get-proto-version conn) (foreign-mysql-get-proto-info (mysql-connection-ptr conn)))
(define (mysql-get-server-info conn) (foreign-mysql-get-server-info (mysql-connection-ptr conn)))
(define (mysql-get-server-version conn) (foreign-mysql-get-server-version (mysql-connection-ptr conn)))
(define (mysql-info conn) (foreign-mysql-info (mysql-connection-ptr conn)))
(define (mysql-insert-id conn) (foreign-mysql-insert-id (mysql-connection-ptr conn)))
(define (mysql-kill conn pid) (foreign-mysql-kill (mysql-connection-ptr conn) pid))
(define (mysql-list-dbs conn like) (mysql-free-result conn) (mysql-connection-result-set! conn (foreign-mysql-list-dbs (mysql-connection-ptr conn) like)))
(define (mysql-list-processes conn) (mysql-free-result conn) (mysql-connection-result-set! conn (foreign-mysql-list-processes (mysql-connection-ptr conn))))
(define (mysql-list-tables conn wild) (mysql-free-result conn) (mysql-connection-result-set! conn (foreign-mysql-list-tables (mysql-connection-ptr conn) wild)))
(define (mysql-num-fields conn) (foreign-mysql-num-fields (mysql-connection-result conn)))
(define (mysql-num-rows conn) (if (not (mysql-connection-result conn)) #f (foreign-mysql-num-rows (mysql-connection-result conn))))
(define (mysql-options conn option arg) (foreign-mysql-options (mysql-connection-ptr conn) option arg))
(define (mysql-ping conn) (foreign-mysql-ping (mysql-connection-ptr conn)))
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))))
(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))
(define (mysql-stat conn) (foreign-mysql-stat (mysql-connection-ptr conn)))
(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)))
(define (mysql-thread-id conn) (foreign-mysql-thread-id (mysql-connection-ptr conn)))
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))))
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)))
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))