mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
SCRUM
client capabilities included into libmysqld some API methods became "virtual" lots of duplicated code removed IMHO all the above made library's code way more pleasant to look at, didn't it? BitKeeper/deleted/.del-lib_vio.c~d779731a1e391220: Delete: libmysqld/lib_vio.c BitKeeper/etc/ignore: Added libmysqld/client.c libmysqld/client_settings.h libmysqld/libmysql.c libmysqld/pack.c to the ignore list client/mysqltest.c: we don't need this now include/mysql.h: MYSQL and related structures unified four methods made "virtual" relative wrappers added include/mysql_com.h: todo added include/mysql_embed.h: now we include implementations of Vio structure in libmysqld include/sql_common.h: declarations changed include/violite.h: implementation of Vio included in libmysqld libmysql/client_settings.h: changes to make this working with both client and embedded libmysql/libmysql.c: global variables and my_net_local_init moved to sql-common/pack.c libmysqld/Makefile.am: libmysql.c, client.c, pack.c symlinked and added to sources lib_vio.c removed libmysqld/examples/Makefile.am: now we need CLIENT_LIBS here libmysqld/lib_sql.cc: code duplications removed emb_advanced_command was made from simple_command libmysqld/libmysqld.c: duplicated code removed sql-common/client.c: code trimmed with new model of calling sql-common/pack.c: some code moved here from libmysql.c and protocol.cc sql/client_settings.h: we don't need mysql_use_result for mini_client sql/net_serv.cc: file included in embedded server sql/protocol.cc: code moved to sql-common/pack.c
This commit is contained in:
parent
5551e0df2a
commit
ef726bbff3
19 changed files with 217 additions and 1568 deletions
|
@ -622,3 +622,7 @@ vio/test-ssl
|
|||
vio/test-sslclient
|
||||
vio/test-sslserver
|
||||
vio/viotest-ssl
|
||||
libmysqld/client.c
|
||||
libmysqld/client_settings.h
|
||||
libmysqld/libmysql.c
|
||||
libmysqld/pack.c
|
||||
|
|
|
@ -319,7 +319,7 @@ static uint out_length;
|
|||
static int eval_result = 0;
|
||||
|
||||
/* Disable functions that only exist in MySQL 4.0 */
|
||||
#if MYSQL_VERSION_ID < 40000 || defined(EMBEDDED_LIBRARY)
|
||||
#if MYSQL_VERSION_ID < 40000
|
||||
void mysql_enable_rpl_parse(MYSQL* mysql __attribute__((unused))) {}
|
||||
void mysql_disable_rpl_parse(MYSQL* mysql __attribute__((unused))) {}
|
||||
int mysql_rpl_parse_enabled(MYSQL* mysql __attribute__((unused))) { return 1; }
|
||||
|
|
|
@ -201,6 +201,7 @@ enum mysql_rpl_type
|
|||
MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE, MYSQL_RPL_ADMIN
|
||||
};
|
||||
|
||||
struct st_mysql_methods;
|
||||
|
||||
#if !defined(CHECK_EMBEDDED_DIFFERENCES) || !defined(EMBEDDED_LIBRARY)
|
||||
|
||||
|
@ -247,11 +248,13 @@ typedef struct st_mysql
|
|||
struct st_mysql* last_used_con;
|
||||
|
||||
LIST *stmts; /* list of all statements */
|
||||
const struct st_mysql_methods *methods;
|
||||
#if !defined(CHECK_EMBEDDED_DIFFERENCES)
|
||||
struct st_mysql_res *result;
|
||||
void *thd;
|
||||
unsigned int last_errno;
|
||||
char *last_error;
|
||||
char sqlstate[SQLSTATE_LENGTH+1]; /* Used by embedded server */
|
||||
#endif
|
||||
} MYSQL;
|
||||
|
||||
|
@ -378,12 +381,10 @@ MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,
|
|||
unsigned int port,
|
||||
const char *unix_socket,
|
||||
unsigned long clientflag);
|
||||
void STDCALL mysql_close(MYSQL *sock);
|
||||
int STDCALL mysql_select_db(MYSQL *mysql, const char *db);
|
||||
int STDCALL mysql_query(MYSQL *mysql, const char *q);
|
||||
int STDCALL mysql_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
my_bool STDCALL mysql_read_query_result(MYSQL *mysql);
|
||||
int STDCALL mysql_real_query(MYSQL *mysql, const char *q,
|
||||
unsigned long length);
|
||||
/* perform query on master */
|
||||
|
@ -444,8 +445,6 @@ MYSQL_RES * STDCALL mysql_list_tables(MYSQL *mysql,const char *wild);
|
|||
MYSQL_RES * STDCALL mysql_list_fields(MYSQL *mysql, const char *table,
|
||||
const char *wild);
|
||||
MYSQL_RES * STDCALL mysql_list_processes(MYSQL *mysql);
|
||||
MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);
|
||||
MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql);
|
||||
int STDCALL mysql_options(MYSQL *mysql,enum mysql_option option,
|
||||
const char *arg);
|
||||
void STDCALL mysql_free_result(MYSQL_RES *result);
|
||||
|
@ -566,6 +565,25 @@ typedef struct st_mysql_stmt
|
|||
} MYSQL_STMT;
|
||||
|
||||
|
||||
#define mysql_close(sock) (*(sock)->methods->close)(sock)
|
||||
#define mysql_read_query_result(mysql) (*(mysql)->methods->read_query_result)(mysql)
|
||||
#define mysql_store_result(mysql) (*(mysql)->methods->store_result)(mysql)
|
||||
#define mysql_use_result(mysql) (*(mysql)->methods->use_result)(mysql)
|
||||
|
||||
typedef struct st_mysql_methods
|
||||
{
|
||||
void STDCALL (*close)(MYSQL *sock);
|
||||
my_bool STDCALL (*read_query_result)(MYSQL *mysql);
|
||||
my_bool STDCALL (*advanced_command)(MYSQL *mysql,
|
||||
enum enum_server_command command,
|
||||
const char *header,
|
||||
ulong header_length,
|
||||
const char *arg,
|
||||
ulong arg_length, my_bool skip_check);
|
||||
MYSQL_RES * STDCALL (*store_result)(MYSQL *mysql);
|
||||
MYSQL_RES * STDCALL (*use_result)(MYSQL *mysql);
|
||||
} MYSQL_METHODS;
|
||||
|
||||
MYSQL_STMT * STDCALL mysql_prepare(MYSQL * mysql, const char *query,
|
||||
unsigned long length);
|
||||
int STDCALL mysql_execute(MYSQL_STMT * stmt);
|
||||
|
|
|
@ -232,6 +232,9 @@ void my_net_local_init(NET *net);
|
|||
void net_end(NET *net);
|
||||
void net_clear(NET *net);
|
||||
my_bool net_realloc(NET *net, unsigned long length);
|
||||
|
||||
/*HFTODO - should remove it
|
||||
*/
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
my_bool net_flush(NET *net);
|
||||
#else
|
||||
|
|
|
@ -19,11 +19,13 @@
|
|||
#ifdef EMBEDDED_LIBRARY
|
||||
|
||||
/* Things we don't need in the embedded version of MySQL */
|
||||
/*HFTODO
|
||||
#undef HAVE_VIO - if we don't want client in embedded library
|
||||
*/
|
||||
|
||||
#undef HAVE_PSTACK /* No stacktrace */
|
||||
#undef HAVE_DLOPEN /* No udf functions */
|
||||
#undef HAVE_OPENSSL
|
||||
#undef HAVE_VIO
|
||||
#undef HAVE_ISAM
|
||||
#undef HAVE_SMEM /* No shared memory */
|
||||
|
||||
|
|
|
@ -27,9 +27,6 @@ my_ulonglong net_field_length_ll(uchar **packet);
|
|||
|
||||
MYSQL_FIELD *unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
|
||||
my_bool default_value, uint server_capabilities);
|
||||
my_bool advanced_command(MYSQL *mysql, enum enum_server_command command,
|
||||
const char *header, ulong header_length,
|
||||
const char *arg, ulong arg_length, my_bool skip_check);
|
||||
void free_rows(MYSQL_DATA *cur);
|
||||
MYSQL_DATA *read_rows (MYSQL *mysql,MYSQL_FIELD *fields,
|
||||
uint field_count);
|
||||
|
@ -38,6 +35,8 @@ void fetch_lengths(ulong *to, MYSQL_ROW column, uint field_count);
|
|||
void free_old_query(MYSQL *mysql);
|
||||
void end_server(MYSQL *mysql);
|
||||
my_bool mysql_reconnect(MYSQL *mysql);
|
||||
void mysql_read_default_options(struct st_mysql_options *options,
|
||||
const char *filename,const char *group);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -220,7 +220,8 @@ enum SSL_type
|
|||
};
|
||||
|
||||
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
/* HFTODO - hide this if we don't want client in embedded server
|
||||
*/
|
||||
/* This structure is for every connection on both sides */
|
||||
struct st_vio
|
||||
{
|
||||
|
@ -263,5 +264,4 @@ struct st_vio
|
|||
#endif /* HAVE_SMEM */
|
||||
#endif /* HAVE_VIO */
|
||||
};
|
||||
#endif /* EMBEDDED_LIBRARY */
|
||||
#endif /* vio_violite_h_ */
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
|
||||
static my_bool mysql_client_init=0;
|
||||
extern uint mysql_port;
|
||||
extern my_string mysql_unix_port;
|
||||
|
||||
|
@ -35,7 +34,7 @@ char *shared_memory_base_name=0;
|
|||
const char *def_shared_memory_base_name=default_shared_memory_base_name;
|
||||
#endif
|
||||
|
||||
static my_bool org_my_init_done=0;
|
||||
extern my_bool org_my_init_done;
|
||||
|
||||
sig_handler pipe_sig_handler(int sig __attribute__((unused)));
|
||||
my_bool stmt_close(MYSQL_STMT *stmt, my_bool skip_list);
|
||||
|
@ -56,3 +55,8 @@ my_bool send_file_to_server(MYSQL *mysql, const char *filename);
|
|||
#define set_sigpipe(mysql)
|
||||
#define reset_sigpipe(mysql)
|
||||
#endif
|
||||
|
||||
#define CLI_MYSQL_USE_RESULT cli_mysql_use_result
|
||||
|
||||
MYSQL_RES * STDCALL cli_mysql_use_result(MYSQL *mysql);
|
||||
|
||||
|
|
|
@ -58,13 +58,20 @@
|
|||
#endif
|
||||
|
||||
#include <sql_common.h>
|
||||
#include "client_settings.h"
|
||||
|
||||
#ifdef EMBEDDED_LIBRARY
|
||||
#ifdef net_flush
|
||||
#undef net_flush
|
||||
#endif
|
||||
|
||||
my_bool net_flush(NET *net);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
uint mysql_port=0;
|
||||
my_string mysql_unix_port=0;
|
||||
ulong net_buffer_length=8192;
|
||||
ulong max_allowed_packet= 1024L*1024L*1024L;
|
||||
ulong net_read_timeout= NET_READ_TIMEOUT;
|
||||
ulong net_write_timeout= NET_WRITE_TIMEOUT;
|
||||
|
||||
#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG \
|
||||
| CLIENT_LOCAL_FILES | CLIENT_TRANSACTIONS \
|
||||
|
@ -101,8 +108,9 @@ sig_handler pipe_sig_handler(int sig);
|
|||
static ulong mysql_sub_escape_string(CHARSET_INFO *charset_info, char *to,
|
||||
const char *from, ulong length);
|
||||
my_bool stmt_close(MYSQL_STMT *stmt, my_bool skip_list);
|
||||
static my_bool org_my_init_done=0;
|
||||
my_bool org_my_init_done=0;
|
||||
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
int STDCALL mysql_server_init(int argc __attribute__((unused)),
|
||||
char **argv __attribute__((unused)),
|
||||
char **groups __attribute__((unused)))
|
||||
|
@ -119,6 +127,7 @@ void STDCALL mysql_server_end()
|
|||
else
|
||||
mysql_thread_end();
|
||||
}
|
||||
#endif /*EMBEDDED_LIBRARY*/
|
||||
|
||||
my_bool STDCALL mysql_thread_init()
|
||||
{
|
||||
|
@ -140,17 +149,6 @@ void STDCALL mysql_thread_end()
|
|||
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
|
||||
|
||||
static MYSQL* spawn_init(MYSQL* parent, const char* host,
|
||||
unsigned int port,
|
||||
const char* user,
|
||||
|
@ -846,8 +844,7 @@ STDCALL mysql_add_slave(MYSQL* mysql, const char* host,
|
|||
have to wait for the client (and will not wait more than 30 sec/packet).
|
||||
**************************************************************************/
|
||||
|
||||
MYSQL_RES * STDCALL
|
||||
mysql_use_result(MYSQL *mysql)
|
||||
MYSQL_RES * STDCALL CLI_MYSQL_USE_RESULT(MYSQL *mysql)
|
||||
{
|
||||
MYSQL_RES *result;
|
||||
DBUG_ENTER("mysql_use_result");
|
||||
|
@ -1253,19 +1250,6 @@ uint STDCALL mysql_thread_safe(void)
|
|||
Some support functions
|
||||
****************************************************************************/
|
||||
|
||||
/*
|
||||
Functions called my my_net_init() to set some application specific variables
|
||||
*/
|
||||
|
||||
void my_net_local_init(NET *net)
|
||||
{
|
||||
net->max_packet= (uint) net_buffer_length;
|
||||
net->read_timeout= (uint) net_read_timeout;
|
||||
net->write_timeout=(uint) net_write_timeout;
|
||||
net->retry_count= 1;
|
||||
net->max_packet_size= max(net_buffer_length, max_allowed_packet);
|
||||
}
|
||||
|
||||
/*
|
||||
Add escape characters to a string (blob?) to make it suitable for a insert
|
||||
to should at least have place for length*2+1 chars
|
||||
|
@ -1999,8 +1983,9 @@ static my_bool execute(MYSQL_STMT * stmt, char *packet, ulong length)
|
|||
|
||||
mysql->last_used_con= mysql;
|
||||
int4store(buff, stmt->stmt_id); /* Send stmt id to server */
|
||||
if (advanced_command(mysql, COM_EXECUTE, buff, MYSQL_STMT_HEADER, packet,
|
||||
length, 1) ||
|
||||
if ((*mysql->methods->advanced_command)(mysql, COM_EXECUTE, buff,
|
||||
MYSQL_STMT_HEADER, packet,
|
||||
length, 1) ||
|
||||
mysql_read_query_result(mysql))
|
||||
{
|
||||
set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate);
|
||||
|
@ -2292,8 +2277,9 @@ mysql_send_long_data(MYSQL_STMT *stmt, uint param_number,
|
|||
Note that we don't get any ok packet from the server in this case
|
||||
This is intentional to save bandwidth.
|
||||
*/
|
||||
if (advanced_command(mysql, COM_LONG_DATA, extra_data,
|
||||
MYSQL_LONG_DATA_HEADER, data, length, 1))
|
||||
if ((*mysql->methods->advanced_command)(mysql, COM_LONG_DATA, extra_data,
|
||||
MYSQL_LONG_DATA_HEADER, data,
|
||||
length, 1))
|
||||
{
|
||||
set_stmt_errmsg(stmt, mysql->net.last_error,
|
||||
mysql->net.last_errno, mysql->net.sqlstate);
|
||||
|
|
|
@ -32,7 +32,7 @@ noinst_LIBRARIES = libmysqld_int.a
|
|||
pkglib_LIBRARIES = libmysqld.a
|
||||
SUBDIRS = . examples
|
||||
libmysqld_sources= libmysqld.c lib_sql.cc
|
||||
libmysqlsources = errmsg.c get_password.c
|
||||
libmysqlsources = errmsg.c get_password.c libmysql.c client.c pack.c
|
||||
|
||||
noinst_HEADERS = embedded_priv.h
|
||||
|
||||
|
@ -57,8 +57,6 @@ sqlsources = derror.cc field.cc field_conv.cc filesort.cc \
|
|||
unireg.cc uniques.cc stacktrace.c sql_union.cc hash_filo.cc \
|
||||
spatial.cc gstream.cc sql_help.cc
|
||||
|
||||
EXTRA_DIST = lib_vio.c
|
||||
|
||||
libmysqld_int_a_SOURCES= $(libmysqld_sources) $(libmysqlsources) $(sqlsources)
|
||||
libmysqld_a_SOURCES=
|
||||
|
||||
|
@ -74,7 +72,8 @@ INC_LIB= $(top_builddir)/regex/libregex.a \
|
|||
$(top_builddir)/mysys/libmysys.a \
|
||||
$(top_builddir)/strings/libmystrings.a \
|
||||
$(top_builddir)/dbug/libdbug.a \
|
||||
$(top_builddir)/regex/libregex.a
|
||||
$(top_builddir)/regex/libregex.a \
|
||||
$(top_builddir)/vio/libvio.a
|
||||
|
||||
#
|
||||
# To make it easy for the end user to use the embedded library we
|
||||
|
@ -115,11 +114,14 @@ link_sources:
|
|||
for f in $(libmysqlsources); do \
|
||||
rm -f $(srcdir)/$$f; \
|
||||
@LN_CP_F@ $(srcdir)/../libmysql/$$f $(srcdir)/$$f; \
|
||||
done
|
||||
done; \
|
||||
@LN_CP_F@ $(srcdir)/../libmysql/client_settings.h $(srcdir)/client_settings.h;
|
||||
|
||||
|
||||
clean-local:
|
||||
rm -f `echo $(sqlsources) $(libmysqlsources) | sed "s;\.lo;.c;g"` \
|
||||
$(top_srcdir)/linked_libmysqld_sources
|
||||
$(top_srcdir)/linked_libmysqld_sources; \
|
||||
rm -f client_settings.h
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
|
|
@ -10,7 +10,7 @@ link_sources:
|
|||
DEFS = -DEMBEDDED_LIBRARY
|
||||
INCLUDES = @MT_INCLUDES@ -I$(top_srcdir)/include -I$(srcdir) \
|
||||
-I$(top_srcdir) -I$(top_srcdir)/client $(openssl_includes)
|
||||
LIBS = @LIBS@ @WRAPLIBS@
|
||||
LIBS = @LIBS@ @WRAPLIBS@ @CLIENT_LIBS@
|
||||
LDADD = @CLIENT_EXTRA_LDFLAGS@ ../libmysqld.a @innodb_system_libs@ @bdb_libs_with_path@ @LIBDL@ $(CXXLDFLAGS)
|
||||
|
||||
mysqltest_SOURCES = mysqltest.c
|
||||
|
|
|
@ -47,9 +47,10 @@ static bool check_user(THD *thd, enum_server_command command,
|
|||
char * get_mysql_home(){ return mysql_home;};
|
||||
char * get_mysql_real_data_home(){ return mysql_real_data_home;};
|
||||
|
||||
my_bool simple_command(MYSQL *mysql,enum enum_server_command command,
|
||||
const char *arg,
|
||||
ulong length, my_bool skipp_check)
|
||||
my_bool
|
||||
emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
||||
const char *header, ulong header_length,
|
||||
const char *arg, ulong arg_length, my_bool skip_check)
|
||||
{
|
||||
my_bool result= 1;
|
||||
THD *thd=(THD *) mysql->thd;
|
||||
|
@ -67,9 +68,9 @@ my_bool simple_command(MYSQL *mysql,enum enum_server_command command,
|
|||
mysql->affected_rows= ~(my_ulonglong) 0;
|
||||
|
||||
thd->store_globals(); // Fix if more than one connect
|
||||
result= dispatch_command(command, thd, (char *) arg, length + 1);
|
||||
result= dispatch_command(command, thd, (char *) arg, arg_length + 1);
|
||||
|
||||
if (!skipp_check)
|
||||
if (!skip_check)
|
||||
result= thd->net.last_errno ? -1 : 0;
|
||||
|
||||
mysql->last_error= thd->net.last_error;
|
||||
|
@ -144,7 +145,6 @@ char **copy_arguments(int argc, char **argv)
|
|||
extern "C"
|
||||
{
|
||||
|
||||
ulong max_allowed_packet, net_buffer_length;
|
||||
char ** copy_arguments_ptr= 0;
|
||||
|
||||
int STDCALL mysql_server_init(int argc, char **argv, char **groups)
|
||||
|
@ -281,21 +281,6 @@ void STDCALL mysql_server_end()
|
|||
my_end(0);
|
||||
}
|
||||
|
||||
my_bool STDCALL mysql_thread_init()
|
||||
{
|
||||
#ifdef THREAD
|
||||
return my_thread_init();
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
void STDCALL mysql_thread_end()
|
||||
{
|
||||
#ifdef THREAD
|
||||
my_thread_end();
|
||||
#endif
|
||||
}
|
||||
} /* extern "C" */
|
||||
|
||||
C_MODE_START
|
||||
|
@ -454,11 +439,6 @@ send_eof(THD *thd, bool no_flush)
|
|||
{
|
||||
}
|
||||
|
||||
uint STDCALL mysql_warning_count(MYSQL *mysql)
|
||||
{
|
||||
return ((THD *)mysql->thd)->total_warn_count;
|
||||
}
|
||||
|
||||
void Protocol_simple::prepare_for_resend()
|
||||
{
|
||||
MYSQL_ROWS *cur;
|
||||
|
|
|
@ -1,236 +0,0 @@
|
|||
/* Copyright (C) 2000 MySQL 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 */
|
||||
|
||||
/*
|
||||
Note that we can't have assertion on file descriptors; The reason for
|
||||
this is that during mysql shutdown, another thread can close a file
|
||||
we are working on. In this case we should just return read errors from
|
||||
the file descriptior.
|
||||
*/
|
||||
#ifdef DUMMY
|
||||
|
||||
#include <my_global.h>
|
||||
#include "mysql_embed.h"
|
||||
#include "mysql.h"
|
||||
|
||||
#ifndef HAVE_VIO /* is Vio enabled */
|
||||
|
||||
#include <errno.h>
|
||||
#include <my_sys.h>
|
||||
#include <violite.h>
|
||||
#include <my_net.h>
|
||||
#include <m_string.h>
|
||||
#include <assert.h>
|
||||
|
||||
#ifndef __WIN__
|
||||
#define HANDLE void *
|
||||
#endif
|
||||
|
||||
struct st_vio
|
||||
{
|
||||
enum enum_vio_type type; /* Type of connection */
|
||||
void *dest_thd;
|
||||
char *packets, **last_packet;
|
||||
char *where_in_packet, *end_of_packet;
|
||||
my_bool reading;
|
||||
MEM_ROOT root;
|
||||
};
|
||||
|
||||
|
||||
/* Initialize the communication buffer */
|
||||
|
||||
Vio *vio_new(my_socket sd, enum enum_vio_type type, my_bool localhost)
|
||||
{
|
||||
DBUG_ENTER("vio_new");
|
||||
Vio * vio;
|
||||
|
||||
if ((vio= (Vio *) my_malloc(sizeof(*vio),MYF(MY_WME|MY_ZEROFILL))))
|
||||
{
|
||||
init_alloc_root(&vio->root, 8192, 8192);
|
||||
vio->root.min_malloc = sizeof(char *) + 4;
|
||||
vio->last_packet = &vio->packets;
|
||||
vio->type = type;
|
||||
}
|
||||
DBUG_RETURN(vio);
|
||||
}
|
||||
|
||||
|
||||
#ifdef __WIN__
|
||||
|
||||
Vio *vio_new_win32pipe(HANDLE hPipe)
|
||||
{
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void vio_delete(Vio * vio)
|
||||
{
|
||||
DBUG_ENTER("vio_delete");
|
||||
if (vio)
|
||||
{
|
||||
if (vio->type != VIO_CLOSED)
|
||||
vio_close(vio);
|
||||
free_root(&vio->root, MYF(0));
|
||||
my_free((gptr) vio, MYF(0));
|
||||
}
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
void vio_reset(Vio *vio)
|
||||
{
|
||||
DBUG_ENTER("vio_reset");
|
||||
free_root(&vio->root, MYF(MY_KEEP_PREALLOC));
|
||||
vio->packets = vio->where_in_packet = vio->end_of_packet = 0;
|
||||
vio->last_packet = &vio->packets;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
int vio_errno(Vio *vio __attribute__((unused)))
|
||||
{
|
||||
return socket_errno; /* On Win32 this mapped to WSAGetLastError() */
|
||||
}
|
||||
|
||||
int vio_read(Vio * vio, gptr buf, int size)
|
||||
{
|
||||
vio->reading = 1;
|
||||
if (vio->where_in_packet >= vio->end_of_packet)
|
||||
{
|
||||
DBUG_ASSERT(vio->packets);
|
||||
vio->where_in_packet = vio->packets + sizeof(char *) + 4;
|
||||
vio->end_of_packet = vio->where_in_packet +
|
||||
uint4korr(vio->packets + sizeof(char *));
|
||||
vio->packets = *(char **)vio->packets;
|
||||
}
|
||||
if (vio->where_in_packet + size > vio->end_of_packet)
|
||||
size = vio->end_of_packet - vio->where_in_packet;
|
||||
memcpy(buf, vio->where_in_packet, size);
|
||||
vio->where_in_packet += size;
|
||||
return (size);
|
||||
}
|
||||
|
||||
int vio_write(Vio * vio, const gptr buf, int size)
|
||||
{
|
||||
DBUG_ENTER("vio_write");
|
||||
char *packet;
|
||||
if (vio->reading)
|
||||
{
|
||||
vio->reading = 0;
|
||||
vio_reset(vio);
|
||||
}
|
||||
if ((packet = alloc_root(&vio->root, sizeof(char*) + 4 + size)))
|
||||
{
|
||||
*vio->last_packet = packet;
|
||||
vio->last_packet = (char **)packet;
|
||||
*((char **)packet) = 0; /* Set forward link to 0 */
|
||||
packet += sizeof(char *);
|
||||
int4store(packet, size);
|
||||
memcpy(packet + 4, buf, size);
|
||||
}
|
||||
else
|
||||
size= -1;
|
||||
DBUG_RETURN(size);
|
||||
}
|
||||
|
||||
int vio_blocking(Vio * vio, my_bool set_blocking_mode, my_bool *old_mode)
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
|
||||
my_bool
|
||||
vio_is_blocking(Vio * vio)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
int vio_fastsend(Vio * vio)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
int vio_keepalive(Vio* vio, my_bool set_keep_alive)
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
||||
my_bool
|
||||
vio_should_retry(Vio * vio __attribute__((unused)))
|
||||
{
|
||||
int en = socket_errno;
|
||||
return (en == SOCKET_EAGAIN || en == SOCKET_EINTR ||
|
||||
en == SOCKET_EWOULDBLOCK);
|
||||
}
|
||||
|
||||
|
||||
int vio_close(Vio * vio)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
const char *vio_description(Vio * vio)
|
||||
{
|
||||
return "embedded vio";
|
||||
}
|
||||
|
||||
enum enum_vio_type vio_type(Vio* vio)
|
||||
{
|
||||
return VIO_CLOSED;
|
||||
}
|
||||
|
||||
my_socket vio_fd(Vio* vio)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
my_bool vio_peer_addr(Vio * vio, char *buf, uint16 *port)
|
||||
{
|
||||
return(0);
|
||||
}
|
||||
|
||||
|
||||
void vio_in_addr(Vio *vio, struct in_addr *in)
|
||||
{
|
||||
}
|
||||
|
||||
my_bool vio_poll_read(Vio *vio,uint timeout)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int create_vio(NET *net, int separate_thread)
|
||||
{
|
||||
Vio * v = net->vio;
|
||||
if (!v)
|
||||
{
|
||||
v = vio_new(0, separate_thread ? VIO_CLOSED : VIO_TYPE_TCPIP, 0);
|
||||
net->vio = v;
|
||||
}
|
||||
return !v;
|
||||
}
|
||||
|
||||
void set_thd(Vio *v, void *thd)
|
||||
{
|
||||
if (v)
|
||||
{
|
||||
v -> dest_thd = thd;
|
||||
}
|
||||
}
|
||||
#endif /* HAVE_VIO */
|
||||
#endif /* DUMMY */
|
||||
|
File diff suppressed because it is too large
Load diff
|
@ -40,6 +40,32 @@
|
|||
#if defined(MYSQL_SERVER) || defined(HAVE_EXTERNAL_CLIENT)
|
||||
|
||||
#include "mysql.h"
|
||||
|
||||
#ifdef EMBEDDED_LIBRARY
|
||||
|
||||
#ifdef MYSQL_SERVER
|
||||
#undef MYSQL_SERVER
|
||||
#endif
|
||||
|
||||
#ifndef MYSQL_CLIENT
|
||||
#define MYSQL_CLIENT
|
||||
#endif
|
||||
|
||||
#define CLI_MYSQL_REAL_CONNECT cli_mysql_real_connect
|
||||
|
||||
#ifdef net_flush
|
||||
#undef net_flush
|
||||
#endif
|
||||
my_bool net_flush(NET *net);
|
||||
|
||||
#else /*EMBEDDED_LIBRARY*/
|
||||
#define CLI_MYSQL_REAL_CONNECT mysql_real_connect
|
||||
#endif /*EMBEDDED_LIBRARY*/
|
||||
|
||||
#ifdef MYSQL_CLIENT
|
||||
static my_bool mysql_client_init=0;
|
||||
#endif
|
||||
|
||||
#if !defined(MYSQL_SERVER) && defined(__WIN__) || defined(_WIN32) || defined(_WIN64)
|
||||
#include <winsock.h>
|
||||
#include <odbcinst.h>
|
||||
|
@ -563,8 +589,8 @@ void free_rows(MYSQL_DATA *cur)
|
|||
}
|
||||
}
|
||||
|
||||
my_bool
|
||||
advanced_command(MYSQL *mysql, enum enum_server_command command,
|
||||
static my_bool
|
||||
cli_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
||||
const char *header, ulong header_length,
|
||||
const char *arg, ulong arg_length, my_bool skip_check)
|
||||
{
|
||||
|
@ -632,7 +658,9 @@ my_bool
|
|||
simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg,
|
||||
ulong length, my_bool skip_check)
|
||||
{
|
||||
return advanced_command(mysql, command, NullS, 0, arg, length, skip_check);
|
||||
return
|
||||
(*mysql->methods->advanced_command)(mysql, command,
|
||||
NullS, 0, arg, length, skip_check);
|
||||
}
|
||||
|
||||
void free_old_query(MYSQL *mysql)
|
||||
|
@ -747,8 +775,8 @@ static int add_init_command(struct st_mysql_options *options, const char *cmd)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void mysql_read_default_options(struct st_mysql_options *options,
|
||||
const char *filename,const char *group)
|
||||
void mysql_read_default_options(struct st_mysql_options *options,
|
||||
const char *filename,const char *group)
|
||||
{
|
||||
int argc;
|
||||
char *argv_buff[1],**argv;
|
||||
|
@ -1428,10 +1456,23 @@ error:
|
|||
before calling mysql_real_connect !
|
||||
*/
|
||||
|
||||
MYSQL * STDCALL
|
||||
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)
|
||||
static void STDCALL cli_mysql_close(MYSQL *mysql);
|
||||
static my_bool STDCALL cli_mysql_read_query_result(MYSQL *mysql);
|
||||
static MYSQL_RES * STDCALL cli_mysql_store_result(MYSQL *mysql);
|
||||
|
||||
static MYSQL_METHODS client_methods=
|
||||
{
|
||||
cli_mysql_close,
|
||||
cli_mysql_read_query_result,
|
||||
cli_advanced_command,
|
||||
cli_mysql_store_result,
|
||||
CLI_MYSQL_USE_RESULT
|
||||
};
|
||||
|
||||
MYSQL * STDCALL
|
||||
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)
|
||||
{
|
||||
#ifdef MYSQL_CLIENT
|
||||
char *charset_name;
|
||||
|
@ -1466,6 +1507,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
|
|||
user ? user : "(Null)"));
|
||||
|
||||
/* Don't give sigpipe errors if the client doesn't want them */
|
||||
mysql->methods= &client_methods;
|
||||
set_sigpipe(mysql);
|
||||
net->vio = 0; /* If something goes wrong */
|
||||
mysql->client_flag=0; /* For handshake */
|
||||
|
@ -2176,8 +2218,7 @@ mysql_ssl_free(MYSQL *mysql __attribute__((unused)))
|
|||
If handle is alloced by mysql connect free it.
|
||||
*************************************************************************/
|
||||
|
||||
void STDCALL
|
||||
mysql_close(MYSQL *mysql)
|
||||
static void STDCALL cli_mysql_close(MYSQL *mysql)
|
||||
{
|
||||
DBUG_ENTER("mysql_close");
|
||||
if (mysql) /* Some simple safety */
|
||||
|
@ -2259,7 +2300,7 @@ mysql_close(MYSQL *mysql)
|
|||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
my_bool STDCALL mysql_read_query_result(MYSQL *mysql)
|
||||
static my_bool STDCALL cli_mysql_read_query_result(MYSQL *mysql)
|
||||
{
|
||||
uchar *pos;
|
||||
ulong field_count;
|
||||
|
@ -2378,8 +2419,7 @@ mysql_real_query(MYSQL *mysql, const char *query, ulong length)
|
|||
mysql_data_seek may be used.
|
||||
**************************************************************************/
|
||||
|
||||
MYSQL_RES * STDCALL
|
||||
mysql_store_result(MYSQL *mysql)
|
||||
static MYSQL_RES * STDCALL cli_mysql_store_result(MYSQL *mysql)
|
||||
{
|
||||
MYSQL_RES *result;
|
||||
DBUG_ENTER("mysql_store_result");
|
||||
|
|
|
@ -1,7 +1,28 @@
|
|||
/* Copyright (C) 2000-2003 MySQL 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 */
|
||||
|
||||
#include <my_global.h>
|
||||
#include <mysql_com.h>
|
||||
#include <mysql.h>
|
||||
|
||||
ulong net_buffer_length=8192;
|
||||
ulong max_allowed_packet= 1024L*1024L*1024L;
|
||||
ulong net_read_timeout= NET_READ_TIMEOUT;
|
||||
ulong net_write_timeout= NET_WRITE_TIMEOUT;
|
||||
|
||||
/* Get the length of next field. Change parameter to point at fieldstart */
|
||||
ulong STDCALL net_field_length(uchar **packet)
|
||||
{
|
||||
|
@ -62,3 +83,16 @@ my_ulonglong net_field_length_ll(uchar **packet)
|
|||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
Functions called my my_net_init() to set some application specific variables
|
||||
*/
|
||||
|
||||
void my_net_local_init(NET *net)
|
||||
{
|
||||
net->max_packet= (uint) net_buffer_length;
|
||||
net->read_timeout= (uint) net_read_timeout;
|
||||
net->write_timeout=(uint) net_write_timeout;
|
||||
net->retry_count= 1;
|
||||
net->max_packet_size= max(net_buffer_length, max_allowed_packet);
|
||||
}
|
||||
|
||||
|
|
|
@ -32,3 +32,5 @@ extern ulong slave_net_timeout;
|
|||
#ifdef HAVE_SMEM
|
||||
#undef HAVE_SMEM
|
||||
#endif
|
||||
|
||||
#define CLI_MYSQL_USE_RESULT NULL
|
||||
|
|
|
@ -30,7 +30,10 @@
|
|||
3 byte length & 1 byte package-number.
|
||||
*/
|
||||
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
/*
|
||||
HFTODO this must be hidden if we don't want client capabilities in
|
||||
embedded library
|
||||
*/
|
||||
#ifdef __WIN__
|
||||
#include <winsock.h>
|
||||
#endif
|
||||
|
@ -46,6 +49,19 @@
|
|||
#include <signal.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef EMBEDDED_LIBRARY
|
||||
|
||||
#ifdef net_flush
|
||||
#undef net_flush
|
||||
#endif
|
||||
|
||||
extern "C" {
|
||||
my_bool net_flush(NET *net);
|
||||
}
|
||||
|
||||
#endif /*EMBEDDED_LIBRARY */
|
||||
|
||||
|
||||
/*
|
||||
The following handles the differences when this is linked between the
|
||||
client and the server.
|
||||
|
@ -959,5 +975,4 @@ my_net_read(NET *net)
|
|||
return len;
|
||||
}
|
||||
|
||||
#endif /* EMBEDDED_LIBRARY */
|
||||
|
||||
|
|
|
@ -236,29 +236,6 @@ net_printf(THD *thd, uint errcode, ...)
|
|||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
/*
|
||||
Function called by my_net_init() to set some check variables
|
||||
*/
|
||||
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
extern "C" {
|
||||
void my_net_local_init(NET *net)
|
||||
{
|
||||
net->max_packet= (uint) global_system_variables.net_buffer_length;
|
||||
net->read_timeout= (uint) global_system_variables.net_read_timeout;
|
||||
net->write_timeout=(uint) global_system_variables.net_write_timeout;
|
||||
net->retry_count= (uint) global_system_variables.net_retry_count;
|
||||
net->max_packet_size= max(global_system_variables.net_buffer_length,
|
||||
global_system_variables.max_allowed_packet);
|
||||
}
|
||||
}
|
||||
|
||||
#else /* EMBEDDED_LIBRARY */
|
||||
void my_net_local_init(NET *net __attribute__(unused))
|
||||
{
|
||||
}
|
||||
#endif /* EMBEDDED_LIBRARY */
|
||||
|
||||
/*
|
||||
Return ok to the client.
|
||||
|
||||
|
|
Loading…
Reference in a new issue