diff --git a/config/ac-macros/storage.m4 b/config/ac-macros/storage.m4 index 8564e8ef5cc..4148aed818d 100644 --- a/config/ac-macros/storage.m4 +++ b/config/ac-macros/storage.m4 @@ -39,7 +39,10 @@ then AC_DEFINE([$5]) mysql_se_decls="${mysql_se_decls},$6" mysql_se_htons="${mysql_se_htons},&$6" - mysql_se_objs="$mysql_se_objs $8" + if test "$8" != "no" + then + mysql_se_objs="$mysql_se_objs $8" + fi mysql_se_dirs="$mysql_se_dirs $7" mysql_se_libs="$mysql_se_libs $9" else diff --git a/configure.in b/configure.in index 48cc4192d28..ad31ec8a497 100644 --- a/configure.in +++ b/configure.in @@ -2437,8 +2437,8 @@ MYSQL_STORAGE_ENGINE(archive,,,,,,storage/archive,, \$(top_builddir)/storage/archive/libarchive.a, [ AC_CONFIG_FILES(storage/archive/Makefile) ]) -MYSQL_STORAGE_ENGINE(csv,,,"yes",,tina_hton,storage/csv, - ../storage/csv/ha_tina.o,,[ +MYSQL_STORAGE_ENGINE(csv,,,"yes",,tina_hton,storage/csv,no, + \$(top_builddir)/storage/csv/libcsv.a,[ AC_CONFIG_FILES(storage/csv/Makefile) ]) MYSQL_STORAGE_ENGINE(blackhole) diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index 5ca22fbc7c7..06a9acf9761 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -296,7 +296,10 @@ err: #endif /* HAVE_REPLICATION */ -bool ha_myisam::check_if_locking_is_allowed(THD *thd, TABLE *table, uint count) +bool ha_myisam::check_if_locking_is_allowed(uint sql_command, + ulong type, TABLE *table, + uint count, + bool called_by_logger_thread) { /* To be able to open and lock for reading system tables like 'mysql.proc', diff --git a/sql/ha_myisam.h b/sql/ha_myisam.h index 1247437375f..86efed27478 100644 --- a/sql/ha_myisam.h +++ b/sql/ha_myisam.h @@ -60,7 +60,10 @@ class ha_myisam: public handler uint max_supported_key_part_length() const { return MI_MAX_KEY_LENGTH; } uint checksum() const; - virtual bool check_if_locking_is_allowed(THD *thd, TABLE *table, uint count); + virtual bool check_if_locking_is_allowed(uint sql_command, + ulong type, TABLE *table, + uint count, + bool called_by_logger_thread); int open(const char *name, int mode, uint test_if_locked); int close(void); int write_row(byte * buf); diff --git a/sql/handler.cc b/sql/handler.cc index 868dc5a09e9..b40a40684fe 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1425,6 +1425,12 @@ int ha_delete_table(THD *thd, handlerton *table_type, const char *path, ** General handler functions ****************************************************************************/ + +void handler::ha_statistic_increment(ulong SSV::*offset) const +{ + statistic_increment(table->in_use->status_var.*offset, &LOCK_status); +} + /* Open database-handler. diff --git a/sql/handler.h b/sql/handler.h index f85d98cd34e..f43a6514086 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -1006,6 +1006,8 @@ typedef struct st_handler_buffer byte *end_of_used_area; /* End of area that was used by handler */ } HANDLER_BUFFER; +typedef struct system_status_var SSV; + class handler :public Sql_alloc { #ifdef WITH_PARTITION_STORAGE_ENGINE @@ -1027,6 +1029,9 @@ class handler :public Sql_alloc virtual int rnd_init(bool scan) =0; virtual int rnd_end() { return 0; } + void ha_statistic_increment(ulong SSV::*offset) const; + + private: virtual int reset() { return extra(HA_EXTRA_RESET); } public: @@ -1109,7 +1114,10 @@ public: TRUE Locking is allowed FALSE Locking is not allowed. The error was thrown. */ - virtual bool check_if_locking_is_allowed(THD *thd, TABLE *table, uint count) + virtual bool check_if_locking_is_allowed(uint sql_command, + ulong type, TABLE *table, + uint count, + bool called_by_logger_thread) { return TRUE; } diff --git a/sql/item.h b/sql/item.h index 5de69013605..e8f1697f09d 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1932,7 +1932,7 @@ public: virtual Item *real_item() { return ref; } }; - +#ifdef MYSQL_SERVER #include "gstream.h" #include "spatial.h" #include "item_sum.h" @@ -1945,6 +1945,7 @@ public: #include "item_uniq.h" #include "item_subselect.h" #include "item_xmlfunc.h" +#endif class Item_copy_string :public Item { diff --git a/sql/lock.cc b/sql/lock.cc index 36648c33ac6..5f1141cc841 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -617,8 +617,11 @@ static MYSQL_LOCK *get_lock_data(THD *thd, TABLE **table_ptr, uint count, Check if we can lock the table. For some tables we cannot do that beacause of handler-specific locking issues. */ - if (!table_ptr[i]->file->check_if_locking_is_allowed(thd, table_ptr[i], - count)) + if (!table_ptr[i]-> file-> + check_if_locking_is_allowed(thd->lex->sql_command, thd->lex->type, + table_ptr[i], count, + (thd == logger.get_general_log_thd()) || + (thd == logger.get_slow_log_thd()))) return 0; } diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 955983981d1..a0678edec37 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -477,6 +477,11 @@ inline THD *_current_thd(void) } #define current_thd _current_thd() +/* below functions are required for plugins as THD class is opaque */ +my_bool thd_in_lock_tables(const THD *thd); +my_bool thd_tablespace_op(const THD *thd); +const char *thd_proc_info(THD *thd, const char *info); + /* External variables */ @@ -507,7 +512,9 @@ enum enum_var_type class sys_var; #include "item.h" extern my_decimal decimal_zero; +#ifdef MYSQL_SERVER typedef Comp_creator* (*chooser_compare_func_creator)(bool invert); +#endif /* sql_parse.cc */ void free_items(Item *item); void cleanup_items(Item *item); @@ -545,6 +552,7 @@ Item *negate_expression(THD *thd, Item *expr); #include "sql_class.h" #include "sql_acl.h" #include "tztime.h" +#ifdef MYSQL_SERVER #include "opt_range.h" #ifdef HAVE_QUERY_CACHE @@ -841,6 +849,8 @@ find_field_in_table(THD *thd, TABLE *table, const char *name, uint length, Field * find_field_in_table_sef(TABLE *table, const char *name); +#endif /* MYSQL_SERVER */ + #ifdef HAVE_OPENSSL #include struct st_des_keyblock @@ -858,6 +868,7 @@ extern pthread_mutex_t LOCK_des_key_file; bool load_des_key_file(const char *file_name); #endif /* HAVE_OPENSSL */ +#ifdef MYSQL_SERVER /* sql_do.cc */ bool mysql_do(THD *thd, List &values); @@ -1169,6 +1180,7 @@ int key_cmp(KEY_PART_INFO *key_part, const byte *key, uint key_length); int key_rec_cmp(void *key_info, byte *a, byte *b); bool init_errmessage(void); +#endif /* MYSQL_SERVER */ void sql_perror(const char *message); int vprint_msg_to_log(enum loglevel level, const char *format, va_list args); @@ -1191,6 +1203,7 @@ bool general_log_print(THD *thd, enum enum_server_command command, bool fn_format_relative_to_data_home(my_string to, const char *name, const char *dir, const char *extension); +#ifdef MYSQL_SERVER File open_binlog(IO_CACHE *log, const char *log_file_name, const char **errmsg); @@ -1739,4 +1752,5 @@ inline void kill_delayed_threads(void) {} #define check_stack_overrun(A, B, C) 0 #endif +#endif /* MYSQL_SERVER */ #endif /* MYSQL_CLIENT */ diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 0885faffeb6..d827724678b 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -167,6 +167,25 @@ Open_tables_state::Open_tables_state(ulong version_arg) reset_open_tables_state(); } +my_bool thd_in_lock_tables(const THD *thd) +{ + return thd->in_lock_tables; +} + + +my_bool thd_tablespace_op(const THD *thd) +{ + return thd->tablespace_op; +} + + +const char *thd_proc_info(THD *thd, const char *info) +{ + const char *old_info= thd->proc_info; + thd->proc_info= info; + return old_info; +} + /* Pass nominal parameters to Statement constructor only to ensure that diff --git a/sql/sql_class.h b/sql/sql_class.h index e7efa5fcfda..27b3f9df300 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -171,6 +171,7 @@ public: class delayed_insert; class select_result; +class Time_zone; #define THD_SENTRY_MAGIC 0xfeedd1ff #define THD_SENTRY_GONE 0xdeadbeef @@ -344,6 +345,8 @@ typedef struct system_status_var #define last_system_status_var com_stmt_close +#ifdef MYSQL_SERVER + void free_tmp_table(THD *thd, TABLE *entry); @@ -354,7 +357,6 @@ void free_tmp_table(THD *thd, TABLE *entry); #define INIT_ARENA_DBUG_INFO #endif - class Query_arena { public: @@ -1905,3 +1907,5 @@ public: /* Functions in sql_class.cc */ void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var); + +#endif /* MYSQL_SERVER */ diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 28ba8fbf94a..b0eba863235 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -29,6 +29,7 @@ class st_alter_tablespace; class partition_info; class event_timed; +#ifdef MYSQL_SERVER /* The following hack is needed because mysql_yacc.cc does not define YYSTYPE before including this file @@ -43,6 +44,7 @@ class event_timed; #include "sql_yacc.h" #define LEX_YYSTYPE YYSTYPE * #endif +#endif /* When a command is added here, be sure it's also added in mysqld.cc @@ -115,6 +117,8 @@ enum enum_sql_command { */ #define DESCRIBE_PARTITIONS 4 +#ifdef MYSQL_SERVER + enum enum_sp_suid_behaviour { SP_IS_DEFAULT_SUID= 0, @@ -1109,3 +1113,5 @@ extern int yylex(void *arg, void *yythd); extern pthread_key(LEX*,THR_LEX); #define current_lex (current_thd->lex) + +#endif diff --git a/storage/csv/Makefile.am b/storage/csv/Makefile.am index f1802f4e5b0..509cef954ff 100644 --- a/storage/csv/Makefile.am +++ b/storage/csv/Makefile.am @@ -24,17 +24,16 @@ INCLUDES = -I$(top_srcdir)/include \ -I$(top_srcdir)/regex \ -I$(top_srcdir)/sql \ -I$(srcdir) -WRAPLIBS= -pkglib_LTLIBRARIES = ha_csv.la - -ha_csv_la_LDFLAGS = -module -noinst_HEADERS = ha_tina.h -ha_csv_la_SOURCES = ha_tina.cc +pkglib_LIBRARIES = libcsv.a LDADD = -DEFS = -DMYSQL_SERVER @DEFS@ +DEFS = @DEFS@ + +libcsv_a_CXXFLAGS = $(AM_CFLAGS) +noinst_HEADERS = ha_tina.h +libcsv_a_SOURCES = ha_tina.cc # Don't update the files from bitkeeper %::SCCS/s.% diff --git a/storage/csv/ha_tina.cc b/storage/csv/ha_tina.cc index e2b2d16d704..be75f9c49c9 100644 --- a/storage/csv/ha_tina.cc +++ b/storage/csv/ha_tina.cc @@ -590,7 +590,10 @@ void ha_tina::update_status() } -bool ha_tina::check_if_locking_is_allowed(THD *thd, TABLE *table, uint count) +bool ha_tina::check_if_locking_is_allowed(uint sql_command, + ulong type, TABLE *table, + uint count, + bool called_by_logger_thread) { /* Deny locking of the log tables, which is incompatible with @@ -598,11 +601,10 @@ bool ha_tina::check_if_locking_is_allowed(THD *thd, TABLE *table, uint count) general_log_thd or slow_log_thd. */ if (table->s->log_table && - thd->lex->sql_command != SQLCOM_TRUNCATE && - !(thd->lex->sql_command == SQLCOM_FLUSH && - thd->lex->type & REFRESH_LOG) && - (thd != logger.get_general_log_thd()) && - (thd != logger.get_slow_log_thd()) && + sql_command != SQLCOM_TRUNCATE && + !(sql_command == SQLCOM_FLUSH && + type & REFRESH_LOG) && + !called_by_logger_thread && (table->reginfo.lock_type >= TL_READ_NO_INSERT)) { /* @@ -665,7 +667,7 @@ int ha_tina::write_row(byte * buf) int size; DBUG_ENTER("ha_tina::write_row"); - statistic_increment(table->in_use->status_var.ha_write_count, &LOCK_status); + ha_statistic_increment(&SSV::ha_write_count); if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_INSERT) table->timestamp_field->set_time(); @@ -714,9 +716,7 @@ int ha_tina::update_row(const byte * old_data, byte * new_data) int size; DBUG_ENTER("ha_tina::update_row"); - - statistic_increment(table->in_use->status_var.ha_read_rnd_next_count, - &LOCK_status); + ha_statistic_increment(&SSV::ha_read_rnd_next_count); if (table->timestamp_field_type & TIMESTAMP_AUTO_SET_ON_UPDATE) table->timestamp_field->set_time(); @@ -751,8 +751,7 @@ int ha_tina::update_row(const byte * old_data, byte * new_data) int ha_tina::delete_row(const byte * buf) { DBUG_ENTER("ha_tina::delete_row"); - statistic_increment(table->in_use->status_var.ha_delete_count, - &LOCK_status); + ha_statistic_increment(&SSV::ha_delete_count); if (chain_append()) DBUG_RETURN(-1); @@ -903,8 +902,7 @@ int ha_tina::rnd_next(byte *buf) { DBUG_ENTER("ha_tina::rnd_next"); - statistic_increment(table->in_use->status_var.ha_read_rnd_next_count, - &LOCK_status); + ha_statistic_increment(&SSV::ha_read_rnd_next_count); current_position= next_position; if (!share->mapped_file) @@ -941,8 +939,7 @@ void ha_tina::position(const byte *record) int ha_tina::rnd_pos(byte * buf, byte *pos) { DBUG_ENTER("ha_tina::rnd_pos"); - statistic_increment(table->in_use->status_var.ha_read_rnd_next_count, - &LOCK_status); + ha_statistic_increment(&SSV::ha_read_rnd_next_count); current_position= my_get_ptr(pos,ref_length); DBUG_RETURN(find_current_row(buf)); } diff --git a/storage/csv/ha_tina.h b/storage/csv/ha_tina.h index 09f10c430bc..3760af60a41 100644 --- a/storage/csv/ha_tina.h +++ b/storage/csv/ha_tina.h @@ -104,7 +104,10 @@ public: */ ha_rows estimate_rows_upper_bound() { return HA_POS_ERROR; } - virtual bool check_if_locking_is_allowed(THD *thd, TABLE *table, uint count); + virtual bool check_if_locking_is_allowed(uint sql_command, + ulong type, TABLE *table, + uint count, + bool called_by_logger_thread); int open(const char *name, int mode, uint test_if_locked); int close(void); int write_row(byte * buf);