Merge hundin:/my/mysql-4.0 into bitch.mysql.fi:/my/mysql-4.0
13
BUILD/compile-ia64-debug-max
Executable file
|
@ -0,0 +1,13 @@
|
|||
gmake -k clean || true
|
||||
/bin/rm -f */.deps/*.P config.cache
|
||||
|
||||
aclocal && autoheader && aclocal && automake && autoconf
|
||||
(cd bdb/dist && sh s_all)
|
||||
(cd innobase && aclocal && autoheader && aclocal && automake && autoconf)
|
||||
if [ -d gemini ]
|
||||
then
|
||||
(cd gemini && aclocal && autoheader && aclocal && automake && autoconf)
|
||||
fi
|
||||
|
||||
CC=ecc CFLAGS="-w1 -DEXTRA_DEBUG -DSAFEMALLOC -DSAFE_MUTEX -O2" CXX=ecc CXXFLAGS="-w1 -DEXTRA_DEBUG -DSAFEMALLOC -DSAFE_MUTEX -O2" ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex --enable-thread-safe-client --with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static --with-debug --with-innodb --with-embedded-server
|
||||
gmake
|
|
@ -8,6 +8,6 @@ extra_configs="$pentium_configs"
|
|||
strip=yes
|
||||
|
||||
extra_configs="$extra_configs --with-innodb --with-berkeley-db \
|
||||
--enable-thread-safe-client"
|
||||
--enable-thread-safe-client --with-openssl --with-vio"
|
||||
|
||||
. "$path/FINISH.sh"
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
Administrator@fred.
|
||||
Miguel@light.local
|
||||
Sinisa@sinisa.nasamreza.org
|
||||
davida@isil.mysql.com
|
||||
|
|
|
@ -4,10 +4,10 @@ use Getopt::Long;
|
|||
$opt_distribution=$opt_user=$opt_result=$opt_config_options=$opt_config_env="";
|
||||
$opt_dbd_options=$opt_perl_options=$opt_suffix="";
|
||||
$opt_tmp=$version_suffix="";
|
||||
$opt_help=$opt_Information=$opt_no_delete=$opt_delete=$opt_debug=$opt_stage=$opt_rsh_mail=$opt_no_test=$opt_no_perl=$opt_with_low_memory=$opt_fast_benchmark=$opt_static_client=$opt_static_server=$opt_static_perl=$opt_sur=$opt_with_small_disk=$opt_local_perl=$opt_tcpip=$opt_build_thread=$opt_no_mysqltest=$opt_use_old_distribution=$opt_enable_shared=$opt_no_crash_me=$opt_no_strip=0;
|
||||
$opt_help=$opt_Information=$opt_delete=$opt_debug=$opt_stage=$opt_rsh_mail=$opt_no_test=$opt_no_perl=$opt_with_low_memory=$opt_fast_benchmark=$opt_static_client=$opt_static_server=$opt_static_perl=$opt_sur=$opt_with_small_disk=$opt_local_perl=$opt_tcpip=$opt_build_thread=$opt_no_mysqltest=$opt_use_old_distribution=$opt_enable_shared=$opt_no_crash_me=$opt_no_strip=0;
|
||||
$opt_innodb=$opt_bdb=0;
|
||||
|
||||
GetOptions("Information","help","distribution=s","user=s","result=s","no-delete","delete","no-test","no-mysqltest","perl-files=s","debug","config-options=s","config-env=s","stage=i","rsh-mail","with-low-memory","fast-benchmark","tmp=s","static-client","static-server","static-perl","no-perl","local-perl","perl-options=s","sur","with-small-disk","dbd-options=s","tcpip","suffix=s","build-thread=i","innodb","bdb","use-old-distribution","enable-shared","no-crash-me","no-strip") || usage();
|
||||
GetOptions("Information","help","distribution=s","user=s","result=s","delete","no-test","no-mysqltest","perl-files=s","debug","config-options=s","config-env=s","stage=i","rsh-mail","with-low-memory","fast-benchmark","tmp=s","static-client","static-server","static-perl","no-perl","local-perl","perl-options=s","sur","with-small-disk","dbd-options=s","tcpip","suffix=s","build-thread=i","innodb","bdb","use-old-distribution","enable-shared","no-crash-me","no-strip") || usage();
|
||||
|
||||
usage() if ($opt_help || $opt_Information);
|
||||
usage() if (!$opt_distribution);
|
||||
|
@ -105,14 +105,31 @@ $|=1;
|
|||
safe_cd("$host");
|
||||
if ($opt_stage == 0 && ! $opt_use_old_distribution)
|
||||
{
|
||||
my ($name);
|
||||
safe_system("gunzip < $opt_distribution | $tar xf -");
|
||||
|
||||
# Fix file times; This is needed because the time for files may be
|
||||
# in the future
|
||||
system("touch timestamp; find $var -newer timestamp -print | xargs touch; rm -f timestamp");
|
||||
sleep(2);
|
||||
# Ensure that files we don't want to rebuild are newer than other files
|
||||
foreach $name ("configure",
|
||||
"Docs/include.texi",
|
||||
"Docs/*.html", "Docs/manual.txt", "Docs/mysql.info",
|
||||
"sql/sql_yacc.h", "sql/sql_yacc.cc")
|
||||
{
|
||||
system("touch $name");
|
||||
}
|
||||
}
|
||||
|
||||
safe_cd($ver);
|
||||
if ($opt_stage <= 1)
|
||||
{
|
||||
$opt_config_options.=" --with-low-memory" if ($opt_with_low_memory);
|
||||
# Fix files if this is in another timezone than work.mysql.com
|
||||
unlink("config.cache");
|
||||
unlink("bdb/build_unix/config.cache");
|
||||
unlink("innobase/config.cache");
|
||||
log_system("$make clean") if ($opt_use_old_distribution);
|
||||
if ($opt_static_server)
|
||||
{
|
||||
|
@ -143,7 +160,7 @@ if ($opt_stage <= 1)
|
|||
|
||||
if ($opt_stage <= 2)
|
||||
{
|
||||
unlink($opt_distribution) if (!$opt_delete && !$opt_use_old_distribution);
|
||||
unlink($opt_distribution) if ($opt_delete && !$opt_use_old_distribution);
|
||||
safe_system("$make");
|
||||
}
|
||||
|
||||
|
|
|
@ -210,7 +210,7 @@ if [ $? != 0 ]; then
|
|||
tail $log
|
||||
fi
|
||||
|
||||
if [ ! x$local_build=x1 ]; then
|
||||
if [ x$local_build != x1 ]; then
|
||||
|
||||
# Build perl RPM (we currently need to be root to do this and that is
|
||||
# not possible)
|
||||
|
@ -228,5 +228,3 @@ if [ ! x$local_build=x1 ]; then
|
|||
#scp $owner@$bmachine:$rpmdir/SRPMS/Perl*-*.rpm $bpath/NEW-RPMS
|
||||
fi
|
||||
) > $log 2>&1
|
||||
|
||||
|
||||
|
|
0
Docs/Flags/belgium.gif
Executable file → Normal file
Before Width: | Height: | Size: 181 B After Width: | Height: | Size: 181 B |
BIN
Docs/Flags/mexico.eps
Executable file → Normal file
0
Docs/Flags/mexico.gif
Executable file → Normal file
Before Width: | Height: | Size: 269 B After Width: | Height: | Size: 269 B |
BIN
Docs/Flags/philippines.eps
Executable file → Normal file
0
Docs/Flags/philippines.gif
Executable file → Normal file
Before Width: | Height: | Size: 306 B After Width: | Height: | Size: 306 B |
0
Docs/Flags/turkey.gif
Executable file → Normal file
Before Width: | Height: | Size: 169 B After Width: | Height: | Size: 169 B |
|
@ -3187,7 +3187,7 @@ encounter per year, but we are as always very flexible towards our customers!
|
|||
@c @image{Flags/estonia} Estonia [Tradenet] @
|
||||
@c @uref{http://mysql.tradenet.ee, WWW}
|
||||
@item
|
||||
@c EMAIL: tonu@spamm.ee (Tonu Samuel)
|
||||
@c EMAIL: tonu@spam.ee (Tonu Samuel)
|
||||
@image{Flags/estonia} Estonia [OKinteractive] @
|
||||
@uref{http://mysql.mirror.ok.ee, WWW}
|
||||
@item
|
||||
|
|
1354
Docs/manual.texi
21
acinclude.m4
|
@ -663,7 +663,7 @@ if test "$cpu_vendor" = "AuthenticAMD"; then
|
|||
fi
|
||||
elif test "$cpu_vendor" = "GenuineIntel"; then
|
||||
if test $cpu_family>=6; then
|
||||
cpu_set=" pentiumpro pentium i486 i386";
|
||||
cpu_set="pentiumpro pentium i486 i386";
|
||||
elif test $cpu_family=5; then
|
||||
cpu_set="pentium i486 i386";
|
||||
elif test $cpu_family=4; then
|
||||
|
@ -682,15 +682,15 @@ done
|
|||
if test "$mysql_cv_cpu" = "unknown"
|
||||
then
|
||||
CFLAGS="$ac_save_CFLAGS"
|
||||
AC_MSG_RESULT(none)
|
||||
AC_MSG_RESULT(none)
|
||||
else
|
||||
AC_MSG_RESULT($mysql_cv_cpu)
|
||||
AC_MSG_RESULT($mysql_cv_cpu)
|
||||
fi
|
||||
]))
|
||||
|
||||
AC_DEFUN(MYSQL_CHECK_VIO, [
|
||||
AC_ARG_WITH([vio],
|
||||
[ --with-vio Include the Virtual IO support],
|
||||
[ --with-vio Include the Virtual IO support],
|
||||
[vio="$withval"],
|
||||
[vio=no])
|
||||
|
||||
|
@ -726,7 +726,7 @@ AC_MSG_CHECKING(for OpenSSL)
|
|||
openssl_includes="-I/usr/local/ssl/include"
|
||||
AC_DEFINE(HAVE_OPENSSL)
|
||||
else
|
||||
AC_MSG_RESULT(disabled because --with-vio wasn not used)
|
||||
AC_MSG_RESULT(disabled because --with-vio was not used)
|
||||
fi
|
||||
else
|
||||
AC_MSG_RESULT(no)
|
||||
|
@ -767,7 +767,8 @@ dnl get substituted.
|
|||
|
||||
AC_DEFUN(MYSQL_CHECK_ORBIT, [
|
||||
AC_MSG_CHECKING(for ORBit)
|
||||
if test `which orbit-config`
|
||||
orbit_config_path=`which orbit-config`
|
||||
if test -n "$orbit_config_path"
|
||||
then
|
||||
orbit_exec_prefix=`orbit-config --exec-prefix`
|
||||
orbit_includes=`orbit-config --cflags server`
|
||||
|
@ -1054,9 +1055,9 @@ dnl ---------------------------------------------------------------------------
|
|||
AC_DEFUN([MYSQL_CHECK_INNODB], [
|
||||
AC_ARG_WITH([innodb],
|
||||
[\
|
||||
--with-innodb Use Innodb],
|
||||
--without-innodb Do not include the InnoDB table handler],
|
||||
[innodb="$withval"],
|
||||
[innodb=no])
|
||||
[innodb=yes])
|
||||
|
||||
AC_MSG_CHECKING([for Innodb])
|
||||
|
||||
|
@ -1132,7 +1133,7 @@ dnl ---------------------------------------------------------------------------
|
|||
AC_DEFUN([MYSQL_CHECK_GEMINI], [
|
||||
AC_ARG_WITH([gemini],
|
||||
[\
|
||||
--with-gemini[=DIR] Use Gemini DB located in DIR],
|
||||
--with-gemini[=DIR] Use Gemini DB located in DIR],
|
||||
[gemini="$withval"],
|
||||
[gemini=no])
|
||||
|
||||
|
@ -1251,7 +1252,7 @@ changequote([, ])dnl
|
|||
AC_DEFUN(AC_SYS_LARGEFILE,
|
||||
[AC_REQUIRE([AC_CANONICAL_HOST])
|
||||
AC_ARG_ENABLE(largefile,
|
||||
[ --disable-largefile Omit support for large files])
|
||||
[ --disable-largefile Omit support for large files])
|
||||
if test "$enable_largefile" != no; then
|
||||
AC_CHECK_TOOL(GETCONF, getconf)
|
||||
AC_SYS_LARGEFILE_FLAGS(CFLAGS)
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
* Jani Tolonen <jani@mysql.com>
|
||||
* Matt Wagner <mwagner@mysql.com>
|
||||
* Jeremy Cole <jcole@mysql.com>
|
||||
* Tonu Samuel <tonu@mysql.com>
|
||||
*
|
||||
**/
|
||||
|
||||
|
@ -74,7 +75,6 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
#undef bcmp // Fix problem with new readline
|
||||
#undef bzero
|
||||
#if defined( __WIN__) || defined(OS2)
|
||||
#include <conio.h>
|
||||
#else
|
||||
|
@ -243,7 +243,8 @@ static COMMANDS commands[] = {
|
|||
};
|
||||
|
||||
static const char *load_default_groups[]= { "mysql","client",0 };
|
||||
static const char *server_default_groups[]= { "server", "mysql_SERVER", 0 };
|
||||
static const char *server_default_groups[]=
|
||||
{ "server", "embedded", "mysql_SERVER", 0 };
|
||||
|
||||
#ifdef HAVE_READLINE
|
||||
extern "C" void add_history(char *command); /* From readline directory */
|
||||
|
@ -271,7 +272,6 @@ int main(int argc,char *argv[])
|
|||
{
|
||||
char buff[80];
|
||||
|
||||
mysql_server_init(0, NULL, server_default_groups);
|
||||
MY_INIT(argv[0]);
|
||||
DBUG_ENTER("main");
|
||||
DBUG_PROCESS(argv[0]);
|
||||
|
@ -302,6 +302,7 @@ int main(int argc,char *argv[])
|
|||
!(status.line_buff=batch_readline_init(max_allowed_packet+512,stdin)))
|
||||
exit(1);
|
||||
glob_buffer.realloc(512);
|
||||
mysql_server_init(0, NULL, server_default_groups);
|
||||
completion_hash_init(&ht,50);
|
||||
bzero((char*) &mysql, sizeof(mysql));
|
||||
if (sql_connect(current_host,current_db,current_user,opt_password,
|
||||
|
@ -368,7 +369,6 @@ int main(int argc,char *argv[])
|
|||
if (opt_outfile)
|
||||
end_tee();
|
||||
mysql_end(0);
|
||||
mysql_server_end();
|
||||
#ifndef _lint
|
||||
DBUG_RETURN(0); // Keep compiler happy
|
||||
#endif
|
||||
|
@ -398,6 +398,7 @@ sig_handler mysql_end(int sig)
|
|||
my_free(current_db,MYF(MY_ALLOW_ZERO_PTR));
|
||||
my_free(current_host,MYF(MY_ALLOW_ZERO_PTR));
|
||||
my_free(current_user,MYF(MY_ALLOW_ZERO_PTR));
|
||||
mysql_server_end();
|
||||
my_end(info_flag ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
|
||||
exit(status.exit_status);
|
||||
}
|
||||
|
@ -967,7 +968,7 @@ static bool add_line(String &buffer,char *line,char *in_string)
|
|||
{ // mSQL or postgreSQL style command ?
|
||||
if (!(inchar = (uchar) *++pos))
|
||||
break; // readline adds one '\'
|
||||
if (*in_string || inchar == 'N')
|
||||
if (*in_string || inchar == 'N') // \N is short for NULL
|
||||
{ // Don't allow commands in string
|
||||
*out++='\\';
|
||||
*out++= (char) inchar;
|
||||
|
@ -1232,6 +1233,7 @@ You can turn off this feature to get a quicker startup with -A\n\n");
|
|||
}
|
||||
}
|
||||
}
|
||||
/* FIXME: free() on small chunks is sloooowwww. glibc bug */
|
||||
if (field_names) {
|
||||
for (i=0; field_names[i]; i++) {
|
||||
for (j=0; field_names[i][j]; j++) {
|
||||
|
@ -2219,7 +2221,7 @@ sql_real_connect(char *host,char *database,char *user,char *password,
|
|||
#ifdef HAVE_OPENSSL
|
||||
if (opt_use_ssl)
|
||||
mysql_ssl_set(&mysql, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
|
||||
opt_ssl_capath);
|
||||
opt_ssl_capath, opt_ssl_cipher);
|
||||
#endif
|
||||
if (safe_updates)
|
||||
{
|
||||
|
|
|
@ -265,7 +265,7 @@ int main(int argc,char *argv[])
|
|||
#ifdef HAVE_OPENSSL
|
||||
if (opt_use_ssl)
|
||||
mysql_ssl_set(&mysql, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
|
||||
opt_ssl_capath);
|
||||
opt_ssl_capath, opt_ssl_cipher);
|
||||
#endif /* HAVE_OPENSSL */
|
||||
if (sql_connect(&mysql,host,user,opt_password,option_wait))
|
||||
error = 1;
|
||||
|
|
|
@ -23,15 +23,6 @@
|
|||
|
||||
#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_LOCAL_FILES)
|
||||
|
||||
#ifndef OS2
|
||||
extern "C"
|
||||
{
|
||||
int simple_command(MYSQL *mysql,enum enum_server_command command,
|
||||
const char *arg, uint length, my_bool skipp_check);
|
||||
uint net_safe_read(MYSQL* mysql);
|
||||
}
|
||||
#endif
|
||||
|
||||
char server_version[SERVER_VERSION_LENGTH];
|
||||
uint32 server_id = 0;
|
||||
|
||||
|
|
|
@ -591,7 +591,7 @@ static int dbConnect(char *host, char *user, char *passwd)
|
|||
#ifdef HAVE_OPENSSL
|
||||
if (opt_use_ssl)
|
||||
mysql_ssl_set(&mysql_connection, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
|
||||
opt_ssl_capath);
|
||||
opt_ssl_capath, opt_ssl_cipher);
|
||||
#endif
|
||||
if (!(sock = mysql_real_connect(&mysql_connection, host, user, passwd,
|
||||
NULL, opt_mysql_port, opt_mysql_unix_port, 0)))
|
||||
|
|
|
@ -523,7 +523,7 @@ static int dbConnect(char *host, char *user,char *passwd)
|
|||
#ifdef HAVE_OPENSSL
|
||||
if (opt_use_ssl)
|
||||
mysql_ssl_set(&mysql_connection, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
|
||||
opt_ssl_capath);
|
||||
opt_ssl_capath, opt_ssl_cipher);
|
||||
#endif
|
||||
if (!(sock= mysql_real_connect(&mysql_connection,host,user,passwd,
|
||||
NULL,opt_mysql_port,opt_mysql_unix_port,
|
||||
|
|
|
@ -400,7 +400,7 @@ static MYSQL *db_connect(char *host, char *database, char *user, char *passwd)
|
|||
#ifdef HAVE_OPENSSL
|
||||
if (opt_use_ssl)
|
||||
mysql_ssl_set(&mysql_connection, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
|
||||
opt_ssl_capath);
|
||||
opt_ssl_capath, opt_ssl_cipher);
|
||||
#endif
|
||||
if (!(sock= mysql_real_connect(&mysql_connection,host,user,passwd,
|
||||
database,opt_mysql_port,opt_mysql_unix_port,
|
||||
|
|
|
@ -87,7 +87,7 @@ int main(int argc, char **argv)
|
|||
#ifdef HAVE_OPENSSL
|
||||
if (opt_use_ssl)
|
||||
mysql_ssl_set(&mysql, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
|
||||
opt_ssl_capath);
|
||||
opt_ssl_capath, opt_ssl_cipher);
|
||||
#endif
|
||||
if (!(mysql_real_connect(&mysql,host,user,opt_password,
|
||||
argv[0],opt_mysql_port,opt_mysql_unix_port,
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
|
||||
**********************************************************************/
|
||||
|
||||
#define MTEST_VERSION "1.10"
|
||||
#define MTEST_VERSION "1.11"
|
||||
|
||||
#include <my_global.h>
|
||||
#include <mysql_embed.h>
|
||||
|
@ -84,7 +84,7 @@
|
|||
static int record = 0, verbose = 0, silent = 0, opt_sleep=0;
|
||||
static char *db = 0, *pass=0;
|
||||
const char* user = 0, *host = 0, *unix_sock = 0;
|
||||
static int port = 0, opt_big_test=0;
|
||||
static int port = 0, opt_big_test=0, opt_compress=0;
|
||||
static uint start_lineno, *lineno;
|
||||
|
||||
static char **default_argv;
|
||||
|
@ -246,11 +246,11 @@ static uint out_length;
|
|||
static int eval_result = 0;
|
||||
|
||||
/* Disable functions that only exist in MySQL 4.0 */
|
||||
#if MYSQL_VERSION_ID < 40000
|
||||
static void mysql_enable_rpl_parse(MYSQL* mysql __attribute__((unused))) {}
|
||||
static void mysql_disable_rpl_parse(MYSQL* mysql __attribute__((unused))) {}
|
||||
static int mysql_rpl_parse_enabled(MYSQL* mysql __attribute__((unused))) { return 1; }
|
||||
static int mysql_rpl_probe(MYSQL *mysql __attribute__((unused))) { return 1; }
|
||||
#if MYSQL_VERSION_ID < 40000 || defined(EMBEDDED_LIBRARY)
|
||||
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; }
|
||||
int mysql_rpl_probe(MYSQL *mysql __attribute__((unused))) { return 1; }
|
||||
#endif
|
||||
|
||||
static void do_eval(DYNAMIC_STRING* query_eval, const char* query)
|
||||
|
@ -306,17 +306,18 @@ static void close_cons()
|
|||
|
||||
static void close_files()
|
||||
{
|
||||
do
|
||||
DBUG_ENTER("close_files");
|
||||
for (; cur_file != file_stack ; cur_file--)
|
||||
{
|
||||
if (*cur_file != stdin && *cur_file)
|
||||
my_fclose(*cur_file,MYF(0));
|
||||
} while (cur_file-- != file_stack);
|
||||
}
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
static void free_used_memory()
|
||||
{
|
||||
uint i;
|
||||
DBUG_ENTER("free_used_memory");
|
||||
close_cons();
|
||||
close_files();
|
||||
hash_free(&var_hash);
|
||||
|
@ -336,8 +337,8 @@ static void free_used_memory()
|
|||
dynstr_free(&ds_res);
|
||||
my_free(pass,MYF(MY_ALLOW_ZERO_PTR));
|
||||
free_defaults(default_argv);
|
||||
mysql_server_end();
|
||||
my_end(MY_CHECK_ERROR);
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
static void die(const char* fmt, ...)
|
||||
|
@ -1163,6 +1164,8 @@ int do_connect(struct st_query* q)
|
|||
|
||||
if (!mysql_init(&next_con->mysql))
|
||||
die("Failed on mysql_init()");
|
||||
if (opt_compress)
|
||||
mysql_options(&next_con->mysql,MYSQL_OPT_COMPRESS,NullS);
|
||||
if (con_sock)
|
||||
con_sock=fn_format(buff, con_sock, TMPDIR, "",0);
|
||||
if (!con_db[0])
|
||||
|
@ -1303,15 +1306,11 @@ int read_line(char* buf, int size)
|
|||
{
|
||||
if ((*cur_file) != stdin)
|
||||
my_fclose(*cur_file,MYF(0));
|
||||
|
||||
cur_file--;
|
||||
lineno--;
|
||||
if (cur_file == file_stack)
|
||||
return 1;
|
||||
else
|
||||
{
|
||||
cur_file--;
|
||||
lineno--;
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
switch(state) {
|
||||
|
@ -1506,6 +1505,7 @@ struct option long_options[] =
|
|||
{"debug", optional_argument, 0, '#'},
|
||||
{"database", required_argument, 0, 'D'},
|
||||
{"big-test", no_argument, 0, 'B'},
|
||||
{"compress", no_argument, 0, 'C'},
|
||||
{"help", no_argument, 0, '?'},
|
||||
{"host", required_argument, 0, 'h'},
|
||||
{"password", optional_argument, 0, 'p'},
|
||||
|
@ -1550,6 +1550,7 @@ void usage()
|
|||
-p[password], --password[=...]\n\
|
||||
Password to use when connecting to server.\n\
|
||||
-B, --big-test Define BIG_TEST to 1\n\
|
||||
-C, --compress Use the compressed server/client protocol\n\
|
||||
-D, --database=... Database to use.\n\
|
||||
-P, --port=... Port number to use for connection.\n\
|
||||
-S, --socket=... Socket file to use for connection.\n\
|
||||
|
@ -1572,8 +1573,8 @@ int parse_args(int argc, char **argv)
|
|||
load_defaults("my",load_default_groups,&argc,&argv);
|
||||
default_argv= argv;
|
||||
|
||||
while((c = getopt_long(argc, argv, "h:p::u:BP:D:S:R:x:t:T:#:?rvVq",
|
||||
long_options, &option_index)) != EOF)
|
||||
while ((c = getopt_long(argc, argv, "h:p::u:BCP:D:S:R:x:t:T:#:?rvVq",
|
||||
long_options, &option_index)) != EOF)
|
||||
{
|
||||
switch(c) {
|
||||
case '#':
|
||||
|
@ -1592,7 +1593,7 @@ int parse_args(int argc, char **argv)
|
|||
result_file = optarg;
|
||||
break;
|
||||
case 'x':
|
||||
if (!(*cur_file = my_fopen(optarg, O_RDONLY, MYF(MY_WME))))
|
||||
if (!(*++cur_file = my_fopen(optarg, O_RDONLY, MYF(MY_WME))))
|
||||
die("Could not open %s: errno = %d", optarg, errno);
|
||||
break;
|
||||
case 'p':
|
||||
|
@ -1608,6 +1609,9 @@ int parse_args(int argc, char **argv)
|
|||
case 'B':
|
||||
opt_big_test=1;
|
||||
break;
|
||||
case 'C':
|
||||
opt_compress=1;
|
||||
break;
|
||||
case 'P':
|
||||
port = atoi(optarg);
|
||||
break;
|
||||
|
@ -1949,9 +1953,10 @@ int main(int argc, char** argv)
|
|||
struct st_query* q;
|
||||
my_bool require_file=0, q_send_flag=0;
|
||||
char save_file[FN_REFLEN];
|
||||
mysql_server_init(sizeof(embedded_server_args) / sizeof(char *) - 1,
|
||||
embedded_server_args, embedded_server_groups);
|
||||
MY_INIT(argv[0]);
|
||||
{
|
||||
DBUG_ENTER("main");
|
||||
DBUG_PROCESS(argv[0]);
|
||||
|
||||
save_file[0]=0;
|
||||
TMPDIR[0]=0;
|
||||
|
@ -1976,13 +1981,18 @@ int main(int argc, char** argv)
|
|||
*block_ok = 1;
|
||||
init_dynamic_string(&ds_res, "", 0, 65536);
|
||||
parse_args(argc, argv);
|
||||
if (mysql_server_init(sizeof(embedded_server_args) / sizeof(char *) - 1,
|
||||
embedded_server_args, embedded_server_groups))
|
||||
die("Can't initialize MySQL server");
|
||||
init_var_hash();
|
||||
if (!*cur_file)
|
||||
*cur_file = stdin;
|
||||
if (cur_file == file_stack)
|
||||
*++cur_file = stdin;
|
||||
*lineno=1;
|
||||
|
||||
if (!( mysql_init(&cur_con->mysql)))
|
||||
die("Failed in mysql_init()");
|
||||
if (opt_compress)
|
||||
mysql_options(&cur_con->mysql,MYSQL_OPT_COMPRESS,NullS);
|
||||
cur_con->name = my_strdup("default", MYF(MY_WME));
|
||||
if (!cur_con->name)
|
||||
die("Out of memory");
|
||||
|
@ -2114,10 +2124,10 @@ int main(int argc, char** argv)
|
|||
printf("ok\n");
|
||||
}
|
||||
|
||||
mysql_server_end();
|
||||
free_used_memory();
|
||||
exit(error ? 1 : 0);
|
||||
return error ? 1 : 0; /* Keep compiler happy */
|
||||
DBUG_RETURN(error ? 1 : 0); /* Keep compiler happy */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
19
configure.in
|
@ -10,7 +10,7 @@ AM_CONFIG_HEADER(config.h)
|
|||
PROTOCOL_VERSION=10
|
||||
DOT_FRM_VERSION=6
|
||||
# See the libtool docs for information on how to do shared lib versions.
|
||||
SHARED_LIB_VERSION=10:0:0
|
||||
SHARED_LIB_VERSION=11:0:0
|
||||
|
||||
# Set all version vars based on $VERSION. How do we do this more elegant ?
|
||||
# Remember that regexps needs to quote [ and ] since this is run through m4
|
||||
|
@ -699,7 +699,7 @@ int main()
|
|||
AC_MSG_RESULT($atom_ops)
|
||||
|
||||
AC_ARG_WITH(pstack,
|
||||
[ --with-pstack Use the pstack backtrace library],
|
||||
[ --with-pstack Use the pstack backtrace library],
|
||||
[ USE_PSTACK=$withval ],
|
||||
[ USE_PSTACK=no ])
|
||||
pstack_libs=
|
||||
|
@ -1752,8 +1752,7 @@ AC_ARG_WITH(embedded-server,
|
|||
)
|
||||
|
||||
AC_ARG_WITH(extra-tools,
|
||||
[ --without-extra-tools Skip building utilites in the tools \
|
||||
directory.],
|
||||
[ --without-extra-tools Skip building utilites in the tools directory.],
|
||||
[with_tools=$withval],
|
||||
[with_tools=yes]
|
||||
)
|
||||
|
@ -2182,7 +2181,17 @@ EOF
|
|||
then
|
||||
sql_server_dirs="innobase $sql_server_dirs"
|
||||
echo "CONFIGURING FOR INNODB"
|
||||
(cd innobase && sh ./configure) \
|
||||
if test ! -d "innobase"; then
|
||||
# This should only happen when doing a VPATH build
|
||||
echo "NOTICE: I have to make the Innobase directory: `pwd`/innobase"
|
||||
mkdir "innobase" || exit 1
|
||||
fi
|
||||
rel_srcdir=
|
||||
case "$srcdir" in
|
||||
/* ) rel_srcdir="$srcdir" ;;
|
||||
* ) rel_srcdir="../$srcdir" ;;
|
||||
esac
|
||||
(cd innobase && sh $rel_srcdir/innobase/configure) \
|
||||
|| AC_MSG_ERROR([could not configure INNODB])
|
||||
|
||||
echo "END OF INNODB CONFIGURATION"
|
||||
|
|
|
@ -965,4 +965,13 @@ typedef union {
|
|||
#define statistic_add(V,C,L) (V)+=(C)
|
||||
#endif
|
||||
|
||||
/* Macros to make switching between C and C++ mode easier */
|
||||
#ifdef __cplusplus
|
||||
#define C_MODE_START extern "C" {
|
||||
#define C_MODE_END }
|
||||
#else
|
||||
#define C_MODE_START
|
||||
#define C_MODE_END
|
||||
#endif
|
||||
|
||||
#endif /* _global_h */
|
||||
|
|
|
@ -106,7 +106,8 @@ extern int NEAR my_errno; /* Last error in mysys */
|
|||
#define MY_WAIT_FOR_USER_TO_FIX_PANIC 60 /* in seconds */
|
||||
#define MY_WAIT_GIVE_USER_A_MESSAGE 10 /* Every 10 times of prev */
|
||||
#define MIN_COMPRESS_LENGTH 50 /* Don't compress small bl. */
|
||||
#define KEYCACHE_BLOCK_SIZE 1024
|
||||
#define DEFAULT_KEYCACHE_BLOCK_SIZE 1024
|
||||
#define MAX_KEYCACHE_BLOCK_SIZE 16384
|
||||
|
||||
/* root_alloc flags */
|
||||
#define MY_KEEP_PREALLOC 1
|
||||
|
@ -190,9 +191,10 @@ extern char *get_charsets_dir(char *buf);
|
|||
/* statistics */
|
||||
extern ulong _my_cache_w_requests,_my_cache_write,_my_cache_r_requests,
|
||||
_my_cache_read;
|
||||
extern ulong _my_blocks_used,_my_blocks_changed;
|
||||
extern ulong _my_blocks_used,_my_blocks_changed;
|
||||
extern uint key_cache_block_size;
|
||||
extern ulong my_file_opened,my_stream_opened, my_tmp_file_created;
|
||||
extern my_bool key_cache_inited;
|
||||
extern my_bool key_cache_inited, my_init_done;
|
||||
|
||||
/* Point to current my_message() */
|
||||
extern void (*my_sigtstp_cleanup)(void),
|
||||
|
@ -602,6 +604,7 @@ my_bool my_compress(byte *, ulong *, ulong *);
|
|||
my_bool my_uncompress(byte *, ulong *, ulong *);
|
||||
byte *my_compress_alloc(const byte *packet, ulong *len, ulong *complen);
|
||||
ulong checksum(const byte *mem, uint count);
|
||||
uint my_bit_log2(ulong value);
|
||||
|
||||
#if defined(_MSC_VER) && !defined(__WIN__)
|
||||
extern void sleep(int sec);
|
||||
|
|
|
@ -46,6 +46,11 @@ extern "C" {
|
|||
/* Max extra space to use when sorting keys */
|
||||
#define MI_MAX_TEMP_LENGTH 256*1024L*1024L
|
||||
|
||||
/* Possible values for myisam_block_size (must be power of 2) */
|
||||
#define MI_KEY_BLOCK_LENGTH 1024 /* default key block length */
|
||||
#define MI_MIN_KEY_BLOCK_LENGTH 1024 /* Min key block length */
|
||||
#define MI_MAX_KEY_BLOCK_LENGTH 16384
|
||||
|
||||
#define mi_portable_sizeof_char_ptr 8
|
||||
|
||||
typedef uint32 ha_checksum;
|
||||
|
@ -192,7 +197,7 @@ extern uint myisam_block_size;
|
|||
extern my_bool myisam_flush,myisam_delay_key_write,myisam_single_user;
|
||||
extern my_bool myisam_concurrent_insert;
|
||||
extern my_off_t myisam_max_temp_length,myisam_max_extra_temp_length;
|
||||
extern uint myisam_bulk_insert_tree_size;
|
||||
extern ulong myisam_bulk_insert_tree_size;
|
||||
|
||||
/* Prototypes for myisam-functions */
|
||||
|
||||
|
|
|
@ -26,11 +26,9 @@
|
|||
#undef __WIN__
|
||||
#endif
|
||||
|
||||
#ifndef MYSQL_SERVER
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef _global_h /* If not standard header */
|
||||
#include <sys/types.h>
|
||||
|
@ -74,11 +72,11 @@ typedef struct st_mysql_field {
|
|||
char *name; /* Name of column */
|
||||
char *table; /* Table of column if column was a field */
|
||||
char *def; /* Default value (set by mysql_list_fields) */
|
||||
enum enum_field_types type; /* Type of field. Se mysql_com.h for types */
|
||||
unsigned int length; /* Width of column */
|
||||
unsigned int max_length; /* Max width of selected set */
|
||||
unsigned long length; /* Width of column */
|
||||
unsigned long max_length; /* Max width of selected set */
|
||||
unsigned int flags; /* Div flags */
|
||||
unsigned int decimals; /* Number of decimals in field */
|
||||
enum enum_field_types type; /* Type of field. Se mysql_com.h for types */
|
||||
} MYSQL_FIELD;
|
||||
|
||||
typedef char **MYSQL_ROW; /* return data as array of strings */
|
||||
|
@ -135,6 +133,7 @@ struct st_mysql_options {
|
|||
char *ssl_cert; /* PEM cert file */
|
||||
char *ssl_ca; /* PEM CA file */
|
||||
char *ssl_capath; /* PEM directory of CA-s? */
|
||||
char *ssl_cipher; /* cipher to use */
|
||||
my_bool use_ssl; /* if to use SSL or not */
|
||||
my_bool compress,named_pipe;
|
||||
/*
|
||||
|
@ -176,25 +175,30 @@ typedef struct st_mysql {
|
|||
gptr connector_fd; /* ConnectorFd for SSL */
|
||||
char *host,*user,*passwd,*unix_socket,*server_version,*host_info,
|
||||
*info,*db;
|
||||
struct charset_info_st *charset;
|
||||
MYSQL_FIELD *fields;
|
||||
MEM_ROOT field_alloc;
|
||||
my_ulonglong affected_rows;
|
||||
my_ulonglong insert_id; /* id if insert on table with NEXTNR */
|
||||
my_ulonglong extra_info; /* Used by mysqlshow */
|
||||
unsigned long thread_id; /* Id for connection in server */
|
||||
unsigned long packet_length;
|
||||
unsigned int port,client_flag,server_capabilities;
|
||||
unsigned int protocol_version;
|
||||
unsigned int field_count;
|
||||
unsigned int server_status;
|
||||
unsigned long thread_id; /* Id for connection in server */
|
||||
my_ulonglong affected_rows;
|
||||
my_ulonglong insert_id; /* id if insert on table with NEXTNR */
|
||||
my_ulonglong extra_info; /* Used by mysqlshow */
|
||||
unsigned long packet_length;
|
||||
unsigned int server_language;
|
||||
struct st_mysql_options options;
|
||||
enum mysql_status status;
|
||||
MYSQL_FIELD *fields;
|
||||
MEM_ROOT field_alloc;
|
||||
my_bool free_me; /* If free in mysql_close */
|
||||
my_bool reconnect; /* set to 1 if automatic reconnect */
|
||||
struct st_mysql_options options;
|
||||
char scramble_buff[9];
|
||||
struct charset_info_st *charset;
|
||||
unsigned int server_language;
|
||||
|
||||
/*
|
||||
Set if this is the original connection, not a master or a slave we have
|
||||
added though mysql_rpl_probe() or mysql_set_master()/ mysql_add_slave()
|
||||
*/
|
||||
my_bool rpl_pivot;
|
||||
/* pointers to the master, and the next slave
|
||||
connections, points to itself if lone connection */
|
||||
struct st_mysql* master, *next_slave;
|
||||
|
@ -202,41 +206,36 @@ typedef struct st_mysql {
|
|||
struct st_mysql* last_used_slave; /* needed for round-robin slave pick */
|
||||
/* needed for send/read/store/use result to work correctly with replication */
|
||||
struct st_mysql* last_used_con;
|
||||
/*
|
||||
Set if this is the original connection, not a master or a slave we have
|
||||
added though mysql_rpl_probe() or mysql_set_master()/ mysql_add_slave()
|
||||
*/
|
||||
my_bool rpl_pivot;
|
||||
} MYSQL;
|
||||
|
||||
|
||||
typedef struct st_mysql_res {
|
||||
my_ulonglong row_count;
|
||||
unsigned int field_count, current_field;
|
||||
MYSQL_FIELD *fields;
|
||||
MYSQL_DATA *data;
|
||||
MYSQL_ROWS *data_cursor;
|
||||
MEM_ROOT field_alloc;
|
||||
MYSQL_ROW row; /* If unbuffered read */
|
||||
MYSQL_ROW current_row; /* buffer to current row */
|
||||
unsigned long *lengths; /* column lengths of current row */
|
||||
MYSQL *handle; /* for unbuffered reads */
|
||||
my_bool eof; /* Used my mysql_fetch_row */
|
||||
MEM_ROOT field_alloc;
|
||||
unsigned int field_count, current_field;
|
||||
MYSQL_ROW row; /* If unbuffered read */
|
||||
MYSQL_ROW current_row; /* buffer to current row */
|
||||
my_bool eof; /* Used by mysql_fetch_row */
|
||||
} MYSQL_RES;
|
||||
|
||||
|
||||
/* Set up and bring down the server; to ensure that applications will
|
||||
* work when linked against either the standard client library or the
|
||||
* embedded server library, these functions should be called. */
|
||||
void mysql_server_init(int argc, const char **argv, const char **groups);
|
||||
void mysql_server_end();
|
||||
int mysql_server_init(int argc, const char **argv, const char **groups);
|
||||
void mysql_server_end(void);
|
||||
|
||||
/* Set up and bring down a thread; these function should be called
|
||||
* for each thread in an application which opens at least one MySQL
|
||||
* connection. All uses of the connection(s) should be between these
|
||||
* function calls. */
|
||||
my_bool mysql_thread_init();
|
||||
void mysql_thread_end();
|
||||
my_bool mysql_thread_init(void);
|
||||
void mysql_thread_end(void);
|
||||
|
||||
/* Functions to get information from the MYSQL and MYSQL_RES structures */
|
||||
/* Should definitely be used if one uses shared libraries */
|
||||
|
@ -262,7 +261,7 @@ const char * STDCALL mysql_character_set_name(MYSQL *mysql);
|
|||
MYSQL * STDCALL mysql_init(MYSQL *mysql);
|
||||
int STDCALL mysql_ssl_set(MYSQL *mysql, const char *key,
|
||||
const char *cert, const char *ca,
|
||||
const char *capath);
|
||||
const char *capath, const char *cipher);
|
||||
int STDCALL mysql_ssl_clear(MYSQL *mysql);
|
||||
my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
|
||||
const char *passwd, const char *db);
|
||||
|
@ -277,20 +276,20 @@ 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 int length);
|
||||
unsigned long length);
|
||||
int STDCALL mysql_read_query_result(MYSQL *mysql);
|
||||
int STDCALL mysql_real_query(MYSQL *mysql, const char *q,
|
||||
unsigned int length);
|
||||
unsigned long length);
|
||||
/* perform query on master */
|
||||
int STDCALL mysql_master_query(MYSQL *mysql, const char *q,
|
||||
unsigned int length);
|
||||
unsigned long length);
|
||||
int STDCALL mysql_master_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned int length);
|
||||
unsigned long length);
|
||||
/* perform query on slave */
|
||||
int STDCALL mysql_slave_query(MYSQL *mysql, const char *q,
|
||||
unsigned int length);
|
||||
unsigned long length);
|
||||
int STDCALL mysql_slave_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned int length);
|
||||
unsigned long length);
|
||||
|
||||
/*
|
||||
enable/disable parsing of all queries to decide if they go on master or
|
||||
|
@ -370,21 +369,26 @@ char * STDCALL mysql_odbc_escape_string(MYSQL *mysql,
|
|||
void STDCALL myodbc_remove_escape(MYSQL *mysql,char *name);
|
||||
unsigned int STDCALL mysql_thread_safe(void);
|
||||
|
||||
#define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT)
|
||||
|
||||
#ifdef USE_OLD_FUNCTIONS
|
||||
MYSQL * STDCALL mysql_connect(MYSQL *mysql, const char *host,
|
||||
const char *user, const char *passwd);
|
||||
int STDCALL mysql_create_db(MYSQL *mysql, const char *DB);
|
||||
int STDCALL mysql_drop_db(MYSQL *mysql, const char *DB);
|
||||
#define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT)
|
||||
#define HAVE_MYSQL_REAL_CONNECT
|
||||
#endif
|
||||
|
||||
#define HAVE_MYSQL_REAL_CONNECT
|
||||
/*
|
||||
The following functions are mainly exported because of mysqlbinlog;
|
||||
They are not for general usage
|
||||
*/
|
||||
|
||||
int simple_command(MYSQL *mysql,enum enum_server_command command,
|
||||
const char *arg, ulong length, my_bool skipp_check);
|
||||
ulong net_safe_read(MYSQL* mysql);
|
||||
|
||||
#ifndef MYSQL_SERVER
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
#endif /* _mysql_h */
|
||||
|
|
|
@ -108,11 +108,12 @@ typedef struct st_vio Vio;
|
|||
|
||||
typedef struct st_net {
|
||||
Vio* vio;
|
||||
my_socket fd; /* For Perl DBI/dbd */
|
||||
int fcntl;
|
||||
unsigned char *buff,*buff_end,*write_pos,*read_pos;
|
||||
my_socket fd; /* For Perl DBI/dbd */
|
||||
unsigned long max_packet;
|
||||
int fcntl;
|
||||
unsigned int last_errno,timeout,pkt_nr,compress_pkt_nr;
|
||||
char last_error[MYSQL_ERRMSG_SIZE];
|
||||
unsigned int last_errno,max_packet,timeout,pkt_nr;
|
||||
unsigned char error;
|
||||
my_bool return_errno,compress;
|
||||
/*
|
||||
|
@ -120,14 +121,14 @@ typedef struct st_net {
|
|||
command ( as in LOAD TABLE ... FROM MASTER ),
|
||||
and do not want to confuse the client with OK at the wrong time
|
||||
*/
|
||||
my_bool no_send_ok;
|
||||
unsigned long remain_in_buf,length, buf_length, where_b;
|
||||
unsigned int *return_status;
|
||||
unsigned char reading_or_writing;
|
||||
char save_char;
|
||||
my_bool no_send_ok;
|
||||
} NET;
|
||||
|
||||
#define packet_error ((unsigned int) -1)
|
||||
#define packet_error (~(unsigned long) 0)
|
||||
|
||||
enum enum_field_types { FIELD_TYPE_DECIMAL, FIELD_TYPE_TINY,
|
||||
FIELD_TYPE_SHORT, FIELD_TYPE_LONG,
|
||||
|
|
|
@ -221,4 +221,7 @@
|
|||
#define ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT 1218
|
||||
#define ER_CANT_UPDATE_WITH_READLOCK 1219
|
||||
#define ER_MIXING_NOT_ALLOWED 1220
|
||||
#define ER_ERROR_MESSAGES 221
|
||||
#define ER_GRANT_DUPL_SUBJECT 1221
|
||||
#define ER_GRANT_DUPL_ISSUER 1222
|
||||
#define ER_GRANT_DUPL_CIPHER 1223
|
||||
#define ER_ERROR_MESSAGES 224
|
||||
|
|
|
@ -39,4 +39,10 @@
|
|||
my_free(opt_ssl_ca, MYF(MY_ALLOW_ZERO_PTR));
|
||||
opt_ssl_ca = my_strdup(optarg, MYF(0));
|
||||
break;
|
||||
case OPT_SSL_CIPHER:
|
||||
opt_use_ssl = 1; /* true */
|
||||
my_free(opt_ssl_cipher, MYF(MY_ALLOW_ZERO_PTR));
|
||||
opt_ssl_cipher = my_strdup(optarg, MYF(0));
|
||||
break;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -22,10 +22,12 @@
|
|||
#define OPT_SSL_CERT 202
|
||||
#define OPT_SSL_CA 203
|
||||
#define OPT_SSL_CAPATH 204
|
||||
#define OPT_SSL_CIPHER 205
|
||||
{"ssl", no_argument, 0, OPT_SSL_SSL},
|
||||
{"ssl-key", required_argument, 0, OPT_SSL_KEY},
|
||||
{"ssl-cert", required_argument, 0, OPT_SSL_CERT},
|
||||
{"ssl-ca", required_argument, 0, OPT_SSL_CA},
|
||||
{"ssl-capath", required_argument, 0, OPT_SSL_CAPATH},
|
||||
{"ssl-cipher", required_argument, 0, OPT_SSL_CIPHER},
|
||||
|
||||
#endif /* HAVE_OPENSSL */
|
||||
|
|
|
@ -21,5 +21,6 @@
|
|||
--ssl-key X509 key in PEM format (implies --ssl)\n\
|
||||
--ssl-cert X509 cert in PEM format (implies --ssl)\n\
|
||||
--ssl-ca CA file in PEM format (check OpenSSL docs, implies --ssl)\n\
|
||||
--ssl-capath CA directory (check OpenSSL docs, implies --ssl)");
|
||||
--ssl-capath CA directory (check OpenSSL docs, implies --ssl)\n\
|
||||
--ssl-cipher SSL cipher to use (implies --ssl)");
|
||||
#endif
|
||||
|
|
|
@ -21,4 +21,5 @@ static char *opt_ssl_key = 0;
|
|||
static char *opt_ssl_cert = 0;
|
||||
static char *opt_ssl_ca = 0;
|
||||
static char *opt_ssl_capath = 0;
|
||||
static char *opt_ssl_cipher = 0;
|
||||
#endif
|
||||
|
|
|
@ -108,7 +108,6 @@ my_bool vio_poll_read(Vio *vio,uint timeout);
|
|||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* vio_violite_h_ */
|
||||
|
||||
#if defined(HAVE_VIO) && !defined(DONT_MAP_VIO)
|
||||
#define vio_delete(vio) (vio)->viodelete(vio)
|
||||
|
@ -169,9 +168,6 @@ struct st_VioSSLAcceptorFd
|
|||
state_connect = 1,
|
||||
state_accept = 2
|
||||
};
|
||||
// BIO* bio_;
|
||||
// char desc_[100];
|
||||
// Vio* sd_;
|
||||
|
||||
/* function pointers which are only once for SSL server
|
||||
Vio*(*sslaccept)(struct st_VioSSLAcceptorFd*,Vio*); */
|
||||
|
@ -184,15 +180,17 @@ struct st_VioSSLConnectorFd
|
|||
SSL_METHOD* ssl_method_;
|
||||
/* function pointers which are only once for SSL client */
|
||||
};
|
||||
void sslaccept(struct st_VioSSLAcceptorFd*, Vio*);
|
||||
void sslconnect(struct st_VioSSLConnectorFd*, Vio*);
|
||||
void sslaccept(struct st_VioSSLAcceptorFd*, Vio*, long timeout);
|
||||
void sslconnect(struct st_VioSSLConnectorFd*, Vio*, long timeout);
|
||||
|
||||
struct st_VioSSLConnectorFd
|
||||
*new_VioSSLConnectorFd(const char* key_file, const char* cert_file,
|
||||
const char* ca_file, const char* ca_path);
|
||||
const char* ca_file, const char* ca_path,
|
||||
const char* cipher);
|
||||
struct st_VioSSLAcceptorFd
|
||||
*new_VioSSLAcceptorFd(const char* key_file, const char* cert_file,
|
||||
const char* ca_file,const char* ca_path);
|
||||
const char* ca_file,const char* ca_path,
|
||||
const char* cipher);
|
||||
Vio* new_VioSSL(struct st_VioSSLAcceptorFd* fd, Vio* sd,int state);
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -200,6 +198,9 @@ Vio* new_VioSSL(struct st_VioSSLAcceptorFd* fd, Vio* sd,int state);
|
|||
#endif
|
||||
#endif /* HAVE_OPENSSL */
|
||||
|
||||
/* This enumerator is used in parser - should be always visible */
|
||||
enum SSL_type {SSL_TYPE_NONE, SSL_TYPE_ANY, SSL_TYPE_X509, SSL_TYPE_SPECIFIED};
|
||||
|
||||
#ifndef EMBEDDED_LIBRARY
|
||||
/* This structure is for every connection on both sides */
|
||||
struct st_vio
|
||||
|
@ -229,11 +230,10 @@ struct st_vio
|
|||
my_bool (*poll_read)(Vio*,uint);
|
||||
|
||||
#ifdef HAVE_OPENSSL
|
||||
BIO* bio_;
|
||||
SSL* ssl_;
|
||||
my_bool open_;
|
||||
char *ssl_cip_;
|
||||
#endif /* HAVE_OPENSSL */
|
||||
#endif /* HAVE_VIO */
|
||||
};
|
||||
#endif /* EMBEDDED_LIBRARY */
|
||||
#endif /* vio_violite_h_ */
|
||||
|
|
|
@ -55,5 +55,7 @@ noinst_HEADERS = btr0btr.h btr0btr.ic btr0cur.h btr0cur.ic \
|
|||
ut0dbg.h ut0lst.h ut0mem.h ut0mem.ic ut0rnd.h ut0rnd.ic \
|
||||
ut0sort.h ut0ut.h ut0ut.ic
|
||||
|
||||
EXTRA_DIST = Makefile.i
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
libsdir = ../libs
|
||||
|
||||
INCLUDES = -I../../include -I../include
|
||||
INCLUDES = -I$(srcdir)/../include -I$(srcdir)/../../include -I../../include
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
|
|
@ -71,11 +71,11 @@ link_sources:
|
|||
# keep only the stubs for safemalloc.c and debug.c
|
||||
#
|
||||
# A list of needed headers collected from the deps information 000213
|
||||
nh = global.h config-win32.h dbug.h errmsg.h global.h \
|
||||
nh = my_global.h config-win32.h dbug.h errmsg.h \
|
||||
m_ctype.h m_string.h \
|
||||
my_alarm.h my_config.h my_dir.h my_list.h my_net.h my_sys.h \
|
||||
mysql.h mysql_com.h mysql_version.h mysqld_error.h mysys_err.h \
|
||||
my_pthread.h thr_alarm.h violite.h hash.h
|
||||
mysql.h mysql_com.h mysql_version.h mysqld_error.h \
|
||||
mysys_err.h my_pthread.h thr_alarm.h violite.h hash.h
|
||||
# Get a list of the needed objects
|
||||
lobjs = $(mysysobjects1) $(dbugobjects) $(mystringsobjects)
|
||||
|
||||
|
|
|
@ -91,10 +91,12 @@ static sig_handler pipe_sig_handler(int sig);
|
|||
static ulong mysql_sub_escape_string(CHARSET_INFO *charset_info, char *to,
|
||||
const char *from, ulong length);
|
||||
|
||||
void mysql_server_init(int argc __attribute__((unused)),
|
||||
int mysql_server_init(int argc __attribute__((unused)),
|
||||
const char **argv __attribute__((unused)),
|
||||
const char **groups __attribute__((unused)))
|
||||
{}
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mysql_server_end()
|
||||
{}
|
||||
|
@ -314,11 +316,11 @@ HANDLE create_named_pipe(NET *net, uint connect_timeout, char **arg_host,
|
|||
** or packet is an error message
|
||||
*****************************************************************************/
|
||||
|
||||
uint
|
||||
ulong
|
||||
net_safe_read(MYSQL *mysql)
|
||||
{
|
||||
NET *net= &mysql->net;
|
||||
uint len=0;
|
||||
ulong len=0;
|
||||
init_sigpipe_variables
|
||||
|
||||
/* Don't give sigpipe errors if the client doesn't want them */
|
||||
|
@ -336,7 +338,7 @@ net_safe_read(MYSQL *mysql)
|
|||
CR_NET_PACKET_TOO_LARGE:
|
||||
CR_SERVER_LOST);
|
||||
strmov(net->last_error,ER(net->last_errno));
|
||||
return(packet_error);
|
||||
return (packet_error);
|
||||
}
|
||||
if (net->read_pos[0] == 255)
|
||||
{
|
||||
|
@ -347,7 +349,7 @@ net_safe_read(MYSQL *mysql)
|
|||
pos+=2;
|
||||
len-=2;
|
||||
(void) strmake(net->last_error,(char*) pos,
|
||||
min(len,sizeof(net->last_error)-1));
|
||||
min((uint) len,(uint) sizeof(net->last_error)-1));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -438,7 +440,7 @@ static void free_rows(MYSQL_DATA *cur)
|
|||
|
||||
int
|
||||
simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg,
|
||||
uint length, my_bool skipp_check)
|
||||
ulong length, my_bool skipp_check)
|
||||
{
|
||||
NET *net= &mysql->net;
|
||||
int result= -1;
|
||||
|
@ -669,8 +671,8 @@ mysql_free_result(MYSQL_RES *result)
|
|||
DBUG_PRINT("warning",("Not all rows in set were read; Ignoring rows"));
|
||||
for (;;)
|
||||
{
|
||||
uint pkt_len;
|
||||
if ((pkt_len=(uint) net_safe_read(result->handle)) == packet_error)
|
||||
ulong pkt_len;
|
||||
if ((pkt_len=net_safe_read(result->handle)) == packet_error)
|
||||
break;
|
||||
if (pkt_len == 1 && result->handle->net.read_pos[0] == 254)
|
||||
break; /* End of data */
|
||||
|
@ -695,7 +697,7 @@ mysql_free_result(MYSQL_RES *result)
|
|||
static const char *default_options[]=
|
||||
{"port","socket","compress","password","pipe", "timeout", "user",
|
||||
"init-command", "host", "database", "debug", "return-found-rows",
|
||||
"ssl-key" ,"ssl-cert" ,"ssl-ca" ,"ssl-capath",
|
||||
"ssl-key" ,"ssl-cert" ,"ssl-ca" ,"ssl-capath", "ssl-cipher"
|
||||
"character-set-dir", "default-character-set", "interactive-timeout",
|
||||
"connect_timeout", "replication-probe", "enable-reads-from-master",
|
||||
"repl-parse-query",
|
||||
|
@ -864,7 +866,8 @@ unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
|
|||
MYSQL_FIELD *field,*result;
|
||||
DBUG_ENTER("unpack_fields");
|
||||
|
||||
field=result=(MYSQL_FIELD*) alloc_root(alloc,sizeof(MYSQL_FIELD)*fields);
|
||||
field=result=(MYSQL_FIELD*) alloc_root(alloc,
|
||||
(uint) sizeof(MYSQL_FIELD)*fields);
|
||||
if (!result)
|
||||
DBUG_RETURN(0);
|
||||
|
||||
|
@ -911,7 +914,7 @@ static MYSQL_DATA *read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
|
|||
NET *net = &mysql->net;
|
||||
DBUG_ENTER("read_rows");
|
||||
|
||||
if ((pkt_len=(uint) net_safe_read(mysql)) == packet_error)
|
||||
if ((pkt_len= net_safe_read(mysql)) == packet_error)
|
||||
DBUG_RETURN(0);
|
||||
if (!(result=(MYSQL_DATA*) my_malloc(sizeof(MYSQL_DATA),
|
||||
MYF(MY_WME | MY_ZEROFILL))))
|
||||
|
@ -1018,7 +1021,7 @@ read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row, ulong *lengths)
|
|||
|
||||
/* perform query on master */
|
||||
int STDCALL mysql_master_query(MYSQL *mysql, const char *q,
|
||||
unsigned int length)
|
||||
unsigned long length)
|
||||
{
|
||||
if (mysql_master_send_query(mysql, q, length))
|
||||
return 1;
|
||||
|
@ -1026,7 +1029,7 @@ int STDCALL mysql_master_query(MYSQL *mysql, const char *q,
|
|||
}
|
||||
|
||||
int STDCALL mysql_master_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned int length)
|
||||
unsigned long length)
|
||||
{
|
||||
MYSQL*master = mysql->master;
|
||||
if (!length)
|
||||
|
@ -1040,7 +1043,7 @@ int STDCALL mysql_master_send_query(MYSQL *mysql, const char *q,
|
|||
|
||||
/* perform query on slave */
|
||||
int STDCALL mysql_slave_query(MYSQL *mysql, const char *q,
|
||||
unsigned int length)
|
||||
unsigned long length)
|
||||
{
|
||||
if (mysql_slave_send_query(mysql, q, length))
|
||||
return 1;
|
||||
|
@ -1048,7 +1051,7 @@ int STDCALL mysql_slave_query(MYSQL *mysql, const char *q,
|
|||
}
|
||||
|
||||
int STDCALL mysql_slave_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned int length)
|
||||
unsigned long length)
|
||||
{
|
||||
MYSQL* last_used_slave, *slave_to_use = 0;
|
||||
|
||||
|
@ -1269,7 +1272,7 @@ STDCALL mysql_rpl_query_type(const char* q, int len)
|
|||
case 'c': /* create or check */
|
||||
return tolower(q[1]) == 'h' ? MYSQL_RPL_ADMIN : MYSQL_RPL_MASTER ;
|
||||
case 's': /* select or show */
|
||||
return tolower(q[1] == 'h') ? MYSQL_RPL_ADMIN : MYSQL_RPL_SLAVE;
|
||||
return tolower(q[1]) == 'h' ? MYSQL_RPL_ADMIN : MYSQL_RPL_SLAVE;
|
||||
case 'f': /* flush */
|
||||
case 'r': /* repair */
|
||||
case 'g': /* grant */
|
||||
|
@ -1278,8 +1281,7 @@ STDCALL mysql_rpl_query_type(const char* q, int len)
|
|||
return MYSQL_RPL_SLAVE;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
return MYSQL_RPL_MASTER; /* By default, send to master */
|
||||
}
|
||||
|
||||
|
||||
|
@ -1368,15 +1370,17 @@ mysql_ssl_set(MYSQL *mysql __attribute__((unused)) ,
|
|||
const char *key __attribute__((unused)),
|
||||
const char *cert __attribute__((unused)),
|
||||
const char *ca __attribute__((unused)),
|
||||
const char *capath __attribute__((unused)))
|
||||
const char *capath __attribute__((unused)),
|
||||
const char *cipher __attribute__((unused)))
|
||||
{
|
||||
#ifdef HAVE_OPENSSL
|
||||
mysql->options.ssl_key = key==0 ? 0 : my_strdup(key,MYF(0));
|
||||
mysql->options.ssl_cert = cert==0 ? 0 : my_strdup(cert,MYF(0));
|
||||
mysql->options.ssl_ca = ca==0 ? 0 : my_strdup(ca,MYF(0));
|
||||
mysql->options.ssl_capath = capath==0 ? 0 : my_strdup(capath,MYF(0));
|
||||
mysql->options.ssl_cipher = cipher==0 ? 0 : my_strdup(cipher,MYF(0));
|
||||
mysql->options.use_ssl = TRUE;
|
||||
mysql->connector_fd = (gptr)new_VioSSLConnectorFd(key, cert, ca, capath);
|
||||
mysql->connector_fd = (gptr)new_VioSSLConnectorFd(key, cert, ca, capath, cipher);
|
||||
DBUG_PRINT("info",("mysql_ssl_set, context: %p",((struct st_VioSSLConnectorFd *)(mysql->connector_fd))->ssl_context_));
|
||||
#endif
|
||||
return 0;
|
||||
|
@ -1396,10 +1400,12 @@ mysql_ssl_clear(MYSQL *mysql __attribute__((unused)))
|
|||
my_free(mysql->options.ssl_cert, MYF(MY_ALLOW_ZERO_PTR));
|
||||
my_free(mysql->options.ssl_ca, MYF(MY_ALLOW_ZERO_PTR));
|
||||
my_free(mysql->options.ssl_capath, MYF(MY_ALLOW_ZERO_PTR));
|
||||
my_free(mysql->options.ssl_cipher, MYF(MY_ALLOW_ZERO_PTR));
|
||||
mysql->options.ssl_key = 0;
|
||||
mysql->options.ssl_cert = 0;
|
||||
mysql->options.ssl_ca = 0;
|
||||
mysql->options.ssl_capath = 0;
|
||||
mysql->options.ssl_cipher= 0;
|
||||
mysql->options.use_ssl = FALSE;
|
||||
my_free(mysql->connector_fd,MYF(MY_ALLOW_ZERO_PTR));
|
||||
mysql->connector_fd = 0;
|
||||
|
@ -1797,7 +1803,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
|
|||
/* Do the SSL layering. */
|
||||
DBUG_PRINT("info", ("IO layer change in progress..."));
|
||||
DBUG_PRINT("info", ("IO context %p",((struct st_VioSSLConnectorFd*)mysql->connector_fd)->ssl_context_));
|
||||
sslconnect((struct st_VioSSLConnectorFd*)(mysql->connector_fd),mysql->net.vio);
|
||||
sslconnect((struct st_VioSSLConnectorFd*)(mysql->connector_fd),mysql->net.vio, (long)(mysql->options.connect_timeout));
|
||||
DBUG_PRINT("info", ("IO layer change done!"));
|
||||
}
|
||||
#endif /* HAVE_OPENSSL */
|
||||
|
@ -1823,7 +1829,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
|
|||
mysql->db=my_strdup(db,MYF(MY_WME));
|
||||
db=0;
|
||||
}
|
||||
if (my_net_write(net,buff,(uint) (end-buff)) || net_flush(net) ||
|
||||
if (my_net_write(net,buff,(ulong) (end-buff)) || net_flush(net) ||
|
||||
net_safe_read(mysql) == packet_error)
|
||||
goto error;
|
||||
if (client_flag & CLIENT_COMPRESS) /* We will use compression */
|
||||
|
@ -1887,7 +1893,7 @@ static my_bool mysql_reconnect(MYSQL *mysql)
|
|||
if (!mysql->reconnect ||
|
||||
(mysql->server_status & SERVER_STATUS_IN_TRANS) || !mysql->host_info)
|
||||
{
|
||||
/* Allov reconnect next time */
|
||||
/* Allow reconnect next time */
|
||||
mysql->server_status&= ~SERVER_STATUS_IN_TRANS;
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
@ -1929,7 +1935,7 @@ my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
|
|||
pos=scramble(pos, mysql->scramble_buff, passwd,
|
||||
(my_bool) (mysql->protocol_version == 9));
|
||||
pos=strmov(pos+1,db ? db : "");
|
||||
if (simple_command(mysql,COM_CHANGE_USER, buff,(uint) (pos-buff),0))
|
||||
if (simple_command(mysql,COM_CHANGE_USER, buff,(ulong) (pos-buff),0))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));
|
||||
|
@ -1954,7 +1960,7 @@ mysql_select_db(MYSQL *mysql, const char *db)
|
|||
DBUG_ENTER("mysql_select_db");
|
||||
DBUG_PRINT("enter",("db: '%s'",db));
|
||||
|
||||
if ((error=simple_command(mysql,COM_INIT_DB,db,(uint) strlen(db),0)))
|
||||
if ((error=simple_command(mysql,COM_INIT_DB,db,(ulong) strlen(db),0)))
|
||||
DBUG_RETURN(error);
|
||||
my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));
|
||||
mysql->db=my_strdup(db,MYF(MY_WME));
|
||||
|
@ -1995,13 +2001,13 @@ mysql_close(MYSQL *mysql)
|
|||
my_free(mysql->options.my_cnf_group,MYF(MY_ALLOW_ZERO_PTR));
|
||||
my_free(mysql->options.charset_dir,MYF(MY_ALLOW_ZERO_PTR));
|
||||
my_free(mysql->options.charset_name,MYF(MY_ALLOW_ZERO_PTR));
|
||||
#ifdef HAVE_OPENSSL
|
||||
mysql_ssl_clear(mysql);
|
||||
#endif /* HAVE_OPENSSL */
|
||||
/* Clear pointers for better safety */
|
||||
mysql->host_info=mysql->user=mysql->passwd=mysql->db=0;
|
||||
bzero((char*) &mysql->options,sizeof(mysql->options));
|
||||
mysql->net.vio = 0;
|
||||
#ifdef HAVE_OPENSSL
|
||||
mysql_ssl_clear(mysql);
|
||||
#endif /* HAVE_OPENSSL */
|
||||
|
||||
/* free/close slave list */
|
||||
if (mysql->rpl_pivot)
|
||||
|
@ -2105,7 +2111,7 @@ STDCALL mysql_add_slave(MYSQL* mysql, const char* host,
|
|||
*/
|
||||
|
||||
int STDCALL
|
||||
mysql_send_query(MYSQL* mysql, const char* query, uint length)
|
||||
mysql_send_query(MYSQL* mysql, const char* query, ulong length)
|
||||
{
|
||||
if (mysql->options.rpl_parse && mysql->rpl_pivot)
|
||||
{
|
||||
|
@ -2173,13 +2179,13 @@ get_info:
|
|||
CLIENT_LONG_FLAG))))
|
||||
DBUG_RETURN(-1);
|
||||
mysql->status=MYSQL_STATUS_GET_RESULT;
|
||||
mysql->field_count=field_count;
|
||||
mysql->field_count= (uint) field_count;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
||||
int STDCALL
|
||||
mysql_real_query(MYSQL *mysql, const char *query, uint length)
|
||||
mysql_real_query(MYSQL *mysql, const char *query, ulong length)
|
||||
{
|
||||
DBUG_ENTER("mysql_real_query");
|
||||
DBUG_PRINT("enter",("handle: %lx",mysql));
|
||||
|
@ -2270,8 +2276,9 @@ mysql_store_result(MYSQL *mysql)
|
|||
DBUG_RETURN(0);
|
||||
}
|
||||
mysql->status=MYSQL_STATUS_READY; /* server is ready */
|
||||
if (!(result=(MYSQL_RES*) my_malloc(sizeof(MYSQL_RES)+
|
||||
sizeof(ulong)*mysql->field_count,
|
||||
if (!(result=(MYSQL_RES*) my_malloc((uint) (sizeof(MYSQL_RES)+
|
||||
sizeof(ulong) *
|
||||
mysql->field_count),
|
||||
MYF(MY_WME | MY_ZEROFILL))))
|
||||
{
|
||||
mysql->net.last_errno=CR_OUT_OF_MEMORY;
|
||||
|
@ -2427,7 +2434,7 @@ mysql_fetch_lengths(MYSQL_RES *res)
|
|||
continue;
|
||||
}
|
||||
if (start) /* Found end of prev string */
|
||||
*prev_length= (uint) (*column-start-1);
|
||||
*prev_length= (ulong) (*column-start-1);
|
||||
start= *column;
|
||||
prev_length=lengths;
|
||||
}
|
||||
|
@ -2528,7 +2535,7 @@ mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)
|
|||
LINT_INIT(query);
|
||||
|
||||
end=strmake(strmake(buff, table,128)+1,wild ? wild : "",128);
|
||||
if (simple_command(mysql,COM_FIELD_LIST,buff,(uint) (end-buff),1) ||
|
||||
if (simple_command(mysql,COM_FIELD_LIST,buff,(ulong) (end-buff),1) ||
|
||||
!(query = read_rows(mysql,(MYSQL_FIELD*) 0,6)))
|
||||
DBUG_RETURN(NULL);
|
||||
|
||||
|
@ -2584,7 +2591,7 @@ mysql_create_db(MYSQL *mysql, const char *db)
|
|||
{
|
||||
DBUG_ENTER("mysql_createdb");
|
||||
DBUG_PRINT("enter",("db: %s",db));
|
||||
DBUG_RETURN(simple_command(mysql,COM_CREATE_DB,db, (uint) strlen(db),0));
|
||||
DBUG_RETURN(simple_command(mysql,COM_CREATE_DB,db, (ulong) strlen(db),0));
|
||||
}
|
||||
|
||||
|
||||
|
@ -2593,7 +2600,7 @@ mysql_drop_db(MYSQL *mysql, const char *db)
|
|||
{
|
||||
DBUG_ENTER("mysql_drop_db");
|
||||
DBUG_PRINT("enter",("db: %s",db));
|
||||
DBUG_RETURN(simple_command(mysql,COM_DROP_DB,db,(uint) strlen(db),0));
|
||||
DBUG_RETURN(simple_command(mysql,COM_DROP_DB,db,(ulong) strlen(db),0));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <winsock.h>
|
||||
#endif
|
||||
#include <my_global.h>
|
||||
#include "mysql_embed.h"
|
||||
#include <mysql_com.h>
|
||||
#include <violite.h>
|
||||
#include <my_sys.h>
|
||||
|
@ -89,7 +90,7 @@ extern ulong mysqld_net_retry_count;
|
|||
typedef my_bool thr_alarm_t;
|
||||
typedef my_bool ALARM;
|
||||
#define thr_alarm_init(A) (*(A))=0
|
||||
#define thr_alarm_in_use(A) (*(A)!= 0)
|
||||
#define thr_alarm_in_use(A) (*(A) != 0)
|
||||
#define thr_end_alarm(A)
|
||||
#define thr_alarm(A,B,C) local_thr_alarm((A),(B),(C))
|
||||
inline int local_thr_alarm(my_bool *A,int B __attribute__((unused)),ALARM *C __attribute__((unused)))
|
||||
|
@ -129,7 +130,7 @@ int my_net_init(NET *net, Vio* vio)
|
|||
net->no_send_ok = 0;
|
||||
net->error=0; net->return_errno=0; net->return_status=0;
|
||||
net->timeout=(uint) net_read_timeout; /* Timeout for read */
|
||||
net->pkt_nr=0;
|
||||
net->pkt_nr=net->compress_pkt_nr=0;
|
||||
net->write_pos=net->read_pos = net->buff;
|
||||
net->last_error[0]=0;
|
||||
net->compress=0; net->reading_or_writing=0;
|
||||
|
@ -190,7 +191,7 @@ static my_bool net_realloc(NET *net, ulong length)
|
|||
void net_clear(NET *net)
|
||||
{
|
||||
#ifndef EXTRA_DEBUG
|
||||
int count;
|
||||
int count; /* One may get 'unused' warn */
|
||||
bool is_blocking=vio_is_blocking(net->vio);
|
||||
if (is_blocking)
|
||||
vio_blocking(net->vio, FALSE);
|
||||
|
@ -204,7 +205,7 @@ void net_clear(NET *net)
|
|||
vio_blocking(net->vio, TRUE);
|
||||
}
|
||||
#endif /* EXTRA_DEBUG */
|
||||
net->pkt_nr=0; /* Ready for new command */
|
||||
net->pkt_nr=net->compress_pkt_nr=0; /* Ready for new command */
|
||||
net->write_pos=net->buff;
|
||||
}
|
||||
|
||||
|
@ -217,9 +218,12 @@ int net_flush(NET *net)
|
|||
if (net->buff != net->write_pos)
|
||||
{
|
||||
error=net_real_write(net,(char*) net->buff,
|
||||
(uint) (net->write_pos - net->buff));
|
||||
(ulong) (net->write_pos - net->buff));
|
||||
net->write_pos=net->buff;
|
||||
}
|
||||
/* Sync packet number if using compression */
|
||||
if (net->compress)
|
||||
net->pkt_nr=net->compress_pkt_nr;
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
|
||||
|
@ -248,7 +252,7 @@ my_net_write(NET *net,const char *packet,ulong len)
|
|||
{
|
||||
const ulong z_size = MAX_THREE_BYTES;
|
||||
int3store(buff, z_size);
|
||||
buff[3]= (net->compress) ? 0 : (uchar) (net->pkt_nr++);
|
||||
buff[3]= net->pkt_nr++;
|
||||
if (net_write_buff(net, (char*) buff, NET_HEADER_SIZE) ||
|
||||
net_write_buff(net, packet, z_size))
|
||||
return 1;
|
||||
|
@ -257,7 +261,7 @@ my_net_write(NET *net,const char *packet,ulong len)
|
|||
}
|
||||
/* Write last packet */
|
||||
int3store(buff,len);
|
||||
buff[3]= (net->compress) ? 0 : (uchar) (net->pkt_nr++);
|
||||
buff[3]= net->pkt_nr++;
|
||||
if (net_write_buff(net,(char*) buff,NET_HEADER_SIZE))
|
||||
return 1;
|
||||
return net_write_buff(net,packet,len);
|
||||
|
@ -275,7 +279,7 @@ my_net_write(NET *net,const char *packet,ulong len)
|
|||
int
|
||||
net_write_command(NET *net,uchar command,const char *packet,ulong len)
|
||||
{
|
||||
uint length=len+1; /* 1 extra byte for command */
|
||||
ulong length=len+1; /* 1 extra byte for command */
|
||||
uchar buff[NET_HEADER_SIZE+1];
|
||||
uint header_size=NET_HEADER_SIZE+1;
|
||||
buff[4]=command; /* For first packet */
|
||||
|
@ -287,7 +291,7 @@ net_write_command(NET *net,uchar command,const char *packet,ulong len)
|
|||
do
|
||||
{
|
||||
int3store(buff, MAX_THREE_BYTES);
|
||||
buff[3]= (net->compress) ? 0 : (uchar) (net->pkt_nr++);
|
||||
buff[3]= net->pkt_nr++;
|
||||
if (net_write_buff(net,(char*) buff, header_size) ||
|
||||
net_write_buff(net,packet,len))
|
||||
return 1;
|
||||
|
@ -299,7 +303,7 @@ net_write_command(NET *net,uchar command,const char *packet,ulong len)
|
|||
len=length; /* Data left to be written */
|
||||
}
|
||||
int3store(buff,length);
|
||||
buff[3]= (net->compress) ? 0 : (uchar) (net->pkt_nr++);
|
||||
buff[3]= net->pkt_nr++;
|
||||
return test(net_write_buff(net,(char*) buff,header_size) ||
|
||||
net_write_buff(net,packet,len) || net_flush(net));
|
||||
}
|
||||
|
@ -312,7 +316,7 @@ net_write_command(NET *net,uchar command,const char *packet,ulong len)
|
|||
static int
|
||||
net_write_buff(NET *net,const char *packet,ulong len)
|
||||
{
|
||||
uint left_length=(uint) (net->buff_end - net->write_pos);
|
||||
ulong left_length=(ulong) (net->buff_end - net->write_pos);
|
||||
|
||||
while (len > left_length)
|
||||
{
|
||||
|
@ -338,7 +342,7 @@ net_write_buff(NET *net,const char *packet,ulong len)
|
|||
int
|
||||
net_real_write(NET *net,const char *packet,ulong len)
|
||||
{
|
||||
int length;
|
||||
long int length;
|
||||
char *pos,*end;
|
||||
thr_alarm_t alarmed;
|
||||
#if !defined(__WIN__) && !defined(__EMX__) && !defined(OS2)
|
||||
|
@ -378,7 +382,7 @@ net_real_write(NET *net,const char *packet,ulong len)
|
|||
}
|
||||
int3store(&b[NET_HEADER_SIZE],complen);
|
||||
int3store(b,len);
|
||||
b[3]=(uchar) (net->pkt_nr++);
|
||||
b[3]=(uchar) (net->compress_pkt_nr++);
|
||||
len+= header_length;
|
||||
packet= (char*) b;
|
||||
}
|
||||
|
@ -396,7 +400,7 @@ net_real_write(NET *net,const char *packet,ulong len)
|
|||
pos=(char*) packet; end=pos+len;
|
||||
while (pos != end)
|
||||
{
|
||||
if ((int) (length=vio_write(net->vio,pos,(int) (end-pos))) <= 0)
|
||||
if ((long) (length=vio_write(net->vio,pos,(ulong) (end-pos))) <= 0)
|
||||
{
|
||||
my_bool interrupted = vio_should_retry(net->vio);
|
||||
#if (!defined(__WIN__) && !defined(__EMX__) && !defined(OS2))
|
||||
|
@ -496,7 +500,7 @@ static void my_net_skip_rest(NET *net, ulong remain, thr_alarm_t *alarmed)
|
|||
if ((int) (length=vio_read(net->vio,(char*) net->buff,remain)) <= 0L)
|
||||
{
|
||||
my_bool interrupted = vio_should_retry(net->vio);
|
||||
if (!thr_got_alarm(alarmed) && interrupted)
|
||||
if (!thr_got_alarm(&alarmed) && interrupted)
|
||||
{ /* Probably in MIT threads */
|
||||
if (retry_count++ < RETRY_COUNT)
|
||||
continue;
|
||||
|
@ -516,7 +520,7 @@ static void my_net_skip_rest(NET *net, ulong remain, thr_alarm_t *alarmed)
|
|||
This function reallocates the net->buff buffer if necessary.
|
||||
*/
|
||||
|
||||
static uint
|
||||
static ulong
|
||||
my_real_read(NET *net, ulong *complen)
|
||||
{
|
||||
uchar *pos;
|
||||
|
@ -627,9 +631,9 @@ my_real_read(NET *net, ulong *complen)
|
|||
if (net->buff[net->where_b] != (uchar) 255)
|
||||
{
|
||||
DBUG_PRINT("error",
|
||||
("Packets out of order (Found: %d, expected %d)",
|
||||
("Packets out of order (Found: %d, expected %u)",
|
||||
(int) net->buff[net->where_b + 3],
|
||||
(uint) (uchar) net->pkt_nr));
|
||||
net->pkt_nr));
|
||||
#ifdef EXTRA_DEBUG
|
||||
fprintf(stderr,"Packets out of order (Found: %d, expected %d)\n",
|
||||
(int) net->buff[net->where_b + 3],
|
||||
|
@ -642,7 +646,7 @@ my_real_read(NET *net, ulong *complen)
|
|||
#endif
|
||||
goto end;
|
||||
}
|
||||
net->pkt_nr++;
|
||||
net->compress_pkt_nr= ++net->pkt_nr;
|
||||
#ifdef HAVE_COMPRESS
|
||||
if (net->compress)
|
||||
{
|
||||
|
@ -710,7 +714,7 @@ my_net_read(NET *net)
|
|||
if (len == MAX_THREE_BYTES)
|
||||
{
|
||||
/* First packet of a multi-packet. Concatenate the packets */
|
||||
int save_pos = net->where_b;
|
||||
ulong save_pos = net->where_b;
|
||||
ulong total_length=0;
|
||||
do
|
||||
{
|
||||
|
@ -820,8 +824,8 @@ my_net_read(NET *net)
|
|||
|
||||
net->read_pos= net->buff+ first_packet_offset + NET_HEADER_SIZE;
|
||||
net->buf_length= buf_length;
|
||||
net->remain_in_buf= buf_length - start_of_packet;
|
||||
len = ((uint) (start_of_packet - first_packet_offset) - NET_HEADER_SIZE -
|
||||
net->remain_in_buf= (ulong) (buf_length - start_of_packet);
|
||||
len = ((ulong) (start_of_packet - first_packet_offset) - NET_HEADER_SIZE -
|
||||
multi_byte_packet);
|
||||
net->save_char= net->read_pos[len]; /* Must be saved */
|
||||
net->read_pos[len]=0; /* Safeguard for mysql_use_result */
|
||||
|
|
|
@ -39,6 +39,8 @@ libmysqlsources = errmsg.c get_password.c password.c
|
|||
## XXX: we should not have to duplicate info from the sources list
|
||||
libmysqlobjects = errmsg.lo get_password.lo password.lo
|
||||
|
||||
noinst_HEADERS = embedded_priv.h
|
||||
|
||||
sqlsources = convert.cc derror.cc field.cc field_conv.cc filesort.cc \
|
||||
ha_innobase.cc ha_berkeley.cc ha_heap.cc ha_isam.cc ha_isammrg.cc \
|
||||
ha_myisam.cc ha_myisammrg.cc handler.cc sql_handler.cc \
|
||||
|
|
32
libmysqld/embedded_priv.h
Normal file
|
@ -0,0 +1,32 @@
|
|||
/* 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 */
|
||||
|
||||
/* Prototypes for the embedded version of MySQL */
|
||||
|
||||
#include <my_global.h>
|
||||
#include <mysql_embed.h>
|
||||
#include <mysql.h>
|
||||
#include <mysql_version.h>
|
||||
#include <mysqld_error.h>
|
||||
#include <my_pthread.h>
|
||||
|
||||
C_MODE_START
|
||||
extern void start_embedded_connection(NET * net);
|
||||
extern void end_embedded_connection(NET * net);
|
||||
extern void lib_connection_phase(NET *net, int phase);
|
||||
extern bool lib_dispatch_command(enum enum_server_command command, NET *net,
|
||||
const char *arg, ulong length);
|
||||
C_MODE_END
|
|
@ -26,7 +26,7 @@ LDADD = $(top_builddir)/libmysqld/libmysqld.la \
|
|||
mysqltest_DEPENDENCIES = ../libmysqld.la
|
||||
mysqltest_SOURCES = mysqltest.c
|
||||
|
||||
mysql_SOURCES = mysql.cc readline.cc sql_string.cc completion_hash.cc \
|
||||
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)
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@ usage: $0 [-g|-h|-r] [test-name ...]
|
|||
EOF
|
||||
}
|
||||
|
||||
init_args=""
|
||||
while test $# -gt 0
|
||||
do
|
||||
arg=
|
||||
|
@ -56,6 +57,7 @@ do
|
|||
-h | --help | -\? ) usage; exit 0;;
|
||||
-l | --list ) list=1 ; shift ;;
|
||||
-r | --run ) run="${cr}run"; shift;;
|
||||
--debug) init_args="$init_args --debug" ; shift ;;
|
||||
-s | --start=* )
|
||||
test $argset -eq 0 && { shift; arg="$1"; }
|
||||
start="$arg"
|
||||
|
@ -103,7 +105,7 @@ do
|
|||
echo "test '$b' doesn't exist" >&2
|
||||
continue
|
||||
}
|
||||
args="-v -S /tmp/mysql.sock -R $r -x $t test"
|
||||
args="$init_args -v -S /tmp/mysql.sock -R $r -x $t test"
|
||||
echo "set args $args$run" > test-gdbinit
|
||||
#if false && test -n "$run"
|
||||
if test -n "$run" -o $gdb -eq 1
|
||||
|
|
|
@ -12,20 +12,21 @@
|
|||
* modified is included with the above copyright notice.
|
||||
*
|
||||
*/
|
||||
#include "my_global.h"
|
||||
#include "mysql_embed.h"
|
||||
#include "my_pthread.h"
|
||||
#include "embedded_priv.h"
|
||||
#include "sys/types.h"
|
||||
#include "../regex/regex.h"
|
||||
#include "my_sys.h"
|
||||
|
||||
/*
|
||||
The following is needed to not cause conflicts when we include mysqld.cc
|
||||
*/
|
||||
|
||||
#define main main1
|
||||
#define mysql_unix_port mysql_inix_port1
|
||||
#define mysql_port mysql_port1
|
||||
#define net_read_timeout net_read_timeout1
|
||||
#define net_write_timeout net_write_timeout1
|
||||
#define changeable_vars changeable_vars1
|
||||
//#define mysql_tmpdir mysql_tmpdir1
|
||||
|
||||
extern "C"
|
||||
{
|
||||
|
@ -36,38 +37,21 @@ extern "C"
|
|||
|
||||
class THD;
|
||||
|
||||
static int
|
||||
check_connections1(THD * thd);
|
||||
|
||||
static bool
|
||||
check_user(THD *thd, enum_server_command command,const char *user, const char *passwd, const char *db, bool check_count);
|
||||
|
||||
static int
|
||||
check_connections2(THD * thd);
|
||||
|
||||
extern void free_defaults(char ** argv);
|
||||
void free_defaults_internal(char ** argv){if (argv) free_defaults(argv);}
|
||||
static int check_connections1(THD * thd);
|
||||
static int check_connections2(THD * thd);
|
||||
static bool check_user(THD *thd, enum_server_command command,
|
||||
const char *user, const char *passwd, const char *db,
|
||||
bool check_count);
|
||||
void free_defaults_internal(char ** argv) {if (argv) free_defaults(argv);}
|
||||
#define free_defaults free_defaults_internal
|
||||
|
||||
char mysql_data_home[FN_REFLEN];
|
||||
char * get_mysql_data_home(){return mysql_data_home;};
|
||||
#define mysql_data_home mysql_data_home_internal
|
||||
#include "../sql/mysqld.cc"
|
||||
|
||||
#define SCRAMBLE_LENGTH 8
|
||||
extern "C" {
|
||||
C_MODE_START
|
||||
|
||||
/*
|
||||
void
|
||||
free_defaults(char ** argv) {};
|
||||
void
|
||||
load_defaults(const char *, const char **, int *, char ***) {};
|
||||
*/
|
||||
|
||||
char *
|
||||
get_mysql_home(){ return mysql_home;};
|
||||
char *
|
||||
get_mysql_real_data_home(){ return mysql_real_data_home;};
|
||||
char * get_mysql_home(){ return mysql_home;};
|
||||
char * get_mysql_real_data_home(){ return mysql_real_data_home;};
|
||||
|
||||
|
||||
bool lib_dispatch_command(enum enum_server_command command, NET *net,
|
||||
|
@ -83,9 +67,7 @@ bool lib_dispatch_command(enum enum_server_command command, NET *net,
|
|||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
lib_connection_phase(NET * net, int phase)
|
||||
void lib_connection_phase(NET * net, int phase)
|
||||
{
|
||||
THD * thd;
|
||||
thd = (THD *)(net->vio->dest_thd);
|
||||
|
@ -99,7 +81,9 @@ lib_connection_phase(NET * net, int phase)
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
C_MODE_END
|
||||
|
||||
|
||||
void start_embedded_conn1(NET * net)
|
||||
{
|
||||
THD * thd = new THD;
|
||||
|
@ -117,7 +101,6 @@ void start_embedded_conn1(NET * net)
|
|||
if (v)
|
||||
{
|
||||
v -> dest_thd = thd;
|
||||
/* v -> dest_net = &thd->net; XXX: Probably not needed? */
|
||||
}
|
||||
thd->net.vio = v;
|
||||
if (thd->store_globals())
|
||||
|
@ -257,7 +240,7 @@ static bool check_user(THD *thd,enum_server_command command, const char *user,
|
|||
send_error(net,ER_OUT_OF_RESOURCES);
|
||||
return 1;
|
||||
}
|
||||
thd->master_access=acl_getroot(thd->host, thd->ip, thd->user,
|
||||
thd->master_access=acl_getroot(thd, thd->host, thd->ip, thd->user,
|
||||
passwd, thd->scramble, &thd->priv_user,
|
||||
protocol_version == 9 ||
|
||||
!(thd->client_capabilities &
|
||||
|
@ -308,10 +291,14 @@ static bool check_user(THD *thd,enum_server_command command, const char *user,
|
|||
}
|
||||
|
||||
|
||||
extern "C"{
|
||||
void mysql_server_init(int argc, const char **argv, const char **groups)
|
||||
extern "C"
|
||||
{
|
||||
char hostname[FN_REFLEN];
|
||||
|
||||
static my_bool inited, org_my_init_done;
|
||||
|
||||
int mysql_server_init(int argc, const char **argv, const char **groups)
|
||||
{
|
||||
char glob_hostname[FN_REFLEN];
|
||||
|
||||
/* This mess is to allow people to call the init function without
|
||||
* having to mess with a fake argv */
|
||||
|
@ -335,7 +322,16 @@ void mysql_server_init(int argc, const char **argv, const char **groups)
|
|||
|
||||
my_umask=0660; // Default umask for new files
|
||||
my_umask_dir=0700; // Default umask for new directories
|
||||
MY_INIT((char *)"mysqld_server"); // init my_sys library & pthreads
|
||||
|
||||
/* Only call MY_INIT() if it hasn't been called before */
|
||||
if (!inited)
|
||||
{
|
||||
inited=1;
|
||||
org_my_init_done=my_init_done;
|
||||
}
|
||||
if (!org_my_init_done)
|
||||
MY_INIT((char *)"mysql_embedded"); // init my_sys library & pthreads
|
||||
|
||||
tzset(); // Set tzname
|
||||
|
||||
start_time=time((time_t*) 0);
|
||||
|
@ -344,49 +340,34 @@ void mysql_server_init(int argc, const char **argv, const char **groups)
|
|||
{
|
||||
struct tm tm_tmp;
|
||||
localtime_r(&start_time,&tm_tmp);
|
||||
strmov(time_zone,tzname[tm_tmp.tm_isdst == 1 ? 1 : 0]);
|
||||
strmov(time_zone,tzname[tm_tmp.tm_isdst != 0 ? 1 : 0]);
|
||||
}
|
||||
#else
|
||||
{
|
||||
struct tm *start_tm;
|
||||
start_tm=localtime(&start_time);
|
||||
strmov(time_zone=tzname[start_tm->tm_isdst == 1 ? 1 : 0]);
|
||||
strmov(time_zone,tzname[start_tm->tm_isdst != 0 ? 1 : 0]);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
if (gethostname(hostname,sizeof(hostname)-4) < 0)
|
||||
strmov(hostname,"mysql");
|
||||
strmov(pidfile_name,hostname);
|
||||
strmov(strcend(pidfile_name,'.'),".pid"); // Add extension
|
||||
#ifdef DEMO_VERSION
|
||||
strcat(server_version,"-demo");
|
||||
#endif
|
||||
#ifdef SHAREWARE_VERSION
|
||||
strcat(server_version,"-shareware");
|
||||
#endif
|
||||
if (gethostname(glob_hostname,sizeof(glob_hostname)-4) < 0)
|
||||
strmov(glob_hostname,"mysql");
|
||||
#ifndef DBUG_OFF
|
||||
strcat(server_version,"-debug");
|
||||
#endif
|
||||
strcat(server_version,"-library-ver");
|
||||
#ifdef _CUSTOMSTARTUPCONFIG_
|
||||
if (_cust_check_startup())
|
||||
{
|
||||
/* _cust_check_startup will report startup failure error */
|
||||
exit( 1 );
|
||||
}
|
||||
#endif
|
||||
strcat(server_version,"-embedded");
|
||||
load_defaults("my", groups, argcp, argvp);
|
||||
defaults_argv=*argvp;
|
||||
mysql_tmpdir=getenv("TMPDIR"); /* Use this if possible */
|
||||
#ifdef __WIN__
|
||||
#if defined( __WIN__) || defined(OS2)
|
||||
if (!mysql_tmpdir)
|
||||
mysql_tmpdir=getenv("TEMP");
|
||||
if (!mysql_tmpdir)
|
||||
mysql_tmpdir=getenv("TMP");
|
||||
#endif
|
||||
if (!mysql_tmpdir || !mysql_tmpdir[0])
|
||||
mysql_tmpdir=strdup((char*) P_tmpdir);
|
||||
mysql_tmpdir=(char*) P_tmpdir; /* purecov: inspected */
|
||||
set_options();
|
||||
get_options(*argcp, *argvp);
|
||||
|
||||
|
@ -427,23 +408,20 @@ void mysql_server_init(int argc, const char **argv, const char **groups)
|
|||
(void) pthread_cond_init(&COND_slave_start, NULL);
|
||||
|
||||
if (set_default_charset_by_name(default_charset, MYF(MY_WME)))
|
||||
unireg_abort(1);
|
||||
{
|
||||
mysql_server_end();
|
||||
return 1;
|
||||
}
|
||||
charsets_list = list_charsets(MYF(MY_COMPILED_SETS|MY_CONFIG_SETS));
|
||||
|
||||
|
||||
if (!(opt_specialflag & SPECIAL_NO_PRIOR))
|
||||
my_pthread_setprio(pthread_self(),CONNECT_PRIOR);
|
||||
/* Parameter for threads created for connections */
|
||||
(void) pthread_attr_init(&connection_attrib);
|
||||
(void) pthread_attr_setdetachstate(&connection_attrib,
|
||||
PTHREAD_CREATE_DETACHED);
|
||||
pthread_attr_setstacksize(&connection_attrib,thread_stack);
|
||||
|
||||
if (!(opt_specialflag & SPECIAL_NO_PRIOR))
|
||||
my_pthread_attr_setprio(&connection_attrib,WAIT_PRIOR);
|
||||
pthread_attr_setscope(&connection_attrib, PTHREAD_SCOPE_SYSTEM);
|
||||
|
||||
#ifdef SET_RLIMIT_NOFILE
|
||||
#if defined( SET_RLIMIT_NOFILE) || defined( OS2)
|
||||
/* connections and databases neads lots of files */
|
||||
{
|
||||
uint wanted_files=10+(uint) max(max_connections*5,
|
||||
|
@ -468,64 +446,57 @@ void mysql_server_init(int argc, const char **argv, const char **groups)
|
|||
#ifdef USE_REGEX
|
||||
regex_init();
|
||||
#endif
|
||||
select_thread=pthread_self();
|
||||
select_thread_in_use=1;
|
||||
if (use_temp_pool && bitmap_init(&temp_pool,1024))
|
||||
{
|
||||
mysql_server_end();
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
** We have enough space for fiddling with the argv, continue
|
||||
*/
|
||||
umask(((~my_umask) & 0666));
|
||||
// strcpy(mysql_real_data_home, "/usr/local");
|
||||
//if (my_setwd(mysql_real_data_home,MYF(MY_WME)))
|
||||
//{
|
||||
// unireg_abort(1); /* purecov: inspected */
|
||||
//}
|
||||
//mysql_data_home[0]=FN_CURLIB; // all paths are relative from here
|
||||
//mysql_data_home[1]=0;
|
||||
|
||||
strcpy(get_mysql_data_home(), mysql_real_data_home);
|
||||
|
||||
//server_init();
|
||||
table_cache_init();
|
||||
hostname_cache_init();
|
||||
sql_cache_init();
|
||||
randominit(&sql_rand,(ulong) start_time,(ulong) start_time/2);
|
||||
reset_floating_point_exceptions();
|
||||
init_thr_lock();
|
||||
init_slave_list();
|
||||
|
||||
/* Setup log files */
|
||||
if (opt_log)
|
||||
open_log(&mysql_log, hostname, opt_logname, ".log", LOG_NORMAL);
|
||||
open_log(&mysql_log, glob_hostname, opt_logname, ".log", LOG_NORMAL);
|
||||
if (opt_update_log)
|
||||
open_log(&mysql_update_log, hostname, opt_update_logname, "",
|
||||
{
|
||||
open_log(&mysql_update_log, glob_hostname, opt_update_logname, "",
|
||||
LOG_NEW);
|
||||
using_update_log=1;
|
||||
}
|
||||
if (opt_bin_log)
|
||||
{
|
||||
if(server_id)
|
||||
{
|
||||
if (!opt_bin_logname)
|
||||
{
|
||||
char tmp[FN_REFLEN];
|
||||
strnmov(tmp,hostname,FN_REFLEN-5);
|
||||
strmov(strcend(tmp,'.'),"-bin");
|
||||
opt_bin_logname=my_strdup(tmp,MYF(MY_WME));
|
||||
}
|
||||
mysql_bin_log.set_index_file_name(opt_binlog_index_name);
|
||||
open_log(&mysql_bin_log, hostname, opt_bin_logname, "-bin",
|
||||
LOG_BIN);
|
||||
}
|
||||
else
|
||||
sql_print_error("Server id is not set - binary logging disabled");
|
||||
if (!opt_bin_logname)
|
||||
{
|
||||
char tmp[FN_REFLEN];
|
||||
strmake(tmp,glob_hostname,FN_REFLEN-5);
|
||||
strmov(strcend(tmp,'.'),"-bin");
|
||||
opt_bin_logname=my_strdup(tmp,MYF(MY_WME));
|
||||
}
|
||||
mysql_bin_log.set_index_file_name(opt_binlog_index_name);
|
||||
open_log(&mysql_bin_log, glob_hostname, opt_bin_logname, "-bin",
|
||||
LOG_BIN);
|
||||
using_update_log=1;
|
||||
}
|
||||
|
||||
if (opt_slow_log)
|
||||
open_log(&mysql_slow_log, hostname, opt_slow_logname, "-slow.log",
|
||||
open_log(&mysql_slow_log, glob_hostname, opt_slow_logname, "-slow.log",
|
||||
LOG_NORMAL);
|
||||
if (ha_init())
|
||||
{
|
||||
sql_print_error("Can't init databases");
|
||||
exit(1);
|
||||
}
|
||||
ha_key_cache();
|
||||
#ifdef HAVE_MLOCKALL
|
||||
if (locked_in_memory && !geteuid())
|
||||
{
|
||||
|
@ -556,120 +527,73 @@ void mysql_server_init(int argc, const char **argv, const char **groups)
|
|||
sql_print_error("Can't create thread-keys");
|
||||
exit(1);
|
||||
}
|
||||
//init_signals();
|
||||
opt_noacl = 1;
|
||||
opt_noacl = 1; // No permissions
|
||||
if (acl_init(opt_noacl))
|
||||
{
|
||||
select_thread_in_use=0;
|
||||
(void) pthread_kill(signal_thread,MYSQL_KILL_SIGNAL);
|
||||
exit(1);
|
||||
mysql_server_end();
|
||||
return 1;
|
||||
}
|
||||
if (!opt_noacl)
|
||||
(void) grant_init();
|
||||
|
||||
#ifdef HAVE_DLOPEN
|
||||
if (!opt_noacl)
|
||||
udf_init();
|
||||
#endif
|
||||
|
||||
if (opt_bootstrap)
|
||||
{
|
||||
int error=bootstrap(stdin);
|
||||
end_thr_alarm(); // Don't allow alarms
|
||||
unireg_abort(error ? 1 : 0);
|
||||
}
|
||||
if (opt_init_file)
|
||||
{
|
||||
if (read_init_file(opt_init_file))
|
||||
{
|
||||
end_thr_alarm(); // Don't allow alarms
|
||||
unireg_abort(1);
|
||||
}
|
||||
}
|
||||
(void) thr_setconcurrency(concurrency); // 10 by default
|
||||
|
||||
if (flush_time && flush_time != ~(ulong) 0L)
|
||||
if (
|
||||
#ifdef HAVE_BERKELEY_DB
|
||||
!berkeley_skip ||
|
||||
#endif
|
||||
(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");
|
||||
mysql_server_end();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
// slave thread
|
||||
if(master_host)
|
||||
{
|
||||
if(server_id)
|
||||
{
|
||||
pthread_t hThread;
|
||||
if(!opt_skip_slave_start &&
|
||||
pthread_create(&hThread, &connection_attrib, handle_slave, 0))
|
||||
sql_print_error("Warning: Can't create thread to handle slave");
|
||||
}
|
||||
else
|
||||
sql_print_error("Server id is not set, slave thread will not be started");
|
||||
}
|
||||
|
||||
//printf(ER(ER_READY),my_progname,server_version,"");
|
||||
//printf("%s initialized.\n", server_version);
|
||||
fflush(stdout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void mysql_server_end()
|
||||
{
|
||||
/* (void) pthread_attr_destroy(&connection_attrib); */
|
||||
|
||||
DBUG_PRINT("quit",("Exiting main thread"));
|
||||
|
||||
#ifdef EXTRA_DEBUG
|
||||
sql_print_error("Before Lock_thread_count");
|
||||
clean_up(0);
|
||||
#ifdef THREAD
|
||||
/* Don't call my_thread_end() if the application is using MY_INIT() */
|
||||
if (!org_my_init_done)
|
||||
my_thread_end();
|
||||
#endif
|
||||
(void) pthread_mutex_lock(&LOCK_thread_count);
|
||||
select_thread_in_use=0; // For close_connections
|
||||
(void) pthread_cond_broadcast(&COND_thread_count);
|
||||
(void) pthread_mutex_unlock(&LOCK_thread_count);
|
||||
#ifdef EXTRA_DEBUG
|
||||
sql_print_error("After lock_thread_count");
|
||||
#endif
|
||||
|
||||
// /* Wait until cleanup is done */
|
||||
// (void) pthread_mutex_lock(&LOCK_thread_count);
|
||||
// while (!ready_to_exit)
|
||||
// {
|
||||
// pthread_cond_wait(&COND_thread_count,&LOCK_thread_count);
|
||||
// }
|
||||
// (void) pthread_mutex_unlock(&LOCK_thread_count);
|
||||
unireg_end(0);
|
||||
my_thread_end();
|
||||
}
|
||||
|
||||
my_bool mysql_thread_init()
|
||||
{
|
||||
#ifdef THREAD
|
||||
return my_thread_init();
|
||||
return my_thread_init();
|
||||
#else
|
||||
return 0;
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
void mysql_thread_end()
|
||||
{
|
||||
#ifdef THREAD
|
||||
my_thread_end();
|
||||
my_thread_end();
|
||||
#endif
|
||||
}
|
||||
|
||||
void start_embedded_connection(NET * net)
|
||||
{
|
||||
start_embedded_conn1(net);
|
||||
start_embedded_conn1(net);
|
||||
}
|
||||
//====================================================================
|
||||
}
|
||||
int embedded_do_command(NET * net)
|
||||
|
||||
void end_embedded_connection(NET * net)
|
||||
{
|
||||
THD * thd = (THD *) net ->vio;
|
||||
do_command(thd);
|
||||
return 0;
|
||||
THD *thd = (THD *) net->vio->dest_thd;
|
||||
delete thd;
|
||||
}
|
||||
|
||||
|
||||
|
||||
} /* extern "C" */
|
||||
|
|
|
@ -15,15 +15,7 @@
|
|||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA */
|
||||
|
||||
#include <my_global.h>
|
||||
#if defined(__WIN__) || defined(_WIN32) || defined(_WIN64)
|
||||
#include <winsock.h>
|
||||
#include <odbcinst.h>
|
||||
#endif
|
||||
#include "mysql_embed.h"
|
||||
#include "mysql.h"
|
||||
#include "mysql_version.h"
|
||||
#include "mysqld_error.h"
|
||||
#include "embedded_priv.h"
|
||||
#include <my_sys.h>
|
||||
#include <mysys_err.h>
|
||||
#include <m_string.h>
|
||||
|
@ -51,9 +43,6 @@
|
|||
#ifdef HAVE_SYS_UN_H
|
||||
# include <sys/un.h>
|
||||
#endif
|
||||
#if defined(THREAD) && !defined(__WIN__)
|
||||
#include <my_pthread.h> /* because of signal() */
|
||||
#endif
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE -1
|
||||
#endif
|
||||
|
@ -74,12 +63,6 @@ my_string mysql_unix_port=0;
|
|||
#define closesocket(A) close(A)
|
||||
#endif
|
||||
|
||||
/* XXX: this is real ugly... */
|
||||
extern void start_embedded_connection(NET * net);
|
||||
extern void lib_connection_phase(NET *net, int phase);
|
||||
extern bool lib_dispatch_command(enum enum_server_command command, NET *net,
|
||||
const char *arg, ulong length);
|
||||
|
||||
static void mysql_once_init(void);
|
||||
static MYSQL_DATA *read_rows (MYSQL *mysql,MYSQL_FIELD *fields,
|
||||
uint field_count);
|
||||
|
@ -89,7 +72,6 @@ static void end_server(MYSQL *mysql);
|
|||
static void read_user_name(char *name);
|
||||
static void append_wild(char *to,char *end,const char *wild);
|
||||
static int send_file_to_server(MYSQL *mysql,const char *filename);
|
||||
static sig_handler pipe_sig_handler(int sig);
|
||||
static ulong mysql_sub_escape_string(CHARSET_INFO *charset_info, char *to,
|
||||
const char *from, ulong length);
|
||||
|
||||
|
@ -107,7 +89,7 @@ static MYSQL* spawn_init(MYSQL* parent, const char* host,
|
|||
** or packet is an error message
|
||||
*****************************************************************************/
|
||||
|
||||
static uint
|
||||
ulong
|
||||
net_safe_read(MYSQL *mysql)
|
||||
{
|
||||
NET *net= &mysql->net;
|
||||
|
@ -236,9 +218,9 @@ static void free_rows(MYSQL_DATA *cur)
|
|||
}
|
||||
|
||||
|
||||
static int
|
||||
int
|
||||
simple_command(MYSQL *mysql,enum enum_server_command command, const char *arg,
|
||||
uint length, my_bool skipp_check)
|
||||
ulong length, my_bool skipp_check)
|
||||
{
|
||||
NET *net= &mysql->net;
|
||||
int result= -1;
|
||||
|
@ -402,22 +384,6 @@ mysql_debug(const char *debug)
|
|||
#endif
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
** Close the server connection if we get a SIGPIPE
|
||||
ARGSUSED
|
||||
**************************************************************************/
|
||||
|
||||
static sig_handler
|
||||
pipe_sig_handler(int sig __attribute__((unused)))
|
||||
{
|
||||
DBUG_PRINT("info",("Hit by signal %d",sig));
|
||||
#ifdef DONT_REMEMBER_SIGNAL
|
||||
(void) signal(SIGPIPE,pipe_sig_handler);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
** Shut down connection
|
||||
**************************************************************************/
|
||||
|
@ -428,11 +394,7 @@ end_server(MYSQL *mysql)
|
|||
DBUG_ENTER("end_server");
|
||||
if (mysql->net.vio != 0)
|
||||
{
|
||||
init_sigpipe_variables
|
||||
DBUG_PRINT("info",("Net: %s", vio_description(mysql->net.vio)));
|
||||
set_sigpipe(mysql);
|
||||
vio_delete(mysql->net.vio);
|
||||
reset_sigpipe(mysql);
|
||||
end_embedded_connection(&mysql->net);
|
||||
mysql->net.vio= 0; /* Marker */
|
||||
}
|
||||
net_end(&mysql->net);
|
||||
|
@ -738,7 +700,7 @@ read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row, ulong *lengths)
|
|||
ulong pkt_len,len;
|
||||
uchar *pos,*prev_pos;
|
||||
|
||||
if ((pkt_len=(uint) net_safe_read(mysql)) == packet_error)
|
||||
if ((pkt_len=net_safe_read(mysql)) == packet_error)
|
||||
return -1;
|
||||
if (pkt_len == 1 && mysql->net.read_pos[0] == 254)
|
||||
return 1; /* End of data */
|
||||
|
@ -766,301 +728,6 @@ read_one_row(MYSQL *mysql,uint fields,MYSQL_ROW row, ulong *lengths)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* perform query on master */
|
||||
int STDCALL mysql_master_query(MYSQL *mysql, const char *q,
|
||||
unsigned int length)
|
||||
{
|
||||
if(mysql_master_send_query(mysql, q, length))
|
||||
return 1;
|
||||
return mysql_read_query_result(mysql);
|
||||
}
|
||||
|
||||
int STDCALL mysql_master_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned int length)
|
||||
{
|
||||
MYSQL*master = mysql->master;
|
||||
if (!length)
|
||||
length = strlen(q);
|
||||
if (!master->net.vio && !mysql_real_connect(master,0,0,0,0,0,0,0))
|
||||
return 1;
|
||||
mysql->last_used_con = master;
|
||||
return simple_command(master, COM_QUERY, q, length, 1);
|
||||
}
|
||||
|
||||
|
||||
/* perform query on slave */
|
||||
int STDCALL mysql_slave_query(MYSQL *mysql, const char *q,
|
||||
unsigned int length)
|
||||
{
|
||||
if(mysql_slave_send_query(mysql, q, length))
|
||||
return 1;
|
||||
return mysql_read_query_result(mysql);
|
||||
}
|
||||
|
||||
int STDCALL mysql_slave_send_query(MYSQL *mysql, const char *q,
|
||||
unsigned int length)
|
||||
{
|
||||
MYSQL* last_used_slave, *slave_to_use = 0;
|
||||
|
||||
if((last_used_slave = mysql->last_used_slave))
|
||||
slave_to_use = last_used_slave->next_slave;
|
||||
else
|
||||
slave_to_use = mysql->next_slave;
|
||||
/* next_slave is always safe to use - we have a circular list of slaves
|
||||
if there are no slaves, mysql->next_slave == mysql
|
||||
*/
|
||||
mysql->last_used_con = mysql->last_used_slave = slave_to_use;
|
||||
if(!length)
|
||||
length = strlen(q);
|
||||
if(!slave_to_use->net.vio && !mysql_real_connect(slave_to_use, 0,0,0,
|
||||
0,0,0,0))
|
||||
return 1;
|
||||
return simple_command(slave_to_use, COM_QUERY, q, length, 1);
|
||||
}
|
||||
|
||||
|
||||
/* enable/disable parsing of all queries to decide
|
||||
if they go on master or slave */
|
||||
void STDCALL mysql_enable_rpl_parse(MYSQL* mysql)
|
||||
{
|
||||
mysql->options.rpl_parse = 1;
|
||||
}
|
||||
|
||||
void STDCALL mysql_disable_rpl_parse(MYSQL* mysql)
|
||||
{
|
||||
mysql->options.rpl_parse = 0;
|
||||
}
|
||||
|
||||
/* get the value of the parse flag */
|
||||
int STDCALL mysql_rpl_parse_enabled(MYSQL* mysql)
|
||||
{
|
||||
return mysql->options.rpl_parse;
|
||||
}
|
||||
|
||||
/* enable/disable reads from master */
|
||||
void STDCALL mysql_enable_reads_from_master(MYSQL* mysql)
|
||||
{
|
||||
mysql->options.no_master_reads = 0;
|
||||
}
|
||||
|
||||
void STDCALL mysql_disable_reads_from_master(MYSQL* mysql)
|
||||
{
|
||||
mysql->options.no_master_reads = 1;
|
||||
}
|
||||
|
||||
/* get the value of the master read flag */
|
||||
int STDCALL mysql_reads_from_master_enabled(MYSQL* mysql)
|
||||
{
|
||||
return !(mysql->options.no_master_reads);
|
||||
}
|
||||
|
||||
/* We may get an error while doing replication internals.
|
||||
In this case, we add a special explanation to the original
|
||||
error
|
||||
*/
|
||||
static inline void expand_error(MYSQL* mysql, int error)
|
||||
{
|
||||
char tmp[MYSQL_ERRMSG_SIZE];
|
||||
char* p, *tmp_end;
|
||||
tmp_end = strnmov(tmp, mysql->net.last_error, MYSQL_ERRMSG_SIZE);
|
||||
p = strnmov(mysql->net.last_error, ER(error), MYSQL_ERRMSG_SIZE);
|
||||
memcpy(p, tmp, tmp_end - tmp);
|
||||
mysql->net.last_errno = error;
|
||||
}
|
||||
|
||||
/* This function assumes we have just called SHOW SLAVE STATUS and have
|
||||
read the given result and row
|
||||
*/
|
||||
static inline int get_master(MYSQL* mysql, MYSQL_RES* res, MYSQL_ROW row)
|
||||
{
|
||||
MYSQL* master;
|
||||
if(mysql_num_fields(res) < 3)
|
||||
return 1; /* safety */
|
||||
|
||||
/* use the same username and password as the original connection */
|
||||
if(!(master = spawn_init(mysql, row[0], atoi(row[2]), 0, 0)))
|
||||
return 1;
|
||||
mysql->master = master;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* assuming we already know that mysql points to a master connection,
|
||||
retrieve all the slaves
|
||||
*/
|
||||
static inline int get_slaves_from_master(MYSQL* mysql)
|
||||
{
|
||||
MYSQL_RES* res = 0;
|
||||
MYSQL_ROW row;
|
||||
int error = 1;
|
||||
int has_auth_info;
|
||||
if (!mysql->net.vio && !mysql_real_connect(mysql,0,0,0,0,0,0,0))
|
||||
{
|
||||
expand_error(mysql, CR_PROBE_MASTER_CONNECT);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (mysql_query(mysql, "SHOW SLAVE HOSTS") ||
|
||||
!(res = mysql_store_result(mysql)))
|
||||
{
|
||||
expand_error(mysql, CR_PROBE_SLAVE_HOSTS);
|
||||
return 1;
|
||||
}
|
||||
|
||||
switch (mysql_num_fields(res))
|
||||
{
|
||||
case 3: has_auth_info = 0; break;
|
||||
case 5: has_auth_info = 1; break;
|
||||
default:
|
||||
goto err;
|
||||
}
|
||||
|
||||
while ((row = mysql_fetch_row(res)))
|
||||
{
|
||||
MYSQL* slave;
|
||||
const char* tmp_user, *tmp_pass;
|
||||
|
||||
if (has_auth_info)
|
||||
{
|
||||
tmp_user = row[3];
|
||||
tmp_pass = row[4];
|
||||
}
|
||||
else
|
||||
{
|
||||
tmp_user = mysql->user;
|
||||
tmp_pass = mysql->passwd;
|
||||
}
|
||||
|
||||
if(!(slave = spawn_init(mysql, row[1], atoi(row[2]),
|
||||
tmp_user, tmp_pass)))
|
||||
goto err;
|
||||
|
||||
/* Now add slave into the circular linked list */
|
||||
slave->next_slave = mysql->next_slave;
|
||||
mysql->next_slave = slave;
|
||||
}
|
||||
error = 0;
|
||||
err:
|
||||
if(res)
|
||||
mysql_free_result(res);
|
||||
return error;
|
||||
}
|
||||
|
||||
int STDCALL mysql_rpl_probe(MYSQL* mysql)
|
||||
{
|
||||
MYSQL_RES* res = 0;
|
||||
MYSQL_ROW row;
|
||||
int error = 1;
|
||||
/* first determine the replication role of the server we connected to
|
||||
the most reliable way to do this is to run SHOW SLAVE STATUS and see
|
||||
if we have a non-empty master host. This is still not fool-proof -
|
||||
it is not a sin to have a master that has a dormant slave thread with
|
||||
a non-empty master host. However, it is more reliable to check
|
||||
for empty master than whether the slave thread is actually running
|
||||
*/
|
||||
if (mysql_query(mysql, "SHOW SLAVE STATUS") ||
|
||||
!(res = mysql_store_result(mysql)))
|
||||
{
|
||||
expand_error(mysql, CR_PROBE_SLAVE_STATUS);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!(row = mysql_fetch_row(res)))
|
||||
goto err;
|
||||
|
||||
/* check master host for emptiness/NULL */
|
||||
if (row[0] && *(row[0]))
|
||||
{
|
||||
/* this is a slave, ask it for the master */
|
||||
if (get_master(mysql, res, row) || get_slaves_from_master(mysql))
|
||||
goto err;
|
||||
}
|
||||
else
|
||||
{
|
||||
mysql->master = mysql;
|
||||
if (get_slaves_from_master(mysql))
|
||||
goto err;
|
||||
}
|
||||
|
||||
error = 0;
|
||||
err:
|
||||
if(res)
|
||||
mysql_free_result(res);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
||||
/* make a not so fool-proof decision on where the query should go, to
|
||||
the master or the slave. Ideally the user should always make this
|
||||
decision himself with mysql_master_query() or mysql_slave_query().
|
||||
However, to be able to more easily port the old code, we support the
|
||||
option of an educated guess - this should work for most applications,
|
||||
however, it may make the wrong decision in some particular cases. If
|
||||
that happens, the user would have to change the code to call
|
||||
mysql_master_query() or mysql_slave_query() explicitly in the place
|
||||
where we have made the wrong decision
|
||||
*/
|
||||
enum mysql_rpl_type
|
||||
STDCALL mysql_rpl_query_type(const char* q, int len)
|
||||
{
|
||||
const char* q_end;
|
||||
q_end = (len) ? q + len : strend(q);
|
||||
for(; q < q_end; ++q)
|
||||
{
|
||||
char c;
|
||||
if(isalpha(c=*q))
|
||||
switch(tolower(c))
|
||||
{
|
||||
case 'i': /* insert */
|
||||
case 'u': /* update or unlock tables */
|
||||
case 'l': /* lock tables or load data infile */
|
||||
case 'd': /* drop or delete */
|
||||
case 'a': /* alter */
|
||||
return MYSQL_RPL_MASTER;
|
||||
case 'c': /* create or check */
|
||||
return tolower(q[1]) == 'h' ? MYSQL_RPL_ADMIN : MYSQL_RPL_MASTER ;
|
||||
case 's': /* select or show */
|
||||
return tolower(q[1] == 'h') ? MYSQL_RPL_ADMIN : MYSQL_RPL_SLAVE;
|
||||
case 'f': /* flush */
|
||||
case 'r': /* repair */
|
||||
case 'g': /* grant */
|
||||
return MYSQL_RPL_ADMIN;
|
||||
default:
|
||||
return MYSQL_RPL_SLAVE;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static MYSQL* spawn_init(MYSQL* parent, const char* host,
|
||||
unsigned int port,
|
||||
const char* user,
|
||||
const char* passwd)
|
||||
{
|
||||
MYSQL* child;
|
||||
if (!(child = mysql_init(0)))
|
||||
return 0;
|
||||
|
||||
child->options.user = my_strdup((user) ? user :
|
||||
(parent->user ? parent->user :
|
||||
parent->options.user), MYF(0));
|
||||
child->options.password = my_strdup((passwd) ? passwd : (parent->passwd ?
|
||||
parent->passwd :
|
||||
parent->options.password), MYF(0));
|
||||
child->options.port = port;
|
||||
child->options.host = my_strdup((host) ? host : (parent->host ?
|
||||
parent->host :
|
||||
parent->options.host), MYF(0));
|
||||
if(parent->db)
|
||||
child->options.db = my_strdup(parent->db, MYF(0));
|
||||
else if(parent->options.db)
|
||||
child->options.db = my_strdup(parent->options.db, MYF(0));
|
||||
|
||||
child->options.rpl_parse = child->options.rpl_probe = child->rpl_pivot = 0;
|
||||
|
||||
return child;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
** Init MySQL structure or allocate one
|
||||
****************************************************************************/
|
||||
|
@ -1307,7 +974,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
|
|||
mysql->db=my_strdup(db,MYF(MY_WME));
|
||||
db=0;
|
||||
}
|
||||
if (my_net_write(net,buff,(uint) (end-buff)) || net_flush(net))
|
||||
if (my_net_write(net,buff,(ulong) (end-buff)) || net_flush(net))
|
||||
goto error;
|
||||
|
||||
lib_connection_phase(net,2);
|
||||
|
@ -1364,7 +1031,7 @@ my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
|
|||
pos=scramble(pos, mysql->scramble_buff, passwd,
|
||||
(my_bool) (mysql->protocol_version == 9));
|
||||
pos=strmov(pos+1,db ? db : "");
|
||||
if (simple_command(mysql,COM_CHANGE_USER, buff,(uint) (pos-buff),0))
|
||||
if (simple_command(mysql,COM_CHANGE_USER, buff,(ulong) (pos-buff),0))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));
|
||||
|
@ -1389,7 +1056,7 @@ mysql_select_db(MYSQL *mysql, const char *db)
|
|||
DBUG_ENTER("mysql_select_db");
|
||||
DBUG_PRINT("enter",("db: '%s'",db));
|
||||
|
||||
if ((error=simple_command(mysql,COM_INIT_DB,db,(uint) strlen(db),0)))
|
||||
if ((error=simple_command(mysql,COM_INIT_DB,db,(ulong) strlen(db),0)))
|
||||
DBUG_RETURN(error);
|
||||
my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));
|
||||
mysql->db=my_strdup(db,MYF(MY_WME));
|
||||
|
@ -1452,11 +1119,11 @@ mysql_close(MYSQL *mysql)
|
|||
int STDCALL
|
||||
mysql_query(MYSQL *mysql, const char *query)
|
||||
{
|
||||
return mysql_real_query(mysql,query, (uint) strlen(query));
|
||||
return mysql_real_query(mysql,query, (ulong) strlen(query));
|
||||
}
|
||||
|
||||
int STDCALL
|
||||
mysql_send_query(MYSQL* mysql, const char* query, uint length)
|
||||
mysql_send_query(MYSQL* mysql, const char* query, ulong length)
|
||||
{
|
||||
return simple_command(mysql, COM_QUERY, query, length, 1);
|
||||
}
|
||||
|
@ -1512,7 +1179,7 @@ get_info:
|
|||
}
|
||||
|
||||
int STDCALL
|
||||
mysql_real_query(MYSQL *mysql, const char *query, uint length)
|
||||
mysql_real_query(MYSQL *mysql, const char *query, ulong length)
|
||||
{
|
||||
DBUG_ENTER("mysql_real_query");
|
||||
DBUG_PRINT("enter",("handle: %lx",mysql));
|
||||
|
@ -1910,7 +1577,7 @@ mysql_create_db(MYSQL *mysql, const char *db)
|
|||
{
|
||||
DBUG_ENTER("mysql_createdb");
|
||||
DBUG_PRINT("enter",("db: %s",db));
|
||||
DBUG_RETURN(simple_command(mysql,COM_CREATE_DB,db, (uint) strlen(db),0));
|
||||
DBUG_RETURN(simple_command(mysql,COM_CREATE_DB,db, (ulong) strlen(db),0));
|
||||
}
|
||||
|
||||
|
||||
|
@ -1919,7 +1586,7 @@ mysql_drop_db(MYSQL *mysql, const char *db)
|
|||
{
|
||||
DBUG_ENTER("mysql_drop_db");
|
||||
DBUG_PRINT("enter",("db: %s",db));
|
||||
DBUG_RETURN(simple_command(mysql,COM_DROP_DB,db,(uint) strlen(db),0));
|
||||
DBUG_RETURN(simple_command(mysql,COM_DROP_DB,db,(ulong) strlen(db),0));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -173,7 +173,7 @@ int do_boolean(ALL_IN_ONE *aio, uint nested __attribute__((unused)),
|
|||
aio->key_root);
|
||||
else
|
||||
r=_mi_search(aio->info, aio->keyinfo, aio->info->lastkey,
|
||||
aio->info->lastkey_length, SEARCH_BIGGER,
|
||||
USE_WHOLE_KEY, SEARCH_BIGGER,
|
||||
aio->key_root);
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -126,7 +126,7 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio)
|
|||
aio->key_root);
|
||||
else
|
||||
r=_mi_search(aio->info, aio->keyinfo, aio->info->lastkey,
|
||||
aio->info->lastkey_length, SEARCH_BIGGER,
|
||||
USE_WHOLE_KEY, SEARCH_BIGGER,
|
||||
aio->key_root);
|
||||
}
|
||||
if(doc_cnt) {
|
||||
|
|
|
@ -34,7 +34,7 @@ FT_DOCLIST *ft_init_search(void *info, uint keynr, byte *query,
|
|||
/* black magic ON */
|
||||
if ((int) (keynr = _mi_check_index((MI_INFO *)info,keynr)) < 0)
|
||||
return NULL;
|
||||
if (_mi_readinfo((MI_INFO *)info,F_RDLCK,1))
|
||||
if (fast_mi_readinfo((MI_INFO *) info))
|
||||
return NULL;
|
||||
/* black magic OFF */
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ int mi_is_changed(MI_INFO *info)
|
|||
{
|
||||
int result;
|
||||
DBUG_ENTER("mi_is_changed");
|
||||
if (_mi_readinfo(info,F_RDLCK,1))
|
||||
if (fast_mi_readinfo(info))
|
||||
DBUG_RETURN(-1);
|
||||
VOID(_mi_writeinfo(info,0));
|
||||
result=(int) info->data_changed;
|
||||
|
|
|
@ -231,7 +231,7 @@ wrong:
|
|||
static int check_k_link(MI_CHECK *param, register MI_INFO *info, uint nr)
|
||||
{
|
||||
my_off_t next_link;
|
||||
uint block_size=(nr+1)*MI_KEY_BLOCK_LENGTH;
|
||||
uint block_size=(nr+1)*MI_MIN_KEY_BLOCK_LENGTH;
|
||||
ha_rows records;
|
||||
char llbuff[21],*buff;
|
||||
DBUG_ENTER("check_k_link");
|
||||
|
@ -1205,8 +1205,6 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info,
|
|||
param->glob_crc=0;
|
||||
if (param->testflag & T_CALC_CHECKSUM)
|
||||
param->calc_checksum=1;
|
||||
if (!rep_quick)
|
||||
share->state.checksum=0;
|
||||
|
||||
info->update= (short) (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);
|
||||
for (i=0 ; i < info->s->base.keys ; i++)
|
||||
|
@ -1301,9 +1299,9 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info,
|
|||
else
|
||||
{
|
||||
info->state->data_file_length=sort_info->max_pos;
|
||||
if (param->testflag & T_CALC_CHECKSUM)
|
||||
share->state.checksum=param->glob_crc;
|
||||
}
|
||||
if (param->testflag & T_CALC_CHECKSUM)
|
||||
share->state.checksum=param->glob_crc;
|
||||
|
||||
if (!(param->testflag & T_SILENT))
|
||||
{
|
||||
|
@ -1886,8 +1884,6 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
|
|||
param->glob_crc=0;
|
||||
if (param->testflag & T_CALC_CHECKSUM)
|
||||
param->calc_checksum=1;
|
||||
if (! rep_quick)
|
||||
share->state.checksum=0;
|
||||
|
||||
rec_per_key_part= param->rec_per_key_part;
|
||||
for (sort_info->key=0 ; sort_info->key < share->base.keys ;
|
||||
|
@ -2018,7 +2014,7 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
|
|||
"Can't change size of datafile, error: %d",
|
||||
my_errno);
|
||||
}
|
||||
else if (param->testflag & T_CALC_CHECKSUM)
|
||||
if (param->testflag & T_CALC_CHECKSUM)
|
||||
share->state.checksum=param->glob_crc;
|
||||
|
||||
if (my_chsize(share->kfile,info->state->key_file_length,MYF(0)))
|
||||
|
@ -2115,6 +2111,7 @@ static int sort_key_read(SORT_INFO *sort_info, void *key)
|
|||
DBUG_RETURN(sort_write_record(sort_info));
|
||||
} /* sort_key_read */
|
||||
|
||||
|
||||
static int sort_ft_key_read(SORT_INFO *sort_info, void *key)
|
||||
{
|
||||
int error;
|
||||
|
@ -2540,7 +2537,7 @@ int sort_write_record(SORT_INFO *sort_info)
|
|||
DBUG_RETURN(1);
|
||||
}
|
||||
sort_info->filepos+=share->base.pack_reclength;
|
||||
info->s->state.checksum+=mi_static_checksum(info, sort_info->record);
|
||||
/* sort_info->param->glob_crc+=mi_static_checksum(info, sort_info->record); */
|
||||
break;
|
||||
case DYNAMIC_RECORD:
|
||||
if (! info->blobs)
|
||||
|
@ -2564,7 +2561,7 @@ int sort_write_record(SORT_INFO *sort_info)
|
|||
}
|
||||
info->checksum=mi_checksum(info,sort_info->record);
|
||||
reclength=_mi_rec_pack(info,from,sort_info->record);
|
||||
info->s->state.checksum+=info->checksum;
|
||||
/* sort_info->param->glob_crc+=info->checksum; */
|
||||
block_length=reclength+ 3 + test(reclength >= (65520-3));
|
||||
if (block_length < share->base.min_block_length)
|
||||
block_length=share->base.min_block_length;
|
||||
|
@ -2578,7 +2575,7 @@ int sort_write_record(SORT_INFO *sort_info)
|
|||
DBUG_RETURN(1);
|
||||
}
|
||||
sort_info->filepos+=block_length;
|
||||
info->s->state.checksum+=info->checksum;
|
||||
/* sort_info->param->glob_crc+=info->checksum; */
|
||||
break;
|
||||
case COMPRESSED_RECORD:
|
||||
reclength=info->packed_length;
|
||||
|
@ -2591,7 +2588,7 @@ int sort_write_record(SORT_INFO *sort_info)
|
|||
mi_check_print_error(param,"%d when writing to datafile",my_errno);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
info->s->state.checksum+=info->checksum;
|
||||
/* sort_info->param->glob_crc+=info->checksum; */
|
||||
sort_info->filepos+=reclength+length;
|
||||
break;
|
||||
}
|
||||
|
@ -2808,9 +2805,9 @@ static int sort_delete_record(MI_CHECK *param)
|
|||
DBUG_RETURN(1);
|
||||
}
|
||||
}
|
||||
if (info->s->calc_checksum)
|
||||
info->s->state.checksum-=(*info->s->calc_checksum)(info,
|
||||
sort_info->record);
|
||||
if (param->calc_checksum)
|
||||
param->glob_crc-=(*info->s->calc_checksum)(info,
|
||||
sort_info->record);
|
||||
}
|
||||
error=flush_io_cache(&info->rec_cache) || (*info->s->delete_record)(info);
|
||||
info->dfile=old_file; /* restore actual value */
|
||||
|
|
|
@ -227,8 +227,8 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
share.state.key_del=key_del;
|
||||
if (uniques)
|
||||
{
|
||||
max_key_block_length= MI_KEY_BLOCK_LENGTH;
|
||||
max_key_length= MI_UNIQUE_HASH_LENGTH;
|
||||
max_key_block_length= myisam_block_size;
|
||||
max_key_length= MI_UNIQUE_HASH_LENGTH;
|
||||
}
|
||||
|
||||
for (i=0, keydef=keydefs ; i < keys ; i++ , keydef++)
|
||||
|
@ -370,7 +370,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
share.state.rec_per_key_part[key_segs-1]=1L;
|
||||
length+=key_length;
|
||||
keydef->block_length= MI_BLOCK_SIZE(length,pointer,MI_MAX_KEYPTR_SIZE);
|
||||
if (keydef->block_length/MI_KEY_BLOCK_LENGTH > MI_MAX_KEY_BLOCK_SIZE)
|
||||
if (keydef->block_length > MI_MAX_KEY_BLOCK_LENGTH)
|
||||
{
|
||||
my_errno=HA_WRONG_CREATE_OPTION;
|
||||
goto err;
|
||||
|
@ -386,7 +386,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
(length*2)))*
|
||||
(ulong) keydef->block_length;
|
||||
}
|
||||
for (i=max_key_block_length/MI_KEY_BLOCK_LENGTH ; i-- ; )
|
||||
for (i=max_key_block_length/MI_MIN_KEY_BLOCK_LENGTH ; i-- ; )
|
||||
key_del[i]=HA_OFFSET_ERROR;
|
||||
|
||||
unique_key_parts=0;
|
||||
|
@ -401,7 +401,8 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
key_segs+=uniques; /* Each unique has 1 key seg */
|
||||
|
||||
base_pos=(MI_STATE_INFO_SIZE + keys * MI_STATE_KEY_SIZE +
|
||||
max_key_block_length/MI_KEY_BLOCK_LENGTH*MI_STATE_KEYBLOCK_SIZE+
|
||||
max_key_block_length/MI_MIN_KEY_BLOCK_LENGTH*
|
||||
MI_STATE_KEYBLOCK_SIZE+
|
||||
key_segs*MI_STATE_KEYSEG_SIZE);
|
||||
info_length=base_pos+(uint) (MI_BASE_INFO_SIZE+
|
||||
keys * MI_KEYDEF_SIZE+
|
||||
|
@ -420,7 +421,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
mi_int2store(share.state.header.base_pos,base_pos);
|
||||
share.state.header.language= (ci->language ?
|
||||
ci->language : MY_CHARSET_CURRENT);
|
||||
share.state.header.max_block_size=max_key_block_length/MI_KEY_BLOCK_LENGTH;
|
||||
share.state.header.max_block_size=max_key_block_length/MI_MIN_KEY_BLOCK_LENGTH;
|
||||
|
||||
share.state.dellink = HA_OFFSET_ERROR;
|
||||
share.state.process= (ulong) getpid();
|
||||
|
@ -433,7 +434,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
share.base.rec_reflength=pointer;
|
||||
share.base.key_reflength=
|
||||
mi_get_pointer_length((tot_length + max_key_block_length * keys *
|
||||
MI_INDEX_BLOCK_MARGIN) / MI_KEY_BLOCK_LENGTH,
|
||||
MI_INDEX_BLOCK_MARGIN) / MI_MIN_KEY_BLOCK_LENGTH,
|
||||
3);
|
||||
share.base.keys= share.state.header.keys = keys;
|
||||
share.state.header.uniques= uniques;
|
||||
|
@ -575,7 +576,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
|||
{
|
||||
tmp_keydef.keysegs=1;
|
||||
tmp_keydef.flag= HA_UNIQUE_CHECK;
|
||||
tmp_keydef.block_length= MI_KEY_BLOCK_LENGTH;
|
||||
tmp_keydef.block_length= myisam_block_size;
|
||||
tmp_keydef.keylength= MI_UNIQUE_HASH_LENGTH + pointer;
|
||||
tmp_keydef.minlength=tmp_keydef.maxlength=tmp_keydef.keylength;
|
||||
tmp_keyseg.type= MI_UNIQUE_HASH_TYPE;
|
||||
|
|
|
@ -196,7 +196,8 @@ static int d_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
|||
DBUG_ENTER("d_search");
|
||||
DBUG_DUMP("page",(byte*) anc_buff,mi_getint(anc_buff));
|
||||
|
||||
flag=(*keyinfo->bin_search)(info,keyinfo,anc_buff,key,key_length,SEARCH_SAME,
|
||||
flag=(*keyinfo->bin_search)(info,keyinfo,anc_buff,key, USE_WHOLE_KEY,
|
||||
SEARCH_SAME,
|
||||
&keypos, lastkey, &last_key);
|
||||
if (flag == MI_FOUND_WRONG_KEY)
|
||||
{
|
||||
|
|
|
@ -43,7 +43,7 @@ int mi_delete_all_rows(MI_INFO *info)
|
|||
info->state->empty=info->state->key_empty=0;
|
||||
state->checksum=0;
|
||||
|
||||
for (i=share->base.max_key_block_length/MI_KEY_BLOCK_LENGTH ; i-- ; )
|
||||
for (i=share->base.max_key_block_length/MI_MIN_KEY_BLOCK_LENGTH ; i-- ; )
|
||||
state->key_del[i]= HA_OFFSET_ERROR;
|
||||
for (i=0 ; i < share->base.keys ; i++)
|
||||
state->key_root[i]= HA_OFFSET_ERROR;
|
||||
|
|
|
@ -1059,11 +1059,11 @@ int _mi_read_dynamic_record(MI_INFO *info, my_off_t filepos, byte *buf)
|
|||
} while (left_length);
|
||||
|
||||
info->update|= HA_STATE_AKTIV; /* We have a aktive record */
|
||||
VOID(_mi_writeinfo(info,0));
|
||||
fast_mi_writeinfo(info);
|
||||
DBUG_RETURN(_mi_rec_unpack(info,buf,info->rec_buff,block_info.rec_len) !=
|
||||
MY_FILE_ERROR ? 0 : -1);
|
||||
}
|
||||
VOID(_mi_writeinfo(info,0));
|
||||
fast_mi_writeinfo(info);
|
||||
DBUG_RETURN(-1); /* Wrong data to read */
|
||||
|
||||
panic:
|
||||
|
@ -1393,8 +1393,7 @@ int _mi_read_rnd_dynamic_record(MI_INFO *info, byte *buf,
|
|||
} while (left_len);
|
||||
|
||||
info->update|= HA_STATE_AKTIV | HA_STATE_KEY_CHANGED;
|
||||
if (share->r_locks == 0 && share->w_locks == 0)
|
||||
VOID(_mi_writeinfo(info,0));
|
||||
fast_mi_writeinfo(info);
|
||||
if (_mi_rec_unpack(info,buf,info->rec_buff,block_info.rec_len) !=
|
||||
MY_FILE_ERROR)
|
||||
DBUG_RETURN(0);
|
||||
|
|
|
@ -45,7 +45,7 @@ int mi_status(MI_INFO *info, register MI_ISAMINFO *x, uint flag)
|
|||
{
|
||||
pthread_mutex_lock(&share->intern_lock);
|
||||
VOID(_mi_readinfo(info,F_RDLCK,0));
|
||||
VOID(_mi_writeinfo(info,0));
|
||||
fast_mi_writeinfo(info);
|
||||
pthread_mutex_unlock(&share->intern_lock);
|
||||
}
|
||||
if (flag & HA_STATUS_VARIABLE)
|
||||
|
|
|
@ -346,7 +346,7 @@ err:
|
|||
|
||||
int _mi_read_key_record(MI_INFO *info, my_off_t filepos, byte *buf)
|
||||
{
|
||||
VOID(_mi_writeinfo(info,0));
|
||||
fast_mi_writeinfo(info);
|
||||
if (filepos != HA_OFFSET_ERROR)
|
||||
{
|
||||
if (info->lastinx >= 0)
|
||||
|
|
|
@ -50,6 +50,7 @@ int mi_lock_database(MI_INFO *info, int lock_type)
|
|||
count= --share->r_locks;
|
||||
else
|
||||
count= --share->w_locks;
|
||||
--share->tot_locks;
|
||||
if (info->lock_type == F_WRLCK && !share->w_locks &&
|
||||
!share->delay_key_write && flush_key_blocks(share->kfile,FLUSH_KEEP))
|
||||
{
|
||||
|
@ -153,6 +154,7 @@ int mi_lock_database(MI_INFO *info, int lock_type)
|
|||
}
|
||||
VOID(_mi_test_if_changed(info));
|
||||
share->r_locks++;
|
||||
share->tot_locks++;
|
||||
info->lock_type=lock_type;
|
||||
break;
|
||||
case F_WRLCK:
|
||||
|
@ -200,6 +202,7 @@ int mi_lock_database(MI_INFO *info, int lock_type)
|
|||
VOID(_mi_test_if_changed(info));
|
||||
info->lock_type=lock_type;
|
||||
share->w_locks++;
|
||||
share->tot_locks++;
|
||||
break;
|
||||
default:
|
||||
break; /* Impossible */
|
||||
|
@ -295,13 +298,12 @@ my_bool mi_check_status(void* param)
|
|||
|
||||
int _mi_readinfo(register MI_INFO *info, int lock_type, int check_keybuffer)
|
||||
{
|
||||
MYISAM_SHARE *share;
|
||||
DBUG_ENTER("_mi_readinfo");
|
||||
|
||||
share=info->s;
|
||||
if (info->lock_type == F_UNLCK)
|
||||
{
|
||||
if (!share->r_locks && !share->w_locks)
|
||||
MYISAM_SHARE *share=info->s;
|
||||
if (!share->tot_locks)
|
||||
{
|
||||
if ((info->tmp_lock_type=lock_type) != F_RDLCK)
|
||||
if (my_lock(share->kfile,lock_type,0L,F_TO_EOF,
|
||||
|
@ -339,7 +341,7 @@ int _mi_writeinfo(register MI_INFO *info, uint operation)
|
|||
DBUG_ENTER("_mi_writeinfo");
|
||||
|
||||
error=0;
|
||||
if (share->r_locks == 0 && share->w_locks == 0)
|
||||
if (share->tot_locks == 0)
|
||||
{
|
||||
olderror=my_errno; /* Remember last error */
|
||||
if (operation)
|
||||
|
|
|
@ -217,7 +217,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
|
|||
(mi_safe_mul(share->base.reclength,
|
||||
(ulonglong) 1 << (share->base.rec_reflength*8))-1);
|
||||
max_key_file_length=
|
||||
mi_safe_mul(MI_KEY_BLOCK_LENGTH,
|
||||
mi_safe_mul(MI_MIN_KEY_BLOCK_LENGTH,
|
||||
((ulonglong) 1 << (share->base.key_reflength*8))-1);
|
||||
#if SIZEOF_OFF_T == 4
|
||||
set_if_smaller(max_data_file_length, INT_MAX32);
|
||||
|
@ -913,7 +913,7 @@ char *mi_keydef_read(char *ptr, MI_KEYDEF *keydef)
|
|||
keydef->keylength = mi_uint2korr(ptr); ptr +=2;
|
||||
keydef->minlength = mi_uint2korr(ptr); ptr +=2;
|
||||
keydef->maxlength = mi_uint2korr(ptr); ptr +=2;
|
||||
keydef->block_size = keydef->block_length/MI_KEY_BLOCK_LENGTH-1;
|
||||
keydef->block_size = keydef->block_length/MI_MIN_KEY_BLOCK_LENGTH-1;
|
||||
keydef->underflow_block_length=keydef->block_length/3;
|
||||
keydef->version = 0; /* Not saved */
|
||||
return ptr;
|
||||
|
|
|
@ -64,9 +64,9 @@ int _mi_write_keypage(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
|||
#ifndef FAST /* Safety check */
|
||||
if (page < info->s->base.keystart ||
|
||||
page+keyinfo->block_length > info->state->key_file_length ||
|
||||
page & (myisam_block_size-1))
|
||||
(page & (MI_MIN_KEY_BLOCK_LENGTH-1)))
|
||||
{
|
||||
DBUG_PRINT("error",("Trying to write outside key region: %lu",
|
||||
DBUG_PRINT("error",("Trying to write inside key status region: %lu",
|
||||
(long) page));
|
||||
my_errno=EINVAL;
|
||||
return(-1);
|
||||
|
|
|
@ -45,7 +45,7 @@ ha_rows mi_records_in_range(MI_INFO *info, int inx, const byte *start_key,
|
|||
if ((inx = _mi_check_index(info,inx)) < 0)
|
||||
DBUG_RETURN(HA_POS_ERROR);
|
||||
|
||||
if (_mi_readinfo(info,F_RDLCK,1))
|
||||
if (fast_mi_readinfo(info))
|
||||
DBUG_RETURN(HA_POS_ERROR);
|
||||
info->update&= (HA_STATE_CHANGED+HA_STATE_ROW_CHANGED);
|
||||
if (info->s->concurrent_insert)
|
||||
|
@ -58,7 +58,7 @@ ha_rows mi_records_in_range(MI_INFO *info, int inx, const byte *start_key,
|
|||
info->state->records+ (ha_rows) 1);
|
||||
if (info->s->concurrent_insert)
|
||||
rw_unlock(&info->s->key_root_lock[inx]);
|
||||
VOID(_mi_writeinfo(info,0));
|
||||
fast_mi_writeinfo(info);
|
||||
if (start_pos == HA_POS_ERROR || end_pos == HA_POS_ERROR)
|
||||
DBUG_RETURN(HA_POS_ERROR);
|
||||
DBUG_PRINT("info",("records: %ld",(ulong) (end_pos-start_pos)));
|
||||
|
@ -72,7 +72,7 @@ ha_rows mi_records_in_range(MI_INFO *info, int inx, const byte *start_key,
|
|||
static ha_rows _mi_record_pos(MI_INFO *info, const byte *key, uint key_len,
|
||||
enum ha_rkey_function search_flag)
|
||||
{
|
||||
uint inx=(uint) info->lastinx;
|
||||
uint inx=(uint) info->lastinx, nextflag;
|
||||
MI_KEYDEF *keyinfo=info->s->keyinfo+inx;
|
||||
uchar *key_buff;
|
||||
double pos;
|
||||
|
@ -86,8 +86,12 @@ static ha_rows _mi_record_pos(MI_INFO *info, const byte *key, uint key_len,
|
|||
key_len=_mi_pack_key(info,inx,key_buff,(uchar*) key,key_len);
|
||||
DBUG_EXECUTE("key",_mi_print_key(DBUG_FILE,keyinfo->seg,
|
||||
(uchar*) key_buff,key_len););
|
||||
nextflag=myisam_read_vec[search_flag];
|
||||
if (!(nextflag & (SEARCH_FIND | SEARCH_NO_FIND | SEARCH_LAST)))
|
||||
key_len=USE_WHOLE_KEY;
|
||||
|
||||
pos=_mi_search_pos(info,keyinfo,key_buff,key_len,
|
||||
myisam_read_vec[search_flag] | SEARCH_SAVE_BUFF,
|
||||
nextflag | SEARCH_SAVE_BUFF,
|
||||
info->s->state.key_root[inx]);
|
||||
if (pos >= 0.0)
|
||||
{
|
||||
|
@ -145,9 +149,9 @@ static double _mi_search_pos(register MI_INFO *info,
|
|||
** Matches keynr+1
|
||||
*/
|
||||
offset=1.0; /* Matches keynr+1 */
|
||||
if (nextflag & SEARCH_FIND &&
|
||||
if ((nextflag & SEARCH_FIND) && nod_flag &&
|
||||
((keyinfo->flag & (HA_NOSAME | HA_NULL_PART)) != HA_NOSAME ||
|
||||
key_len) && nod_flag)
|
||||
key_len != USE_WHOLE_KEY))
|
||||
{
|
||||
/*
|
||||
** There may be identical keys in the tree. Try to match on of those.
|
||||
|
|
|
@ -27,7 +27,7 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len,
|
|||
{
|
||||
uchar *key_buff;
|
||||
MYISAM_SHARE *share=info->s;
|
||||
uint pack_key_length;
|
||||
uint pack_key_length, use_key_length, nextflag;
|
||||
DBUG_ENTER("mi_rkey");
|
||||
DBUG_PRINT("enter",("base: %lx inx: %d search_flag: %d",
|
||||
info,inx,search_flag));
|
||||
|
@ -55,11 +55,17 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len,
|
|||
bmove(key_buff,key,key_len);
|
||||
}
|
||||
|
||||
if (_mi_readinfo(info,F_RDLCK,1))
|
||||
if (fast_mi_readinfo(info))
|
||||
goto err;
|
||||
if (share->concurrent_insert)
|
||||
rw_rdlock(&share->key_root_lock[inx]);
|
||||
if (!_mi_search(info,info->s->keyinfo+inx,key_buff,pack_key_length,
|
||||
|
||||
nextflag=myisam_read_vec[search_flag];
|
||||
use_key_length=pack_key_length;
|
||||
if (!(nextflag & (SEARCH_FIND | SEARCH_NO_FIND | SEARCH_LAST)))
|
||||
use_key_length=USE_WHOLE_KEY;
|
||||
|
||||
if (!_mi_search(info,info->s->keyinfo+inx,key_buff,use_key_length,
|
||||
myisam_read_vec[search_flag],info->s->state.key_root[inx]))
|
||||
{
|
||||
while (info->lastpos >= info->state->data_file_length)
|
||||
|
|
|
@ -35,7 +35,7 @@ int mi_rnext(MI_INFO *info, byte *buf, int inx)
|
|||
if (info->lastpos == HA_OFFSET_ERROR && info->update & HA_STATE_PREV_FOUND)
|
||||
flag=0; /* Read first */
|
||||
|
||||
if (_mi_readinfo(info,F_RDLCK,1))
|
||||
if (fast_mi_readinfo(info))
|
||||
DBUG_RETURN(my_errno);
|
||||
if (info->s->concurrent_insert)
|
||||
rw_rdlock(&info->s->key_root_lock[inx]);
|
||||
|
@ -51,7 +51,7 @@ int mi_rnext(MI_INFO *info, byte *buf, int inx)
|
|||
info->s->state.key_root[inx]);
|
||||
else
|
||||
error=_mi_search(info,info->s->keyinfo+inx,info->lastkey,
|
||||
info->lastkey_length,flag, info->s->state.key_root[inx]);
|
||||
USE_WHOLE_KEY,flag, info->s->state.key_root[inx]);
|
||||
|
||||
if (!error)
|
||||
{
|
||||
|
|
|
@ -35,7 +35,7 @@ int mi_rnext_same(MI_INFO *info, byte *buf)
|
|||
DBUG_RETURN(my_errno=HA_ERR_WRONG_INDEX);
|
||||
keyinfo=info->s->keyinfo+inx;
|
||||
flag=SEARCH_BIGGER; /* Read next */
|
||||
if (_mi_readinfo(info,F_RDLCK,1))
|
||||
if (fast_mi_readinfo(info))
|
||||
DBUG_RETURN(my_errno);
|
||||
|
||||
memcpy(info->lastkey2,info->lastkey,info->last_rkey_length);
|
||||
|
|
|
@ -36,7 +36,7 @@ int mi_rprev(MI_INFO *info, byte *buf, int inx)
|
|||
if (info->lastpos == HA_OFFSET_ERROR && info->update & HA_STATE_NEXT_FOUND)
|
||||
flag=0; /* Read last */
|
||||
|
||||
if (_mi_readinfo(info,F_RDLCK,1))
|
||||
if (fast_mi_readinfo(info))
|
||||
DBUG_RETURN(my_errno);
|
||||
changed=_mi_test_if_changed(info);
|
||||
if (share->concurrent_insert)
|
||||
|
@ -50,7 +50,7 @@ int mi_rprev(MI_INFO *info, byte *buf, int inx)
|
|||
share->state.key_root[inx]);
|
||||
else
|
||||
error=_mi_search(info,share->keyinfo+inx,info->lastkey,
|
||||
info->lastkey_length, flag, share->state.key_root[inx]);
|
||||
USE_WHOLE_KEY, flag, share->state.key_root[inx]);
|
||||
|
||||
if (!error)
|
||||
{
|
||||
|
|
|
@ -41,7 +41,7 @@ int mi_rsame(MI_INFO *info, byte *record, int inx)
|
|||
info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);
|
||||
|
||||
/* Read row from data file */
|
||||
if (_mi_readinfo(info,F_RDLCK,1))
|
||||
if (fast_mi_readinfo(info))
|
||||
DBUG_RETURN(my_errno);
|
||||
|
||||
if (inx >= 0)
|
||||
|
@ -51,7 +51,8 @@ int mi_rsame(MI_INFO *info, byte *record, int inx)
|
|||
info->lastpos);
|
||||
if (info->s->concurrent_insert)
|
||||
rw_rdlock(&info->s->key_root_lock[inx]);
|
||||
VOID(_mi_search(info,info->s->keyinfo+inx,info->lastkey,0,SEARCH_SAME,
|
||||
VOID(_mi_search(info,info->s->keyinfo+inx,info->lastkey, USE_WHOLE_KEY,
|
||||
SEARCH_SAME,
|
||||
info->s->state.key_root[inx]));
|
||||
if (info->s->concurrent_insert)
|
||||
rw_unlock(&info->s->key_root_lock[inx]);
|
||||
|
|
|
@ -107,14 +107,15 @@ int _mi_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
|||
}
|
||||
else
|
||||
{
|
||||
if (nextflag & SEARCH_FIND && (!(keyinfo->flag & HA_NOSAME)
|
||||
|| key_len) && nod_flag)
|
||||
if ((nextflag & SEARCH_FIND) && nod_flag &&
|
||||
((keyinfo->flag & (HA_NOSAME | HA_NULL_PART)) != HA_NOSAME ||
|
||||
key_len != USE_WHOLE_KEY))
|
||||
{
|
||||
if ((error=_mi_search(info,keyinfo,key,key_len,SEARCH_FIND,
|
||||
_mi_kpos(nod_flag,keypos))) >= 0 ||
|
||||
my_errno != HA_ERR_KEY_NOT_FOUND)
|
||||
DBUG_RETURN(error);
|
||||
info->last_keypage= HA_OFFSET_ERROR; /* Buffer not in memory */
|
||||
info->last_keypage= HA_OFFSET_ERROR; /* Buffer not in mem */
|
||||
}
|
||||
}
|
||||
if (pos != info->last_keypage)
|
||||
|
@ -283,8 +284,6 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
|
|||
LINT_INIT(saved_vseg);
|
||||
|
||||
t_buff[0]=0; /* Avoid bugs */
|
||||
if (!(nextflag & (SEARCH_FIND | SEARCH_NO_FIND | SEARCH_LAST)))
|
||||
key_len=USE_WHOLE_KEY;
|
||||
end= page+mi_getint(page);
|
||||
nod_flag=mi_test_if_nod(page);
|
||||
page+=2+nod_flag;
|
||||
|
@ -477,11 +476,11 @@ my_off_t _mi_kpos(uint nod_flag, uchar *after_key)
|
|||
switch (nod_flag) {
|
||||
#if SIZEOF_OFF_T > 4
|
||||
case 7:
|
||||
return mi_uint7korr(after_key)*MI_KEY_BLOCK_LENGTH;
|
||||
return mi_uint7korr(after_key)*MI_MIN_KEY_BLOCK_LENGTH;
|
||||
case 6:
|
||||
return mi_uint6korr(after_key)*MI_KEY_BLOCK_LENGTH;
|
||||
return mi_uint6korr(after_key)*MI_MIN_KEY_BLOCK_LENGTH;
|
||||
case 5:
|
||||
return mi_uint5korr(after_key)*MI_KEY_BLOCK_LENGTH;
|
||||
return mi_uint5korr(after_key)*MI_MIN_KEY_BLOCK_LENGTH;
|
||||
#else
|
||||
case 7:
|
||||
after_key++;
|
||||
|
@ -491,13 +490,13 @@ my_off_t _mi_kpos(uint nod_flag, uchar *after_key)
|
|||
after_key++;
|
||||
#endif
|
||||
case 4:
|
||||
return ((my_off_t) mi_uint4korr(after_key))*MI_KEY_BLOCK_LENGTH;
|
||||
return ((my_off_t) mi_uint4korr(after_key))*MI_MIN_KEY_BLOCK_LENGTH;
|
||||
case 3:
|
||||
return ((my_off_t) mi_uint3korr(after_key))*MI_KEY_BLOCK_LENGTH;
|
||||
return ((my_off_t) mi_uint3korr(after_key))*MI_MIN_KEY_BLOCK_LENGTH;
|
||||
case 2:
|
||||
return (my_off_t) (mi_uint2korr(after_key)*MI_KEY_BLOCK_LENGTH);
|
||||
return (my_off_t) (mi_uint2korr(after_key)*MI_MIN_KEY_BLOCK_LENGTH);
|
||||
case 1:
|
||||
return (uint) (*after_key)*MI_KEY_BLOCK_LENGTH;
|
||||
return (uint) (*after_key)*MI_MIN_KEY_BLOCK_LENGTH;
|
||||
case 0: /* At leaf page */
|
||||
default: /* Impossible */
|
||||
return(HA_OFFSET_ERROR);
|
||||
|
@ -509,7 +508,7 @@ my_off_t _mi_kpos(uint nod_flag, uchar *after_key)
|
|||
|
||||
void _mi_kpointer(register MI_INFO *info, register uchar *buff, my_off_t pos)
|
||||
{
|
||||
pos/=MI_KEY_BLOCK_LENGTH;
|
||||
pos/=MI_MIN_KEY_BLOCK_LENGTH;
|
||||
switch (info->s->base.key_reflength) {
|
||||
#if SIZEOF_OFF_T > 4
|
||||
case 7: mi_int7store(buff,pos); break;
|
||||
|
@ -719,10 +718,7 @@ int _mi_key_cmp(register MI_KEYSEG *keyseg, register uchar *a,
|
|||
double d_1,d_2;
|
||||
uint next_key_length;
|
||||
|
||||
if (!(nextflag & (SEARCH_FIND | SEARCH_NO_FIND | SEARCH_LAST)))
|
||||
key_length=USE_WHOLE_KEY;
|
||||
*diff_pos=0;
|
||||
|
||||
for ( ; (int) key_length >0 ; key_length=next_key_length, keyseg++)
|
||||
{
|
||||
uchar *end;
|
||||
|
@ -1446,7 +1442,7 @@ int _mi_search_next(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
|||
info->page_changed ||
|
||||
(info->int_keytree_version != keyinfo->version &&
|
||||
(info->int_nod_flag || info->buff_used)))
|
||||
DBUG_RETURN(_mi_search(info,keyinfo,key,key_length,
|
||||
DBUG_RETURN(_mi_search(info,keyinfo,key, USE_WHOLE_KEY,
|
||||
nextflag | SEARCH_SAVE_BUFF, pos));
|
||||
|
||||
if (info->buff_used)
|
||||
|
@ -1459,17 +1455,17 @@ int _mi_search_next(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
|||
|
||||
/* Last used buffer is in info->buff */
|
||||
nod_flag=mi_test_if_nod(info->buff);
|
||||
memcpy(lastkey,key,key_length);
|
||||
|
||||
if (nextflag & SEARCH_BIGGER) /* Next key */
|
||||
{
|
||||
my_off_t tmp_pos=_mi_kpos(nod_flag,info->int_keypos);
|
||||
if (tmp_pos != HA_OFFSET_ERROR)
|
||||
{
|
||||
if ((error=_mi_search(info,keyinfo,key,key_length,
|
||||
if ((error=_mi_search(info,keyinfo,key, USE_WHOLE_KEY,
|
||||
nextflag | SEARCH_SAVE_BUFF, tmp_pos)) <=0)
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
memcpy(lastkey,key,key_length);
|
||||
if (!(info->lastkey_length=(*keyinfo->get_key)(keyinfo,nod_flag,
|
||||
&info->int_keypos,lastkey)))
|
||||
DBUG_RETURN(-1);
|
||||
|
@ -1483,12 +1479,14 @@ int _mi_search_next(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
|||
if (!info->int_keypos)
|
||||
DBUG_RETURN(-1);
|
||||
if (info->int_keypos == info->buff+2)
|
||||
DBUG_RETURN(_mi_search(info,keyinfo,key,key_length,
|
||||
DBUG_RETURN(_mi_search(info,keyinfo,key, USE_WHOLE_KEY,
|
||||
nextflag | SEARCH_SAVE_BUFF, pos));
|
||||
if ((error=_mi_search(info,keyinfo,key,0,nextflag | SEARCH_SAVE_BUFF,
|
||||
if ((error=_mi_search(info,keyinfo,key, USE_WHOLE_KEY,
|
||||
nextflag | SEARCH_SAVE_BUFF,
|
||||
_mi_kpos(nod_flag,info->int_keypos))) <= 0)
|
||||
DBUG_RETURN(error);
|
||||
|
||||
/* QQ: We should be able to optimize away the following call */
|
||||
if (! _mi_get_last_key(info,keyinfo,info->buff,lastkey,
|
||||
info->int_keypos,&info->lastkey_length))
|
||||
DBUG_RETURN(-1);
|
||||
|
|
|
@ -40,7 +40,7 @@ my_bool myisam_concurrent_insert=0;
|
|||
#endif
|
||||
my_off_t myisam_max_extra_temp_length= MI_MAX_TEMP_LENGTH;
|
||||
my_off_t myisam_max_temp_length= MAX_FILE_SIZE;
|
||||
uint myisam_bulk_insert_tree_size=8192*1024;
|
||||
ulong myisam_bulk_insert_tree_size=8192*1024;
|
||||
|
||||
/* read_vec[] is used for converting between P_READ_KEY.. and SEARCH_ */
|
||||
/* Position is , == , >= , <= , > , < */
|
||||
|
|
|
@ -181,8 +181,7 @@ int _mi_read_static_record(register MI_INFO *info, register my_off_t pos,
|
|||
|
||||
error=my_pread(info->dfile,(char*) record,info->s->base.reclength,
|
||||
pos,MYF(MY_NABP)) != 0;
|
||||
if (info->s->r_locks == 0 && info->s->w_locks == 0)
|
||||
VOID(_mi_writeinfo(info,0));
|
||||
fast_mi_writeinfo(info);
|
||||
if (! error)
|
||||
{
|
||||
if (!*record)
|
||||
|
@ -195,7 +194,7 @@ int _mi_read_static_record(register MI_INFO *info, register my_off_t pos,
|
|||
}
|
||||
return(-1); /* Error on read */
|
||||
}
|
||||
VOID(_mi_writeinfo(info,0)); /* No such record */
|
||||
fast_mi_writeinfo(info); /* No such record */
|
||||
return(-1);
|
||||
}
|
||||
|
||||
|
@ -257,7 +256,7 @@ int _mi_read_rnd_static_record(MI_INFO *info, byte *buf,
|
|||
DBUG_PRINT("test",("filepos: %ld (%ld) records: %ld del: %ld",
|
||||
filepos/share->base.reclength,filepos,
|
||||
info->state->records, info->state->del));
|
||||
VOID(_mi_writeinfo(info,0));
|
||||
fast_mi_writeinfo(info);
|
||||
DBUG_RETURN(my_errno=HA_ERR_END_OF_FILE);
|
||||
}
|
||||
info->lastpos= filepos;
|
||||
|
|
|
@ -343,68 +343,72 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
if (testflag==3) goto end;
|
||||
|
||||
if (!silent)
|
||||
printf("- Same key: first - next -> last - prev -> first\n");
|
||||
DBUG_PRINT("progpos",("first - next -> last - prev -> first"));
|
||||
for (i=999, dupp_keys=j=0 ; i>0 ; i--)
|
||||
{
|
||||
if (key1[i] >dupp_keys) { dupp_keys=key1[i]; j=i; }
|
||||
if (key1[i] > dupp_keys) { dupp_keys=key1[i]; j=i; }
|
||||
}
|
||||
sprintf(key,"%6d",j);
|
||||
if (verbose) printf(" Using key: \"%s\" Keys: %d\n",key,dupp_keys);
|
||||
if (mi_rkey(file,read_record,0,key,0,HA_READ_KEY_EXACT)) goto err;
|
||||
if (mi_rsame(file,read_record2,-1)) goto err;
|
||||
if (memcmp(read_record,read_record2,reclength) != 0)
|
||||
if (dupp_keys)
|
||||
{
|
||||
printf("mi_rsame didn't find same record\n");
|
||||
goto end;
|
||||
}
|
||||
info.recpos=mi_position(file);
|
||||
if (mi_rfirst(file,read_record2,0) ||
|
||||
mi_rsame_with_pos(file,read_record2,0,info.recpos) ||
|
||||
memcmp(read_record,read_record2,reclength) != 0)
|
||||
{
|
||||
printf("mi_rsame_with_pos didn't find same record\n");
|
||||
goto end;
|
||||
}
|
||||
{
|
||||
int skr=mi_rnext(file,read_record2,0);
|
||||
if ((skr && my_errno != HA_ERR_END_OF_FILE) ||
|
||||
mi_rprev(file,read_record2,-1) ||
|
||||
memcmp(read_record,read_record2,reclength) != 0)
|
||||
if (!silent)
|
||||
printf("- Same key: first - next -> last - prev -> first\n");
|
||||
DBUG_PRINT("progpos",("first - next -> last - prev -> first"));
|
||||
if (verbose) printf(" Using key: \"%s\" Keys: %d\n",key,dupp_keys);
|
||||
|
||||
if (mi_rkey(file,read_record,0,key,0,HA_READ_KEY_EXACT)) goto err;
|
||||
if (mi_rsame(file,read_record2,-1)) goto err;
|
||||
if (memcmp(read_record,read_record2,reclength) != 0)
|
||||
{
|
||||
printf("mi_rsame_with_pos lost position\n");
|
||||
printf("mi_rsame didn't find same record\n");
|
||||
goto end;
|
||||
}
|
||||
info.recpos=mi_position(file);
|
||||
if (mi_rfirst(file,read_record2,0) ||
|
||||
mi_rsame_with_pos(file,read_record2,0,info.recpos) ||
|
||||
memcmp(read_record,read_record2,reclength) != 0)
|
||||
{
|
||||
printf("mi_rsame_with_pos didn't find same record\n");
|
||||
goto end;
|
||||
}
|
||||
{
|
||||
int skr=mi_rnext(file,read_record2,0);
|
||||
if ((skr && my_errno != HA_ERR_END_OF_FILE) ||
|
||||
mi_rprev(file,read_record2,-1) ||
|
||||
memcmp(read_record,read_record2,reclength) != 0)
|
||||
{
|
||||
printf("mi_rsame_with_pos lost position\n");
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
ant=1;
|
||||
start=keyinfo[0].seg[0].start; length=keyinfo[0].seg[0].length;
|
||||
while (mi_rnext(file,read_record2,0) == 0 &&
|
||||
memcmp(read_record2+start,key,length) == 0) ant++;
|
||||
if (ant != dupp_keys)
|
||||
{
|
||||
printf("next: Found: %d keys of %d\n",ant,dupp_keys);
|
||||
goto end;
|
||||
}
|
||||
ant=0;
|
||||
while (mi_rprev(file,read_record3,0) == 0 &&
|
||||
bcmp(read_record3+start,key,length) == 0) ant++;
|
||||
if (ant != dupp_keys)
|
||||
{
|
||||
printf("prev: Found: %d records of %d\n",ant,dupp_keys);
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
ant=1;
|
||||
start=keyinfo[0].seg[0].start; length=keyinfo[0].seg[0].length;
|
||||
while (mi_rnext(file,read_record2,0) == 0 &&
|
||||
memcmp(read_record2+start,key,length) == 0) ant++;
|
||||
if (ant != dupp_keys)
|
||||
{
|
||||
printf("next: Found: %d keys of %d\n",ant,dupp_keys);
|
||||
goto end;
|
||||
}
|
||||
ant=0;
|
||||
while (mi_rprev(file,read_record3,0) == 0 &&
|
||||
bcmp(read_record3+start,key,length) == 0) ant++;
|
||||
if (ant != dupp_keys)
|
||||
{
|
||||
printf("prev: Found: %d records of %d\n",ant,dupp_keys);
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* Check of mi_rnext_same */
|
||||
if (mi_rkey(file,read_record,0,key,0,HA_READ_KEY_EXACT))
|
||||
goto err;
|
||||
ant=1;
|
||||
while (!mi_rnext_same(file,read_record3) && ant < dupp_keys+10)
|
||||
ant++;
|
||||
if (ant != dupp_keys || my_errno != HA_ERR_END_OF_FILE)
|
||||
{
|
||||
printf("mi_rnext_same: Found: %d records of %d\n",ant,dupp_keys);
|
||||
goto end;
|
||||
/* Check of mi_rnext_same */
|
||||
if (mi_rkey(file,read_record,0,key,0,HA_READ_KEY_EXACT))
|
||||
goto err;
|
||||
ant=1;
|
||||
while (!mi_rnext_same(file,read_record3) && ant < dupp_keys+10)
|
||||
ant++;
|
||||
if (ant != dupp_keys || my_errno != HA_ERR_END_OF_FILE)
|
||||
{
|
||||
printf("mi_rnext_same: Found: %d records of %d\n",ant,dupp_keys);
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
||||
if (!silent)
|
||||
|
@ -776,9 +780,13 @@ end:
|
|||
printf("\nFollowing test have been made:\n");
|
||||
printf("Write records: %d\nUpdate records: %d\nSame-key-read: %d\nDelete records: %d\n", write_count,update,dupp_keys,opt_delete);
|
||||
if (rec_pointer_size)
|
||||
printf("Record pointer size: %d\n",rec_pointer_size);
|
||||
printf("Record pointer size: %d\n",rec_pointer_size);
|
||||
printf("myisam_block_size: %u\n", myisam_block_size);
|
||||
if (key_cacheing)
|
||||
{
|
||||
puts("Key cacheing used");
|
||||
printf("key_cache_block_size: %u\n", key_cache_block_size);
|
||||
}
|
||||
if (write_cacheing)
|
||||
puts("Write cacheing used");
|
||||
if (write_cacheing)
|
||||
|
@ -801,7 +809,7 @@ reads: %10lu\n",
|
|||
end_key_cache();
|
||||
if (blob_buffer)
|
||||
my_free(blob_buffer,MYF(0));
|
||||
my_end(MY_CHECK_ERROR | MY_GIVE_INFO);
|
||||
my_end(silent ? MY_CHECK_ERROR : MY_CHECK_ERROR | MY_GIVE_INFO);
|
||||
return(0);
|
||||
err:
|
||||
printf("got error: %d when using MyISAM-database\n",my_errno);
|
||||
|
@ -861,7 +869,29 @@ static void get_options(int argc, char **argv)
|
|||
verbose=1;
|
||||
break;
|
||||
case 'm': /* records */
|
||||
recant=atoi(++pos);
|
||||
if ((recant=atoi(++pos)) < 10)
|
||||
{
|
||||
fprintf(stderr,"record count must be >= 10\n");
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
case 'e': /* myisam_block_length */
|
||||
if ((myisam_block_size=atoi(++pos)) < MI_MIN_KEY_BLOCK_LENGTH ||
|
||||
myisam_block_size > MI_MAX_KEY_BLOCK_LENGTH)
|
||||
{
|
||||
fprintf(stderr,"Wrong myisam_block_length\n");
|
||||
exit(1);
|
||||
}
|
||||
myisam_block_size=1 << my_bit_log2(myisam_block_size);
|
||||
break;
|
||||
case 'E': /* myisam_block_length */
|
||||
if ((key_cache_block_size=atoi(++pos)) < MI_MIN_KEY_BLOCK_LENGTH ||
|
||||
key_cache_block_size > MI_MAX_KEY_BLOCK_LENGTH)
|
||||
{
|
||||
fprintf(stderr,"Wrong key_cache_block_size\n");
|
||||
exit(1);
|
||||
}
|
||||
key_cache_block_size=1 << my_bit_log2(key_cache_block_size);
|
||||
break;
|
||||
case 'f':
|
||||
if ((first_key=atoi(++pos)) < 0 || first_key >= MYISAM_KEYS)
|
||||
|
@ -904,7 +934,7 @@ static void get_options(int argc, char **argv)
|
|||
case 'V':
|
||||
printf("%s Ver 1.2 for %s at %s\n",progname,SYSTEM_TYPE,MACHINE_TYPE);
|
||||
puts("By Monty, for your professional use\n");
|
||||
printf("Usage: %s [-?AbBcDIKLPRqSsVWltv] [-k#] [-f#] [-m#] [-t#]\n",
|
||||
printf("Usage: %s [-?AbBcDIKLPRqSsVWltv] [-k#] [-f#] [-m#] [-e#] [-E#] [-t#]\n",
|
||||
progname);
|
||||
exit(0);
|
||||
case '#':
|
||||
|
|
|
@ -1,48 +1,50 @@
|
|||
Maximum memory usage: 545477 bytes (533k)
|
||||
Maximum memory usage: 545477 bytes (533k)
|
||||
Maximum memory usage: 545369 bytes (533k)
|
||||
mi_test2-i686 -s -L -K -R1 -m2000 ; Should give error 135
|
||||
mi_test2 -s -L -K -R1 -m2000 ; Should give error 135
|
||||
Error: 135 in write at record: 1105
|
||||
got error: 135 when using MyISAM-database
|
||||
Maximum memory usage: 29439 bytes (29k)
|
||||
Maximum memory usage: 66541 bytes (65k)
|
||||
Maximum memory usage: 5101 bytes (5k)
|
||||
Maximum memory usage: 545488 bytes (533k)
|
||||
myisamchk: MyISAM file test2
|
||||
myisamchk: warning: Datafile is almost full, 65532 of 65534 used
|
||||
MyISAM-table 'test2' is usable but should be fixed
|
||||
Commands Used count Errors Recover errors
|
||||
open 1 0 0
|
||||
write 50 0 0
|
||||
update 5 0 0
|
||||
delete 50 0 0
|
||||
close 1 0 0
|
||||
extra 6 0 0
|
||||
Total 113 0 0
|
||||
Maximum memory usage: 545744 bytes (533k)
|
||||
open 17 0 0
|
||||
write 850 0 0
|
||||
update 85 0 0
|
||||
delete 850 0 0
|
||||
close 17 0 0
|
||||
extra 102 0 0
|
||||
Total 1921 0 0
|
||||
Commands Used count Errors Recover errors
|
||||
open 2 0 0
|
||||
write 100 0 0
|
||||
update 10 0 0
|
||||
delete 100 0 0
|
||||
close 2 0 0
|
||||
extra 12 0 0
|
||||
Total 226 0 0
|
||||
Maximum memory usage: 5101 bytes (5k)
|
||||
1.12user 0.52system 0:01.71elapsed 95%CPU (0avgtext+0avgdata 0maxresident)k
|
||||
0inputs+0outputs (214major+25minor)pagefaults 0swaps
|
||||
Maximum memory usage: 21189 bytes (21k)
|
||||
1.29user 0.55system 0:01.82elapsed 101%CPU (0avgtext+0avgdata 0maxresident)k
|
||||
0inputs+0outputs (215major+29minor)pagefaults 0swaps
|
||||
Maximum memory usage: 66541 bytes (65k)
|
||||
1.10user 0.51system 0:01.66elapsed 96%CPU (0avgtext+0avgdata 0maxresident)k
|
||||
0inputs+0outputs (216major+40minor)pagefaults 0swaps
|
||||
Maximum memory usage: 82629 bytes (81k)
|
||||
1.33user 0.24system 0:01.54elapsed 101%CPU (0avgtext+0avgdata 0maxresident)k
|
||||
0inputs+0outputs (216major+44minor)pagefaults 0swaps
|
||||
Maximum memory usage: 545477 bytes (533k)
|
||||
1.31user 0.24system 0:01.55elapsed 99%CPU (0avgtext+0avgdata 0maxresident)k
|
||||
0inputs+0outputs (216major+173minor)pagefaults 0swaps
|
||||
Maximum memory usage: 545389 bytes (533k)
|
||||
1.37user 0.18system 0:01.57elapsed 98%CPU (0avgtext+0avgdata 0maxresident)k
|
||||
0inputs+0outputs (218major+180minor)pagefaults 0swaps
|
||||
Maximum memory usage: 109165 bytes (107k)
|
||||
1.42user 0.38system 0:01.78elapsed 101%CPU (0avgtext+0avgdata 0maxresident)k
|
||||
0inputs+0outputs (218major+51minor)pagefaults 0swaps
|
||||
open 18 0 0
|
||||
write 900 0 0
|
||||
update 90 0 0
|
||||
delete 900 0 0
|
||||
close 18 0 0
|
||||
extra 108 0 0
|
||||
Total 2034 0 0
|
||||
|
||||
real 0m1.054s
|
||||
user 0m0.410s
|
||||
sys 0m0.640s
|
||||
|
||||
real 0m1.077s
|
||||
user 0m0.550s
|
||||
sys 0m0.530s
|
||||
|
||||
real 0m1.100s
|
||||
user 0m0.420s
|
||||
sys 0m0.680s
|
||||
|
||||
real 0m0.783s
|
||||
user 0m0.590s
|
||||
sys 0m0.200s
|
||||
|
||||
real 0m0.764s
|
||||
user 0m0.560s
|
||||
sys 0m0.210s
|
||||
|
||||
real 0m0.699s
|
||||
user 0m0.570s
|
||||
sys 0m0.130s
|
||||
|
||||
real 0m0.991s
|
||||
user 0m0.630s
|
||||
sys 0m0.350s
|
||||
|
|
|
@ -66,6 +66,14 @@ myisamchk$suffix -rs test1
|
|||
myisamchk$suffix -se test1
|
||||
myisamchk$suffix -rqs test1
|
||||
myisamchk$suffix -se test1
|
||||
myisamchk$suffix -rs --correct-checksum test1
|
||||
myisamchk$suffix -se test1
|
||||
myisamchk$suffix -rqs --correct-checksum test1
|
||||
myisamchk$suffix -se test1
|
||||
myisamchk$suffix -ros --correct-checksum test1
|
||||
myisamchk$suffix -se test1
|
||||
myisamchk$suffix -rqos --correct-checksum test1
|
||||
myisamchk$suffix -se test1
|
||||
|
||||
# check of myisampack / myisamchk
|
||||
myisampack$suffix --force -s test1
|
||||
|
@ -105,13 +113,25 @@ mi_test1$suffix $silent --key_multiple -P -S
|
|||
myisamchk$suffix -sm test1
|
||||
|
||||
mi_test2$suffix $silent -L -K -W -P
|
||||
myisamchk$suffix -sm test2
|
||||
mi_test2$suffix $silent -L -K -W -P -A
|
||||
myisamchk$suffix -sm test2
|
||||
mi_test2$suffix $silent -L -K -W -P -S -R1 -m500
|
||||
echo "mi_test2$suffix $silent -L -K -R1 -m2000 ; Should give error 135"
|
||||
myisamchk$suffix -sm test2
|
||||
mi_test2$suffix $silent -L -K -R1 -m2000
|
||||
myisamchk$suffix -sm test2
|
||||
mi_test2$suffix $silent -L -K -P -S -R3 -m50 -b1000000
|
||||
myisamchk$suffix -sm test2
|
||||
mi_test2$suffix $silent -L -B
|
||||
myisamchk$suffix -sm test2
|
||||
mi_test2$suffix $silent -D -B -c
|
||||
myisamchk$suffix -sm test2
|
||||
mi_test2$suffix $silent -m10000 -e8192 -K
|
||||
myisamchk$suffix -sm test2
|
||||
mi_test2$suffix $silent -m10000 -e16384 -E16384 -K -L
|
||||
myisamchk$suffix -sm test2
|
||||
|
||||
mi_test2$suffix $silent -L -K -W -P -m50 -l
|
||||
myisamlog$suffix
|
||||
mi_test2$suffix $silent -L -K -W -P -m50 -l -b100
|
||||
|
|
|
@ -291,7 +291,7 @@ static int w_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
|||
my_bool insert_last)
|
||||
{
|
||||
int error,flag;
|
||||
uint comp_flag,nod_flag;
|
||||
uint comp_flag,nod_flag, search_key_length;
|
||||
uchar *temp_buff,*keypos;
|
||||
uchar keybuff[MI_MAX_KEY_BUFF];
|
||||
my_bool was_last_key;
|
||||
|
@ -299,10 +299,14 @@ static int w_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
|||
DBUG_ENTER("w_search");
|
||||
DBUG_PRINT("enter",("page: %ld",page));
|
||||
|
||||
search_key_length=USE_WHOLE_KEY;
|
||||
if (keyinfo->flag & HA_SORT_ALLOWS_SAME)
|
||||
comp_flag=SEARCH_BIGGER; /* Put after same key */
|
||||
else if (keyinfo->flag & HA_NOSAME)
|
||||
{
|
||||
comp_flag=SEARCH_FIND | SEARCH_UPDATE; /* No dupplicates */
|
||||
search_key_length= key_length;
|
||||
}
|
||||
else
|
||||
comp_flag=SEARCH_SAME; /* Keys in rec-pos order */
|
||||
|
||||
|
@ -312,8 +316,8 @@ static int w_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
|||
if (!_mi_fetch_keypage(info,keyinfo,page,temp_buff,0))
|
||||
goto err;
|
||||
|
||||
flag=(*keyinfo->bin_search)(info,keyinfo,temp_buff,key,key_length,comp_flag,
|
||||
&keypos, keybuff, &was_last_key);
|
||||
flag=(*keyinfo->bin_search)(info,keyinfo,temp_buff,key,search_key_length,
|
||||
comp_flag, &keypos, keybuff, &was_last_key);
|
||||
nod_flag=mi_test_if_nod(temp_buff);
|
||||
if (flag == 0)
|
||||
{
|
||||
|
|
|
@ -40,6 +40,7 @@ static char **default_argv;
|
|||
static const char *load_default_groups[]= { "myisamchk", 0 };
|
||||
static const char *set_charset_name;
|
||||
static CHARSET_INFO *set_charset;
|
||||
static long opt_myisam_block_size;
|
||||
|
||||
static const char *type_names[]=
|
||||
{ "?","char","binary", "short", "long", "float",
|
||||
|
@ -141,6 +142,9 @@ int main(int argc, char **argv)
|
|||
static CHANGEABLE_VAR changeable_vars[] = {
|
||||
{ "key_buffer_size",(long*) &check_param.use_buffers,(long) USE_BUFFER_INIT,
|
||||
(long) MALLOC_OVERHEAD, (long) ~0L,(long) MALLOC_OVERHEAD,(long) IO_SIZE },
|
||||
{ "myisam_block_size", (long*) &opt_myisam_block_size,
|
||||
MI_KEY_BLOCK_LENGTH, MI_MIN_KEY_BLOCK_LENGTH, MI_MAX_KEY_BLOCK_LENGTH,
|
||||
0, MI_MIN_KEY_BLOCK_LENGTH },
|
||||
{ "read_buffer_size", (long*) &check_param.read_buffer_length,(long) READ_BUFFER_INIT,
|
||||
(long) MALLOC_OVERHEAD,(long) ~0L,(long) MALLOC_OVERHEAD,(long) 1L },
|
||||
{ "write_buffer_size", (long*) &check_param.write_buffer_length,(long) READ_BUFFER_INIT,
|
||||
|
@ -159,7 +163,10 @@ static CHANGEABLE_VAR changeable_vars[] = {
|
|||
20, 4, HA_FT_MAXLEN, 0, 1 },
|
||||
{ NullS,(long*) 0,0L,0L,0L,0L,0L,} };
|
||||
|
||||
enum options {OPT_CHARSETS_DIR=256, OPT_SET_CHARSET,OPT_START_CHECK_POS};
|
||||
enum options {
|
||||
OPT_CHARSETS_DIR=256, OPT_SET_CHARSET,OPT_START_CHECK_POS,
|
||||
OPT_CORRECT_CHECKSUM
|
||||
};
|
||||
|
||||
|
||||
static struct option long_options[] =
|
||||
|
@ -167,9 +174,10 @@ static struct option long_options[] =
|
|||
{"analyze", no_argument, 0, 'a'},
|
||||
{"block-search", required_argument,0, 'b'},
|
||||
{"backup", no_argument, 0, 'B'},
|
||||
{"character-sets-dir",required_argument,0, OPT_CHARSETS_DIR},
|
||||
{"character-sets-dir",required_argument,0, OPT_CHARSETS_DIR},
|
||||
{"check", no_argument, 0, 'c'},
|
||||
{"check-only-changed",no_argument, 0, 'C'},
|
||||
{"correct-checksum", no_argument, 0, OPT_CORRECT_CHECKSUM},
|
||||
#ifndef DBUG_OFF
|
||||
{"debug", optional_argument, 0, '#'},
|
||||
#endif
|
||||
|
@ -205,7 +213,7 @@ static struct option long_options[] =
|
|||
|
||||
static void print_version(void)
|
||||
{
|
||||
printf("%s Ver 1.51 for %s at %s\n",my_progname,SYSTEM_TYPE,
|
||||
printf("%s Ver 1.52 for %s at %s\n",my_progname,SYSTEM_TYPE,
|
||||
MACHINE_TYPE);
|
||||
}
|
||||
|
||||
|
@ -248,6 +256,7 @@ static void usage(void)
|
|||
|
||||
puts("Repair options (When using -r or -o) \n\
|
||||
-B, --backup Make a backup of the .MYD file as 'filename-time.BAK'\n\
|
||||
--correct-checksum Correct checksum information for table. \n\
|
||||
-D, --data-file-length=# Max length of data file (when recreating data\n\
|
||||
file when it's full)\n\
|
||||
-e, --extend-check Try to recover every possible row from the data file\n\
|
||||
|
@ -433,6 +442,9 @@ static void get_options(register int *argc,register char ***argv)
|
|||
case 'V':
|
||||
print_version();
|
||||
exit(0);
|
||||
case OPT_CORRECT_CHECKSUM:
|
||||
check_param.testflag|=T_CALC_CHECKSUM;
|
||||
break;
|
||||
case OPT_CHARSETS_DIR:
|
||||
charsets_dir = optarg;
|
||||
break;
|
||||
|
@ -449,6 +461,11 @@ static void get_options(register int *argc,register char ***argv)
|
|||
exit(0);
|
||||
}
|
||||
}
|
||||
/* If using repair, then update checksum if one uses --update-state */
|
||||
if ((check_param.testflag & T_UPDATE_STATE) &&
|
||||
(check_param.testflag & (T_REP | T_REP_BY_SORT)))
|
||||
check_param.testflag|= T_CALC_CHECKSUM;
|
||||
|
||||
(*argc)-=optind;
|
||||
(*argv)+=optind;
|
||||
if (*argc == 0)
|
||||
|
@ -456,6 +473,7 @@ static void get_options(register int *argc,register char ***argv)
|
|||
usage();
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
if ((check_param.testflag & T_UNPACK) &&
|
||||
(check_param.opt_rep_quick || (check_param.testflag & T_SORT_RECORDS)))
|
||||
{
|
||||
|
@ -479,6 +497,7 @@ static void get_options(register int *argc,register char ***argv)
|
|||
if (!(set_charset=get_charset_by_name(set_charset_name, MYF(MY_WME))))
|
||||
exit(1);
|
||||
|
||||
myisam_block_size=(uint) 1 << my_bit_log2(opt_myisam_block_size);
|
||||
return;
|
||||
} /* get options */
|
||||
|
||||
|
@ -605,7 +624,8 @@ static int myisamchk(MI_CHECK *param, my_string filename)
|
|||
(((ulonglong) 1L << share->base.keys)-1)) ||
|
||||
test_if_almost_full(info) ||
|
||||
info->s->state.header.file_version[3] != myisam_file_magic[3] ||
|
||||
(set_charset && set_charset->number != share->state.header.language)))
|
||||
(set_charset && set_charset->number != share->state.header.language) ||
|
||||
myisam_block_size != MI_KEY_BLOCK_LENGTH))
|
||||
{
|
||||
if (set_charset)
|
||||
check_param.language=set_charset->number;
|
||||
|
|
|
@ -173,7 +173,7 @@ typedef struct st_mi_isam_share { /* Shared between opens */
|
|||
File data_file; /* Shared data file */
|
||||
int mode; /* mode of file on open */
|
||||
uint reopen; /* How many times reopened */
|
||||
uint w_locks,r_locks; /* Number of read/write locks */
|
||||
uint w_locks,r_locks,tot_locks; /* Number of read/write locks */
|
||||
uint blocksize; /* blocksize of keyfile */
|
||||
ulong min_pack_length; /* Theese are used by packed data */
|
||||
ulong max_pack_length;
|
||||
|
@ -365,10 +365,8 @@ struct st_myisam_info {
|
|||
#define PACK_TYPE_ZERO_FILL 4
|
||||
#define MI_FOUND_WRONG_KEY 32738 /* Impossible value from _mi_key_cmp */
|
||||
|
||||
#define MI_KEY_BLOCK_LENGTH 1024 /* Min key block length */
|
||||
#define MI_MAX_KEY_BLOCK_LENGTH 8192
|
||||
#define MI_MAX_KEY_BLOCK_SIZE (MI_MAX_KEY_BLOCK_LENGTH/MI_KEY_BLOCK_LENGTH)
|
||||
#define MI_BLOCK_SIZE(key_length,data_pointer,key_pointer) ((((key_length+data_pointer+key_pointer)*4+key_pointer+2)/MI_KEY_BLOCK_LENGTH+1)*MI_KEY_BLOCK_LENGTH)
|
||||
#define MI_MAX_KEY_BLOCK_SIZE (MI_MAX_KEY_BLOCK_LENGTH/MI_MIN_KEY_BLOCK_LENGTH)
|
||||
#define MI_BLOCK_SIZE(key_length,data_pointer,key_pointer) ((((key_length+data_pointer+key_pointer)*4+key_pointer+2)/myisam_block_size+1)*myisam_block_size)
|
||||
#define MI_MAX_KEYPTR_SIZE 5 /* For calculating block lengths */
|
||||
#define MI_MIN_KEYBLOCK_LENGTH 50 /* When to split delete blocks */
|
||||
|
||||
|
@ -589,6 +587,9 @@ enum myisam_log_commands {
|
|||
#define myisam_log_command(a,b,c,d,e) if (myisam_log_file >= 0) _myisam_log_command(a,b,c,d,e)
|
||||
#define myisam_log_record(a,b,c,d,e) if (myisam_log_file >= 0) _myisam_log_record(a,b,c,d,e)
|
||||
|
||||
#define fast_mi_writeinfo(INFO) if (!(INFO)->s->tot_locks) (void) _mi_writeinfo((INFO),0)
|
||||
#define fast_mi_readinfo(INFO) (!(INFO)->lock_type == F_UNLCK) && _mi_readinfo((INFO),F_RDLCK,1)
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
|
|
@ -134,7 +134,7 @@ then
|
|||
c_u="$c_u References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
|
||||
c_u="$c_u Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
|
||||
c_u="$c_u Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
|
||||
c_u="$c_u ssl_type enum('none', 'cipher', 'x509','issuer','subject') NOT NULL,"
|
||||
c_u="$c_u ssl_type enum('NONE','ANY', 'X509', 'SPECIFIED') NOT NULL,"
|
||||
c_u="$c_u ssl_cipher char(60) NULL,"
|
||||
c_u="$c_u x509_issuer blob NULL,"
|
||||
c_u="$c_u x509_subject blob NULL,"
|
||||
|
|
|
@ -113,6 +113,11 @@ SLAVE_LOAD_TMPDIR=../../var/tmp #needs to be same length to test logging
|
|||
RES_SPACE=" "
|
||||
MYSQLD_SRC_DIRS="strings mysys include extra regex isam merge myisam \
|
||||
myisammrg heap sql"
|
||||
#
|
||||
# Set LD_LIBRARY_PATH if we are using shared libraries
|
||||
#
|
||||
LD_LIBRARY_PATH="$BASEDIR/lib:$LD_LIBRARY_PATH"
|
||||
export LD_LIBRARY_PATH
|
||||
|
||||
MASTER_RUNNING=0
|
||||
MASTER_MYPORT=9306
|
||||
|
@ -166,6 +171,8 @@ while test $# -gt 0; do
|
|||
;;
|
||||
--big*) # Actually --big-test
|
||||
EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1" ;;
|
||||
--compress)
|
||||
EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1" ;;
|
||||
--sleep=*)
|
||||
EXTRA_MYSQL_TEST_OPT="$EXTRA_MYSQL_TEST_OPT $1"
|
||||
SLEEP_TIME=`$ECHO "$1" | $SED -e "s;--sleep=;;"`
|
||||
|
@ -345,7 +352,7 @@ prompt_user ()
|
|||
read unused
|
||||
}
|
||||
|
||||
# We can't use diff -u as this isn't portable
|
||||
# We can't use diff -u or diff -a as these are not portable
|
||||
|
||||
show_failed_diff ()
|
||||
{
|
||||
|
@ -362,7 +369,7 @@ show_failed_diff ()
|
|||
then
|
||||
echo "Below are the diffs between actual and expected results:"
|
||||
echo "-------------------------------------------------------"
|
||||
$DIFF -c -a $result_file $reject_file
|
||||
$DIFF -c $result_file $reject_file
|
||||
echo "-------------------------------------------------------"
|
||||
echo "Please follow the instructions outlined at"
|
||||
echo "http://www.mysql.com/doc/R/e/Reporting_mysqltest_bugs.html"
|
||||
|
@ -578,12 +585,12 @@ start_slave()
|
|||
--exit-info=256 \
|
||||
--log-bin=$MYSQL_TEST_DIR/var/log/slave-bin
|
||||
--log-slave-updates \
|
||||
--log=$SLAVE_MYLOG \
|
||||
--basedir=$MY_BASEDIR \
|
||||
--datadir=$SLAVE_MYDDIR \
|
||||
--pid-file=$SLAVE_MYPID \
|
||||
--port=$SLAVE_MYPORT \
|
||||
--socket=$SLAVE_MYSOCK \
|
||||
--log=$SLAVE_MYLOG \
|
||||
--character-sets-dir=$CHARSETSDIR \
|
||||
--default-character-set=$CHARACTER_SET \
|
||||
--core \
|
||||
|
@ -593,6 +600,7 @@ start_slave()
|
|||
--slave-load-tmpdir=$SLAVE_LOAD_TMPDIR \
|
||||
--report-host=127.0.0.1 --report-user=root \
|
||||
--report-port=$SLAVE_MYPORT \
|
||||
--master-retry-count=5 \
|
||||
$SMALL_SERVER \
|
||||
$EXTRA_SLAVE_OPT $EXTRA_SLAVE_MYSQLD_OPT"
|
||||
if [ x$DO_DDD = x1 ]
|
||||
|
|
|
@ -3,7 +3,7 @@ n
|
|||
2001
|
||||
2002
|
||||
Server_id Host Port
|
||||
2 127.0.0.1 9307
|
||||
2 127.0.0.1 9999
|
||||
id created
|
||||
1 1970-01-01 06:25:45
|
||||
id created
|
||||
|
|
|
@ -93,3 +93,21 @@ t1 CREATE TABLE `t1` (
|
|||
Database Table In_use Name_locked
|
||||
Database Table In_use Name_locked
|
||||
test t1 0 0
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) NOT NULL default '0',
|
||||
`b` char(10) default NULL,
|
||||
KEY `b` (`b`)
|
||||
) TYPE=MyISAM MIN_ROWS=10 MAX_ROWS=100 AVG_ROW_LENGTH=10 PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED COMMENT='test'
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) NOT NULL default '0',
|
||||
`b` varchar(10) default NULL,
|
||||
KEY `b` (`b`)
|
||||
) TYPE=MyISAM MIN_ROWS=10 MAX_ROWS=200 AVG_ROW_LENGTH=10 PACK_KEYS=0 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='test'
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) NOT NULL default '0',
|
||||
`b` varchar(10) default NULL,
|
||||
KEY `b` (`b`)
|
||||
) TYPE=MyISAM
|
||||
|
|
|
@ -11,6 +11,7 @@ use test;
|
|||
sync_with_master;
|
||||
select * from t1;
|
||||
connection master;
|
||||
--replace_result 9307 9999 3350 9999 3351 9999
|
||||
show slave hosts;
|
||||
drop table t1;
|
||||
save_master_pos;
|
||||
|
|
|
@ -3,8 +3,8 @@ master-bin.001
|
|||
4
|
||||
127.0.0.1
|
||||
replicate
|
||||
aaaaaaaaaaaaaaab
|
||||
9306
|
||||
aaaaaaaaaaaaaaabthispartofthepasswordisnotused
|
||||
$MASTER_MYPORT
|
||||
1
|
||||
0
|
||||
EOF
|
||||
|
|
|
@ -3,6 +3,7 @@ connect (slave,localhost,root,,test,0,mysql-slave.sock);
|
|||
connection master;
|
||||
reset master;
|
||||
grant file on *.* to replicate@localhost identified by 'aaaaaaaaaaaaaaab';
|
||||
grant file on *.* to replicate@127.0.0.1 identified by 'aaaaaaaaaaaaaaab';
|
||||
connection slave;
|
||||
slave start;
|
||||
connection master;
|
||||
|
|
|
@ -79,3 +79,11 @@ create table t1(n int);
|
|||
insert into t1 values (1);
|
||||
show open tables;
|
||||
drop table t1;
|
||||
|
||||
create table t1 (a int not null, b VARCHAR(10), INDEX (b) ) AVG_ROW_LENGTH=10 CHECKSUM=1 COMMENT="test" TYPE=MYISAM MIN_ROWS=10 MAX_ROWS=100 PACK_KEYS=1 DELAY_KEY_WRITE=1 ROW_FORMAT=fixed;
|
||||
show create table t1;
|
||||
alter table t1 MAX_ROWS=200 ROW_FORMAT=dynamic PACK_KEYS=0;
|
||||
show create table t1;
|
||||
ALTER TABLE t1 AVG_ROW_LENGTH=0 CHECKSUM=0 COMMENT="" MIN_ROWS=0 MAX_ROWS=0 PACK_KEYS=DEFAULT DELAY_KEY_WRITE=0 ROW_FORMAT=default;
|
||||
show create table t1;
|
||||
drop table t1;
|
||||
|
|
|
@ -45,7 +45,7 @@ libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c\
|
|||
my_quick.c my_lockmem.c my_static.c \
|
||||
getopt.c getopt1.c getvar.c my_mkdir.c \
|
||||
default.c my_compress.c checksum.c raid.cc my_net.c \
|
||||
my_vsnprintf.c charset.c my_bitmap.c
|
||||
my_vsnprintf.c charset.c my_bitmap.c my_bit.c
|
||||
EXTRA_DIST = thr_alarm.c thr_lock.c my_pthread.c my_thr_init.c \
|
||||
thr_mutex.c thr_rwlock.c
|
||||
libmysys_a_LIBADD = @THREAD_LOBJECTS@
|
||||
|
|
|
@ -35,7 +35,7 @@ void caseup_str(my_string str)
|
|||
if (use_mb(default_charset_info))
|
||||
{
|
||||
register uint32 l;
|
||||
register char *end=str+(uint) strlen(str);
|
||||
register char *end=str+strlen(str);
|
||||
while (*str)
|
||||
{
|
||||
if ((l=my_ismbchar(default_charset_info, str,end))) str+=l;
|
||||
|
@ -56,7 +56,7 @@ void casedn_str(my_string str)
|
|||
if (use_mb(default_charset_info))
|
||||
{
|
||||
register uint32 l;
|
||||
register char *end=str+(uint) strlen(str);
|
||||
register char *end=str+strlen(str);
|
||||
while (*str)
|
||||
{
|
||||
if ((l=my_ismbchar(default_charset_info, str,end))) str+=l;
|
||||
|
@ -155,7 +155,7 @@ int my_strcasecmp(const char *s, const char *t)
|
|||
if (use_mb(default_charset_info))
|
||||
{
|
||||
register uint32 l;
|
||||
register const char *end=s+(uint) strlen(s);
|
||||
register const char *end=s+strlen(s);
|
||||
while (s<end)
|
||||
{
|
||||
if ((l=my_ismbchar(default_charset_info, s,end)))
|
||||
|
|
|
@ -96,6 +96,7 @@ uint my_b_fill(IO_CACHE *info)
|
|||
** Read a string ended by '\n' into a buffer of 'max_length' size.
|
||||
** Returns number of characters read, 0 on error.
|
||||
** last byte is set to '\0'
|
||||
** If buffer is full then to[max_length-1] will be set to \0.
|
||||
*/
|
||||
|
||||
uint my_b_gets(IO_CACHE *info, char *to, uint max_length)
|
||||
|
|
|
@ -53,7 +53,6 @@ typedef struct sec_link {
|
|||
} SEC_LINK;
|
||||
|
||||
|
||||
static uint find_next_bigger_power(uint value);
|
||||
static SEC_LINK *find_key_block(int file,my_off_t filepos,int *error);
|
||||
|
||||
/* static variables in this file */
|
||||
|
@ -61,9 +60,11 @@ static SEC_LINK *_my_block_root,**_my_hash_root,
|
|||
*_my_used_first,*_my_used_last;
|
||||
static int _my_disk_blocks;
|
||||
static uint _my_disk_blocks_used, _my_hash_blocks;
|
||||
static uint key_cache_shift;
|
||||
ulong _my_blocks_used,_my_blocks_changed;
|
||||
ulong _my_cache_w_requests,_my_cache_write,_my_cache_r_requests,
|
||||
_my_cache_read;
|
||||
uint key_cache_block_size=DEFAULT_KEYCACHE_BLOCK_SIZE;
|
||||
static byte HUGE_PTR *_my_block_mem;
|
||||
static SEC_LINK *changed_blocks[CHANGED_BLOCKS_HASH];
|
||||
static SEC_LINK *file_blocks[CHANGED_BLOCKS_HASH];
|
||||
|
@ -92,12 +93,16 @@ int init_key_cache(ulong use_mem,
|
|||
{
|
||||
key_cache_inited=TRUE;
|
||||
_my_disk_blocks= -1;
|
||||
key_cache_shift=my_bit_log2(key_cache_block_size);
|
||||
DBUG_PRINT("info",("key_cache_block_size: %u key_cache_shift: %u",
|
||||
key_cache_block_size, key_cache_shift));
|
||||
#ifndef DBUG_OFF
|
||||
_my_printed=0;
|
||||
#endif
|
||||
}
|
||||
|
||||
blocks= (uint) (use_mem/(sizeof(SEC_LINK)+sizeof(SEC_LINK*)*5/4+KEYCACHE_BLOCK_SIZE));
|
||||
blocks= (uint) (use_mem/(sizeof(SEC_LINK)+sizeof(SEC_LINK*)*5/4+
|
||||
key_cache_block_size));
|
||||
/* No use to have very few blocks */
|
||||
if (blocks >= 8 && _my_disk_blocks < 0)
|
||||
{
|
||||
|
@ -107,13 +112,15 @@ int init_key_cache(ulong use_mem,
|
|||
#endif
|
||||
for (;;)
|
||||
{
|
||||
if ((_my_hash_blocks=find_next_bigger_power((uint) blocks)) < blocks*5/4)
|
||||
_my_hash_blocks<<=1;
|
||||
/* Set my_hash_blocks to the next bigger 2 power */
|
||||
_my_hash_blocks=(uint) 1 << (my_bit_log2(blocks*5/4)+1);
|
||||
while ((length=(uint) blocks*sizeof(SEC_LINK)+
|
||||
sizeof(SEC_LINK*)*_my_hash_blocks)+(ulong) blocks*KEYCACHE_BLOCK_SIZE >
|
||||
sizeof(SEC_LINK*)*_my_hash_blocks)+
|
||||
((ulong) blocks << key_cache_shift) >
|
||||
use_mem)
|
||||
blocks--;
|
||||
if ((_my_block_mem=my_malloc_lock((ulong) blocks * KEYCACHE_BLOCK_SIZE,MYF(0))))
|
||||
if ((_my_block_mem=my_malloc_lock((ulong) blocks << key_cache_shift,
|
||||
MYF(0))))
|
||||
{
|
||||
if ((_my_block_root=(SEC_LINK*) my_malloc((uint) length,MYF(0))) != 0)
|
||||
break;
|
||||
|
@ -170,17 +177,6 @@ void end_key_cache(void)
|
|||
} /* end_key_cache */
|
||||
|
||||
|
||||
static uint find_next_bigger_power(uint value)
|
||||
{
|
||||
uint old_value=1;
|
||||
while (value)
|
||||
{
|
||||
old_value=value;
|
||||
value&= value-1;
|
||||
}
|
||||
return (old_value << 1);
|
||||
}
|
||||
|
||||
static inline void link_into_file_blocks(SEC_LINK *next, int file)
|
||||
{
|
||||
reg1 SEC_LINK **ptr= &file_blocks[(uint) file & CHANGED_BLOCKS_MASK];
|
||||
|
@ -243,7 +239,7 @@ static void test_key_cache(const char *where, my_bool lock);
|
|||
|
||||
/*
|
||||
** read a key_buffer
|
||||
** filepos must point at a even KEYCACHE_BLOCK_SIZE block
|
||||
** filepos must point at a even key_cache_block_size block
|
||||
** if return_buffer is set then the intern buffer is returned if
|
||||
** it can be used
|
||||
** Returns adress to where data is read
|
||||
|
@ -257,7 +253,7 @@ byte *key_cache_read(File file, my_off_t filepos, byte *buff, uint length,
|
|||
int error=0;
|
||||
|
||||
#ifndef THREAD
|
||||
if (block_length > KEYCACHE_BLOCK_SIZE)
|
||||
if (block_length > key_cache_block_size)
|
||||
return_buffer=0;
|
||||
#endif
|
||||
if (_my_disk_blocks > 0)
|
||||
|
@ -268,7 +264,8 @@ byte *key_cache_read(File file, my_off_t filepos, byte *buff, uint length,
|
|||
do
|
||||
{
|
||||
_my_cache_r_requests++;
|
||||
read_length= length > KEYCACHE_BLOCK_SIZE ? KEYCACHE_BLOCK_SIZE : length;
|
||||
read_length= (length > key_cache_block_size ? key_cache_block_size :
|
||||
length);
|
||||
if (!(next=find_key_block(file,filepos,&error)))
|
||||
{
|
||||
pthread_mutex_unlock(&THR_LOCK_keycache);
|
||||
|
@ -310,7 +307,7 @@ byte *key_cache_read(File file, my_off_t filepos, byte *buff, uint length,
|
|||
|
||||
/* write a key_buffer */
|
||||
/* We don't have to use pwrite because of write locking */
|
||||
/* buff must point at a even KEYCACHE_BLOCK_SIZE block */
|
||||
/* buff must point at a even key_cache_block_size block */
|
||||
|
||||
int key_cache_write(File file, my_off_t filepos, byte *buff, uint length,
|
||||
uint block_length __attribute__((unused)),
|
||||
|
@ -336,7 +333,7 @@ int key_cache_write(File file, my_off_t filepos, byte *buff, uint length,
|
|||
_my_cache_w_requests++;
|
||||
do
|
||||
{
|
||||
read_length= length > KEYCACHE_BLOCK_SIZE ? KEYCACHE_BLOCK_SIZE : length;
|
||||
read_length= length > key_cache_block_size ? key_cache_block_size : length;
|
||||
if (!(next=find_key_block(file,filepos,&error)))
|
||||
goto end; /* Fatal error */
|
||||
if (!dont_write) /* If we wrote buff at start */
|
||||
|
@ -385,7 +382,7 @@ static SEC_LINK *find_key_block(int file, my_off_t filepos, int *error)
|
|||
#endif
|
||||
|
||||
*error=0;
|
||||
next= *(start= &_my_hash_root[((ulong) (filepos/KEYCACHE_BLOCK_SIZE)+(ulong) file) &
|
||||
next= *(start= &_my_hash_root[((ulong) (filepos >> key_cache_shift)+(ulong) file) &
|
||||
(_my_hash_blocks-1)]);
|
||||
while (next && (next->diskpos != filepos || next->file != file))
|
||||
next= next->next_hash;
|
||||
|
@ -411,7 +408,8 @@ static SEC_LINK *find_key_block(int file, my_off_t filepos, int *error)
|
|||
{ /* There are unused blocks */
|
||||
next= &_my_block_root[_my_blocks_used++]; /* Link in hash-chain */
|
||||
next->buffer=ADD_TO_PTR(_my_block_mem,
|
||||
(ulong) _my_disk_blocks_used*KEYCACHE_BLOCK_SIZE,byte*);
|
||||
((ulong) _my_disk_blocks_used << key_cache_shift),
|
||||
byte*);
|
||||
/* link first in file_blocks */
|
||||
next->changed=0;
|
||||
link_into_file_blocks(next,file);
|
||||
|
@ -426,7 +424,8 @@ static SEC_LINK *find_key_block(int file, my_off_t filepos, int *error)
|
|||
next= _my_used_first;
|
||||
if (next->changed)
|
||||
{
|
||||
if (my_pwrite(next->file,next->buffer,KEYCACHE_BLOCK_SIZE,next->diskpos,
|
||||
if (my_pwrite(next->file,next->buffer,key_cache_block_size,
|
||||
next->diskpos,
|
||||
MYF(MY_NABP | MY_WAIT_IF_FULL)))
|
||||
{
|
||||
*error=1;
|
||||
|
@ -505,7 +504,8 @@ static int flush_cached_blocks(File file, SEC_LINK **cache, uint count)
|
|||
qsort((byte*) cache, count, sizeof(*cache), (qsort_cmp) cmp_sec_link);
|
||||
for ( ; count-- ; cache++)
|
||||
{
|
||||
if (my_pwrite(file,(*cache)->buffer,KEYCACHE_BLOCK_SIZE,(*cache)->diskpos,
|
||||
if (my_pwrite(file,(*cache)->buffer,key_cache_block_size,
|
||||
(*cache)->diskpos,
|
||||
MYF(MY_NABP | MY_WAIT_IF_FULL)))
|
||||
{
|
||||
if (!last_errno)
|
||||
|
@ -646,7 +646,7 @@ static void test_key_cache(const char *where, my_bool lock)
|
|||
i,(ulong) pos,(ulong) prev,(ulong) pos->prev_hash));
|
||||
}
|
||||
|
||||
if (((pos->diskpos/KEYCACHE_BLOCK_SIZE)+pos->file) % _my_hash_blocks != i)
|
||||
if (((pos->diskpos >> key_cache_shift)+pos->file) % _my_hash_blocks != i)
|
||||
{
|
||||
DBUG_PRINT("error",("hash: %d pos: %lx : Wrong disk_buffer %ld",
|
||||
i,(ulong) pos,(ulong) pos->diskpos));
|
||||
|
|
|
@ -90,9 +90,10 @@ File create_temp_file(char *to, const char *dir, const char *prefix,
|
|||
uint pfx_len;
|
||||
File org_file;
|
||||
|
||||
pfx_len=(strmov(strnmov(prefix_buff,
|
||||
prefix ? prefix : "tmp.",
|
||||
sizeof(prefix_buff)-7),"XXXXXX") - prefix_buff);
|
||||
pfx_len= (uint) (strmov(strnmov(prefix_buff,
|
||||
prefix ? prefix : "tmp.",
|
||||
sizeof(prefix_buff)-7),"XXXXXX") -
|
||||
prefix_buff);
|
||||
if (!dir && ! (dir =getenv("TMPDIR")))
|
||||
dir=P_tmpdir;
|
||||
if (strlen(dir)+ pfx_len > FN_REFLEN-2)
|
||||
|
|
32
mysys/my_bit.c
Normal file
|
@ -0,0 +1,32 @@
|
|||
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with this library; if not, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA */
|
||||
|
||||
/* Some useful bit functions */
|
||||
|
||||
#include "mysys_priv.h"
|
||||
|
||||
/*
|
||||
Find smallest X in 2^X >= value
|
||||
This can be used to divide a number with value by doing a shift instead
|
||||
*/
|
||||
|
||||
uint my_bit_log2(ulong value)
|
||||
{
|
||||
uint bit;
|
||||
for (bit=0 ; value > 1 ; value>>=1, bit++) ;
|
||||
return bit;
|
||||
}
|
|
@ -45,9 +45,8 @@ static my_bool win32_init_tcp_ip();
|
|||
#else
|
||||
#define my_win_init()
|
||||
#endif
|
||||
static my_bool my_init_done=0;
|
||||
|
||||
|
||||
my_bool my_init_done=0;
|
||||
|
||||
static ulong atoi_octal(const char *str)
|
||||
{
|
||||
|
|
|
@ -76,4 +76,8 @@
|
|||
|
||||
#endif /* !__STDC__ */
|
||||
|
||||
#if !defined(__attribute__) && (defined(__cplusplus) || !defined(__GNUC__) || __GNUC__ == 2 && __GNUC_MINOR__ < 8)
|
||||
#define __attribute__(A)
|
||||
#endif
|
||||
|
||||
#endif /* !_RL_STDC_H_ */
|
||||
|
|
|
@ -88,7 +88,7 @@ do
|
|||
fi
|
||||
done
|
||||
|
||||
for i in libmysql/.libs/libmysqlclient.a libmysql/.libs/libmysqlclient.so* libmysql/libmysqlclient.* libmysql_r/.libs/libmysqlclient_r.a libmysql_r/.libs/libmysqlclient_r.so* libmysql_r/libmysqlclient_r.* mysys/libmysys.a strings/libmystrings.a dbug/libdbug.a $BASE/lib
|
||||
for i in libmysql/.libs/libmysqlclient.a libmysql/.libs/libmysqlclient.so* libmysql/libmysqlclient.* libmysql_r/.libs/libmysqlclient_r.a libmysql_r/.libs/libmysqlclient_r.so* libmysql_r/libmysqlclient_r.* mysys/libmysys.a strings/libmystrings.a dbug/libdbug.a libmysqld/.libs/libmysqld.a libmysqld/.libs/libmysqld.so* libmysqld/libmysqld.a libmysqld/libmysqld.a
|
||||
do
|
||||
if [ -f $i ]
|
||||
then
|
||||
|
|
|
@ -56,6 +56,13 @@ END_OF_DATA
|
|||
echo ""
|
||||
fi
|
||||
|
||||
echo "Adding columns needed by GRANT .. REQUIRE (openssl)"
|
||||
echo "You can ignore any Duplicate column errors"
|
||||
@bindir@/mysql --user=root --password="$root_password" --host="$host" mysql <<END_OF_DATA
|
||||
ALTER TABLE user ADD ssl_type enum('NONE','ANY','X509', 'SPECIFIED') DEFAULT 'NONE' NOT NULL, ADD ssl_cipher BLOB NOT NULL, ADD x509_issuer BLOB NOT NULL, ADD x509_subject BLOB NOT NULL
|
||||
END_OF_DATA
|
||||
echo ""
|
||||
|
||||
#
|
||||
# Create tables_priv and columns_priv if they don't exists
|
||||
#
|
||||
|
@ -96,6 +103,7 @@ echo "You can ignore any errors from this"
|
|||
@bindir@/mysql -f --user=root --password="$root_password" --host="$host" mysql <<END_OF_DATA
|
||||
ALTER TABLE columns_priv change Type Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL;
|
||||
END_OF_DATA
|
||||
echo ""
|
||||
|
||||
#
|
||||
# Add the new 'type' column to the func table.
|
||||
|
@ -107,3 +115,14 @@ echo "You can ignore any Duplicate column errors"
|
|||
@bindir@/mysql --user=root --password=$root_password mysql <<EOF
|
||||
alter table func add type enum ('function','aggregate') NOT NULL;
|
||||
EOF
|
||||
echo ""
|
||||
|
||||
echo "Converting all privilege tables to MyISAM format"
|
||||
@bindir@/mysql -f --user=root --password="$root_password" --host="$host" mysql <<END_OF_DATA
|
||||
ALTER TABLE user type=MyISAM;
|
||||
ALTER TABLE db type=MyISAM;
|
||||
ALTER TABLE host type=MyISAM;
|
||||
ALTER TABLE func type=MyISAM;
|
||||
ALTER TABLE columns_priv type=MyISAM;
|
||||
ALTER TABLE tables_priv type=MyISAM;
|
||||
END_OF_DATA
|
||||
|
|
|
@ -224,18 +224,22 @@ then
|
|||
c_u="$c_u References_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
|
||||
c_u="$c_u Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
|
||||
c_u="$c_u Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,"
|
||||
c_u="$c_u ssl_type enum('NONE','ANY','X509', 'SPECIFIED') DEFAULT 'NONE' NOT NULL,"
|
||||
c_u="$c_u ssl_cipher BLOB NOT NULL,"
|
||||
c_u="$c_u x509_issuer BLOB NOT NULL,"
|
||||
c_u="$c_u x509_subject BLOB NOT NULL,"
|
||||
c_u="$c_u PRIMARY KEY Host (Host,User)"
|
||||
c_u="$c_u )"
|
||||
c_u="$c_u comment='Users and global privileges';"
|
||||
|
||||
i_u="INSERT INTO user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
|
||||
INSERT INTO user VALUES ('$hostname','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
|
||||
i_u="INSERT INTO user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','NONE',NULL,NULL,NULL);
|
||||
INSERT INTO user VALUES ('$hostname','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','NONE',NULL,NULL,NULL);
|
||||
|
||||
REPLACE INTO user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
|
||||
REPLACE INTO user VALUES ('$hostname','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
|
||||
REPLACE INTO user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','NONE',NULL,NULL,NULL);
|
||||
REPLACE INTO user VALUES ('$hostname','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','NONE',NULL,NULL,NULL);
|
||||
|
||||
INSERT INTO user VALUES ('localhost','','','N','N','N','N','N','N','N','N','N','N','N','N','N','N');
|
||||
INSERT INTO user VALUES ('$hostname','','','N','N','N','N','N','N','N','N','N','N','N','N','N','N');"
|
||||
INSERT INTO user VALUES ('localhost','','','N','N','N','N','N','N','N','N','N','N','N','N','N','N','NONE',NULL,NULL,NULL);
|
||||
INSERT INTO user VALUES ('$hostname','','','N','N','N','N','N','N','N','N','N','N','N','N','N','N','NONE',NULL,NULL,NULL);"
|
||||
fi
|
||||
|
||||
if test ! -f $mdata/func.frm
|
||||
|
|
|
@ -73,7 +73,7 @@ sub get_server
|
|||
{ $server= new db_interbase($host,$database); }
|
||||
else
|
||||
{
|
||||
die "Unknown sql server name used: $name\nUse one of: Access, Adabas, AdabasD, Empress, FrontBase, Oracle, Informix, DB2, mSQL, Mimer, MS-SQL, MySQL, Pg, Solid or Sybase.\nIf the connection is done trough ODBC the name must end with _ODBC\n";
|
||||
die "Unknown sql server name used: $name\nUse one of: Access, Adabas, AdabasD, Empress, FrontBase, Oracle, Informix, InterBase, DB2, mSQL, Mimer, MS-SQL, MySQL, Pg, Solid or Sybase.\nIf the connection is done trough ODBC the name must end with _ODBC\n";
|
||||
}
|
||||
if ($name =~ /_ODBC$/i || defined($odbc) && $odbc)
|
||||
{
|
||||
|
@ -2962,7 +2962,7 @@ sub new
|
|||
bless $self;
|
||||
|
||||
$self->{'cmp_name'} = "interbase";
|
||||
$self->{'data_source'} = "DBI:InterBase:database=$database";
|
||||
$self->{'data_source'} = "DBI:InterBase:database=$database:ib_dialect=3";
|
||||
$self->{'limits'} = \%limits;
|
||||
$self->{'smds'} = \%smds;
|
||||
$self->{'blob'} = "blob";
|
||||
|
|
|
@ -72,8 +72,7 @@ static void read_texts(const char *file_name,const char ***point,
|
|||
Check that the above file is the right version for this program!\n\n",
|
||||
my_progname,name,ant,error_messages);
|
||||
VOID(my_close(file,MYF(MY_WME)));
|
||||
clean_up(0); /* Clean_up frees everything */
|
||||
exit(1); /* We can't continue */
|
||||
unireg_abort(1);
|
||||
}
|
||||
|
||||
x_free((gptr) *point); /* Free old language */
|
||||
|
@ -115,8 +114,7 @@ err:
|
|||
if (file != FERR)
|
||||
VOID(my_close(file,MYF(MY_WME)));
|
||||
fprintf(stderr,buff,my_progname,name);
|
||||
clean_up(0); /* Clean_up frees everything */
|
||||
exit(1); /* We can't continue */
|
||||
unireg_abort(1);
|
||||
} /* read_texts */
|
||||
|
||||
|
||||
|
|
|
@ -114,8 +114,8 @@ enum db_type { DB_TYPE_UNKNOWN=0,DB_TYPE_DIAB_ISAM=1,
|
|||
DB_TYPE_BERKELEY_DB, DB_TYPE_INNODB, DB_TYPE_GEMINI,
|
||||
DB_TYPE_DEFAULT };
|
||||
|
||||
enum row_type { ROW_TYPE_DEFAULT, ROW_TYPE_FIXED, ROW_TYPE_DYNAMIC,
|
||||
ROW_TYPE_COMPRESSED };
|
||||
enum row_type { ROW_TYPE_NOT_USED=-1, ROW_TYPE_DEFAULT, ROW_TYPE_FIXED,
|
||||
ROW_TYPE_DYNAMIC, ROW_TYPE_COMPRESSED};
|
||||
|
||||
/* struct to hold information about the table that should be created */
|
||||
|
||||
|
@ -124,6 +124,10 @@ enum row_type { ROW_TYPE_DEFAULT, ROW_TYPE_FIXED, ROW_TYPE_DYNAMIC,
|
|||
#define HA_CREATE_USED_RAID 2
|
||||
#define HA_CREATE_USED_UNION 4
|
||||
#define HA_CREATE_USED_INSERT_METHOD 8
|
||||
#define HA_CREATE_USED_MIN_ROWS 16
|
||||
#define HA_CREATE_USED_MAX_ROWS 32
|
||||
#define HA_CREATE_USED_AVG_ROW_LENGTH 64
|
||||
#define HA_CREATE_USED_PACK_KEYS 128
|
||||
|
||||
typedef struct st_thd_trans {
|
||||
void *bdb_tid;
|
||||
|
|
|
@ -81,6 +81,7 @@ public:
|
|||
virtual void split_sum_func(List<Item> &fields) {}
|
||||
virtual bool get_date(TIME *ltime,bool fuzzydate);
|
||||
virtual bool get_time(TIME *ltime);
|
||||
virtual bool is_null() { return 0; }
|
||||
};
|
||||
|
||||
|
||||
|
@ -130,6 +131,7 @@ public:
|
|||
Field *tmp_table_field() { return result_field; }
|
||||
bool get_date(TIME *ltime,bool fuzzydate);
|
||||
bool get_time(TIME *ltime);
|
||||
bool is_null() { return field->is_null(); }
|
||||
};
|
||||
|
||||
|
||||
|
@ -150,6 +152,7 @@ public:
|
|||
bool send(String *str);
|
||||
bool basic_const_item() const { return 1; }
|
||||
Item *new_item() { return new Item_null(name); }
|
||||
bool is_null() { return 1; }
|
||||
};
|
||||
|
||||
|
||||
|
@ -383,6 +386,7 @@ public:
|
|||
void copy();
|
||||
table_map used_tables() const { return (table_map) 1L; }
|
||||
bool const_item() const { return 0; }
|
||||
bool is_null() { return null_value; }
|
||||
};
|
||||
|
||||
|
||||
|
|