mirror of
https://github.com/MariaDB/server.git
synced 2025-08-09 22:24:09 +03:00
flaws list) TODO: * verify that no sequence of API calls produces SIGSEGV. That is, verify that mysql_stmt_init -> mysql_stmt_fetch is OK, or mysql_stmt_prepare -> mysql_stmt_fetch_column is OK and sets meaningful error. * remove alloc_stmt_fields call * revise stmt->state codes and statement states. * there are other items in prepared statements 'to fix' document. Done: - cleanups and comments - revision of prepared statement error codes. - mysql_stmt_prepare is now can always be called (that is, you can reprepare a statement) - new implementation of mysql_stmt_close and fetch cancellation include/errmsg.h: - CR_NOT_ALL_PARAMS_BOUND - this error code wasn't used until now. Apparently it was added in advance, but then interface of mysql_stmt_bind_param changed. Now it's not possible to bind only some parameters - either all or none of parameters are bound. This error code is renamed to CR_PARAMS_NOT_BOUND - CR_FETCH_CANCELLED - error code set on server side when fetch from MYSQL_RES or MYSQL_STMT (in blocking mode) was cancelled because of intercepting call to mysql_stmt_close - CR_NO_DATA - this is proposed error code to return from mysql_stmt_fetch_column if no row was fetched (by any type of fetch). We always can fall back to CR_COMMANDS_OUT_OF_SYNC though. Need reviewer's opinion on this one. include/mysql.h: - added unbuffered_fetch_owner member to MYSQL to point to MYSQL_RES or MYSQL_STMT which is used to fetch result at the moment. This is to be able to set CR_FETCH_CANCELLED error without fantoms. - added unbuffered_fetch_cancelled boolean variable to MYSQL_STMT and MYSQL_RES structures - rename PREP_STMT_STATE -> enum enum_mysql_stmt_state - members of MYSQL_STMT ordered by size. - removed members of MYSQL_STMT: current_row, result_buffered, last_fetched_column, last_fetched_buffer, query - renamed members of MYSQL_STMT: param_buffers -> bind_param_done, res_buffers -> bind_result_done - now mysql_stmt_fetch calls stmt->read_row_func to read row either from buffer or from network. include/sql_common.h: declaration for flush_use_result libmysql/client_settings.h: stmt_close declaration removed libmysql/errmsg.c: Error messages for changed and added error codes. libmysql/libmysql.c: Many changes: - some unused variables removed - cleanups - better error reporting - some function calls commented - alloc_stmt_fields is now called right after execute, to not read mysql->fields of some other statement - new implementation of mysql_stmt_fetch - this is also with cursor fetch in mind (to implement cursor fetch I'll just need to write special read_row function for it, so this change will be local) - implementation of fetch cancellation, including complete rewrite of mysql_stmt_close - now mysql_stmt_free_result doesn't free results of other statements. sql-common/client.c: - implementation of flush_use_result - implementation of fetch cancellation - changed behaviour of mysql_close in regard to mysql_stmt_close - now mysql_close just set stmt->mysql to 0
72 lines
2.9 KiB
C
72 lines
2.9 KiB
C
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
|
|
|
extern uint mysql_port;
|
|
extern my_string mysql_unix_port;
|
|
|
|
#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | \
|
|
CLIENT_LOCAL_FILES | CLIENT_TRANSACTIONS | \
|
|
CLIENT_PROTOCOL_41 | CLIENT_SECURE_CONNECTION)
|
|
|
|
sig_handler pipe_sig_handler(int sig __attribute__((unused)));
|
|
void read_user_name(char *name);
|
|
my_bool send_file_to_server(MYSQL *mysql, const char *filename);
|
|
|
|
/*
|
|
Let the user specify that we don't want SIGPIPE; This doesn't however work
|
|
with threaded applications as we can have multiple read in progress.
|
|
*/
|
|
|
|
#if !defined(__WIN__) && defined(SIGPIPE) && !defined(THREAD)
|
|
#define init_sigpipe_variables sig_return old_signal_handler=(sig_return) 0;
|
|
#define set_sigpipe(mysql) if ((mysql)->client_flag & CLIENT_IGNORE_SIGPIPE) old_signal_handler=signal(SIGPIPE,pipe_sig_handler)
|
|
#define reset_sigpipe(mysql) if ((mysql)->client_flag & CLIENT_IGNORE_SIGPIPE) signal(SIGPIPE,old_signal_handler);
|
|
#else
|
|
#define init_sigpipe_variables
|
|
#define set_sigpipe(mysql)
|
|
#define reset_sigpipe(mysql)
|
|
#endif
|
|
|
|
void mysql_read_default_options(struct st_mysql_options *options,
|
|
const char *filename,const char *group);
|
|
MYSQL *
|
|
cli_mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
|
|
const char *passwd, const char *db,
|
|
uint port, const char *unix_socket,ulong client_flag);
|
|
|
|
void cli_mysql_close(MYSQL *mysql);
|
|
|
|
MYSQL_FIELD * cli_list_fields(MYSQL *mysql);
|
|
my_bool cli_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt);
|
|
MYSQL_DATA * cli_read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
|
|
uint fields);
|
|
int cli_stmt_execute(MYSQL_STMT *stmt);
|
|
MYSQL_DATA * cli_read_binary_rows(MYSQL_STMT *stmt);
|
|
int cli_unbuffered_fetch(MYSQL *mysql, char **row);
|
|
const char * cli_read_statistics(MYSQL *mysql);
|
|
int cli_read_change_user_result(MYSQL *mysql, char *buff, const char *passwd);
|
|
|
|
#ifdef EMBEDDED_LIBRARY
|
|
int init_embedded_server(int argc, char **argv, char **groups);
|
|
void end_embedded_server();
|
|
|
|
#else
|
|
/* Prevent warnings of unused parameters */
|
|
#define init_embedded_server(a,b,c) ((void)a, (void)b, (void)c, 0)
|
|
#define end_embedded_server()
|
|
#endif /*EMBEDDED_LIBRARY*/
|
|
|