summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorsasha@mysql.sashanet.com <>2001-08-11 15:27:10 -0600
committersasha@mysql.sashanet.com <>2001-08-11 15:27:10 -0600
commit5b7da4267e306af39aa0291a8e0d5685e9ed44cf (patch)
treee96bafef55caa5d0629b7458f3e7443b77511e04 /sql
parentbfbc3252e18a17c12fa48a12f01a0223aed123af (diff)
parentbe4f7bbdcf89e5fa2a9e8193cda1d317918d7d07 (diff)
downloadmariadb-git-5b7da4267e306af39aa0291a8e0d5685e9ed44cf.tar.gz
Merge work:/home/bk/mysql
into mysql.sashanet.com:/home/sasha/src/bk/mysql
Diffstat (limited to 'sql')
-rw-r--r--sql/Makefile.am4
-rw-r--r--sql/log_event.cc31
-rw-r--r--sql/log_event.h4
-rw-r--r--sql/mysqlbinlog.cc473
4 files changed, 24 insertions, 488 deletions
diff --git a/sql/Makefile.am b/sql/Makefile.am
index 28484f09b3d..f1941e1e25c 100644
--- a/sql/Makefile.am
+++ b/sql/Makefile.am
@@ -27,7 +27,6 @@ INCLUDES = @MT_INCLUDES@ \
-I$(srcdir) -I../include -I.. -I.
WRAPLIBS= @WRAPLIBS@
SUBDIRS = share
-bin_PROGRAMS = mysqlbinlog
libexec_PROGRAMS = mysqld
noinst_PROGRAMS = gen_lex_hash
gen_lex_hash_LDFLAGS = @NOINST_LDFLAGS@
@@ -83,9 +82,6 @@ mysqld_SOURCES = sql_lex.cc \
md5.c stacktrace.c
gen_lex_hash_SOURCES = gen_lex_hash.cc
gen_lex_hash_LDADD = $(LDADD) $(CXXLDFLAGS)
-mysqlbinlog_SOURCES = mysqlbinlog.cc mini_client.cc net_serv.cc \
- mini_client_errors.c violite.c password.c
-mysqlbinlog_LDADD = $(LDADD) $(CXXLDFLAGS) # $(mysqld_LDADD)
DEFS = -DMYSQL_SERVER \
-DDEFAULT_MYSQL_HOME="\"$(MYSQLBASEdir)\"" \
diff --git a/sql/log_event.cc b/sql/log_event.cc
index ac985c266c8..1263d361b7f 100644
--- a/sql/log_event.cc
+++ b/sql/log_event.cc
@@ -111,18 +111,29 @@ int Log_event::read_log_event(IO_CACHE* file, String* packet,
#endif // MYSQL_CLIENT
-// allocates memory - the caller is responsible for clean-up
+#ifndef MYSQL_CLIENT
+#define UNLOCK_MUTEX if(log_lock) pthread_mutex_unlock(log_lock);
+#else
+#define UNLOCK_MUTEX
+#endif
+// allocates memory - the caller is responsible for clean-up
+#ifndef MYSQL_CLIENT
Log_event* Log_event::read_log_event(IO_CACHE* file, pthread_mutex_t* log_lock)
+#else
+Log_event* Log_event::read_log_event(IO_CACHE* file)
+#endif
{
time_t timestamp;
uint32 server_id;
char buf[LOG_EVENT_HEADER_LEN-4];
+#ifndef MYSQL_CLIENT
if(log_lock) pthread_mutex_lock(log_lock);
+#endif
if (my_b_read(file, (byte *) buf, sizeof(buf)))
{
- if (log_lock) pthread_mutex_unlock(log_lock);
+ UNLOCK_MUTEX
return NULL;
}
timestamp = uint4korr(buf);
@@ -133,7 +144,7 @@ Log_event* Log_event::read_log_event(IO_CACHE* file, pthread_mutex_t* log_lock)
case QUERY_EVENT:
{
Query_log_event* q = new Query_log_event(file, timestamp, server_id);
- if(log_lock) pthread_mutex_unlock(log_lock);
+ UNLOCK_MUTEX
if (!q->query)
{
delete q;
@@ -145,7 +156,7 @@ Log_event* Log_event::read_log_event(IO_CACHE* file, pthread_mutex_t* log_lock)
case LOAD_EVENT:
{
Load_log_event* l = new Load_log_event(file, timestamp, server_id);
- if(log_lock) pthread_mutex_unlock(log_lock);
+ UNLOCK_MUTEX
if (!l->table_name)
{
delete l;
@@ -158,8 +169,7 @@ Log_event* Log_event::read_log_event(IO_CACHE* file, pthread_mutex_t* log_lock)
case ROTATE_EVENT:
{
Rotate_log_event* r = new Rotate_log_event(file, timestamp, server_id);
- if(log_lock) pthread_mutex_unlock(log_lock);
-
+ UNLOCK_MUTEX
if (!r->new_log_ident)
{
delete r;
@@ -171,8 +181,7 @@ Log_event* Log_event::read_log_event(IO_CACHE* file, pthread_mutex_t* log_lock)
case INTVAR_EVENT:
{
Intvar_log_event* e = new Intvar_log_event(file, timestamp, server_id);
- if(log_lock) pthread_mutex_unlock(log_lock);
-
+ UNLOCK_MUTEX
if (e->type == INVALID_INT_EVENT)
{
delete e;
@@ -184,13 +193,13 @@ Log_event* Log_event::read_log_event(IO_CACHE* file, pthread_mutex_t* log_lock)
case START_EVENT:
{
Start_log_event* e = new Start_log_event(file, timestamp, server_id);
- if(log_lock) pthread_mutex_unlock(log_lock);
+ UNLOCK_MUTEX
return e;
}
case STOP_EVENT:
{
Stop_log_event* e = new Stop_log_event(file, timestamp, server_id);
- if(log_lock) pthread_mutex_unlock(log_lock);
+ UNLOCK_MUTEX
return e;
}
default:
@@ -198,7 +207,7 @@ Log_event* Log_event::read_log_event(IO_CACHE* file, pthread_mutex_t* log_lock)
}
// default
- if (log_lock) pthread_mutex_unlock(log_lock);
+ UNLOCK_MUTEX
return NULL;
}
diff --git a/sql/log_event.h b/sql/log_event.h
index 8d8ac183f61..94f7cce0e35 100644
--- a/sql/log_event.h
+++ b/sql/log_event.h
@@ -105,8 +105,12 @@ public:
void print_timestamp(FILE* file, time_t *ts = 0);
void print_header(FILE* file);
+#ifndef MYSQL_CLIENT
// if mutex is 0, the read will proceed without mutex
static Log_event* read_log_event(IO_CACHE* file, pthread_mutex_t* log_lock);
+#else // avoid having to link mysqlbinlog against libpthread
+ static Log_event* read_log_event(IO_CACHE* file);
+#endif
static Log_event* read_log_event(const char* buf, int event_len);
#ifndef MYSQL_CLIENT
diff --git a/sql/mysqlbinlog.cc b/sql/mysqlbinlog.cc
deleted file mode 100644
index 637115fe2f4..00000000000
--- a/sql/mysqlbinlog.cc
+++ /dev/null
@@ -1,473 +0,0 @@
-/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-
-
-#define MYSQL_CLIENT
-#undef MYSQL_SERVER
-#include <global.h>
-#include <m_string.h>
-#include <my_sys.h>
-#include <getopt.h>
-#include <thr_alarm.h>
-#define MYSQL_SERVER // We want the C++ version of net
-#include <mysql.h>
-#include "log_event.h"
-#include "mini_client.h"
-
-#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_LOCAL_FILES)
-
-char server_version[SERVER_VERSION_LENGTH];
-uint32 server_id = 0;
-
-// needed by net_serv.c
-ulong bytes_sent = 0L, bytes_received = 0L;
-ulong mysqld_net_retry_count = 10L;
-ulong net_read_timeout= NET_READ_TIMEOUT;
-ulong net_write_timeout= NET_WRITE_TIMEOUT;
-uint test_flags = 0;
-FILE *result_file;
-
-#ifndef DBUG_OFF
-static const char* default_dbug_option = "d:t:o,/tmp/mysqlbinlog.trace";
-#endif
-
-static struct option long_options[] =
-{
-#ifndef DBUG_OFF
- {"debug", optional_argument, 0, '#'},
-#endif
- {"help", no_argument, 0, '?'},
- {"host", required_argument, 0, 'h'},
- {"offset", required_argument, 0, 'o'},
- {"password", required_argument, 0, 'p'},
- {"port", required_argument, 0, 'P'},
- {"position", required_argument, 0, 'j'},
- {"result-file", required_argument, 0, 'r'},
- {"short-form", no_argument, 0, 's'},
- {"table", required_argument, 0, 't'},
- {"user", required_argument, 0, 'u'},
- {"version", no_argument, 0, 'V'},
-};
-
-void sql_print_error(const char *format,...);
-
-static bool short_form = 0;
-static ulonglong offset = 0;
-static const char* host = "localhost";
-static int port = MYSQL_PORT;
-static const char* user = "test";
-static const char* pass = "";
-static ulonglong position = 0;
-static bool use_remote = 0;
-static short binlog_flags = 0;
-static MYSQL* mysql = NULL;
-static const char* table = 0;
-
-static void dump_local_log_entries(const char* logname);
-static void dump_remote_log_entries(const char* logname);
-static void dump_log_entries(const char* logname);
-static void dump_remote_file(NET* net, const char* fname);
-static void dump_remote_table(NET* net, const char* db, const char* table);
-static void die(const char* fmt, ...);
-static MYSQL* safe_connect();
-
-
-void sql_print_error(const char *format,...)
-{
- va_list args;
- va_start(args, format);
- fprintf(stderr, "ERROR: ");
- vfprintf(stderr, format, args);
- fprintf(stderr, "\n");
- va_end(args);
-}
-
-static void die(const char* fmt, ...)
-{
- va_list args;
- va_start(args, fmt);
- fprintf(stderr, "ERROR: ");
- vfprintf(stderr, fmt, args);
- fprintf(stderr, "\n");
- va_end(args);
- exit(1);
-}
-
-static void print_version()
-{
- printf("%s Ver 1.5 for %s at %s\n",my_progname,SYSTEM_TYPE, MACHINE_TYPE);
-}
-
-
-static void usage()
-{
- print_version();
- puts("By Sasha, for your professional use\n\
-This software comes with NO WARRANTY: see the file PUBLIC for details\n");
-
- printf("\
-Dumps a MySQL binary log in a format usable for viewing or for pipeing to\n\
-the mysql command line client\n\n");
- printf("Usage: %s [options] log-files\n",my_progname);
- puts("Options:");
-#ifndef DBUG_OFF
- printf("-#, --debug[=...] Output debug log. (%s)\n",
- default_dbug_option);
-#endif
- printf("\
--?, --help Display this help and exit\n\
--s, --short-form Just show the queries, no extra info\n\
--o, --offset=N Skip the first N entries\n\
--h, --host=server Get the binlog from server\n\
--P, --port=port Use port to connect to the remote server\n\
--u, --user=username Connect to the remote server as username\n\
--p, --password=password Password to connect to remote server\n\
--r, --result-file=file Direct output to a given file\n\
--j, --position=N Start reading the binlog at position N\n\
--t, --table=name Get raw table dump using COM_TABLE_DUMB\n\
--V, --version Print version and exit.\n\
-");
-}
-
-static void dump_remote_file(NET* net, const char* fname)
-{
- char buf[FN_REFLEN+1];
- uint len = (uint) strlen(fname);
- buf[0] = 0;
- memcpy(buf + 1, fname, len + 1);
- if(my_net_write(net, buf, len +2) || net_flush(net))
- die("Failed requesting the remote dump of %s", fname);
- for(;;)
- {
- uint packet_len = my_net_read(net);
- if(packet_len == 0)
- {
- if(my_net_write(net, "", 0) || net_flush(net))
- die("Failed sending the ack packet");
-
- // we just need to send something, as the server will read but
- // not examine the packet - this is because mysql_load() sends an OK when it is done
- break;
- }
- else if(packet_len == packet_error)
- die("Failed reading a packet during the dump of %s ", fname);
-
- if(!short_form)
- (void)my_fwrite(result_file, (byte*) net->read_pos, packet_len,MYF(0));
- }
-
- fflush(result_file);
-}
-
-static int parse_args(int *argc, char*** argv)
-{
- int c, opt_index = 0;
-
- result_file = stdout;
- while((c = getopt_long(*argc, *argv, "so:#::h:j:u:p:P:r:t:?V", long_options,
- &opt_index)) != EOF)
- {
- switch(c)
- {
-#ifndef DBUG_OFF
- case '#':
- DBUG_PUSH(optarg ? optarg : default_dbug_option);
- break;
-#endif
- case 's':
- short_form = 1;
- break;
-
- case 'o':
- offset = strtoull(optarg,(char**) 0, 10);
- break;
-
- case 'j':
- position = strtoull(optarg,(char**) 0, 10);
- break;
-
- case 'h':
- use_remote = 1;
- host = my_strdup(optarg, MYF(0));
- break;
-
- case 'P':
- use_remote = 1;
- port = atoi(optarg);
- break;
-
- case 'p':
- use_remote = 1;
- pass = my_strdup(optarg, MYF(0));
- break;
-
- case 'r':
- if (!(result_file = my_fopen(optarg, O_WRONLY | O_BINARY, MYF(MY_WME))))
- exit(1);
- break;
-
- case 'u':
- use_remote = 1;
- user = my_strdup(optarg, MYF(0));
- break;
-
- case 't':
- table = my_strdup(optarg, MYF(0));
- break;
-
- case 'V':
- print_version();
- exit(0);
-
- case '?':
- default:
- usage();
- exit(0);
-
- }
- }
-
- (*argc)-=optind;
- (*argv)+=optind;
-
- return 0;
-}
-
-static MYSQL* safe_connect()
-{
- MYSQL *local_mysql = mc_mysql_init(NULL);
- if(!local_mysql)
- die("Failed on mc_mysql_init");
-
- if(!mc_mysql_connect(local_mysql, host, user, pass, 0, port, 0, 0))
- die("failed on connect: %s", mc_mysql_error(local_mysql));
-
- return local_mysql;
-}
-
-static void dump_log_entries(const char* logname)
-{
- if(use_remote)
- dump_remote_log_entries(logname);
- else
- dump_local_log_entries(logname);
-}
-
-static void dump_remote_table(NET* net, const char* db, const char* table)
-{
- char buf[1024];
- char * p = buf;
- uint table_len = (uint) strlen(table);
- uint db_len = (uint) strlen(db);
- if(table_len + db_len > sizeof(buf) - 2)
- die("Buffer overrun");
-
- *p++ = db_len;
- memcpy(p, db, db_len);
- p += db_len;
- *p++ = table_len;
- memcpy(p, table, table_len);
-
- if(mc_simple_command(mysql, COM_TABLE_DUMP, buf, p - buf + table_len, 1))
- die("Error sending the table dump command");
-
- for(;;)
- {
- uint packet_len = my_net_read(net);
- if(packet_len == 0) break; // end of file
- if(packet_len == packet_error)
- die("Error reading packet in table dump");
- my_fwrite(result_file, (byte*)net->read_pos, packet_len, MYF(MY_WME));
- fflush(result_file);
- }
-}
-
-
-static void dump_remote_log_entries(const char* logname)
-{
- char buf[128];
- char last_db[FN_REFLEN+1] = "";
- uint len;
- NET* net = &mysql->net;
- if(!position) position = 4; // protect the innocent from spam
- if (position < 4)
- {
- position = 4;
- // warn the guity
- sql_print_error("Warning: The position in the binary log can't be less than 4.\nStarting from position 4\n");
- }
- int4store(buf, position);
- int2store(buf + 4, binlog_flags);
- len = (uint) strlen(logname);
- int4store(buf + 6, 0);
- memcpy(buf + 10, logname,len);
- if(mc_simple_command(mysql, COM_BINLOG_DUMP, buf, len + 10, 1))
- die("Error sending the log dump command");
-
- for(;;)
- {
- len = mc_net_safe_read(mysql);
- if (len == packet_error)
- die("Error reading packet from server: %s", mc_mysql_error(mysql));
- if(len == 1 && net->read_pos[0] == 254)
- break; // end of data
- DBUG_PRINT("info",( "len= %u, net->read_pos[5] = %d\n",
- len, net->read_pos[5]));
- Log_event * ev = Log_event::read_log_event(
- (const char*) net->read_pos + 1 ,
- len - 1);
- if(ev)
- {
- ev->print(result_file, short_form, last_db);
- if(ev->get_type_code() == LOAD_EVENT)
- dump_remote_file(net, ((Load_log_event*)ev)->fname);
- delete ev;
- }
- else
- die("Could not construct log event object");
- }
-}
-
-static void dump_local_log_entries(const char* logname)
-{
- File fd = -1;
- IO_CACHE cache,*file= &cache;
- ulonglong rec_count = 0;
- char last_db[FN_REFLEN+1] = "";
-
- if (logname && logname[0] != '-')
- {
- if ((fd = my_open(logname, O_RDONLY | O_BINARY, MYF(MY_WME))) < 0)
- exit(1);
- if (init_io_cache(file, fd, 0, READ_CACHE, (my_off_t) position, 0,
- MYF(MY_WME | MY_NABP)))
- exit(1);
- }
- else
- {
- if (init_io_cache(file, fileno(result_file), 0, READ_CACHE, (my_off_t) 0,
- 0, MYF(MY_WME | MY_NABP | MY_DONT_CHECK_FILESIZE)))
- exit(1);
- if (position)
- {
- /* skip 'position' characters from stdout */
- byte buff[IO_SIZE];
- my_off_t length,tmp;
- for (length= (my_off_t) position ; length > 0 ; length-=tmp)
- {
- tmp=min(length,sizeof(buff));
- if (my_b_read(file,buff, (uint) tmp))
- exit(1);
- }
- }
- file->pos_in_file=position;
- file->seek_not_done=0;
- }
-
- if (!position)
- {
- char magic[4];
- if (my_b_read(file, (byte*) magic, sizeof(magic)))
- die("I/O error reading binlog magic number");
- if(memcmp(magic, BINLOG_MAGIC, 4))
- die("Bad magic number; The file is probably not a MySQL binary log");
- }
-
- for (;;)
- {
- char llbuff[21];
- my_off_t old_off = my_b_tell(file);
-
- Log_event* ev = Log_event::read_log_event(file, 0);
- if (!ev)
- {
- if (file->error)
- die("\
-Could not read entry at offset %s : Error in log format or read error",
- llstr(old_off,llbuff));
- // file->error == 0 means EOF, that's OK, we break in this case
- break;
- }
- if (rec_count >= offset)
- {
- if (!short_form)
- fprintf(result_file, "# at %s\n",llstr(old_off,llbuff));
-
- ev->print(result_file, short_form, last_db);
- }
- rec_count++;
- delete ev;
- }
- if(fd >= 0)
- my_close(fd, MYF(MY_WME));
- end_io_cache(file);
-}
-
-
-int main(int argc, char** argv)
-{
- MY_INIT(argv[0]);
- parse_args(&argc, (char***)&argv);
-
- if(!argc && !table)
- {
- usage();
- return -1;
- }
-
- if(use_remote)
- {
-#ifndef __WIN__
- init_thr_alarm(10); // need to do this manually
-#endif
- mysql = safe_connect();
- }
-
- if (table)
- {
- if(!use_remote)
- die("You must specify connection parameter to get table dump");
- char* db = (char*)table;
- char* tbl = (char*) strchr(table, '.');
- if(!tbl)
- die("You must use database.table syntax to specify the table");
- *tbl++ = 0;
- dump_remote_table(&mysql->net, db, tbl);
- }
- else
- {
- while(--argc >= 0)
- {
- dump_log_entries(*(argv++));
- }
- }
- if (result_file != stdout)
- my_fclose(result_file, MYF(0));
- if (use_remote)
- mc_mysql_close(mysql);
- return 0;
-}
-
-/*
- We must include this here as it's compiled with different options for
- the server
-*/
-
-#ifdef __WIN__
-#include "log_event.cpp"
-#else
-#include "log_event.cc"
-#endif