Commit 04c86213 authored by joreland@mysql.com's avatar joreland@mysql.com

Merge joreland@bk-internal.mysql.com:/home/bk/mysql-4.1

into mysql.com:/home/jonas/src/mysql-4.1
parents 9d8dcdcf a11dba7b
...@@ -3093,7 +3093,6 @@ AC_CONFIG_FILES(ndb/Makefile ndb/include/Makefile dnl ...@@ -3093,7 +3093,6 @@ AC_CONFIG_FILES(ndb/Makefile ndb/include/Makefile dnl
ndb/src/common/logger/Makefile dnl ndb/src/common/logger/Makefile dnl
ndb/src/common/transporter/Makefile dnl ndb/src/common/transporter/Makefile dnl
ndb/src/common/mgmcommon/Makefile dnl ndb/src/common/mgmcommon/Makefile dnl
ndb/src/common/editline/Makefile dnl
ndb/src/kernel/Makefile dnl ndb/src/kernel/Makefile dnl
ndb/src/kernel/error/Makefile dnl ndb/src/kernel/error/Makefile dnl
ndb/src/kernel/blocks/Makefile dnl ndb/src/kernel/blocks/Makefile dnl
......
...@@ -37,7 +37,7 @@ test_DATA = std_data/client-key.pem std_data/client-cert.pem std_data/cacert.pem ...@@ -37,7 +37,7 @@ test_DATA = std_data/client-key.pem std_data/client-cert.pem std_data/cacert.pem
CLEANFILES = $(test_SCRIPTS) $(test_DATA) CLEANFILES = $(test_SCRIPTS) $(test_DATA)
INCLUDES = -I$(srcdir)/../include -I../include -I.. INCLUDES = -I$(srcdir)/../include -I../include -I..
bin_PROGRAMS = mysql_test_run_new EXTRA_PROGRAMS = mysql_test_run_new
noinst_HEADERS = my_manage.h noinst_HEADERS = my_manage.h
mysql_test_run_new_SOURCES= mysql_test_run_new.c my_manage.c mysql_test_run_new_SOURCES= mysql_test_run_new.c my_manage.c
......
...@@ -483,3 +483,13 @@ ERROR 42000: Incorrect table name 't1\\' ...@@ -483,3 +483,13 @@ ERROR 42000: Incorrect table name 't1\\'
rename table t1 to `t1\\`; rename table t1 to `t1\\`;
ERROR 42000: Incorrect table name 't1\\' ERROR 42000: Incorrect table name 't1\\'
drop table t1; drop table t1;
create table t1 (a text) character set koi8r;
insert into t1 values (_koi8r'');
select hex(a) from t1;
hex(a)
D4C5D3D4
alter table t1 convert to character set cp1251;
select hex(a) from t1;
hex(a)
F2E5F1F2
drop table t1;
...@@ -126,3 +126,43 @@ Field Type Null Key Default Extra ...@@ -126,3 +126,43 @@ Field Type Null Key Default Extra
a char(1) a char(1)
b enum('あ','い') YES NULL b enum('あ','い') YES NULL
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1
(
a INTEGER NOT NULL,
b VARCHAR(50) NOT NULL DEFAULT '',
PRIMARY KEY (a),
KEY b (b(10))
) TYPE=InnoDB CHARACTER SET 'ujis' COLLATE 'ujis_japanese_ci';
INSERT INTO t1 (a, b) VALUES (0, 'aaabbbcccddd');
INSERT INTO t1 (a, b) VALUES (1, 'eeefffggghhh');
INSERT INTO t1 (a, b) VALUES (2, 'iiijjjkkkl');
SELECT t1.* FROM t1 WHERE b='aaabbbcccddd' ORDER BY a;
a b
0 aaabbbcccddd
SELECT t1.* FROM t1 WHERE b='eeefffggghhh' ORDER BY a;
a b
1 eeefffggghhh
SELECT t1.* FROM t1 WHERE b='iiijjjkkkl' ORDER BY a;
a b
2 iiijjjkkkl
DROP TABLE t1;
CREATE TABLE t1
(
a INTEGER NOT NULL,
b VARCHAR(50) NOT NULL DEFAULT '',
PRIMARY KEY (a),
KEY b (b(10))
) TYPE=MyISAM CHARACTER SET 'ujis' COLLATE 'ujis_japanese_ci';
INSERT INTO t1 (a, b) VALUES (0, 'aaabbbcccddd');
INSERT INTO t1 (a, b) VALUES (1, 'eeefffggghhh');
INSERT INTO t1 (a, b) VALUES (2, 'iiijjjkkkl');
SELECT t1.* FROM t1 WHERE b='aaabbbcccddd' ORDER BY a;
a b
0 aaabbbcccddd
SELECT t1.* FROM t1 WHERE b='eeefffggghhh' ORDER BY a;
a b
1 eeefffggghhh
SELECT t1.* FROM t1 WHERE b='iiijjjkkkl' ORDER BY a;
a b
2 iiijjjkkkl
DROP TABLE t1;
...@@ -324,3 +324,15 @@ alter table t1 rename to `t1\\`; ...@@ -324,3 +324,15 @@ alter table t1 rename to `t1\\`;
rename table t1 to `t1\\`; rename table t1 to `t1\\`;
drop table t1; drop table t1;
#
# Bug #6479 ALTER TABLE ... changing charset fails for TEXT columns
#
# The column's character set was changed but the actual data was not
# modified. In other words, the values were reinterpreted
# as UTF8 instead of being converted.
create table t1 (a text) character set koi8r;
insert into t1 values (_koi8r'');
select hex(a) from t1;
alter table t1 convert to character set cp1251;
select hex(a) from t1;
drop table t1;
...@@ -83,3 +83,39 @@ CREATE TABLE t1 ( ...@@ -83,3 +83,39 @@ CREATE TABLE t1 (
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
SHOW COLUMNS FROM t1; SHOW COLUMNS FROM t1;
DROP TABLE t1; DROP TABLE t1;
#
# Bug #6345 Unexpected behaviour with partial indices
#
--disable_warnings
CREATE TABLE t1
(
a INTEGER NOT NULL,
b VARCHAR(50) NOT NULL DEFAULT '',
PRIMARY KEY (a),
KEY b (b(10))
) TYPE=InnoDB CHARACTER SET 'ujis' COLLATE 'ujis_japanese_ci';
--enable_warnings
INSERT INTO t1 (a, b) VALUES (0, 'aaabbbcccddd');
INSERT INTO t1 (a, b) VALUES (1, 'eeefffggghhh');
INSERT INTO t1 (a, b) VALUES (2, 'iiijjjkkkl');
SELECT t1.* FROM t1 WHERE b='aaabbbcccddd' ORDER BY a;
SELECT t1.* FROM t1 WHERE b='eeefffggghhh' ORDER BY a;
SELECT t1.* FROM t1 WHERE b='iiijjjkkkl' ORDER BY a;
DROP TABLE t1;
--disable_warnings
CREATE TABLE t1
(
a INTEGER NOT NULL,
b VARCHAR(50) NOT NULL DEFAULT '',
PRIMARY KEY (a),
KEY b (b(10))
) TYPE=MyISAM CHARACTER SET 'ujis' COLLATE 'ujis_japanese_ci';
--enable_warnings
INSERT INTO t1 (a, b) VALUES (0, 'aaabbbcccddd');
INSERT INTO t1 (a, b) VALUES (1, 'eeefffggghhh');
INSERT INTO t1 (a, b) VALUES (2, 'iiijjjkkkl');
SELECT t1.* FROM t1 WHERE b='aaabbbcccddd' ORDER BY a;
SELECT t1.* FROM t1 WHERE b='eeefffggghhh' ORDER BY a;
SELECT t1.* FROM t1 WHERE b='iiijjjkkkl' ORDER BY a;
DROP TABLE t1;
SUBDIRS = portlib debugger util logger transporter mgmcommon editline SUBDIRS = portlib debugger util logger transporter mgmcommon
noinst_LTLIBRARIES = libcommon.la noinst_LTLIBRARIES = libcommon.la
......
include .defs.mk
LIB_DIRS := \
portlib \
debugger \
util \
logger
ifneq ($(USE_EDITLINE), N)
LIB_DIRS += editline
endif
DIRS := transporter mgmcommon
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
DIRS := signaldata
PIC_ARCHIVE := Y
ARCHIVE_TARGET := trace
SOURCES = SignalLoggerManager.cpp DebuggerNames.cpp BlockNames.cpp LogLevel.cpp EventLogger.cpp GrepError.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := ndbapi
PIC_ARCHIVE := Y
ARCHIVE_TARGET := signaldataprint
SOURCES = TcKeyReq.cpp TcKeyConf.cpp TcKeyRef.cpp \
TcRollbackRep.cpp \
TupKey.cpp TupCommit.cpp LqhKey.cpp \
FsOpenReq.cpp FsCloseReq.cpp FsRef.cpp FsConf.cpp FsReadWriteReq.cpp\
SignalDataPrint.cpp SignalNames.cpp \
ContinueB.cpp DihContinueB.cpp NdbfsContinueB.cpp \
CloseComReqConf.cpp PackedSignal.cpp PrepFailReqRef.cpp \
GCPSave.cpp DictTabInfo.cpp \
AlterTable.cpp AlterTab.cpp \
CreateTrig.cpp AlterTrig.cpp DropTrig.cpp \
FireTrigOrd.cpp TrigAttrInfo.cpp \
CreateIndx.cpp AlterIndx.cpp DropIndx.cpp TcIndx.cpp \
IndxKeyInfo.cpp IndxAttrInfo.cpp \
FsAppendReq.cpp ScanTab.cpp \
BackupImpl.cpp BackupSignalData.cpp \
UtilSequence.cpp UtilPrepare.cpp UtilDelete.cpp UtilExecute.cpp \
LqhFrag.cpp DropTab.cpp PrepDropTab.cpp LCP.cpp MasterLCP.cpp \
CopyGCI.cpp SystemError.cpp StartRec.cpp NFCompleteRep.cpp \
FailRep.cpp DisconnectRep.cpp SignalDroppedRep.cpp \
SumaImpl.cpp NdbSttor.cpp CreateFragmentation.cpp \
CntrStart.cpp ReadNodesConf.cpp \
UtilLock.cpp TuxMaint.cpp TupAccess.cpp AccLock.cpp \
LqhTrans.cpp
include $(NDB_TOP)/Epilogue.mk
File Name Description
--------------------------------------------------------
README Release notes and copyright
MANIFEST This shipping list
Make.os9 OS-9 makefile
Makefile Unix makefile
complete.c Filename completion routines
editline.3 Manual page for editline library
editline.c Line-editing routines
editline_internal.h Internal library header file
os9.h OS-9-specific declarations
sysos9.c OS-9-specific routines
sysunix.c Unix-specific routines
testit.c Test driver
unix.h Unix-specific declarations
noinst_LIBRARIES = libeditline.a
libeditline_a_SOURCES = complete.c editline.c sysunix.c
INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/ndb/include
DEFS = -DANSI_ARROWS -DHAVE_TCGETATTR -DSYS_UNIX
# Don't update the files from bitkeeper
%::SCCS/s.%
include .defs.mk
TYPE :=
ARCHIVE_TARGET := editline
CFLAGS += -DANSI_ARROWS -DHAVE_TCGETATTR -DSYS_UNIX
ifeq ($(NDB_OS), WIN32)
SOURCES = editline_win32.c
else
SOURCES = complete.c editline.c sysunix.c
endif
DIRS := test
include $(NDB_TOP)/Epilogue.mk
--
NOTE: This version has been modified by Ericsson/Alzato. Please
see the cvs changelog for more details.
--
$Revision: 1.2 $
This is a line-editing library. It can be linked into almost any
program to provide command-line editing and recall.
It is call-compatible with the FSF readline library, but it is a
fraction of the size (and offers fewer features). It does not use
standard I/O. It is distributed under a "C News-like" copyright.
Configuration is done in the Makefile. Type "make testit" to get
a small slow shell for testing.
This contains some changes since the posting to comp.sources.misc:
- Bugfix for completion on absolute pathnames.
- Better handling of M-n versus showing raw 8bit chars.
- Better signal handling.
- Now supports termios/termio/sgttyb ioctl's.
- Add M-m command to toggle how 8bit data is displayed.
The following changes, made since the last public release, come from
J.G. Vons <vons@cesar.crbca1.sinet.slb.com>:
- History-searching no longer redraws the line wrong
- Added ESC-ESC as synonym for ESC-?
- SIGQUIT (normally ^\) now sends a signal, not indicating EOF.
- Fixed some typo's and unclear wording in the manpage.
- Fixed completion when all entries shared a common prefix.
- Fixed some meta-char line-redrawing bugs.
Enjoy,
Rich $alz
<rsalz@osf.org>
Copyright 1992,1993 Simmule Turner and Rich Salz. All rights reserved.
This software is not subject to any license of the American Telephone
and Telegraph Company or of the Regents of the University of California.
Permission is granted to anyone to use this software for any purpose on
any computer system, and to alter it and redistribute it freely, subject
to the following restrictions:
1. The authors are not responsible for the consequences of use of this
software, no matter how awful, even if they arise from flaws in it.
2. The origin of this software must not be misrepresented, either by
explicit claim or by omission. Since few users ever read sources,
credits must appear in the documentation.
3. Altered versions must be plainly marked as such, and must not be
misrepresented as being the original software. Since few users
ever read sources, credits must appear in the documentation.
4. This notice may not be removed or altered.
/* -*- c-basic-offset: 4; -*-
** $Revision: 1.8 $
**
** History and file completion functions for editline library.
*/
#include "editline_internal.h"
/*
** strcmp-like sorting predicate for qsort.
*/
static int
compare(const void *p1, const void *p2)
{
const char **v1;
const char **v2;
v1 = (const char **)p1;
v2 = (const char **)p2;
return strcmp(*v1, *v2);
}
/*
** Fill in *avp with an array of names that match file, up to its length.
** Ignore . and .. .
*/
static int
FindMatches(char *dir, char *file, char ***avp)
{
char **av;
char **new;
char *p;
DIR *dp;
struct dirent *ep;
size_t ac;
size_t len;
if ((dp = opendir(dir)) == NULL)
return 0;
av = NULL;
ac = 0;
len = strlen(file);
while ((ep = readdir(dp)) != NULL) {
p = ep->d_name;
if (p[0] == '.' && (p[1] == '\0' || (p[1] == '.' && p[2] == '\0')))
continue;
if (len && strncmp(p, file, len) != 0)
continue;
if ((ac % MEM_INC) == 0) {
if ((new = malloc(sizeof(char*) * (ac + MEM_INC))) == NULL)
break;
if (ac) {
memcpy(new, av, ac * sizeof (char **));
free(av);
}
*avp = av = new;
}
if ((av[ac] = strdup(p)) == NULL) {
if (ac == 0)
free(av);
break;
}
ac++;
}
/* Clean up and return. */
(void)closedir(dp);
if (ac)
qsort(av, ac, sizeof (char **), compare);
return ac;
}
/*
** Split a pathname into allocated directory and trailing filename parts.
*/
static int
SplitPath(char *path, char **dirpart, char ** filepart)
{
static char DOT[] = ".";
char *dpart;
char *fpart;
if ((fpart = strrchr(path, '/')) == NULL) {
if ((dpart = strdup(DOT)) == NULL)
return -1;
if ((fpart = strdup(path)) == NULL) {
free(dpart);
return -1;
}
}
else {
if ((dpart = strdup(path)) == NULL)
return -1;
dpart[fpart - path + 1] = '\0';
if ((fpart = strdup(++fpart)) == NULL) {
free(dpart);
return -1;
}
}
*dirpart = dpart;
*filepart = fpart;
return 0;
}
/*
** Attempt to complete the pathname, returning an allocated copy.
** Fill in *unique if we completed it, or set it to 0 if ambiguous.
*/
char *
rl_complete(char *pathname,int *unique)
{
char **av;
char *dir;
char *file;
char *new;
char *p;
size_t ac;
size_t end;
size_t i;
size_t j;
size_t len;
size_t new_len;
size_t p_len;
if (SplitPath(pathname, &dir, &file) < 0)
return NULL;
if ((ac = FindMatches(dir, file, &av)) == 0) {
free(dir);
free(file);
return NULL;
}
p = NULL;
len = strlen(file);
if (ac == 1) {
/* Exactly one match -- finish it off. */
*unique = 1;
j = strlen(av[0]) - len + 2;
p_len = sizeof(char) * (j + 1);
if ((p = malloc(p_len)) != NULL) {
memcpy(p, av[0] + len, j);
new_len = sizeof(char) * (strlen(dir) + strlen(av[0]) + 2);
new = malloc(new_len);
if(new != NULL) {
snprintf(new, new_len, "%s/%s", dir, av[0]);
rl_add_slash(new, p, p_len);
free(new);
}
}
}
else {
/* Find largest matching substring. */
for (*unique = 0, i = len, end = strlen(av[0]); i < end; i++)
for (j = 1; j < ac; j++)
if (av[0][i] != av[j][i])
goto breakout;
breakout:
if (i > len) {
j = i - len + 1;
if ((p = malloc(sizeof(char) * j)) != NULL) {
memcpy(p, av[0] + len, j);
p[j - 1] = '\0';
}
}
}
/* Clean up and return. */
free(dir);
free(file);
for (i = 0; i < ac; i++)
free(av[i]);
free(av);
return p;
}
/*
** Return all possible completions.
*/
int
rl_list_possib(char *pathname, char ***avp)
{
char *dir;
char *file;
int ac;
if (SplitPath(pathname, &dir, &file) < 0)
return 0;
ac = FindMatches(dir, file, avp);
free(dir);
free(file);
return ac;
}
.\" $Revision: 1.1 $
.TH EDITLINE 3
.SH NAME
editline \- command-line editing library with history
.SH SYNOPSIS
.nf
.B "char *"
.B "readline(prompt)"
.B " char *prompt;"
.B "void"
.B "add_history(line)"
.B " char *line;"
.fi
.SH DESCRIPTION
.I Editline
is a library that provides an line-editing interface with text recall.
It is intended to be compatible with the
.I readline
library provided by the Free Software Foundation, but much smaller.
The bulk of this manual page describes the user interface.
.PP
The
.I readline
routine returns a line of text with the trailing newline removed.
The data is returned in a buffer allocated with
.IR malloc (3),
so the space should be released with
.IR free (3)
when the calling program is done with it.
Before accepting input from the user, the specified
.I prompt
is displayed on the terminal.
.PP
The
.I add_history
routine makes a copy of the specified
.I line
and adds it to the internal history list.
.SS "User Interface"
A program that uses this library provides a simple emacs-like editing
interface to its users.
A line may be edited before it is sent to the calling program by typing either
control characters or escape sequences.
A control character, shown as a caret followed by a letter, is typed by
holding down the ``control'' key while the letter is typed.
For example, ``^A'' is a control-A.
An escape sequence is entered by typing the ``escape'' key followed by one or
more characters.
The escape key is abbreviated as ``ESC''.
Note that unlike control keys, case matters in escape sequences; ``ESC\ F''
is not the same as ``ESC\ f''.
.PP
An editing command may be typed anywhere on the line, not just at the
beginning.
In addition, a return may also be typed anywhere on the line, not just at
the end.
.PP
Most editing commands may be given a repeat count,
.IR n ,
where
.I n
is a number.
To enter a repeat count, type the escape key, the number, and then
the command to execute.
For example, ``ESC\ 4\ ^f'' moves forward four characters.
If a command may be given a repeat count then the text ``[n]'' is given at the
end of its description.
.PP
The following control characters are accepted:
.RS
.nf
.ta \w'ESC DEL 'u
^A Move to the beginning of the line
^B Move left (backwards) [n]
^D Delete character [n]
^E Move to end of line
^F Move right (forwards) [n]
^G Ring the bell
^H Delete character before cursor (backspace key) [n]
^I Complete filename (tab key); see below
^J Done with line (return key)
^K Kill to end of line (or column [n])
^L Redisplay line
^M Done with line (alternate return key)
^N Get next line from history [n]
^P Get previous line from history [n]
^R Search backward (forward if [n]) through history for text;
\& prefixing the string with a caret (^) forces it to
\& match only at the beginning of a history line
^T Transpose characters
^V Insert next character, even if it is an edit command
^W Wipe to the mark
^X^X Exchange current location and mark
^Y Yank back last killed text
^[ Start an escape sequence (escape key)
^]c Move forward to next character ``c''
^? Delete character before cursor (delete key) [n]
.fi
.RE
.PP
The following escape sequences are provided.
.RS
.nf
.ta \w'ESC DEL 'u
ESC\ ^H Delete previous word (backspace key) [n]
ESC\ DEL Delete previous word (delete key) [n]
ESC\ ESC Show possible completions; see below
ESC\ SP Set the mark (space key); see ^X^X and ^Y above
ESC\ . Get the last (or [n]'th) word from previous line
ESC\ ? Show possible completions; see below
ESC\ < Move to start of history
ESC\ > Move to end of history
ESC\ b Move backward a word [n]
ESC\ d Delete word under cursor [n]
ESC\ f Move forward a word [n]
ESC\ l Make word lowercase [n]
ESC\ m Toggle if 8bit chars display as themselves or with
\& an ``M\-'' prefix
ESC\ u Make word uppercase [n]
ESC\ y Yank back last killed text
ESC\ w Make area up to mark yankable
ESC\ nn Set repeat count to the number nn
ESC\ C Read from environment variable ``_C_'', where C is
\& an uppercase letter
.fi
.RE
.PP
The
.I editline
library has a small macro facility.
If you type the escape key followed by an uppercase letter,
.IR C ,
then the contents of the environment variable
.I _C_
are read in as if you had typed them at the keyboard.
For example, if the variable
.I _L_
contains the following:
.RS
^A^Kecho '^V^[[H^V^[[2J'^M
.RE
Then typing ``ESC L'' will move to the beginning of the line, kill the
entire line, enter the echo command needed to clear the terminal (if your
terminal is like a VT-100), and send the line back to the shell.
.PP
The
.I editline
library also does filename completion.
Suppose the root directory has the following files in it:
.RS
.nf
.ta \w'core 'u
bin vmunix
core vmunix.old
.fi
.RE
If you type ``rm\ /v'' and then the tab key.
.I Editline
will then finish off as much of the name as possible by adding ``munix''.
Because the name is not unique, it will then beep.
If you type the escape key followed by either a question mark or another
escape, it will display the two choices.
If you then type a period and a tab, the library will finish off the filename
for you:
.RS
.nf
.RI "rm /v[TAB]" munix ".[TAB]" old
.fi
.RE
The tab key is shown by ``[TAB]'' and the automatically-entered text
is shown in italics.
.SH "BUGS AND LIMITATIONS"
Cannot handle lines more than 80 columns.
.SH AUTHORS
Simmule R. Turner <uunet.uu.net!capitol!sysgo!simmy>
and Rich $alz <rsalz@osf.org>.
Original manual page by DaviD W. Sanderson <dws@ssec.wisc.edu>.
This diff is collapsed.
/* $Revision: 1.2 $
**
** Internal header file for editline library.
*/
#include <ndb_global.h>
#if defined(SYS_UNIX)
#include "unix.h"
#endif /* defined(SYS_UNIX) */
#define MEM_INC 64
#define SCREEN_INC 256
/*
** Variables and routines internal to this package.
*/
extern int rl_eof;
extern int rl_erase;
extern int rl_intr;
extern int rl_kill;
extern int rl_quit;
#if defined(DO_SIGTSTP)
extern int rl_susp;
#endif /* defined(DO_SIGTSTP) */
extern char *rl_complete();
extern int rl_list_possib();
extern void rl_ttyset();
extern void rl_add_slash();
/* $Revision: 1.4 $
**
** Unix system-dependant routines for editline library.
*/
#include "editline_internal.h"
#if defined(HAVE_TCGETATTR)
#include <termios.h>
void
rl_ttyset(int Reset)
{
static struct termios old;
struct termios new;
if (Reset == 0) {
if (tcgetattr(0, &old) < 0) perror("tcgetattr");
rl_erase = old.c_cc[VERASE];
rl_kill = old.c_cc[VKILL];
rl_eof = old.c_cc[VEOF];
rl_intr = old.c_cc[VINTR];
rl_quit = old.c_cc[VQUIT];
#if defined(DO_SIGTSTP)
rl_susp = old.c_cc[VSUSP];
#endif /* defined(DO_SIGTSTP) */
new = old;
new.c_lflag &= ~(ECHO | ICANON | ISIG);
new.c_iflag &= ~(ISTRIP | INPCK);
new.c_cc[VMIN] = 1;
new.c_cc[VTIME] = 0;
if (tcsetattr(0, TCSADRAIN, &new) < 0) perror("tcsetattr");
}
else
(void)tcsetattr(0, TCSADRAIN, &old);
}
#else
#if defined(HAVE_TERMIO)
#include <termio.h>
void
rl_ttyset(int Reset)
{
static struct termio old;
struct termio new;
if (Reset == 0) {
(void)ioctl(0, TCGETA, &old);
rl_erase = old.c_cc[VERASE];
rl_kill = old.c_cc[VKILL];
rl_eof = old.c_cc[VEOF];
rl_intr = old.c_cc[VINTR];
rl_quit = old.c_cc[VQUIT];
#if defined(DO_SIGTSTP)
rl_susp = old.c_cc[VSUSP];
#endif /* defined(DO_SIGTSTP) */
new = old;
new.c_lflag &= ~(ECHO | ICANON | ISIG);
new.c_iflag &= ~(ISTRIP | INPCK);
new.c_cc[VMIN] = 1;
new.c_cc[VTIME] = 0;
(void)ioctl(0, TCSETAW, &new);
}
else
(void)ioctl(0, TCSETAW, &old);
}
#else
#include <sgtty.h>
void
rl_ttyset(int Reset)
{
static struct sgttyb old_sgttyb;
static struct tchars old_tchars;
struct sgttyb new_sgttyb;
struct tchars new_tchars;
#if defined(DO_SIGTSTP)
struct ltchars old_ltchars;
#endif /* defined(DO_SIGTSTP) */
if (Reset == 0) {
(void)ioctl(0, TIOCGETP, &old_sgttyb);
rl_erase = old_sgttyb.sg_erase;
rl_kill = old_sgttyb.sg_kill;
(void)ioctl(0, TIOCGETC, &old_tchars);
rl_eof = old_tchars.t_eofc;
rl_intr = old_tchars.t_intrc;
rl_quit = old_tchars.t_quitc;
#if defined(DO_SIGTSTP)
(void)ioctl(0, TIOCGLTC, &old_ltchars);
rl_susp = old_ltchars.t_suspc;
#endif /* defined(DO_SIGTSTP) */
new_sgttyb = old_sgttyb;
new_sgttyb.sg_flags &= ~ECHO;
new_sgttyb.sg_flags |= RAW;
#if defined(PASS8)
new_sgttyb.sg_flags |= PASS8;
#endif /* defined(PASS8) */
(void)ioctl(0, TIOCSETP, &new_sgttyb);
new_tchars = old_tchars;
new_tchars.t_intrc = -1;
new_tchars.t_quitc = -1;
(void)ioctl(0, TIOCSETC, &new_tchars);
}
else {
(void)ioctl(0, TIOCSETP, &old_sgttyb);
(void)ioctl(0, TIOCSETC, &old_tchars);
}
}
#endif /* defined(HAVE_TERMIO) */
#endif /* defined(HAVE_TCGETATTR) */
void
rl_add_slash(char *path, char *p, size_t p_len)
{
struct stat Sb;
if (stat(path, &Sb) >= 0) {
size_t len= strlen(p);
if (len+1 < p_len) {
p[len]= S_ISDIR(Sb.st_mode) ? '/' : ' ';
p[len+1]= 0;
}
}
}
include .defs.mk
TYPE := util
BIN_TARGET := editline_test
BIN_TARGET_ARCHIVES := editline
SOURCES = testit.c
include $(NDB_TOP)/Epilogue.mk
/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/* -*- c-basic-offset: 4; -*-
** $Revision: 1.5 $
**
** A "micro-shell" to test editline library.
** If given any arguments, commands aren't executed.
*/
#include <ndb_global.h>
#include <editline/editline.h>
int
main(int argc, char **argv)
{
char *prompt;
char *p;
int doit;
(void)argv; /* Suppress warning */
doit = argc == 1;
if ((prompt = getenv("TESTPROMPT")) == NULL)
prompt = "testit> ";
while ((p = readline(prompt)) != NULL) {
(void)printf("\t\t\t|%s|\n", p);
if (doit) {
if (strncmp(p, "cd ", 3) == 0) {
if (chdir(&p[3]) < 0)
perror(&p[3]);
} else {
if (system(p) != 0)
perror(p);
}
}
add_history(p);
free(p);
}
return 0;
}
/* $Revision: 1.3 $
**
** Editline system header file for Unix.
*/
#define CRLF "\r\n"
#include <ndb_global.h>
#include <dirent.h>
include .defs.mk
TYPE := ndbapi
PIC_ARCHIVE := Y
ARCHIVE_TARGET := logger
DIRS := loggertest
SOURCES := Logger.cpp LogHandlerList.cpp LogHandler.cpp \
ConsoleLogHandler.cpp FileLogHandler.cpp
ifeq ($(NDB_OS), OSE)
NO_SYSLOG := Y
endif
ifeq ($(NDB_OS), WIN32)
NO_SYSLOG := Y
endif
ifneq ($(NO_SYSLOG), Y)
SOURCES += SysLogHandler.cpp
endif
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := ndbapi mgmapiclient
PIC_ARCHIVE := Y
ARCHIVE_TARGET := mgmsrvcommon
# Removed temporary
DIRS := printConfig
SOURCES = \
LocalConfig.cpp \
Config.cpp \
ConfigInfo.cpp \
ConfigRetriever.cpp \
InitConfigFileParser.cpp \
IPCConfig.cpp
SOURCES.c = NdbConfig.c
CFLAGS_IPCConfig.cpp := -I$(call fixpath,$(NDB_TOP)/src/mgmapi)
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
DIRS :=
ifeq ($(NDB_OS), SOFTOSE)
DIRS += ose
else
ifeq ($(NDB_OS), OSE)
DIRS += ose
else
ifeq ($(NDB_OS), WIN32)
DIRS += win32
else
DIRS += unix
endif
endif
endif
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := util
PIC_ARCHIVE := Y
ARCHIVE_TARGET := portlib
SOURCES.c = NdbCondition.c \
NdbMutex.c \
NdbSleep.c \
NdbTick.c \
NdbEnv.c \
NdbThread.c \
NdbHost.c \
NdbTCP.c \
NdbDaemon.c
ifeq ($(NDB_OS), SOFTOSE)
SOURCES += NdbMem_SoftOse.cpp
else
SOURCES.c += NdbMem.c
endif
include $(NDB_TOP)/Epilogue.mk
testNdbDaemon: NdbDaemon.c
$(CC) -o $@ NdbDaemon.c $(CCFLAGS) -DNDB_DAEMON_TEST -L$(NDB_TOP)/lib
include .defs.mk
TYPE := util
PIC_ARCHIVE := Y
ARCHIVE_TARGET := transporter
DIRS := basictest perftest
# Source files of non-templated classes (.cpp files)
SOURCES = \
Transporter.cpp \
SendBuffer.cpp \
TCP_Transporter.cpp \
TransporterRegistry.cpp \
Packer.cpp
DIRS := basictest perftest
CCFLAGS_LOC += -I$(call fixpath,$(NDB_TOP)/include/kernel) \
-I$(call fixpath,$(NDB_TOP)/include/transporter)
ifeq ($(NDB_SHM), Y)
SOURCES += SHM_Transporter.cpp
ifeq ($(NDB_OS), WIN32)
SOURCES += SHM_Transporter.win32.cpp
else
SOURCES += SHM_Transporter.unix.cpp
endif
endif
ifeq ($(NDB_SCI), Y)
SOURCES += SCI_Transporter.cpp
endif
ifneq ($(findstring OSE, $(NDB_OS)),)
SOURCES += OSE_Transporter.cpp
SOURCES += OSE_Receiver.cpp
endif
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := util
PIC_ARCHIVE := Y
ARCHIVE_TARGET := general
SOURCES = File.cpp md5_hash.cpp Properties.cpp socket_io.cpp \
SimpleProperties.cpp Parser.cpp InputStream.cpp SocketServer.cpp \
OutputStream.cpp NdbOut.cpp BaseString.cpp Base64.cpp \
NdbSqlUtil.cpp ConfigValues.cpp new.cpp
SOURCES.c = uucode.c random.c getarg.c version.c
ifeq ($(NDB_OS), OSE)
SOURCES += NdbErrHnd.cpp
endif
ifeq ($(NDB_OS), OSE)
SOURCES += NdbErrHnd.cpp
endif
SOURCES.c += strdup.c strlcat.c strlcpy.c
DIRS := testSimpleProperties testProperties testConfigValues
include $(NDB_TOP)/Epilogue.mk
testNdbSqlUtil: NdbSqlUtil.cpp
$(CC) -o $@ NdbSqlUtil.cpp $(CCFLAGS) -DNDB_SQL_UTIL_TEST -L$(NDB_TOP)/lib -lportlib -lgeneral
include .defs.mk
DIRS := cpcd
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := util
BIN_TARGET := ndb_cpcd
# Source files of non-templated classes (.cpp files)
SOURCES = main.cpp CPCD.cpp Process.cpp APIService.cpp Monitor.cpp common.cpp
BIN_TARGET_LIBS += logger
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
DIRS := error vm ndb-main blocks
include $(NDB_TOP)/Epilogue.mk
#--------------------------------------------------------------------------
#
# Name Makefile
#
#
#
# List subdirectories to be travered
include .defs.mk
DIRS := \
cmvmi \
dbacc \
dbdict \
dbdih \
dblqh \
dbtc \
dbtup \
ndbfs \
ndbcntr \
qmgr \
trix \
backup \
dbutil \
suma \
grep \
dbtux
include ${NDB_TOP}/Epilogue.mk
include .defs.mk
TYPE := kernel
#ifneq ($(MYSQLCLUSTER_TOP),)
DIRS := restore
#endif
ARCHIVE_TARGET := backup
SOURCES = Backup.cpp BackupInit.cpp
include $(NDB_TOP)/Epilogue.mk
$(NDB_TOP)/bin/readBackupFile: read.o
$(C++) -o $@ read.o \
$(NDB_TOP)/lib/libportlib.a $(NDB_TOP)/lib/libgeneral.a
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := cmvmi
SOURCES = Cmvmi.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := dbacc
SOURCES = \
DbaccInit.cpp \
DbaccMain.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := dbdict
SOURCES = \
Dbdict.cpp
DIRS := printSchemafile
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := dbdih
DIRS := printSysfile
SOURCES = \
DbdihInit.cpp \
DbdihMain.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := dblqh
DIRS := redoLogReader
SOURCES = \
DblqhInit.cpp \
DblqhMain.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := dbtc
SOURCES = \
DbtcInit.cpp \
DbtcMain.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := dbtup
SOURCES = \
DbtupExecQuery.cpp \
DbtupBuffer.cpp \
DbtupRoutines.cpp \
DbtupCommit.cpp \
DbtupFixAlloc.cpp \
DbtupTrigger.cpp \
DbtupAbort.cpp \
DbtupLCP.cpp \
DbtupUndoLog.cpp \
DbtupPageMap.cpp \
DbtupPagMan.cpp \
DbtupStoredProcDef.cpp \
DbtupMeta.cpp \
DbtupTabDesMan.cpp \
DbtupGen.cpp \
DbtupSystemRestart.cpp \
DbtupIndex.cpp \
DbtupDebug.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE = kernel
ARCHIVE_TARGET = dbtux
SOURCES = \
DbtuxGen.cpp \
DbtuxMeta.cpp \
DbtuxMaint.cpp \
DbtuxNode.cpp \
DbtuxTree.cpp \
DbtuxScan.cpp \
DbtuxCmp.cpp \
DbtuxDebug.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := dbutil
SOURCES = DbUtil.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := grep
SOURCES = Grep.cpp GrepInit.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := ndbcntr
SOURCES = \
NdbcntrInit.cpp \
NdbcntrSysTable.cpp \
NdbcntrMain.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := ndbfs
SOURCES = \
AsyncFile.cpp \
Ndbfs.cpp VoidFs.cpp \
Filename.cpp \
CircularIndex.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := qmgr
SOURCES = \
QmgrInit.cpp \
QmgrMain.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := suma
SOURCES = Suma.cpp SumaInit.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := trix
SOURCES = Trix.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := error
SOURCES = \
TimeModule.cpp \
ErrorReporter.cpp \
ErrorMessages.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := kernel
ARCHIVE_TARGET := kernel
SOURCES = \
SimulatedBlock.cpp \
FastScheduler.cpp \
TimeQueue.cpp \
VMSignal.cpp \
ThreadConfig.cpp \
TransporterCallback.cpp \
Emulator.cpp \
Configuration.cpp \
WatchDog.cpp \
SimplePropertiesSection.cpp \
SectionReader.cpp \
MetaData.cpp \
Mutex.cpp SafeCounter.cpp
CFLAGS_Configuration.cpp := -I$(call fixpath,$(NDB_TOP)/src/mgmapi)
DIRS := testCopy testDataBuffer testSimplePropertiesSection
ifneq ($(USE_EDITLINE), N)
DIRS += testLongSig
endif
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := util
PIC_ARCHIVE := Y
ARCHIVE_TARGET := mgmapi
A_LIB := Y
SO_LIB := Y
PIC_LIB := Y
#DIRS := test
LIB_TARGET := MGM_API
LIB_TARGET_ARCHIVES := $(ARCHIVE_TARGET) general portlib
# Source files of non-templated classes (.C files)
SOURCES = mgmapi.cpp mgmapi_configuration.cpp
CCFLAGS_LOC += -I$(call fixpath,$(NDB_TOP)/include/mgmapi) \
-I$(call fixpath,$(NDB_TOP)/src/common/mgmcommon)
CCFLAGS += -DNO_DEBUG_MESSAGES
# -I$(NDB_TOP)/src/common/mgmcommon
include $(NDB_TOP)/Epilogue.mk
This diff is collapsed.
/* Copyright (C) 2003 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#ifndef CommandInterpreter_H
#define CommandInterpreter_H
//#define HAVE_GLOBAL_REPLICATION
//*****************************************************************************
// Author: Peter Lind
//*****************************************************************************
#include <ndb_global.h>
#include <Vector.hpp>
#include <editline/editline.h>
#ifdef HAVE_GLOBAL_REPLICATION
#include "../rep/repapi/repapi.h"
#endif
#include <mgmapi.h>
class MgmtSrvr;
/**
* @class CommandInterpreter
* @brief Reads command line in management client
*
* This class has one public method which reads a command line
* from a stream. It then interpret that commmand line and calls a suitable
* method in the MgmtSrvr class which executes the command.
*
* For command syntax, see the HELP command.
*/
class CommandInterpreter {
public:
/**
* Constructor
* @param mgmtSrvr: Management server to use when executing commands
*/
CommandInterpreter(const char *);
~CommandInterpreter();
/**
* Reads one line from the stream, parse the line to find
* a command and then calls a suitable method which executes
* the command.
*
* @return true until quit/bye/exit has been typed
*/
int readAndExecute(int _try_reconnect=-1);
private:
/**
* Read a string, and return a pointer to it.
*
* @return NULL on EOF.
*/
char *readline_gets ()
{
static char *line_read = (char *)NULL;
/* If the buffer has already been allocated, return the memory
to the free pool. */
if (line_read)
{
free (line_read);
line_read = (char *)NULL;
}
/* Get a line from the user. */
line_read = readline ("NDB> ");
/* If the line has any text in it, save it on the history. */
if (line_read && *line_read)
add_history (line_read);
return (line_read);
}
void printError();
/**
* Analyse the command line, after the first token.
*
* @param processId: DB process id to send command to or -1 if
* command will be sent to all DB processes.
* @param allAfterFirstToken: What the client gave after the
* first token on the command line
*/
void analyseAfterFirstToken(int processId, char* allAfterFirstTokenCstr);
/**
* Parse the block specification part of the LOG* commands,
* things after LOG*: [BLOCK = {ALL|<blockName>+}]
*
* @param allAfterLog: What the client gave after the second token
* (LOG*) on the command line
* @param blocks, OUT: ALL or name of all the blocks
* @return: true if correct syntax, otherwise false
*/
bool parseBlockSpecification(const char* allAfterLog,
Vector<const char*>& blocks);
/**
* A bunch of execute functions: Executes one of the commands
*
* @param processId: DB process id to send command to
* @param parameters: What the client gave after the command name
* on the command line.
* For example if complete input from user is: "1 LOGLEVEL 22" then the
* parameters argument is the string with everything after LOGLEVEL, in
* this case "22". Each function is responsible to check the parameters
* argument.
*/
void executeHelp(char* parameters);
void executeShow(char* parameters);
void executeShutdown(char* parameters);
void executeRun(char* parameters);
void executeInfo(char* parameters);
void executeClusterLog(char* parameters);
public:
void executeStop(int processId, const char* parameters, bool all);
void executeEnterSingleUser(char* parameters);
void executeExitSingleUser(char* parameters);
void executeStart(int processId, const char* parameters, bool all);
void executeRestart(int processId, const char* parameters, bool all);
void executeLogLevel(int processId, const char* parameters, bool all);
void executeError(int processId, const char* parameters, bool all);
void executeTrace(int processId, const char* parameters, bool all);
void executeLog(int processId, const char* parameters, bool all);
void executeLogIn(int processId, const char* parameters, bool all);
void executeLogOut(int processId, const char* parameters, bool all);
void executeLogOff(int processId, const char* parameters, bool all);
void executeTestOn(int processId, const char* parameters, bool all);
void executeTestOff(int processId, const char* parameters, bool all);
void executeSet(int processId, const char* parameters, bool all);
void executeGetStat(int processId, const char* parameters, bool all);
void executeStatus(int processId, const char* parameters, bool all);
void executeEventReporting(int processId, const char* parameters, bool all);
void executeDumpState(int processId, const char* parameters, bool all);
void executeStartBackup(char * parameters);
void executeAbortBackup(char * parameters);
void executeRep(char* parameters);
void executeCpc(char * parameters);
public:
bool connect();
bool disconnect();
/**
* A execute function definition
*/
public:
typedef void (CommandInterpreter::* ExecuteFunction)(int processId,
const char * param,
bool all);
struct CommandFunctionPair {
const char * command;
ExecuteFunction executeFunction;
};
private:
/**
*
*/
void executeForAll(const char * cmd,
ExecuteFunction fun,
const char * param);
NdbMgmHandle m_mgmsrv;
bool connected;
const char *host;
int try_reconnect;
#ifdef HAVE_GLOBAL_REPLICATION
NdbRepHandle m_repserver;
const char *rep_host;
bool rep_connected;
#endif
};
#endif // CommandInterpreter_H
noinst_LTLIBRARIES = libndbmgmclient.la
ndbtools_PROGRAMS = ndb_mgm ndbtools_PROGRAMS = ndb_mgm
ndb_mgm_SOURCES = \ libndbmgmclient_la_SOURCES = CommandInterpreter.cpp
main.cpp \
CommandInterpreter.cpp \ ndb_mgm_SOURCES = main.cpp
CpcClient.cpp
include $(top_srcdir)/ndb/config/common.mk.am include $(top_srcdir)/ndb/config/common.mk.am
include $(top_srcdir)/ndb/config/type_ndbapi.mk.am include $(top_srcdir)/ndb/config/type_ndbapi.mk.am
INCLUDES += -I$(top_srcdir)/ndb/include/mgmapi -I$(top_srcdir)/ndb/src/common/mgmcommon INCLUDES += -I$(top_srcdir)/ndb/include/mgmapi -I$(top_srcdir)/ndb/src/common/mgmcommon
LDADD_LOC = $(top_builddir)/ndb/src/libndbclient.la \ LDADD_LOC = $(top_builddir)/ndb/src/mgmclient/libndbmgmclient.la \
$(top_builddir)/ndb/src/common/editline/libeditline.a \ @readline_link@ \
$(top_builddir)/ndb/src/libndbclient.la \
$(top_builddir)/dbug/libdbug.a \ $(top_builddir)/dbug/libdbug.a \
$(top_builddir)/mysys/libmysys.a \ $(top_builddir)/mysys/libmysys.a \
$(top_builddir)/strings/libmystrings.a \ $(top_builddir)/strings/libmystrings.a \
......
include .defs.mk
TYPE := ndbapi
BIN_TARGET := mgmtclient
BIN_TARGET_LIBS :=
BIN_TARGET_ARCHIVES := trace logger mgmapi general mgmsrvcommon portlib repapi
BIN_TARGET_ARCHIVES += editline
DIRS = test_cpcd
# Source files of non-templated classes (.cpp files)
SOURCES = \
main.cpp \
CommandInterpreter.cpp \
CpcClient.cpp
CCFLAGS_LOC += -I$(call fixpath,$(NDB_TOP)/include/mgmapi) \
-I$(call fixpath,$(NDB_TOP)/src/common/mgmcommon)
include $(NDB_TOP)/Epilogue.mk
_bins_mkconfig : $(NDB_TOP)/bin/$(BIN_TARGET)
...@@ -23,12 +23,12 @@ ...@@ -23,12 +23,12 @@
#include <ndb_version.h> #include <ndb_version.h>
#include <LocalConfig.hpp> #include <LocalConfig.hpp>
#include "CommandInterpreter.hpp" #include "ndb_mgmclient.hpp"
const char *progname = "ndb_mgm"; const char *progname = "ndb_mgm";
static CommandInterpreter* com; static Ndb_mgmclient* com;
extern "C" extern "C"
void void
...@@ -127,8 +127,8 @@ int main(int argc, char** argv){ ...@@ -127,8 +127,8 @@ int main(int argc, char** argv){
signal(SIGPIPE, handler); signal(SIGPIPE, handler);
com = new CommandInterpreter(buf); com = new Ndb_mgmclient(buf);
while(com->readAndExecute(_try_reconnect)); while(com->read_and_execute(_try_reconnect));
delete com; delete com;
return 0; return 0;
......
...@@ -14,19 +14,20 @@ ...@@ -14,19 +14,20 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#ifndef Ndb_mgmclient_h
#define Ndb_mgmclient_h
#include <ndb_global.h> class CommandInterpreter;
class Ndb_mgmclient
char* readline(const char* prompt)
{ {
char* szBuf; public:
printf(prompt); Ndb_mgmclient(const char*);
szBuf = (char*)malloc(256); ~Ndb_mgmclient();
return gets(szBuf); int read_and_execute(int _try_reconnect=-1);
} int execute(const char *_line, int _try_reconnect=-1);
int disconnect();
void add_history(char* pch) private:
{ CommandInterpreter *m_cmd;
} };
#endif // Ndb_mgmclient_h
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include <ndb_global.h> #include <ndb_global.h>
#include <Vector.hpp> #include <Vector.hpp>
#include <editline/editline.h>
#include <BaseString.hpp> #include <BaseString.hpp>
class MgmtSrvr; class MgmtSrvr;
...@@ -63,26 +62,27 @@ private: ...@@ -63,26 +62,27 @@ private:
*/ */
char *readline_gets () char *readline_gets ()
{ {
static char linebuffer[254];
static char *line_read = (char *)NULL; static char *line_read = (char *)NULL;
// Disable the default file-name completion action of TAB
// rl_bind_key ('\t', rl_insert);
/* If the buffer has already been allocated, return the memory /* If the buffer has already been allocated, return the memory
to the free pool. */ to the free pool. */
if (line_read) if (line_read)
{ {
free (line_read); free (line_read);
line_read = (char *)NULL; line_read = (char *)NULL;
} }
/* Get a line from the user. */ /* Get a line from the user. */
line_read = readline ("NDB> "); fputs("ndb_mgmd> ", stdout);
linebuffer[sizeof(linebuffer)-1]=0;
/* If the line has any text in it, save it on the history. */ line_read = fgets(linebuffer, sizeof(linebuffer)-1, stdin);
if (line_read && *line_read) if (line_read == linebuffer) {
add_history (line_read); char *q=linebuffer;
while (*q > 31) q++;
*q=0;
line_read= strdup(linebuffer);
}
return (line_read); return (line_read);
} }
......
...@@ -24,7 +24,6 @@ INCLUDES_LOC = -I$(top_srcdir)/ndb/src/ndbapi \ ...@@ -24,7 +24,6 @@ INCLUDES_LOC = -I$(top_srcdir)/ndb/src/ndbapi \
-I$(top_srcdir)/ndb/src/common/mgmcommon -I$(top_srcdir)/ndb/src/common/mgmcommon
LDADD_LOC = $(top_builddir)/ndb/src/libndbclient.la \ LDADD_LOC = $(top_builddir)/ndb/src/libndbclient.la \
$(top_builddir)/ndb/src/common/editline/libeditline.a \
$(top_builddir)/dbug/libdbug.a \ $(top_builddir)/dbug/libdbug.a \
$(top_builddir)/mysys/libmysys.a \ $(top_builddir)/mysys/libmysys.a \
$(top_builddir)/strings/libmystrings.a @NDB_SCI_LIBS@ $(top_builddir)/strings/libmystrings.a @NDB_SCI_LIBS@
......
include .defs.mk
TYPE := ndbapi mgmapiclient
BIN_TARGET := mgmtsrvr
BIN_TARGET_LIBS :=
BIN_TARGET_ARCHIVES := NDB_API mgmsrvcommon mgmapi general
ifneq ($(USE_EDITLINE), N)
BIN_TARGET_ARCHIVES += editline
DIRS := mkconfig
endif
BIN_TARGET_ARCHIVES += general
BIN_FLAGS += $(TERMCAP_LIB)
# Source files of non-templated classes (.cpp files)
SOURCES = \
MgmtSrvr.cpp \
MgmtSrvrGeneralSignalHandling.cpp \
main.cpp \
Services.cpp \
convertStrToInt.cpp \
NodeLogLevel.cpp \
NodeLogLevelList.cpp \
SignalQueue.cpp \
MgmtSrvrConfig.cpp
ifeq ($(findstring OSE, $(NDB_OS)),)
SOURCES += CommandInterpreter.cpp
endif
CCFLAGS_LOC += -I$(call fixpath,$(NDB_TOP)/src/ndbapi) \
-I$(call fixpath,$(NDB_TOP)/src/mgmapi) \
-I$(call fixpath,$(NDB_TOP)/include/mgmapi) \
-I$(call fixpath,$(NDB_TOP)/src/common/mgmcommon)
include $(NDB_TOP)/Epilogue.mk
_bins_mkconfig : $(NDB_TOP)/bin/$(BIN_TARGET)
include .defs.mk
TYPE := ndbapi
PIC_ARCHIVE := Y
NONPIC_ARCHIVE := Y
ARCHIVE_TARGET := ndbapi
A_LIB := Y
SO_LIB := Y
PIC_LIB := Y
LIB_TARGET := NDB_API
LIB_TARGET_ARCHIVES := $(ARCHIVE_TARGET) \
transporter \
general \
signaldataprint \
mgmapi mgmsrvcommon \
portlib \
logger \
trace
DIRS := signal-sender
CFLAGS_TransporterFacade.cpp := -I$(call fixpath,$(NDB_TOP)/src/mgmapi)
CFLAGS_ClusterMgr.cpp := -I$(call fixpath,$(NDB_TOP)/src/mgmapi)
# Source files of non-templated classes (.cpp files)
SOURCES = \
TransporterFacade.cpp \
ClusterMgr.cpp \
Ndb.cpp \
NdbPoolImpl.cpp NdbPool.cpp \
Ndblist.cpp \
Ndbif.cpp \
Ndbinit.cpp \
ndberror.c Ndberr.cpp NdbErrorOut.cpp \
NdbConnection.cpp \
NdbConnectionScan.cpp \
NdbOperation.cpp \
NdbOperationSearch.cpp \
NdbOperationInt.cpp \
NdbOperationDefine.cpp \
NdbOperationExec.cpp \
NdbResultSet.cpp \
NdbScanOperation.cpp NdbScanFilter.cpp \
NdbIndexOperation.cpp \
NdbEventOperation.cpp \
NdbEventOperationImpl.cpp \
NdbApiSignal.cpp \
NdbRecAttr.cpp \
NdbUtil.cpp \
NdbReceiver.cpp \
NdbDictionary.cpp NdbDictionaryImpl.cpp DictCache.cpp
NdbBlob.cpp
include $(NDB_TOP)/Epilogue.mk
###
# Backward compatible
include .defs.mk
ifeq ($(NDB_OS), OSE)
DIRS = basic flexBench flexAsynch
else
DIRS = lmc-bench ronja
BIN_DIRS = \
flexAsynch \
flexBench \
flexHammer \
flexTT \
create_tab \
create_all_tabs \
drop_all_tabs \
bulk_copy \
restarter2 restarter \
restarts testScan testNdbApi \
testScanInterpreter testIndex \
testInterpreter \
testOIBasic \
testBackup \
testBasic \
basicAsynch \
testNodeRestart \
testOperations testTransactions \
testSystemRestart \
testTimeout \
testMgm \
testRestartGci \
testDataBuffers \
testDict \
acid \
telco \
indexTest \
test_event \
indexTest2 \
testGrep \
testBlobs
ifeq ($(NDB_OS), SOLARIS)
ifeq ($(NDB_COMPILER), FORTE6)
DIRS += flexTimedAsynch
endif
endif
endif
include ${NDB_TOP}/Epilogue.mk
include .defs.mk
DIRS = src bankCreator \
bankSumAccounts \
bankTransactionMaker \
bankValidateAllGLs \
bankMakeGL \
bankTimer \
testBank
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
TYPE := ndbapitest
BIN_TARGET := flexBench
# Source files of non-templated classes (.C files)
SOURCES = flexBench.cpp
include $(NDB_TOP)/Epilogue.mk
...@@ -11,9 +11,8 @@ test_SCRIPTS=atrt-analyze-result.sh atrt-gather-result.sh atrt-setup.sh \ ...@@ -11,9 +11,8 @@ test_SCRIPTS=atrt-analyze-result.sh atrt-gather-result.sh atrt-setup.sh \
atrt-clear-result.sh make-config.sh make-index.sh make-html-reports.sh atrt-clear-result.sh make-config.sh make-index.sh make-html-reports.sh
atrt_SOURCES = main.cpp atrt_SOURCES = main.cpp
INCLUDES_LOC = -I$(top_srcdir)/ndb/test/include -I$(top_srcdir)/ndb/src/mgmclient INCLUDES_LOC = -I$(top_srcdir)/ndb/test/include
LDADD_LOC = $(top_builddir)/ndb/src/mgmclient/CpcClient.o \ LDADD_LOC = $(top_builddir)/ndb/test/src/libNDBT.a \
$(top_builddir)/ndb/test/src/libNDBT.a \
$(top_builddir)/ndb/src/libndbclient.la \ $(top_builddir)/ndb/src/libndbclient.la \
$(top_builddir)/dbug/libdbug.a \ $(top_builddir)/dbug/libdbug.a \
$(top_builddir)/mysys/libmysys.a \ $(top_builddir)/mysys/libmysys.a \
......
include .defs.mk
TYPE := util
BIN_TARGET := atrt
BIN_TARGET_LIBS := mgmapi
SOURCES = main.cpp
SCRIPTS = atrt-analyze-result.sh atrt-gather-result.sh atrt-setup.sh \
atrt-clear-result.sh make-config.sh
OBJECTS_LOC = $(call fixpath,$(NDB_TOP)/src/mgmclient/CpcClient.o)
CFLAGS_main.cpp := -I$(call fixpath,$(NDB_TOP)/src/mgmclient)
CCFLAGS_LOC += -I$(call fixpath,$(NDB_TOP)/include/mgmapi)
include $(NDB_TOP)/Epilogue.mk
_bins::
-rm -f $(SCRIPTS:%=$(NDB_TOP)/bin/%)
cp $(SCRIPTS) $(NDB_TOP)/bin
...@@ -9,7 +9,8 @@ libNDBT_a_SOURCES = \ ...@@ -9,7 +9,8 @@ libNDBT_a_SOURCES = \
HugoAsynchTransactions.cpp UtilTransactions.cpp \ HugoAsynchTransactions.cpp UtilTransactions.cpp \
NdbRestarter.cpp NdbRestarts.cpp NDBT_Output.cpp \ NdbRestarter.cpp NdbRestarts.cpp NDBT_Output.cpp \
NdbBackup.cpp NdbConfig.cpp NdbGrep.cpp NDBT_Table.cpp \ NdbBackup.cpp NdbConfig.cpp NdbGrep.cpp NDBT_Table.cpp \
NdbSchemaCon.cpp NdbSchemaOp.cpp getarg.c NdbSchemaCon.cpp NdbSchemaOp.cpp getarg.c \
CpcClient.cpp
INCLUDES_LOC = -I$(top_srcdir)/ndb/src/common/mgmcommon -I$(top_srcdir)/ndb/include/mgmcommon -I$(top_srcdir)/ndb/include/kernel -I$(top_srcdir)/ndb/src/mgmapi INCLUDES_LOC = -I$(top_srcdir)/ndb/src/common/mgmcommon -I$(top_srcdir)/ndb/include/mgmcommon -I$(top_srcdir)/ndb/include/kernel -I$(top_srcdir)/ndb/src/mgmapi
......
include .defs.mk
TYPE := ndbapitest
ARCHIVE_TARGET := NDBT
SOURCES = NDBT_ReturnCodes.cpp \
NDBT_Error.cpp NDBT_Tables.cpp NDBT_ResultRow.cpp \
NDBT_Test.cpp HugoCalculator.cpp \
HugoOperations.cpp HugoTransactions.cpp \
HugoAsynchTransactions.cpp UtilTransactions.cpp \
NdbRestarter.cpp NdbRestarts.cpp NDBT_Output.cpp \
NdbBackup.cpp NdbConfig.cpp NdbGrep.cpp NDBT_Table.cpp
SOURCES.c =
CFLAGS_NdbRestarter.cpp := -I$(call fixpath,$(NDB_TOP)/src/common/mgmcommon)
CFLAGS_NdbConfig.cpp := -I$(call fixpath,$(NDB_TOP)/include/mgmcommon) \
-I$(call fixpath,$(NDB_TOP)/src/mgmapi)
CFLAGS_NdbRestarts.cpp := -I$(call fixpath,$(NDB_TOP)/include/kernel)
CFLAGS_NdbBackup.cpp := -I$(call fixpath,$(NDB_TOP)/include/mgmcommon) \
-I$(call fixpath,$(NDB_TOP)/src/mgmapi) \
-I$(call fixpath,$(NDB_TOP)/include/kernel)
CFLAGS_NdbGrep.cpp += -I$(call fixpath,$(NDB_TOP)/include/kernel) -I$(call fixpath,$(NDB_TOP)/include/mgmcommon)
include $(NDB_TOP)/Epilogue.mk
...@@ -20,12 +20,10 @@ copy_tab_SOURCES = copy_tab.cpp ...@@ -20,12 +20,10 @@ copy_tab_SOURCES = copy_tab.cpp
create_index_SOURCES = create_index.cpp create_index_SOURCES = create_index.cpp
ndb_cpcc_SOURCES = cpcc.cpp ndb_cpcc_SOURCES = cpcc.cpp
INCLUDES_LOC = -I$(top_srcdir)/ndb/src/mgmclient
include $(top_srcdir)/ndb/config/common.mk.am include $(top_srcdir)/ndb/config/common.mk.am
include $(top_srcdir)/ndb/config/type_ndbapitest.mk.am include $(top_srcdir)/ndb/config/type_ndbapitest.mk.am
ndb_cpcc_LDADD = $(LDADD) $(top_builddir)/ndb/src/mgmclient/CpcClient.o ndb_cpcc_LDADD = $(LDADD)
# Don't update the files from bitkeeper # Don't update the files from bitkeeper
%::SCCS/s.% %::SCCS/s.%
include .defs.mk
DIRS := hugoCalculator hugoFill hugoLoad hugoLockRecords \
hugoPkDelete hugoPkRead hugoPkReadRecord hugoPkUpdate \
hugoScanRead hugoScanUpdate restart waiter
include $(NDB_TOP)/Epilogue.mk
_bins_ndbapi : _libs_src
include .defs.mk
TYPE := ndbapitest
BIN_TARGET := waiter
# Source files of non-templated classes (.C files)
SOURCES = waiter.cpp
include $(NDB_TOP)/Epilogue.mk
include .defs.mk
BIN_DIRS = select_all select_count desc list_tables \
drop_tab delete_all copy_tab \
create_index drop_index verify_index cpcc
ifneq ($(NDB_ODBC),N)
BIN_DIRS += ndbsql
endif
include $(NDB_TOP)/Epilogue.mk
...@@ -4401,10 +4401,14 @@ int Field_string::cmp(const char *a_ptr, const char *b_ptr) ...@@ -4401,10 +4401,14 @@ int Field_string::cmp(const char *a_ptr, const char *b_ptr)
(const uchar*) b_ptr, (const uchar*) b_ptr,
field_length); field_length);
} }
return my_strnncoll(field_charset,(const uchar*) a_ptr, field_length, uint char_len= field_length/field_charset->mbmaxlen;
(const uchar*) b_ptr, field_length); uint a_len= my_charpos(field_charset, a_ptr, a_ptr + field_length, char_len);
uint b_len= my_charpos(field_charset, b_ptr, b_ptr + field_length, char_len);
return my_strnncoll(field_charset,(const uchar*) a_ptr, a_len,
(const uchar*) b_ptr, b_len);
} }
void Field_string::sort_string(char *to,uint length) void Field_string::sort_string(char *to,uint length)
{ {
uint tmp=my_strnxfrm(field_charset, uint tmp=my_strnxfrm(field_charset,
......
...@@ -475,6 +475,8 @@ void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*) ...@@ -475,6 +475,8 @@ void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*)
{ {
if (!(from->flags & BLOB_FLAG)) if (!(from->flags & BLOB_FLAG))
return do_conv_blob; return do_conv_blob;
if (from->charset() != to->charset())
return do_conv_blob;
if (from_length != to_length || if (from_length != to_length ||
to->table->db_low_byte_first != from->table->db_low_byte_first) to->table->db_low_byte_first != from->table->db_low_byte_first)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment