summaryrefslogtreecommitdiff
path: root/libmysqld
diff options
context:
space:
mode:
Diffstat (limited to 'libmysqld')
-rw-r--r--libmysqld/CMakeLists.txt208
-rw-r--r--libmysqld/Makefile.am148
-rw-r--r--libmysqld/emb_qcache.cc121
-rw-r--r--libmysqld/emb_qcache.h13
-rw-r--r--libmysqld/examples/CMakeLists.txt38
-rw-r--r--libmysqld/examples/Makefile.am18
-rw-r--r--libmysqld/examples/builder-sample/emb_samples.cpp2
-rw-r--r--libmysqld/lib_sql.cc209
-rw-r--r--libmysqld/libmysqld.c5
-rw-r--r--libmysqld/libmysqld.def17
10 files changed, 591 insertions, 188 deletions
diff --git a/libmysqld/CMakeLists.txt b/libmysqld/CMakeLists.txt
new file mode 100644
index 00000000000..9fa7d46d466
--- /dev/null
+++ b/libmysqld/CMakeLists.txt
@@ -0,0 +1,208 @@
+# Copyright (C) 2006 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; version 2 of the License.
+#
+# 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX")
+SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DSAFEMALLOC -DSAFE_MUTEX")
+
+# Need to set USE_TLS, since __declspec(thread) approach to thread local
+# storage does not work properly in DLLs.
+IF(WIN32)
+ ADD_DEFINITIONS(-DUSE_TLS)
+ENDIF(WIN32)
+
+ADD_DEFINITIONS(-DMYSQL_SERVER -DEMBEDDED_LIBRARY -DHAVE_DLOPEN)
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include
+ ${CMAKE_SOURCE_DIR}/libmysqld
+ ${CMAKE_SOURCE_DIR}/libmysql
+ ${CMAKE_SOURCE_DIR}/sql
+ ${CMAKE_SOURCE_DIR}/regex
+ ${CMAKE_SOURCE_DIR}/extra/yassl/include
+ ${CMAKE_SOURCE_DIR}/zlib)
+
+SET(GEN_SOURCES ${CMAKE_SOURCE_DIR}/sql/sql_yacc.cc
+ ${CMAKE_SOURCE_DIR}/sql/sql_yacc.h
+ ${CMAKE_SOURCE_DIR}/sql/message.h
+ ${CMAKE_SOURCE_DIR}/sql/message.rc
+ ${CMAKE_SOURCE_DIR}/sql/sql_builtin.cc
+ ${CMAKE_SOURCE_DIR}/sql/lex_hash.h)
+
+SET_SOURCE_FILES_PROPERTIES(${GEN_SOURCES} PROPERTIES GENERATED 1)
+
+# Include and add the directory path
+SET(SOURCE_SUBLIBS TRUE)
+SET(LIB_SOURCES "")
+
+INCLUDE(${CMAKE_SOURCE_DIR}/zlib/CMakeLists.txt)
+FOREACH(rpath ${ZLIB_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../zlib/${rpath})
+ENDFOREACH(rpath)
+
+# FIXME only needed if build type is "Debug", but CMAKE_BUILD_TYPE is
+# not set during configure time.
+INCLUDE(${CMAKE_SOURCE_DIR}/dbug/CMakeLists.txt)
+FOREACH(rpath ${DBUG_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../dbug/${rpath})
+ENDFOREACH(rpath)
+
+INCLUDE(${CMAKE_SOURCE_DIR}/extra/yassl/taocrypt/CMakeLists.txt)
+FOREACH(rpath ${TAOCRYPT_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../extra/yassl/taocrypt/${rpath})
+ENDFOREACH(rpath)
+
+INCLUDE(${CMAKE_SOURCE_DIR}/extra/yassl/CMakeLists.txt)
+FOREACH(rpath ${YASSL_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../extra/yassl/${rpath})
+ENDFOREACH(rpath)
+
+INCLUDE(${CMAKE_SOURCE_DIR}/strings/CMakeLists.txt)
+FOREACH(rpath ${STRINGS_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../strings/${rpath})
+ENDFOREACH(rpath)
+
+INCLUDE(${CMAKE_SOURCE_DIR}/regex/CMakeLists.txt)
+FOREACH(rpath ${REGEX_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../regex/${rpath})
+ENDFOREACH(rpath)
+
+INCLUDE(${CMAKE_SOURCE_DIR}/mysys/CMakeLists.txt)
+FOREACH(rpath ${MYSYS_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../mysys/${rpath})
+ENDFOREACH(rpath)
+
+INCLUDE(${CMAKE_SOURCE_DIR}/vio/CMakeLists.txt)
+FOREACH(rpath ${VIO_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../vio/${rpath})
+ENDFOREACH(rpath)
+
+# Engines
+INCLUDE(${CMAKE_SOURCE_DIR}/storage/heap/CMakeLists.txt)
+FOREACH(rpath ${HEAP_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../storage/heap/${rpath})
+ENDFOREACH(rpath)
+
+INCLUDE(${CMAKE_SOURCE_DIR}/storage/myisam/CMakeLists.txt)
+FOREACH(rpath ${MYISAM_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../storage/myisam/${rpath})
+ENDFOREACH(rpath)
+
+INCLUDE(${CMAKE_SOURCE_DIR}/storage/myisammrg/CMakeLists.txt)
+FOREACH(rpath ${MYISAMMRG_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../storage/myisammrg/${rpath})
+ENDFOREACH(rpath)
+
+IF(WITH_ARCHIVE_STORAGE_ENGINE)
+ INCLUDE(${CMAKE_SOURCE_DIR}/storage/archive/CMakeLists.txt)
+ FOREACH(rpath ${ARCHIVE_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../storage/archive/${rpath})
+ ENDFOREACH(rpath)
+ENDIF(WITH_ARCHIVE_STORAGE_ENGINE)
+
+IF(WITH_BLACKHOLE_STORAGE_ENGINE)
+ INCLUDE(${CMAKE_SOURCE_DIR}/storage/blackhole/CMakeLists.txt)
+ FOREACH(rpath ${BLACKHOLE_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../storage/blackhole/${rpath})
+ ENDFOREACH(rpath)
+ENDIF(WITH_BLACKHOLE_STORAGE_ENGINE)
+
+IF(WITH_EXAMPLE_STORAGE_ENGINE)
+ INCLUDE(${CMAKE_SOURCE_DIR}/storage/example/CMakeLists.txt)
+ FOREACH(rpath ${EXAMPLE_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../storage/example/${rpath})
+ ENDFOREACH(rpath)
+ENDIF(WITH_EXAMPLE_STORAGE_ENGINE)
+
+IF(WITH_FEDERATED_STORAGE_ENGINE)
+ INCLUDE(${CMAKE_SOURCE_DIR}/storage/federated/CMakeLists.txt)
+ FOREACH(rpath ${FEDERATED_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../storage/federated/${rpath})
+ ENDFOREACH(rpath)
+ENDIF(WITH_FEDERATED_STORAGE_ENGINE)
+
+IF(WITH_INNOBASE_STORAGE_ENGINE)
+ INCLUDE(${CMAKE_SOURCE_DIR}/storage/innobase/CMakeLists.txt)
+ FOREACH(rpath ${INNOBASE_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../storage/innobase/${rpath})
+ ENDFOREACH(rpath)
+ENDIF(WITH_INNOBASE_STORAGE_ENGINE)
+
+IF(WITH_CSV_STORAGE_ENGINE)
+ INCLUDE(${CMAKE_SOURCE_DIR}/storage/csv/CMakeLists.txt)
+ FOREACH(rpath ${CSV_SOURCES})
+ SET(LIB_SOURCES ${LIB_SOURCES} ../storage/csv/${rpath})
+ ENDFOREACH(rpath)
+ENDIF(WITH_CSV_STORAGE_ENGINE)
+
+SET(SOURCE_SUBLIBS FALSE)
+
+SET(LIBMYSQLD_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc
+ ../libmysql/libmysql.c ../libmysql/errmsg.c ../client/get_password.c
+ ../sql-common/client.c ../sql-common/my_time.c
+ ../sql-common/my_user.c ../sql-common/pack.c
+ ../sql/password.c ../sql/discover.cc ../sql/derror.cc
+ ../sql/event_scheduler.cc ../sql/events.cc
+ ../sql/event_data_objects.cc ../sql/event_queue.cc
+ ../sql/event_db_repository.cc ../sql/field.cc ../sql/field_conv.cc
+ ../sql/filesort.cc ../sql/gstream.cc ../sql/ha_partition.cc
+ ../sql/handler.cc ../sql/hash_filo.cc ../sql/hostname.cc
+ ../sql/init.cc ../sql/item_buff.cc ../sql/item_cmpfunc.cc
+ ../sql/item.cc ../sql/item_create.cc ../sql/item_func.cc
+ ../sql/item_geofunc.cc ../sql/item_row.cc ../sql/item_strfunc.cc
+ ../sql/item_subselect.cc ../sql/item_sum.cc ../sql/item_timefunc.cc
+ ../sql/item_xmlfunc.cc ../sql/key.cc ../sql/lock.cc ../sql/log.cc
+ ../sql/log_event.cc ../sql/mf_iocache.cc ../sql/my_decimal.cc
+ ../sql/net_serv.cc ../sql/opt_range.cc ../sql/opt_sum.cc
+ ../sql/parse_file.cc ../sql/procedure.cc ../sql/protocol.cc
+ ../sql/records.cc ../sql/repl_failsafe.cc ../sql/rpl_filter.cc
+ ../sql/rpl_record.cc
+ ../sql/rpl_injector.cc ../sql/set_var.cc ../sql/spatial.cc
+ ../sql/sp_cache.cc ../sql/sp.cc ../sql/sp_head.cc
+ ../sql/sp_pcontext.cc ../sql/sp_rcontext.cc ../sql/sql_acl.cc
+ ../sql/sql_analyse.cc ../sql/sql_base.cc ../sql/sql_cache.cc
+ ../sql/sql_class.cc ../sql/sql_crypt.cc ../sql/sql_cursor.cc
+ ../sql/sql_db.cc ../sql/sql_delete.cc ../sql/sql_derived.cc
+ ../sql/sql_do.cc ../sql/sql_error.cc ../sql/sql_handler.cc
+ ../sql/sql_help.cc ../sql/sql_insert.cc ../sql/sql_lex.cc
+ ../sql/sql_list.cc ../sql/sql_load.cc ../sql/sql_locale.cc
+ ../sql/sql_binlog.cc ../sql/sql_manager.cc ../sql/sql_map.cc
+ ../sql/sql_parse.cc ../sql/sql_partition.cc ../sql/sql_plugin.cc
+ ../sql/sql_prepare.cc ../sql/sql_rename.cc ../sql/sql_repl.cc
+ ../sql/sql_select.cc ../sql/sql_servers.cc
+ ../sql/sql_show.cc ../sql/sql_state.c ../sql/sql_string.cc
+ ../sql/sql_tablespace.cc ../sql/sql_table.cc ../sql/sql_test.cc
+ ../sql/sql_trigger.cc ../sql/sql_udf.cc ../sql/sql_union.cc
+ ../sql/sql_update.cc ../sql/sql_view.cc
+ ../sql/strfunc.cc ../sql/table.cc ../sql/thr_malloc.cc
+ ../sql/time.cc ../sql/tztime.cc ../sql/uniques.cc ../sql/unireg.cc
+ ../sql/partition_info.cc ../sql/sql_connect.cc
+ ../sql/scheduler.cc
+ ${GEN_SOURCES}
+ ${LIB_SOURCES})
+
+# Seems we cannot make a library without at least one source file. So use a
+# dummy empty file
+FILE(WRITE cmake_dummy.c " ")
+
+# Tried use the correct ${GEN_SOURCES} as dependency, worked on Unix
+# but not on Windows and Visual Studio generators. Likely because they
+# are no real targets from the Visual Studio project files view. Added
+# custom targets to "sql/CMakeLists.txt" and reference them here.
+ADD_LIBRARY(mysqlserver STATIC ${LIBMYSQLD_SOURCES})
+ADD_DEPENDENCIES(mysqlserver GenServerSource GenError)
+TARGET_LINK_LIBRARIES(mysqlserver)
+
+ADD_LIBRARY(libmysqld MODULE cmake_dummy.c libmysqld.def)
+ADD_DEPENDENCIES(libmysqld mysqlserver)
+TARGET_LINK_LIBRARIES(libmysqld mysqlserver wsock32)
diff --git a/libmysqld/Makefile.am b/libmysqld/Makefile.am
index 81da1e43cc9..c0784447216 100644
--- a/libmysqld/Makefile.am
+++ b/libmysqld/Makefile.am
@@ -20,17 +20,20 @@
MYSQLDATAdir = $(localstatedir)
MYSQLSHAREdir = $(pkgdatadir)
MYSQLBASEdir= $(prefix)
+MYSQLLIBdir= $(libdir)
+EXTRA_DIST = libmysqld.def CMakeLists.txt
DEFS = -DEMBEDDED_LIBRARY -DMYSQL_SERVER \
-DDEFAULT_MYSQL_HOME="\"$(MYSQLBASEdir)\"" \
-DDATADIR="\"$(MYSQLDATAdir)\"" \
- -DSHAREDIR="\"$(MYSQLSHAREdir)\""
-INCLUDES= @bdb_includes@ @innodb_includes@ @ndbcluster_includes@ \
- -I$(top_builddir)/include -I$(top_srcdir)/include \
+ -DSHAREDIR="\"$(MYSQLSHAREdir)\"" \
+ -DLIBDIR="\"$(MYSQLLIBdir)\""
+INCLUDES= -I$(top_builddir)/include -I$(top_srcdir)/include \
-I$(top_builddir)/sql -I$(top_srcdir)/sql \
-I$(top_srcdir)/sql/examples \
-I$(top_srcdir)/regex \
- $(openssl_includes) @ZLIB_INCLUDES@
+ $(openssl_includes) @ZLIB_INCLUDES@ \
+ @condition_dependent_plugin_includes@
noinst_LIBRARIES = libmysqld_int.a
pkglib_LIBRARIES = libmysqld.a
@@ -38,24 +41,28 @@ SUBDIRS = . examples
libmysqld_sources= libmysqld.c lib_sql.cc emb_qcache.cc
libmysqlsources = errmsg.c get_password.c libmysql.c client.c pack.c \
my_time.c
-sqlexamplessources = ha_example.cc ha_tina.cc
noinst_HEADERS = embedded_priv.h emb_qcache.h
sqlsources = derror.cc field.cc field_conv.cc strfunc.cc filesort.cc \
- ha_innodb.cc ha_berkeley.cc ha_heap.cc ha_federated.cc \
- ha_myisam.cc ha_myisammrg.cc handler.cc sql_handler.cc \
+ ha_ndbcluster.cc ha_ndbcluster_cond.cc \
+ ha_ndbcluster_binlog.cc ha_partition.cc \
+ handler.cc sql_handler.cc \
hostname.cc init.cc password.c \
item.cc item_buff.cc item_cmpfunc.cc item_create.cc \
item_func.cc item_strfunc.cc item_sum.cc item_timefunc.cc \
- item_geofunc.cc item_uniq.cc item_subselect.cc item_row.cc\
- key.cc lock.cc log.cc log_event.cc sql_state.c \
+ item_geofunc.cc item_subselect.cc item_row.cc\
+ item_xmlfunc.cc \
+ key.cc lock.cc log.cc sql_state.c \
+ log_event.cc rpl_record.cc \
+ log_event_old.cc rpl_record_old.cc \
protocol.cc net_serv.cc opt_range.cc \
opt_sum.cc procedure.cc records.cc sql_acl.cc \
sql_load.cc discover.cc sql_locale.cc \
sql_analyse.cc sql_base.cc sql_cache.cc sql_class.cc \
sql_crypt.cc sql_db.cc sql_delete.cc sql_error.cc sql_insert.cc \
- sql_lex.cc sql_list.cc sql_manager.cc sql_map.cc sql_parse.cc \
+ sql_lex.cc sql_list.cc sql_manager.cc sql_map.cc \
+ scheduler.cc sql_connect.cc sql_parse.cc \
sql_prepare.cc sql_derived.cc sql_rename.cc \
sql_select.cc sql_do.cc sql_show.cc set_var.cc \
sql_string.cc sql_table.cc sql_test.cc sql_udf.cc \
@@ -64,25 +71,72 @@ sqlsources = derror.cc field.cc field_conv.cc strfunc.cc filesort.cc \
spatial.cc gstream.cc sql_help.cc tztime.cc sql_cursor.cc \
sp_head.cc sp_pcontext.cc sp.cc sp_cache.cc sp_rcontext.cc \
parse_file.cc sql_view.cc sql_trigger.cc my_decimal.cc \
- ha_blackhole.cc ha_archive.cc my_user.c
-
-libmysqld_int_a_SOURCES= $(libmysqld_sources) $(libmysqlsources) $(sqlsources) $(sqlexamplessources)
+ event_scheduler.cc events.cc event_data_objects.cc \
+ event_queue.cc event_db_repository.cc \
+ rpl_filter.cc sql_partition.cc sql_builtin.cc sql_plugin.cc \
+ sql_tablespace.cc \
+ rpl_injector.cc my_user.c partition_info.cc \
+ sql_servers.cc
+
+libmysqld_int_a_SOURCES= $(libmysqld_sources)
+nodist_libmysqld_int_a_SOURCES= $(libmysqlsources) $(sqlsources)
libmysqld_a_SOURCES=
+sqlstoragesources = $(EXTRA_libmysqld_a_SOURCES)
+storagesources = @condition_dependent_plugin_modules@
+storageobjects = @condition_dependent_plugin_objects@
+storagesourceslinks = @condition_dependent_plugin_links@
+
# automake misses these
sql_yacc.cc sql_yacc.h: $(top_srcdir)/sql/sql_yacc.yy
# The following libraries should be included in libmysqld.a
INC_LIB= $(top_builddir)/regex/libregex.a \
- $(top_builddir)/myisam/libmyisam.a \
- $(top_builddir)/myisammrg/libmyisammrg.a \
- $(top_builddir)/heap/libheap.a \
- @innodb_libs@ @bdb_libs_with_path@ \
$(top_builddir)/mysys/libmysys.a \
$(top_builddir)/strings/libmystrings.a \
$(top_builddir)/dbug/libdbug.a \
- $(top_builddir)/vio/libvio.a @NDB_SCI_LIBS@
+ $(top_builddir)/vio/libvio.a \
+ @NDB_SCI_LIBS@ \
+ @mysql_plugin_libs@ \
+ $(yassl_inc_libs)
+
+if HAVE_YASSL
+yassl_inc_libs= $(top_builddir)/extra/yassl/src/.libs/libyassl.a \
+ $(top_builddir)/extra/yassl/taocrypt/src/.libs/libtaocrypt.a
+endif
+
+# Storage engine specific compilation options
+ha_ndbcluster.o:ha_ndbcluster.cc
+ $(CXXCOMPILE) @ndbcluster_includes@ $(LM_CFLAGS) -c $<
+
+ha_ndbcluster_cond.o:ha_ndbcluster_cond.cc
+ $(CXXCOMPILE) @ndbcluster_includes@ $(LM_CFLAGS) -c $<
+
+ha_ndbcluster_binlog.o: ha_ndbcluster_binlog.cc
+ $(CXXCOMPILE) @ndbcluster_includes@ $(LM_CFLAGS) -c $<
+
+# Until we can remove dependency on ha_ndbcluster.h
+handler.o: handler.cc
+ $(CXXCOMPILE) @ndbcluster_includes@ $(LM_CFLAGS) -c $<
+
+# We need rules to compile these as no good way
+# found to append fileslists that collected by configure
+# to the sources list
+ha_federated.o:ha_federated.cc
+ $(CXXCOMPILE) $(LM_CFLAGS) -c $<
+
+ha_heap.o:ha_heap.cc
+ $(CXXCOMPILE) $(LM_CFLAGS) -c $<
+
+ha_innodb.o:ha_innodb.cc
+ $(CXXCOMPILE) $(LM_CFLAGS) -c $<
+
+ha_myisam.o:ha_myisam.cc
+ $(CXXCOMPILE) $(LM_CFLAGS) -c $<
+
+ha_myisammrg.o:ha_myisammrg.cc
+ $(CXXCOMPILE) $(LM_CFLAGS) -c $<
#
# To make it easy for the end user to use the embedded library we
@@ -94,20 +148,31 @@ INC_LIB= $(top_builddir)/regex/libregex.a \
# need to add the same file twice to the library, so 'sort -u' save us
# some time and spares unnecessary work.
-libmysqld.a: libmysqld_int.a $(INC_LIB)
+libmysqld.a: libmysqld_int.a $(INC_LIB) $(libmysqld_a_DEPENDENCIES) $(storageobjects)
if DARWIN_MWCC
- mwld -lib -o $@ libmysqld_int.a `echo $(INC_LIB) | sort -u`
+ mwld -lib -o $@ libmysqld_int.a `echo $(INC_LIB) | sort -u` $(storageobjects)
else
-rm -f libmysqld.a
if test "$(host_os)" = "netware" ; \
then \
- $(libmysqld_a_AR) libmysqld.a libmysqld_int.a $(INC_LIB) ; \
+ $(libmysqld_a_AR) libmysqld.a $(INC_LIB) libmysqld_int.a $(storageobjects); \
else \
- for arc in ./libmysqld_int.a $(INC_LIB); do \
- arpath=`echo $$arc|sed 's|[^/]*$$||'`; \
- $(AR) t $$arc|sed "s|^|$$arpath|"; \
- done | sort -u | xargs $(AR) cq libmysqld.a ; \
+ current_dir=`pwd`; \
+ rm -rf tmp; mkdir tmp; \
+ (for arc in $(INC_LIB) ./libmysqld_int.a; do \
+ arpath=`echo $$arc|sed 's|[^/]*$$||'|sed 's|\.libs/$$||'`; \
+ artmp=`echo $$arc|sed 's|^.*/|tmp/lib-|'`; \
+ for F in `$(AR) t $$arc | grep -v SYMDEF`; do \
+ if test -e "$$arpath/$$F" ; then echo "$$arpath/$$F"; else \
+ mkdir $$artmp; cd $$artmp > /dev/null; \
+ $(AR) x ../../$$arc; \
+ cd $$current_dir > /dev/null; \
+ ls $$artmp/* | grep -v SYMDEF; \
+ continue 2; fi; done; \
+ done; echo $(libmysqld_a_DEPENDENCIES) ) | sort -u | xargs $(AR) cq libmysqld.a ; \
+ $(AR) r libmysqld.a $(storageobjects); \
$(RANLIB) libmysqld.a ; \
+ rm -rf tmp; \
fi
endif
@@ -119,11 +184,11 @@ endif
#libmysqld_la_LDFLAGS = -version-info @SHARED_LIB_VERSION@
#CLEANFILES = $(libmysqld_la_LIBADD) libmysqld.la
-# This is called from the toplevel makefile. If we can link now
-# to an existing file in source, we do that, else we assume it
-# will show up in the build tree eventually (generated file).
+BUILT_SOURCES = link_sources
+
+CLEANFILES = $(BUILT_SOURCES)
+
link_sources:
- set -x; \
for f in $(sqlsources); do \
rm -f $$f; \
if test -e $(top_srcdir)/sql/$$f ; \
@@ -142,17 +207,28 @@ link_sources:
@LN_CP_F@ $(top_builddir)/libmysql/$$f $$f; \
fi ; \
done; \
- for f in $(sqlexamplessources); do \
- rm -f $$f; \
- @LN_CP_F@ $(top_srcdir)/sql/examples/$$f $$f; \
- done; \
+ if test -n "$(sqlstoragesources)" ; \
+ then \
+ for f in "$(sqlstoragesources)"; do \
+ rm -f "$$f"; \
+ @LN_CP_F@ `find $(srcdir)/../sql -name "$$f"` "$$f"; \
+ done; \
+ fi; \
+ if test -n "$(storagesources)" ; \
+ then \
+ rm -f $(storagesources); \
+ for f in $(storagesourceslinks); do \
+ @LN_CP_F@ $(top_srcdir)/$$f . ; \
+ done; \
+ fi; \
rm -f client_settings.h; \
- @LN_CP_F@ $(top_srcdir)/libmysql/client_settings.h client_settings.h
+ @LN_CP_F@ $(top_srcdir)/libmysql/client_settings.h \
+ client_settings.h; \
+ echo timestamp > link_sources
clean-local:
- rm -f `echo $(sqlsources) $(libmysqlsources) $(sqlexamplessources) | sed "s;\.lo;.c;g"` \
- $(top_srcdir)/linked_libmysqld_sources; \
+ rm -f `echo $(sqlsources) $(libmysqlsources) $(sqlstoragesources) $(storagesources) | sed "s;\.lo;.c;g"`; \
rm -f client_settings.h
# Don't update the files from bitkeeper
diff --git a/libmysqld/emb_qcache.cc b/libmysqld/emb_qcache.cc
index e6f35aa33a0..fdd7f8ed776 100644
--- a/libmysqld/emb_qcache.cc
+++ b/libmysqld/emb_qcache.cc
@@ -19,7 +19,7 @@
#include "emb_qcache.h"
#include "embedded_priv.h"
-void Querycache_stream::store_char(char c)
+void Querycache_stream::store_uchar(uchar c)
{
if (data_end == cur_data)
use_next_block(TRUE);
@@ -47,9 +47,9 @@ void Querycache_stream::store_short(ushort s)
cur_data+= 2;
return;
}
- *cur_data= ((byte *)(&s))[0];
+ *cur_data= ((uchar *)(&s))[0];
use_next_block(TRUE);
- *(cur_data++)= ((byte *)(&s))[1];
+ *(cur_data++)= ((uchar *)(&s))[1];
}
void Querycache_stream::store_int(uint i)
@@ -100,7 +100,7 @@ void Querycache_stream::store_ll(ulonglong ll)
}
memcpy(cur_data, &ll, rest_len);
use_next_block(TRUE);
- memcpy(cur_data, ((byte*)&ll)+rest_len, 8-rest_len);
+ memcpy(cur_data, ((uchar*)&ll)+rest_len, 8-rest_len);
cur_data+= 8-rest_len;
}
@@ -142,7 +142,7 @@ void Querycache_stream::store_safe_str(const char *str, uint str_len)
store_int(0);
}
-char Querycache_stream::load_char()
+uchar Querycache_stream::load_uchar()
{
if (cur_data == data_end)
use_next_block(FALSE);
@@ -165,9 +165,9 @@ ushort Querycache_stream::load_short()
cur_data+= 2;
return result;
}
- ((byte*)&result)[0]= *cur_data;
+ ((uchar*)&result)[0]= *cur_data;
use_next_block(FALSE);
- ((byte*)&result)[1]= *(cur_data++);
+ ((uchar*)&result)[1]= *(cur_data++);
return result;
}
@@ -216,7 +216,7 @@ ulonglong Querycache_stream::load_ll()
}
memcpy(&result, cur_data, rest_len);
use_next_block(FALSE);
- memcpy(((byte*)&result)+rest_len, cur_data, 8-rest_len);
+ memcpy(((uchar*)&result)+rest_len, cur_data, 8-rest_len);
cur_data+= 8-rest_len;
return result;
}
@@ -245,7 +245,7 @@ char *Querycache_stream::load_str(MEM_ROOT *alloc, uint *str_len)
{
char *result;
*str_len= load_int();
- if (!(result= alloc_root(alloc, *str_len + 1)))
+ if (!(result= (char*) alloc_root(alloc, *str_len + 1)))
return 0;
load_str_only(result, *str_len);
return result;
@@ -259,7 +259,7 @@ int Querycache_stream::load_safe_str(MEM_ROOT *alloc, char **str, uint *str_len)
return 0;
}
(*str_len)--;
- if (!(*str= alloc_root(alloc, *str_len + 1)))
+ if (!(*str= (char*) alloc_root(alloc, *str_len + 1)))
return 1;
load_str_only(*str, *str_len);
return 0;
@@ -301,8 +301,8 @@ uint emb_count_querycache_size(THD *thd)
*data->embedded_info->prev_ptr= NULL; // this marks the last record
cur_row= data->data;
n_rows= data->rows;
- /* n_fields + n_rows + (field_info + strlen * n_rows) * n_fields */
- result+= (uint) (4+8 + (42 + 4*n_rows)*data->fields);
+ /* n_fields + n_rows + field_info * n_fields */
+ result+= (uint) (4+8 + 42*data->fields);
for(; field < field_end; field++)
{
@@ -313,13 +313,23 @@ uint emb_count_querycache_size(THD *thd)
result+= field->def_length;
}
- for (; cur_row; cur_row=cur_row->next)
+ if (thd->protocol == &thd->protocol_binary)
{
- MYSQL_ROW col= cur_row->data;
- MYSQL_ROW col_end= col + data->fields;
- for (; col < col_end; col++)
- if (*col)
- result+= *(uint *)((*col) - sizeof(uint));
+ result+= (uint) (4*n_rows);
+ for (; cur_row; cur_row=cur_row->next)
+ result+= cur_row->length;
+ }
+ else
+ {
+ result+= (uint) (4*n_rows*data->fields);
+ for (; cur_row; cur_row=cur_row->next)
+ {
+ MYSQL_ROW col= cur_row->data;
+ MYSQL_ROW col_end= col + data->fields;
+ for (; col < col_end; col++)
+ if (*col)
+ result+= *(uint *)((*col) - sizeof(uint));
+ }
}
return result;
}
@@ -353,10 +363,10 @@ void emb_store_querycache_result(Querycache_stream *dst, THD *thd)
{
dst->store_int((uint)field->length);
dst->store_int((uint)field->max_length);
- dst->store_char((char)field->type);
+ dst->store_uchar((uchar)field->type);
dst->store_short((ushort)field->flags);
dst->store_short((ushort)field->charsetnr);
- dst->store_char((char)field->decimals);
+ dst->store_uchar((uchar)field->decimals);
dst->store_str(field->name, field->name_length);
dst->store_str(field->table, field->table_length);
dst->store_str(field->org_name, field->org_name_length);
@@ -366,14 +376,22 @@ void emb_store_querycache_result(Querycache_stream *dst, THD *thd)
dst->store_safe_str(field->def, field->def_length);
}
- for (; cur_row; cur_row=cur_row->next)
+ if (thd->protocol == &thd->protocol_binary)
{
- MYSQL_ROW col= cur_row->data;
- MYSQL_ROW col_end= col + data->fields;
- for (; col < col_end; col++)
+ for (; cur_row; cur_row=cur_row->next)
+ dst->store_str((char *) cur_row->data, cur_row->length);
+ }
+ else
+ {
+ for (; cur_row; cur_row=cur_row->next)
{
- uint len= *col ? *(uint *)((*col) - sizeof(uint)) : 0;
- dst->store_safe_str(*col, len);
+ MYSQL_ROW col= cur_row->data;
+ MYSQL_ROW col_end= col + data->fields;
+ for (; col < col_end; col++)
+ {
+ uint len= *col ? *(uint *)((*col) - sizeof(uint)) : 0;
+ dst->store_safe_str(*col, len);
+ }
}
}
DBUG_ASSERT(emb_count_querycache_size(thd) == dst->stored_size);
@@ -408,10 +426,10 @@ int emb_load_querycache_result(THD *thd, Querycache_stream *src)
{
field->length= src->load_int();
field->max_length= (unsigned int)src->load_int();
- field->type= (enum enum_field_types)src->load_char();
+ field->type= (enum enum_field_types)src->load_uchar();
field->flags= (unsigned int)src->load_short();
field->charsetnr= (unsigned int)src->load_short();
- field->decimals= (unsigned int)src->load_char();
+ field->decimals= src->load_uchar();
if (!(field->name= src->load_str(f_alloc, &field->name_length)) ||
!(field->table= src->load_str(f_alloc,&field->table_length)) ||
@@ -423,31 +441,48 @@ int emb_load_querycache_result(THD *thd, Querycache_stream *src)
goto err;
}
- row= (MYSQL_ROWS *)alloc_root(&data->alloc,
- (uint) (rows * sizeof(MYSQL_ROWS) +
- rows*(data->fields+1)*sizeof(char*)));
- end_row= row + rows;
- columns= (MYSQL_ROW)end_row;
-
data->rows= rows;
- data->data= row;
if (!rows)
goto return_ok;
+ if (thd->protocol == &thd->protocol_binary)
+ {
+ uint length;
+ row= (MYSQL_ROWS *)alloc_root(&data->alloc, rows * sizeof(MYSQL_ROWS));
+ end_row= row + rows;
+ data->data= row;
- for (prev_row= &row->next; row < end_row; prev_row= &row->next, row++)
+ for (prev_row= &row->next; row < end_row; prev_row= &row->next, row++)
+ {
+ *prev_row= row;
+ row->data= (MYSQL_ROW) src->load_str(&data->alloc, &length);
+ row->length= length;
+ }
+ }
+ else
{
- *prev_row= row;
- row->data= columns;
- MYSQL_ROW col_end= columns + data->fields;
- for (; columns < col_end; columns++)
- src->load_column(&data->alloc, columns);
+ row= (MYSQL_ROWS *)alloc_root(&data->alloc,
+ (uint) (rows * sizeof(MYSQL_ROWS) +
+ rows*(data->fields+1)*sizeof(char*)));
+ end_row= row + rows;
+ columns= (MYSQL_ROW)end_row;
- *(columns++)= NULL;
+ data->data= row;
+
+ for (prev_row= &row->next; row < end_row; prev_row= &row->next, row++)
+ {
+ *prev_row= row;
+ row->data= columns;
+ MYSQL_ROW col_end= columns + data->fields;
+ for (; columns < col_end; columns++)
+ src->load_column(&data->alloc, columns);
+
+ *(columns++)= NULL;
+ }
}
*prev_row= NULL;
data->embedded_info->prev_ptr= prev_row;
return_ok:
- send_eof(thd);
+ net_send_eof(thd, thd->server_status, thd->total_warn_count);
DBUG_RETURN(0);
err:
DBUG_RETURN(1);
diff --git a/libmysqld/emb_qcache.h b/libmysqld/emb_qcache.h
index 5c5209902a1..67413739f2c 100644
--- a/libmysqld/emb_qcache.h
+++ b/libmysqld/emb_qcache.h
@@ -15,8 +15,8 @@
class Querycache_stream
{
- byte *cur_data;
- byte *data_end;
+ uchar *cur_data;
+ uchar *data_end;
Query_cache_block *block;
uint headers_len;
public:
@@ -27,7 +27,7 @@ public:
Querycache_stream(Query_cache_block *ini_block, uint ini_headers_len) :
block(ini_block), headers_len(ini_headers_len)
{
- cur_data= ((byte*)block)+headers_len;
+ cur_data= ((uchar*)block)+headers_len;
data_end= cur_data + (block->used-headers_len);
#ifndef DBUG_OFF
first_block= ini_block;
@@ -54,11 +54,11 @@ public:
else
DBUG_ASSERT(block->type == Query_cache_block::RES_CONT);
- cur_data= ((byte*)block)+headers_len;
+ cur_data= ((uchar*)block)+headers_len;
data_end= cur_data + (block->used-headers_len);
}
- void store_char(char c);
+ void store_uchar(uchar c);
void store_short(ushort s);
void store_int(uint i);
void store_ll(ulonglong ll);
@@ -66,7 +66,7 @@ public:
void store_str(const char *str, uint str_len);
void store_safe_str(const char *str, uint str_len);
- char load_char();
+ uchar load_uchar();
ushort load_short();
uint load_int();
ulonglong load_ll();
@@ -79,3 +79,4 @@ public:
uint emb_count_querycache_size(THD *thd);
int emb_load_querycache_result(THD *thd, Querycache_stream *src);
void emb_store_querycache_result(Querycache_stream *dst, THD* thd);
+void net_send_eof(THD *thd, uint server_status, uint total_warn_count);
diff --git a/libmysqld/examples/CMakeLists.txt b/libmysqld/examples/CMakeLists.txt
new file mode 100644
index 00000000000..ee129ff2df0
--- /dev/null
+++ b/libmysqld/examples/CMakeLists.txt
@@ -0,0 +1,38 @@
+# Copyright (C) 2006 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; version 2 of the License.
+#
+# 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include
+ ${CMAKE_SOURCE_DIR}/libmysqld/include
+ ${CMAKE_SOURCE_DIR}/regex
+ ${CMAKE_SOURCE_DIR}/zlib
+ ${CMAKE_SOURCE_DIR}/extra/yassl/include)
+
+# Currently does not work with DBUG, there are missing symbols reported.
+IF(WIN32)
+ ADD_DEFINITIONS(-DUSE_TLS)
+ENDIF(WIN32)
+ADD_EXECUTABLE(mysql_embedded ../../client/completion_hash.cc
+ ../../client/mysql.cc ../../client/readline.cc
+ ../../client/sql_string.cc)
+TARGET_LINK_LIBRARIES(mysql_embedded mysys yassl taocrypt zlib debug dbug regex strings wsock32)
+ADD_DEPENDENCIES(mysql_embedded libmysqld)
+
+ADD_EXECUTABLE(mysqltest_embedded ../../client/mysqltest.c)
+TARGET_LINK_LIBRARIES(mysqltest_embedded mysys yassl taocrypt zlib debug dbug regex strings wsock32)
+ADD_DEPENDENCIES(mysqltest_embedded libmysqld)
+
+ADD_EXECUTABLE(mysql_client_test_embedded ../../tests/mysql_client_test.c)
+TARGET_LINK_LIBRARIES(mysql_client_test_embedded debug dbug mysys yassl taocrypt zlib strings wsock32)
+ADD_DEPENDENCIES(mysql_client_test_embedded libmysqld)
diff --git a/libmysqld/examples/Makefile.am b/libmysqld/examples/Makefile.am
index e0dd8491688..3425b48645f 100644
--- a/libmysqld/examples/Makefile.am
+++ b/libmysqld/examples/Makefile.am
@@ -15,12 +15,13 @@
noinst_PROGRAMS = mysql
bin_PROGRAMS = mysqltest_embedded mysql_client_test_embedded
-client_sources = $(mysqltest_embedded_SOURCES) $(mysql_SOURCES)
-tests_sources = $(mysql_client_test_embedded_SOURCES)
-CLEANFILES = $(client_sources) $(tests_sources)
+client_sources = $(nodist_mysqltest_embedded_SOURCES) $(nodist_mysql_SOURCES)
+tests_sources = $(nodist_mysql_client_test_embedded_SOURCES)
+BUILT_SOURCES = link_sources
+CLEANFILES = $(client_sources) $(tests_sources) $(BUILT_SOURCES)
+EXTRA_DIST = CMakeLists.txt
link_sources:
- set -x; \
for f in $(client_sources); do \
rm -f $$f; \
@LN_CP_F@ $(top_srcdir)/client/$$f $$f; \
@@ -29,25 +30,26 @@ link_sources:
rm -f $$f; \
@LN_CP_F@ $(top_srcdir)/tests/$$f $$f; \
done
+ echo timestamp > link_sources
DEFS = -DEMBEDDED_LIBRARY
INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(srcdir) \
-I$(top_srcdir) -I$(top_srcdir)/client -I$(top_srcdir)/regex \
$(openssl_includes)
LIBS = @LIBS@ @WRAPLIBS@ @CLIENT_LIBS@ $(yassl_libs)
-LDADD = @CLIENT_EXTRA_LDFLAGS@ ../libmysqld.a @innodb_system_libs@ @LIBDL@ $(CXXLDFLAGS) \
+LDADD = @CLIENT_EXTRA_LDFLAGS@ ../libmysqld.a @LIBDL@ $(CXXLDFLAGS) \
@NDB_SCI_LIBS@
mysqltest_embedded_LINK = $(CXXLINK)
-mysqltest_embedded_SOURCES = mysqltest.c
+nodist_mysqltest_embedded_SOURCES = mysqltest.c
mysqltest_embedded_LDADD = $(LDADD) $(top_builddir)/regex/libregex.a
-mysql_SOURCES = mysql.cc readline.cc completion_hash.cc \
+nodist_mysql_SOURCES = mysql.cc readline.cc completion_hash.cc \
my_readline.h sql_string.h completion_hash.h
mysql_LDADD = @readline_link@ @TERMCAP_LIB@ $(LDADD)
mysql_client_test_embedded_LINK = $(CXXLINK)
-mysql_client_test_embedded_SOURCES = mysql_client_test.c
+nodist_mysql_client_test_embedded_SOURCES = mysql_client_test.c
# Don't update the files from bitkeeper
%::SCCS/s.%
diff --git a/libmysqld/examples/builder-sample/emb_samples.cpp b/libmysqld/examples/builder-sample/emb_samples.cpp
index 411de26149b..be3f1931af5 100644
--- a/libmysqld/examples/builder-sample/emb_samples.cpp
+++ b/libmysqld/examples/builder-sample/emb_samples.cpp
@@ -3,7 +3,7 @@
#pragma hdrstop
#include "emb_samples.h"
-#include <winsock.h>
+#include <winsock2.h>
#include <mysql.h>
#include <stdarg.h>
#include <stdio.h>
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc
index b0a47727c7c..bef51a33d75 100644
--- a/libmysqld/lib_sql.cc
+++ b/libmysqld/lib_sql.cc
@@ -28,16 +28,7 @@ extern "C"
extern unsigned long max_allowed_packet, net_buffer_length;
}
-#if defined (__WIN__)
-#include "../sql/mysqld.cpp"
-#else
#include "../sql/mysqld.cc"
-#endif
-
-int check_user(THD *thd, enum enum_server_command command,
- const char *passwd, uint passwd_len, const char *db,
- bool check_count);
-void thd_init_client_charset(THD *thd, uint cs_number);
C_MODE_START
@@ -72,17 +63,17 @@ void embedded_get_error(MYSQL *mysql, MYSQL_DATA *data)
{
NET *net= &mysql->net;
struct embedded_query_result *ei= data->embedded_info;
- net->last_errno= ei->last_errno;
- strmake(net->last_error, ei->info, sizeof(net->last_error));
+ net->client_last_errno= ei->last_errno;
+ strmake(net->client_last_error, ei->info, sizeof(net->client_last_error)-1);
memcpy(net->sqlstate, ei->sqlstate, sizeof(net->sqlstate));
mysql->server_status= ei->server_status;
- my_free((gptr) data, MYF(0));
+ my_free(data, MYF(0));
}
static 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,
+ const uchar *header, ulong header_length,
+ const uchar *arg, ulong arg_length, my_bool skip_check,
MYSQL_STMT *stmt)
{
my_bool result= 1;
@@ -93,19 +84,20 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
/* Check that we are calling the client functions in right order */
if (mysql->status != MYSQL_STATUS_READY)
{
- strmov(net->last_error,
- ER(net->last_errno=CR_COMMANDS_OUT_OF_SYNC));
+ set_mysql_error(mysql, CR_COMMANDS_OUT_OF_SYNC, unknown_sqlstate);
return 1;
}
/* Clear result variables */
thd->clear_error();
+ thd->main_da.reset_diagnostics_area();
mysql->affected_rows= ~(my_ulonglong) 0;
mysql->field_count= 0;
- net->last_errno= 0;
+ net_clear_error(net);
thd->current_stmt= stmt;
thd->store_globals(); // Fix if more than one connect
+ lex_start(thd);
/*
We have to call free_old_query before we start to fill mysql->fields
for new query. In the case of embedded server we collect field data
@@ -122,12 +114,11 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
arg_length= header_length;
}
- thd->net.no_send_error= 0;
- result= dispatch_command(command, thd, (char *) arg, arg_length + 1);
+ result= dispatch_command(command, thd, (char *) arg, arg_length);
thd->cur_data= 0;
if (!skip_check)
- result= thd->net.last_errno ? -1 : 0;
+ result= thd->is_error() ? -1 : 0;
return result;
}
@@ -188,7 +179,7 @@ static MYSQL_FIELD *emb_list_fields(MYSQL *mysql)
res= ((THD*) mysql->thd)->cur_data;
((THD*) mysql->thd)->cur_data= 0;
mysql->field_alloc= res->alloc;
- my_free((gptr) res,MYF(0));
+ my_free(res,MYF(0));
mysql->status= MYSQL_STATUS_READY;
return mysql->fields;
}
@@ -217,7 +208,7 @@ static my_bool emb_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt)
stmt->fields= mysql->fields;
stmt->mem_root= res->alloc;
mysql->fields= NULL;
- my_free((gptr) res,MYF(0));
+ my_free(res,MYF(0));
}
return 0;
@@ -254,11 +245,12 @@ static my_bool emb_read_query_result(MYSQL *mysql)
mysql->warning_count= res->embedded_info->warning_count;
mysql->server_status= res->embedded_info->server_status;
mysql->field_count= res->fields;
- mysql->fields= res->embedded_info->fields_list;
- mysql->affected_rows= res->embedded_info->affected_rows;
- mysql->insert_id= res->embedded_info->insert_id;
- mysql->net.last_errno= 0;
- mysql->net.last_error[0]= 0;
+ if (!(mysql->fields= res->embedded_info->fields_list))
+ {
+ mysql->affected_rows= res->embedded_info->affected_rows;
+ mysql->insert_id= res->embedded_info->insert_id;
+ }
+ net_clear_error(&mysql->net);
mysql->info= 0;
if (res->embedded_info->info[0])
@@ -273,7 +265,7 @@ static my_bool emb_read_query_result(MYSQL *mysql)
thd->cur_data= res;
}
else
- my_free((gptr) res, MYF(0));
+ my_free(res, MYF(0));
return 0;
}
@@ -281,7 +273,7 @@ static my_bool emb_read_query_result(MYSQL *mysql)
static int emb_stmt_execute(MYSQL_STMT *stmt)
{
DBUG_ENTER("emb_stmt_execute");
- char header[5];
+ uchar header[5];
THD *thd;
my_bool res;
@@ -300,7 +292,7 @@ static int emb_stmt_execute(MYSQL_STMT *stmt)
if (res)
{
NET *net= &stmt->mysql->net;
- set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate);
+ set_stmt_errmsg(stmt, net);
DBUG_RETURN(1);
}
DBUG_RETURN(0);
@@ -311,14 +303,12 @@ int emb_read_binary_rows(MYSQL_STMT *stmt)
MYSQL_DATA *data;
if (!(data= emb_read_rows(stmt->mysql, 0, 0)))
{
- set_stmt_errmsg(stmt, stmt->mysql->net.last_error,
- stmt->mysql->net.last_errno, stmt->mysql->net.sqlstate);
+ set_stmt_errmsg(stmt, &stmt->mysql->net);
return 1;
}
stmt->result= *data;
my_free((char *) data, MYF(0));
- set_stmt_errmsg(stmt, stmt->mysql->net.last_error,
- stmt->mysql->net.last_errno, stmt->mysql->net.sqlstate);
+ set_stmt_errmsg(stmt, &stmt->mysql->net);
return 0;
}
@@ -332,16 +322,14 @@ int emb_read_rows_from_cursor(MYSQL_STMT *stmt)
if (res->embedded_info->last_errno)
{
embedded_get_error(mysql, res);
- set_stmt_errmsg(stmt, mysql->net.last_error,
- mysql->net.last_errno, mysql->net.sqlstate);
+ set_stmt_errmsg(stmt, &mysql->net);
return 1;
}
thd->cur_data= res;
mysql->warning_count= res->embedded_info->warning_count;
mysql->server_status= res->embedded_info->server_status;
- mysql->net.last_errno= 0;
- mysql->net.last_error[0]= 0;
+ net_clear_error(&mysql->net);
return emb_read_binary_rows(stmt);
}
@@ -387,7 +375,7 @@ static void emb_free_embedded_thd(MYSQL *mysql)
static const char * emb_read_statistics(MYSQL *mysql)
{
THD *thd= (THD*)mysql->thd;
- return thd->net.last_error;
+ return thd->is_error() ? thd->main_da.message() : "";
}
@@ -478,6 +466,12 @@ int init_embedded_server(int argc, char **argv, char **groups)
my_progname= (char *)"mysql_embedded";
+ /*
+ Perform basic logger initialization logger. Should be called after
+ MY_INIT, as it initializes mutexes. Log tables are inited later.
+ */
+ logger.init_base();
+
if (init_common_variables("my", *argcp, *argvp, (const char **)groups))
{
mysql_server_end();
@@ -528,17 +522,18 @@ int init_embedded_server(int argc, char **argv, char **groups)
(void) thr_setconcurrency(concurrency); // 10 by default
- if (
-#ifdef HAVE_BERKELEY_DB
- (have_berkeley_db == SHOW_OPTION_YES) ||
-#endif
- (flush_time && flush_time != ~(ulong) 0L))
+ if (flush_time && flush_time != ~(ulong) 0L)
{
pthread_t hThread;
if (pthread_create(&hThread,&connection_attrib,handle_manager,0))
sql_print_error("Warning: Can't create thread to manage maintenance");
}
+ // FIXME initialize binlog_filter and rpl_filter if not already done
+ // corresponding delete is in clean_up()
+ if(!binlog_filter) binlog_filter = new Rpl_filter;
+ if(!rpl_filter) rpl_filter = new Rpl_filter;
+
if (opt_init_file)
{
if (read_init_file(opt_init_file))
@@ -548,6 +543,7 @@ int init_embedded_server(int argc, char **argv, char **groups)
}
}
+ execute_ddl_log_recovery();
return 0;
}
@@ -567,10 +563,21 @@ void init_embedded_mysql(MYSQL *mysql, int client_flag)
init_alloc_root(&mysql->field_alloc, 8192, 0);
}
+/**
+ @brief Initialize a new THD for a connection in the embedded server
+
+ @param client_flag Client capabilities which this thread supports
+ @return pointer to the created THD object
+
+ @todo
+ This function copies code from several places in the server, including
+ create_new_thread(), and prepare_new_connection_state(). This should
+ be refactored to avoid code duplication.
+*/
void *create_embedded_thd(int client_flag)
{
THD * thd= new THD;
- thd->thread_id= thread_id++;
+ thd->thread_id= thd->variables.pseudo_thread_id= thread_id++;
thd->thread_stack= (char*) &thd;
if (thd->store_globals())
@@ -578,12 +585,9 @@ void *create_embedded_thd(int client_flag)
fprintf(stderr,"store_globals failed.\n");
goto err;
}
+ lex_start(thd);
- thd->mysys_var= my_thread_var;
- thd->dbug_thread_id= my_thread_id();
- thd->thread_stack= (char*) &thd;
-
-/* TODO - add init_connect command execution */
+ /* TODO - add init_connect command execution */
if (thd->variables.max_join_size == HA_POS_ERROR)
thd->options |= OPTION_BIG_SELECTS;
@@ -593,7 +597,7 @@ void *create_embedded_thd(int client_flag)
thd->set_time();
thd->init_for_queries();
thd->client_capabilities= client_flag;
- thd->real_id= (pthread_t)thd->thread_id;
+ thd->real_id= pthread_self();
thd->db= NULL;
thd->db_length= 0;
@@ -626,6 +630,7 @@ int check_embedded_connection(MYSQL *mysql, const char *db)
strmake(sctx->priv_host, (char*) my_localhost, MAX_HOSTNAME-1);
sctx->priv_user= sctx->user= my_strdup(mysql->user, MYF(0));
result= check_user(thd, COM_CONNECT, NULL, 0, db, true);
+ net_end_statement(thd);
emb_read_query_result(mysql);
return result;
}
@@ -675,8 +680,10 @@ int check_embedded_connection(MYSQL *mysql, const char *db)
err:
{
NET *net= &mysql->net;
- memcpy(net->last_error, thd->net.last_error, sizeof(net->last_error));
- memcpy(net->sqlstate, thd->net.sqlstate, sizeof(net->sqlstate));
+ strmake(net->client_last_error, thd->main_da.message(), sizeof(net->client_last_error)-1);
+ memcpy(net->sqlstate,
+ mysql_errno_to_sqlstate(thd->main_da.sql_errno()),
+ sizeof(net->sqlstate)-1);
}
return result;
}
@@ -699,9 +706,8 @@ void THD::clear_data_list()
void THD::clear_error()
{
- net.last_error[0]= 0;
- net.last_errno= 0;
- net.report_error= 0;
+ if (main_da.is_error())
+ main_da.reset_diagnostics_area();
}
static char *dup_str_aux(MEM_ROOT *root, const char *from, uint length,
@@ -764,20 +770,18 @@ MYSQL_DATA *THD::alloc_new_dataset()
}
-/*
- stores server_status and warning_count in the current
- query result structures
-
- SYNOPSIS
- write_eof_packet()
- thd current thread
+/**
+ Stores server_status and warning_count in the current
+ query result structures.
- NOTES
- should be called to after we get the recordset-result
+ @param thd current thread
+ @note Should be called after we get the recordset-result.
*/
-static void write_eof_packet(THD *thd)
+static
+void
+write_eof_packet(THD *thd, uint server_status, uint total_warn_count)
{
if (!thd->mysql) // bootstrap file handling
return;
@@ -788,13 +792,13 @@ static void write_eof_packet(THD *thd)
*/
if (thd->is_fatal_error)
thd->server_status&= ~SERVER_MORE_RESULTS_EXISTS;
- thd->cur_data->embedded_info->server_status= thd->server_status;
+ thd->cur_data->embedded_info->server_status= server_status;
/*
Don't send warn count during SP execution, as the warn_list
is cleared between substatements, and mysqltest gets confused
*/
thd->cur_data->embedded_info->warning_count=
- (thd->spcont ? 0 : min(thd->total_warn_count, 65535));
+ (thd->spcont ? 0 : min(total_warn_count, 65535));
}
@@ -825,7 +829,7 @@ int Protocol::begin_dataset()
remove last row of current recordset
SYNOPSIS
- Protocol_simple::remove_last_row()
+ Protocol_text::remove_last_row()
NOTES
does the loop from the beginning of the current recordset to
@@ -833,12 +837,12 @@ int Protocol::begin_dataset()
Not supposed to be frequently called.
*/
-void Protocol_simple::remove_last_row()
+void Protocol_text::remove_last_row()
{
MYSQL_DATA *data= thd->cur_data;
MYSQL_ROWS **last_row_hook= &data->data;
uint count= data->rows;
- DBUG_ENTER("Protocol_simple::remove_last_row");
+ DBUG_ENTER("Protocol_text::remove_last_row");
while (--count)
last_row_hook= &(*last_row_hook)->next;
@@ -950,7 +954,7 @@ bool Protocol::send_fields(List<Item> *list, uint flags)
}
if (flags & SEND_EOF)
- write_eof_packet(thd);
+ write_eof_packet(thd, thd->server_status, thd->total_warn_count);
DBUG_RETURN(prepare_for_send(list));
err:
@@ -967,7 +971,7 @@ bool Protocol::write()
return false;
}
-bool Protocol_prep::write()
+bool Protocol_binary::write()
{
MYSQL_ROWS *cur;
MYSQL_DATA *data= thd->cur_data;
@@ -990,17 +994,35 @@ bool Protocol_prep::write()
return false;
}
+
+/**
+ Embedded library implementation of OK response.
+
+ This function is used by the server to write 'OK' packet to
+ the "network" when the server is compiled as an embedded library.
+ Since there is no network in the embedded configuration,
+ a different implementation is necessary.
+ Instead of marshalling response parameters to a network representation
+ and then writing it to the socket, here we simply copy the data to the
+ corresponding client-side connection structures.
+
+ @sa Server implementation of net_send_ok in protocol.cc for
+ description of the arguments.
+
+ @return The function does not return errors.
+*/
+
void
-send_ok(THD *thd,ha_rows affected_rows,ulonglong id,const char *message)
+net_send_ok(THD *thd,
+ uint server_status, uint total_warn_count,
+ ha_rows affected_rows, ulonglong id, const char *message)
{
- DBUG_ENTER("send_ok");
+ DBUG_ENTER("emb_net_send_ok");
MYSQL_DATA *data;
MYSQL *mysql= thd->mysql;
-
+
if (!mysql) // bootstrap file handling
DBUG_VOID_RETURN;
- if (thd->net.no_send_ok) // hack for re-parsing queries
- DBUG_VOID_RETURN;
if (!(data= thd->alloc_new_dataset()))
return;
data->embedded_info->affected_rows= affected_rows;
@@ -1009,15 +1031,24 @@ send_ok(THD *thd,ha_rows affected_rows,ulonglong id,const char *message)
strmake(data->embedded_info->info, message,
sizeof(data->embedded_info->info)-1);
- write_eof_packet(thd);
+ write_eof_packet(thd, server_status, total_warn_count);
thd->cur_data= 0;
DBUG_VOID_RETURN;
}
+
+/**
+ Embedded library implementation of EOF response.
+
+ @sa net_send_ok
+
+ @return This function does not return errors.
+*/
+
void
-send_eof(THD *thd)
+net_send_eof(THD *thd, uint server_status, uint total_warn_count)
{
- write_eof_packet(thd);
+ write_eof_packet(thd, server_status, total_warn_count);
thd->cur_data= 0;
}
@@ -1035,7 +1066,7 @@ void net_send_error_packet(THD *thd, uint sql_errno, const char *err)
}
-void Protocol_simple::prepare_for_resend()
+void Protocol_text::prepare_for_resend()
{
MYSQL_ROWS *cur;
MYSQL_DATA *data= thd->cur_data;
@@ -1060,30 +1091,30 @@ void Protocol_simple::prepare_for_resend()
DBUG_VOID_RETURN;
}
-bool Protocol_simple::store_null()
+bool Protocol_text::store_null()
{
*(next_field++)= NULL;
++next_mysql_field;
return false;
}
-bool Protocol::net_store_data(const char *from, uint length)
+bool Protocol::net_store_data(const uchar *from, size_t length)
{
char *field_buf;
if (!thd->mysql) // bootstrap file handling
- return false;
+ return FALSE;
- if (!(field_buf=alloc_root(alloc, length + sizeof(uint) + 1)))
- return true;
+ if (!(field_buf= (char*) alloc_root(alloc, length + sizeof(uint) + 1)))
+ return TRUE;
*(uint *)field_buf= length;
*next_field= field_buf + sizeof(uint);
- memcpy(*next_field, from, length);
+ memcpy((uchar*) *next_field, from, length);
(*next_field)[length]= 0;
if (next_mysql_field->max_length < length)
next_mysql_field->max_length=length;
++next_field;
++next_mysql_field;
- return false;
+ return FALSE;
}
diff --git a/libmysqld/libmysqld.c b/libmysqld/libmysqld.c
index eb47a045669..a8542f6fca9 100644
--- a/libmysqld/libmysqld.c
+++ b/libmysqld/libmysqld.c
@@ -209,8 +209,9 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
DBUG_RETURN(mysql);
error:
- DBUG_PRINT("error",("message: %u (%s)", mysql->net.last_errno,
- mysql->net.last_error));
+ DBUG_PRINT("error",("message: %u (%s)",
+ mysql->net.client_last_errno,
+ mysql->net.client_last_error));
{
/* Free alloced memory */
my_bool free_me=mysql->free_me;
diff --git a/libmysqld/libmysqld.def b/libmysqld/libmysqld.def
index 8aed164a30e..2aa75c0b23c 100644
--- a/libmysqld/libmysqld.def
+++ b/libmysqld/libmysqld.def
@@ -1,6 +1,6 @@
LIBRARY LIBMYSQLD
-DESCRIPTION 'MySQL 5.0 Embedded Server Library'
-VERSION 5.0
+DESCRIPTION 'MySQL 5.1 Embedded Server Library'
+VERSION 5.1
EXPORTS
_dig_vec_upper
_dig_vec_lower
@@ -18,6 +18,7 @@ EXPORTS
list_delete
load_defaults
max_allowed_packet
+ my_cgets
my_end
my_getopt_print_errors
my_init
@@ -40,11 +41,14 @@ EXPORTS
mysql_commit
mysql_data_seek
mysql_debug
+ mysql_disable_rpl_parse
mysql_dump_debug_info
+ mysql_enable_rpl_parse
mysql_eof
mysql_errno
mysql_error
mysql_escape_string
+ mysql_hex_string
mysql_fetch_field
mysql_fetch_field_direct
mysql_fetch_fields
@@ -54,15 +58,18 @@ EXPORTS
mysql_field_seek
mysql_field_tell
mysql_free_result
+ mysql_get_character_set_info
mysql_get_client_info
mysql_get_host_info
mysql_get_proto_info
mysql_get_server_info
+ mysql_get_client_version
mysql_get_ssl_cipher
mysql_info
mysql_init
mysql_insert_id
mysql_kill
+ mysql_set_server_option
mysql_list_dbs
mysql_list_fields
mysql_list_processes
@@ -82,6 +89,8 @@ EXPORTS
mysql_rollback
mysql_row_seek
mysql_row_tell
+ mysql_rpl_parse_enabled
+ mysql_rpl_probe
mysql_select_db
mysql_send_query
mysql_shutdown
@@ -107,6 +116,7 @@ EXPORTS
get_tty_password
sql_protocol_typelib
mysql_get_server_version
+ mysql_set_character_set
mysql_sqlstate
charsets_dir
disabled_my_option
@@ -131,6 +141,8 @@ EXPORTS
my_read
llstr
mysql_get_parameters
+ mysql_thread_init
+ mysql_thread_end
mysql_stmt_bind_param
mysql_stmt_bind_result
mysql_stmt_execute
@@ -162,4 +174,3 @@ EXPORTS
my_charset_bin
my_charset_same
modify_defaults_file
- mysql_set_server_option