Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
a60ed0b7
Commit
a60ed0b7
authored
Sep 12, 2005
by
jimw@mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
Merge mysql.com:/home/jimw/my/mysql-4.1-clean
into mysql.com:/home/jimw/my/mysql-5.0-clean
parents
b5dbd1c7
0eec7c3c
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
101 additions
and
125 deletions
+101
-125
README
README
+24
-41
configure.in
configure.in
+31
-71
include/my_global.h
include/my_global.h
+3
-0
include/my_pthread.h
include/my_pthread.h
+0
-5
include/violite.h
include/violite.h
+4
-0
mysql-test/r/ndb_autodiscover.result
mysql-test/r/ndb_autodiscover.result
+2
-0
ndb/src/mgmsrv/MgmtSrvr.cpp
ndb/src/mgmsrv/MgmtSrvr.cpp
+1
-4
ndb/src/ndbapi/SignalSender.cpp
ndb/src/ndbapi/SignalSender.cpp
+9
-1
sql-common/client.c
sql-common/client.c
+1
-1
sql/examples/ha_archive.cc
sql/examples/ha_archive.cc
+1
-1
sql/net_serv.cc
sql/net_serv.cc
+1
-1
vio/vio.c
vio/vio.c
+4
-0
vio/vio_priv.h
vio/vio_priv.h
+2
-0
vio/viosocket.c
vio/viosocket.c
+9
-0
vio/viossl.c
vio/viossl.c
+9
-0
No files found.
README
View file @
a60ed0b7
This is a release of MySQL, a
GPL (free) SQL database server (more
licence information in the PUBLIC file and in the reference manual)
.
This is a release of MySQL, a
dual-license SQL database server.
MySQL is brought to you by the MySQL team at MySQL AB
.
Please read the "Upgrading from..." section in the manual first, if you are
migrating from older versions of MySQL!
License information can be found in these files:
- For GPL (free) distributions, see the COPYING file.
- For commercial distributions, see the MySQLEULA.txt file.
The latest information about MySQL can be found at:
http://www.mysql.com
To see what it can do take a look at the features section in the
manual.
For further information about MySQL or additional documentation, see:
- The latest information about MySQL: http://www.mysql.com
- The current MySQL documentation: http:/dev.mysql.com/doc
For installation instructions see the Installation chapter in the
manual.
Some manual sections of special interest:
For future plans see the TODO appendix in the manual.
- If you are migrating from an older version of MySQL, please read the
"Upgrading from..." section first!
- To see what MySQL can do, take a look at the features section.
- For installation instructions, see the Installation chapter.
- For future plans, see the TODO appendix.
- For the new features/bugfix history, see the News appendix.
- For the currently known bugs/misfeatures (known errors) see the problems
appendix.
- For a list of developers and other contributors, see the Credits
appendix.
New features/bug fixes history is in the news appendix in the manual.
For the currently known bugs/misfeatures (known errors) see the bugs
appendix in the manual.
For examples of SQL and benchmarking information see the bench
directory.
The manual mentioned above can be found in the Docs directory. The
manual is available in the following formats: as plain ASCII text in
Docs/manual.txt, in HTML format in Docs/manual_toc.html, as GNU Info in
Docs/mysql.info and as PostScript in Docs/manual.ps.
MySQL is brought to you by the MySQL team at MySQL AB
For a list of developers and other contributors, see the Credits appendix
in the manual.
A local copy of the MySQL Reference Manual can be found in the Docs
directory in GNU Info format. You can also browse the manual online or
download it in any of several formats at the URL given earlier in this
file.
************************************************************
IMPORTANT:
Send bug (error) reports, questions and comments to the mailing list
at mysql@lists.mysql.com
Please use the 'mysqlbug' script when posting bug reports or questions
about MySQL. mysqlbug will gather some information about your system
and start your editor with a form in which you can describe your
problem. Bug reports might be silently ignored by the MySQL
maintainers if there is not a good reason included in the report as to
why mysqlbug has not been used. A report that says 'MySQL does not
work for me. Why?' is not considered a valid bug report.
The mysqlbug script can be found in the 'scripts' directory of the
distribution, that is '<where-you-installed-mysql>/scripts'.
Bug or error reports should be sent to http://bugs.mysql.com.
configure.in
View file @
a60ed0b7
...
...
@@ -322,19 +322,19 @@ case "$target_os" in
;;
esac
;;
sysv5UnixWare
*
)
sysv5UnixWare
*
|
sysv5OpenUNIX8
*
)
if
test
"
$GCC
"
!=
"yes"
;
then
#
We are using built-in inline function
#
Use the built-in alloca()
CFLAGS
=
"
$CFLAGS
-Kalloca"
fi
CXXFLAGS
=
"
$CXXFLAGS
-DNO_CPLUSPLUS_ALLOCA"
;;
sysv5
OpenUNIX8
*
)
sysv5
SCO_SV6.0.0
*
)
if
test
"
$GCC
"
!=
"yes"
;
then
#
We are using built-in inline function
#
Use the built-in alloca()
CFLAGS
=
"
$CFLAGS
-Kalloca"
CXXFLAGS
=
"
$CFLAGS
-Kalloca"
fi
CXXFLAGS
=
"
$CXXFLAGS
-DNO_CPLUSPLUS_ALLOCA"
;;
esac
AC_SUBST
(
CC
)
...
...
@@ -1047,6 +1047,15 @@ case $SYSTEM_TYPE in
MAX_C_OPTIMIZE
=
"-O"
fi
;;
*
darwin9
*
)
if
test
"
$ac_cv_prog_gcc
"
=
"yes"
then
FLAGS
=
"-D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DIGNORE_SIGHUP_SIGQUIT"
CFLAGS
=
"
$CFLAGS
$FLAGS
"
CXXFLAGS
=
"
$CXXFLAGS
$FLAGS
"
MAX_C_OPTIMIZE
=
"-O"
fi
;;
*
freebsd
*
)
AC_MSG_WARN
([
Adding fix
for
interrupted reads]
)
OSVERSION
=
`
sysctl
-a
|
grep
osreldate |
awk
'{ print $2 }'
`
...
...
@@ -1359,8 +1368,6 @@ then
if
expr
"
$SYSTEM_TYPE
"
:
".*unixware7.0.0"
>
/dev/null
then
AC_DEFINE
(
HAVE_UNIXWARE7_THREADS,
[
1]
)
else
AC_DEFINE
(
HAVE_UNIXWARE7_POSIX,
[
1]
)
fi
AC_MSG_RESULT
(
"yes"
)
# We must have cc
...
...
@@ -1386,87 +1393,40 @@ then
AC_MSG_RESULT("no")
fi
fi
# Hack for SCO UnixWare7
#
if test "$with_named_thread" = "no"
then
AC_MSG_CHECKING("SCO UnixWare7 native threads")
if expr "$SYSTEM_TYPE" : ".*UnixWare*" > /dev/null
then
if test -f /usr/lib/libthread.so -o -f /usr/lib/libthreadT.so
then
MYSQL_REMOVE_SOCKET_FROM_LIBS_HACK
if expr "$CC" : ".*gcc.*"
then
with_named_thread="-pthread -lsocket -lnsl"
else
with_named_thread="-Kthread -lsocket -lnsl"
fi
if expr "$SYSTEM_TYPE" : ".*unixware7.0.0" > /dev/null
then
AC_DEFINE(HAVE_UNIXWARE7_THREADS, [1])
else
AC_DEFINE(HAVE_UNIXWARE7_POSIX, [1])
fi
# We must have cc
AC_MSG_CHECKING("for gcc")
if expr "$CC" : ".*gcc.*"
then
CC="$CC -pthread -DUNIXWARE_7 -DHAVE_BROKEN_RWLOCK"
CXX="$CXX -pthread -DUNIXWARE_7 -DHAVE_BROKEN_RWLOCK"
else
CC="$CC -Kthread -DUNIXWARE_7 -DHAVE_BROKEN_RWLOCK"
CXX="$CXX -Kthread -DUNIXWARE_7 -DHAVE_BROKEN_RWLOCK"
fi
AC_MSG_RESULT("yes")
else
AC_MSG_ERROR([configure: error: Can'
t find thread libs on SCO UnixWare7. See the Installation chapter
in
the Reference Manual.]
)
fi
else
AC_MSG_RESULT
(
"no"
)
fi
fi
# Hack for Caldera OpenUNIX8
#
# Check for SCO threading libraries
#
if test "$with_named_thread" = "no"
then
AC_MSG_CHECKING
(
"OpenUNIX8 native threads"
)
if
expr
"
$SYSTEM_TYPE
"
:
".*OpenUNIX*"
>
/dev/null
AC_MSG_CHECKING([SCO OpenServer 6, UnixWare 7 or OpenUNIX 8 native threads])
if expr "$SYSTEM_TYPE" : ".*UnixWare.*" > /dev/null || \
expr "$SYSTEM_TYPE" : ".*SCO_SV6.*" > /dev/null || \
expr "$SYSTEM_TYPE" : ".*OpenUNIX.*" > /dev/null
then
if test -f /usr/lib/libthread.so -o -f /usr/lib/libthreadT.so
then
MYSQL_REMOVE_SOCKET_FROM_LIBS_HACK
if
expr
"
$CC
"
:
".*gcc.*"
if expr "$CC" : ".*gcc.*"
> /dev/null
then
with_named_thread
=
"-pthread -lsocket -lnsl"
with_named_thread="-pthread -lsocket -lnsl"
CC="$CC -pthread -DUNIXWARE_7 -DHAVE_BROKEN_RWLOCK";
CXX="$CXX -pthread -DUNIXWARE_7 -DHAVE_BROKEN_RWLOCK";
else
with_named_thread="-Kthread -lsocket -lnsl"
CC="$CC -Kthread -DUNIXWARE_7 -DHAVE_BROKEN_RWLOCK";
CXX="$CXX -Kthread -DUNIXWARE_7 -DHAVE_BROKEN_RWLOCK";
fi
if expr "$SYSTEM_TYPE" : ".*unixware7.0.0" > /dev/null
then
AC_DEFINE
([
HAVE_UNIXWARE7_THREADS],
[
1],
[
UNIXWARE7 threads are not posix]
)
else
AC_DEFINE
([
HAVE_UNIXWARE7_POSIX],
[
1],
[
new UNIXWARE7 threads that are not yet posix]
)
AC_DEFINE(HAVE_UNIXWARE7_THREADS, [1], [Have UnixWare 7 (or similar) almost-POSIX threading library])
fi
# We must have cc
AC_MSG_CHECKING
(
"for gcc"
)
if
expr
"
$CC
"
:
".*gcc.*"
then
CC
=
"
$CC
-pthread -DUNIXWARE_7 -DHAVE_BROKEN_RWLOCK"
CXX
=
"
$CXX
-pthread -DUNIXWARE_7 -DHAVE_BROKEN_RWLOCK"
else
CC
=
"
$CC
-Kthread -DUNIXWARE_7 -DHAVE_BROKEN_RWLOCK"
CXX
=
"
$CXX
-Kthread -DUNIXWARE_7 -DHAVE_BROKEN_RWLOCK"
fi
AC_MSG_RESULT
(
"yes"
)
AC_MSG_RESULT(yes)
else
AC_MSG_ERROR
([
configure: error: Can
't find thread lib
s on Caldera OpenUNIX 8
. See the Installation chapter in the Reference Manual.])
AC_MSG_ERROR([configure: error: Can'
t find thread lib
rary on SCO/Caldera system
. See the Installation chapter
in
the Reference Manual.]
)
fi
else
AC_MSG_RESULT(
"no"
)
AC_MSG_RESULT
(
no
)
fi
fi
...
...
@@ -2508,7 +2468,7 @@ then
AC_CONFIG_FILES
(
bdb/Makefile
)
echo
"CONFIGURING FOR BERKELEY DB"
bdb_conf_flags
=
"--disable-shared"
bdb_conf_flags
=
"--disable-shared
--build=
$build_alias
"
if
test
$with_debug
=
"yes"
then
bdb_conf_flags
=
"
$bdb_conf_flags
--enable-debug --enable-diagnostic"
...
...
include/my_global.h
View file @
a60ed0b7
...
...
@@ -834,6 +834,7 @@ typedef off_t os_off_t;
#define socket_errno WSAGetLastError()
#define SOCKET_EINTR WSAEINTR
#define SOCKET_EAGAIN WSAEINPROGRESS
#define SOCKET_ETIMEDOUT WSAETIMEDOUT
#define SOCKET_EWOULDBLOCK WSAEWOULDBLOCK
#define SOCKET_ENFILE ENFILE
#define SOCKET_EMFILE EMFILE
...
...
@@ -841,6 +842,7 @@ typedef off_t os_off_t;
#define socket_errno sock_errno()
#define SOCKET_EINTR SOCEINTR
#define SOCKET_EAGAIN SOCEINPROGRESS
#define SOCKET_ETIMEDOUT SOCKET_EINTR
#define SOCKET_EWOULDBLOCK SOCEWOULDBLOCK
#define SOCKET_ENFILE SOCENFILE
#define SOCKET_EMFILE SOCEMFILE
...
...
@@ -850,6 +852,7 @@ typedef off_t os_off_t;
#define closesocket(A) close(A)
#define SOCKET_EINTR EINTR
#define SOCKET_EAGAIN EAGAIN
#define SOCKET_ETIMEDOUT SOCKET_EINTR
#define SOCKET_EWOULDBLOCK EWOULDBLOCK
#define SOCKET_ENFILE ENFILE
#define SOCKET_EMFILE EMFILE
...
...
include/my_pthread.h
View file @
a60ed0b7
...
...
@@ -298,11 +298,6 @@ extern int my_pthread_create_detached;
int
sigwait
(
sigset_t
*
set
,
int
*
sig
);
#endif
#if defined(HAVE_UNIXWARE7_POSIX)
#undef HAVE_NONPOSIX_SIGWAIT
#define HAVE_NONPOSIX_SIGWAIT
/* sigwait takes only 1 argument */
#endif
#ifndef HAVE_NONPOSIX_SIGWAIT
#define my_sigwait(A,B) sigwait((A),(B))
#else
...
...
include/violite.h
View file @
a60ed0b7
...
...
@@ -74,6 +74,8 @@ int vio_fastsend(Vio *vio);
int
vio_keepalive
(
Vio
*
vio
,
my_bool
onoff
);
/* Whenever we should retry the last read/write operation. */
my_bool
vio_should_retry
(
Vio
*
vio
);
/* Check that operation was timed out */
my_bool
vio_was_interrupted
(
Vio
*
vio
);
/* Short text description of the socket for those, who are curious.. */
const
char
*
vio_description
(
Vio
*
vio
);
/* Return the type of the connection */
...
...
@@ -153,6 +155,7 @@ int vio_close_shared_memory(Vio * vio);
#define vio_fastsend(vio) (vio)->fastsend(vio)
#define vio_keepalive(vio, set_keep_alive) (vio)->viokeepalive(vio, set_keep_alive)
#define vio_should_retry(vio) (vio)->should_retry(vio)
#define vio_was_interrupted(vio) (vio)->was_interrupted(vio)
#define vio_close(vio) ((vio)->vioclose)(vio)
#define vio_peer_addr(vio, buf, prt) (vio)->peer_addr(vio, buf, prt)
#define vio_in_addr(vio, in) (vio)->in_addr(vio, in)
...
...
@@ -198,6 +201,7 @@ struct st_vio
my_bool
(
*
peer_addr
)(
Vio
*
,
char
*
,
uint16
*
);
void
(
*
in_addr
)(
Vio
*
,
struct
in_addr
*
);
my_bool
(
*
should_retry
)(
Vio
*
);
my_bool
(
*
was_interrupted
)(
Vio
*
);
int
(
*
vioclose
)(
Vio
*
);
void
(
*
timeout
)(
Vio
*
,
unsigned
int
which
,
unsigned
int
timeout
);
void
*
ssl_arg
;
...
...
mysql-test/r/ndb_autodiscover.result
View file @
a60ed0b7
...
...
@@ -99,6 +99,8 @@ id int not null primary key,
id2 int not null,
name char(20)
) engine=ndb;
Warnings:
Note 1050 Table 't3' already exists
show status like 'handler_discover%';
Variable_name Value
Handler_discover 0
...
...
ndb/src/mgmsrv/MgmtSrvr.cpp
View file @
a60ed0b7
...
...
@@ -2521,10 +2521,7 @@ MgmtSrvr::startBackup(Uint32& backupId, int waitCompleted)
case
GSN_NODE_FAILREP
:{
const
NodeFailRep
*
const
rep
=
CAST_CONSTPTR
(
NodeFailRep
,
signal
->
getDataPtr
());
#ifdef VM_TRACE
ndbout_c
(
"Node %d failed"
,
rep
->
failNo
);
#endif
if
(
rep
->
failNo
==
nodeId
||
if
(
NodeBitmask
::
get
(
rep
->
theNodes
,
nodeId
)
||
waitCompleted
==
1
)
return
1326
;
// wait for next signal
...
...
ndb/src/ndbapi/SignalSender.cpp
View file @
a60ed0b7
...
...
@@ -250,14 +250,22 @@ SignalSender::execNodeStatus(void* signalSender,
// node shutdown complete
s
->
header
.
theVerId_signalNumber
=
GSN_NF_COMPLETEREP
;
NFCompleteRep
*
rep
=
(
NFCompleteRep
*
)
s
->
getDataPtrSend
();
rep
->
blockNo
=
0
;
rep
->
nodeId
=
0
;
rep
->
failedNodeId
=
nodeId
;
rep
->
unused
=
0
;
rep
->
from
=
0
;
}
else
{
// node failure
s
->
header
.
theVerId_signalNumber
=
GSN_NODE_FAILREP
;
NodeFailRep
*
rep
=
(
NodeFailRep
*
)
s
->
getDataPtrSend
();
rep
->
failNo
=
nodeId
;
rep
->
failNo
=
0
;
rep
->
masterNodeId
=
0
;
rep
->
noOfNodes
=
1
;
NodeBitmask
::
clear
(
rep
->
theNodes
);
NodeBitmask
::
set
(
rep
->
theNodes
,
nodeId
);
}
ss
->
m_jobBuffer
.
push_back
(
s
);
...
...
sql-common/client.c
View file @
a60ed0b7
...
...
@@ -599,7 +599,7 @@ net_safe_read(MYSQL *mysql)
DBUG_PRINT
(
"error"
,(
"Wrong connection or packet. fd: %s len: %d"
,
vio_description
(
net
->
vio
),
len
));
#ifdef MYSQL_SERVER
if
(
vio_
errno
(
net
->
vio
)
==
SOCKET_EINTR
)
if
(
vio_
was_interrupted
(
net
->
vio
)
)
return
(
packet_error
);
#endif
/*MYSQL_SERVER*/
end_server
(
mysql
);
...
...
sql/examples/ha_archive.cc
View file @
a60ed0b7
...
...
@@ -544,7 +544,7 @@ int ha_archive::create(const char *name, TABLE *table_arg,
error
=
my_errno
;
goto
error
;
}
if
((
archive
=
gzdopen
(
create_file
,
"
a
b"
))
==
NULL
)
if
((
archive
=
gzdopen
(
create_file
,
"
w
b"
))
==
NULL
)
{
error
=
errno
;
goto
error2
;
...
...
sql/net_serv.cc
View file @
a60ed0b7
...
...
@@ -763,7 +763,7 @@ my_real_read(NET *net, ulong *complen)
net
->
error
=
2
;
/* Close socket */
net
->
report_error
=
1
;
#ifdef MYSQL_SERVER
net
->
last_errno
=
(
interrupted
?
ER_NET_READ_INTERRUPTED
:
net
->
last_errno
=
(
vio_was_interrupted
(
net
->
vio
)
?
ER_NET_READ_INTERRUPTED
:
ER_NET_READ_ERROR
);
#endif
goto
end
;
...
...
vio/vio.c
View file @
a60ed0b7
...
...
@@ -54,6 +54,7 @@ static void vio_init(Vio* vio, enum enum_vio_type type,
vio
->
fastsend
=
vio_fastsend
;
vio
->
viokeepalive
=
vio_keepalive
;
vio
->
should_retry
=
vio_should_retry
;
vio
->
was_interrupted
=
vio_was_interrupted
;
vio
->
vioclose
=
vio_close_pipe
;
vio
->
peer_addr
=
vio_peer_addr
;
vio
->
in_addr
=
vio_in_addr
;
...
...
@@ -73,6 +74,7 @@ static void vio_init(Vio* vio, enum enum_vio_type type,
vio
->
fastsend
=
vio_fastsend
;
vio
->
viokeepalive
=
vio_keepalive
;
vio
->
should_retry
=
vio_should_retry
;
vio
->
was_interrupted
=
vio_was_interrupted
;
vio
->
vioclose
=
vio_close_shared_memory
;
vio
->
peer_addr
=
vio_peer_addr
;
vio
->
in_addr
=
vio_in_addr
;
...
...
@@ -92,6 +94,7 @@ static void vio_init(Vio* vio, enum enum_vio_type type,
vio
->
fastsend
=
vio_ssl_fastsend
;
vio
->
viokeepalive
=
vio_ssl_keepalive
;
vio
->
should_retry
=
vio_ssl_should_retry
;
vio
->
was_interrupted
=
vio_ssl_was_interrupted
;
vio
->
vioclose
=
vio_ssl_close
;
vio
->
peer_addr
=
vio_ssl_peer_addr
;
vio
->
in_addr
=
vio_ssl_in_addr
;
...
...
@@ -109,6 +112,7 @@ static void vio_init(Vio* vio, enum enum_vio_type type,
vio
->
fastsend
=
vio_fastsend
;
vio
->
viokeepalive
=
vio_keepalive
;
vio
->
should_retry
=
vio_should_retry
;
vio
->
was_interrupted
=
vio_was_interrupted
;
vio
->
vioclose
=
vio_close
;
vio
->
peer_addr
=
vio_peer_addr
;
vio
->
in_addr
=
vio_in_addr
;
...
...
vio/vio_priv.h
View file @
a60ed0b7
...
...
@@ -39,6 +39,8 @@ int vio_ssl_fastsend(Vio *vio);
int
vio_ssl_keepalive
(
Vio
*
vio
,
my_bool
onoff
);
/* Whenever we should retry the last read/write operation. */
my_bool
vio_ssl_should_retry
(
Vio
*
vio
);
/* Check that operation was timed out */
my_bool
vio_ssl_was_interrupted
(
Vio
*
vio
);
/* When the workday is over... */
int
vio_ssl_close
(
Vio
*
vio
);
/* Return last error number */
...
...
vio/viosocket.c
View file @
a60ed0b7
...
...
@@ -242,6 +242,15 @@ vio_should_retry(Vio * vio __attribute__((unused)))
}
my_bool
vio_was_interrupted
(
Vio
*
vio
__attribute__
((
unused
)))
{
int
en
=
socket_errno
;
return
(
en
==
SOCKET_EAGAIN
||
en
==
SOCKET_EINTR
||
en
==
SOCKET_EWOULDBLOCK
||
en
==
SOCKET_ETIMEDOUT
);
}
int
vio_close
(
Vio
*
vio
)
{
int
r
=
0
;
...
...
vio/viossl.c
View file @
a60ed0b7
...
...
@@ -184,6 +184,15 @@ vio_ssl_should_retry(Vio * vio __attribute__((unused)))
}
my_bool
vio_ssl_was_interrupted
(
Vio
*
vio
__attribute__
((
unused
)))
{
int
en
=
socket_errno
;
return
(
en
==
SOCKET_EAGAIN
||
en
==
SOCKET_EINTR
||
en
==
SOCKET_EWOULDBLOCK
||
en
==
SOCKET_ETIMEDOUT
);
}
int
vio_ssl_close
(
Vio
*
vio
)
{
int
r
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment