Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
207ca3ce
Commit
207ca3ce
authored
Mar 31, 2011
by
antirez
Browse files
Merge branch '2.2' of github.com:antirez/redis into 2.2
parents
97d3b7dc
abdbfc14
Changes
4
Hide whitespace changes
Inline
Side-by-side
src/redis-cli.c
View file @
207ca3ce
...
@@ -65,6 +65,7 @@ static struct config {
...
@@ -65,6 +65,7 @@ static struct config {
char
*
historyfile
;
char
*
historyfile
;
int
raw_output
;
/* output mode per command */
int
raw_output
;
/* output mode per command */
sds
mb_delim
;
sds
mb_delim
;
char
prompt
[
32
];
}
config
;
}
config
;
static
void
usage
();
static
void
usage
();
...
@@ -85,6 +86,13 @@ static long long mstime(void) {
...
@@ -85,6 +86,13 @@ static long long mstime(void) {
return
mst
;
return
mst
;
}
}
static
void
cliRefreshPrompt
(
void
)
{
if
(
config
.
dbnum
==
0
)
snprintf
(
config
.
prompt
,
sizeof
(
config
.
prompt
),
"redis> "
);
else
snprintf
(
config
.
prompt
,
sizeof
(
config
.
prompt
),
"redis:%d> "
,
config
.
dbnum
);
}
/*------------------------------------------------------------------------------
/*------------------------------------------------------------------------------
* Help functions
* Help functions
*--------------------------------------------------------------------------- */
*--------------------------------------------------------------------------- */
...
@@ -264,11 +272,9 @@ static int cliAuth() {
...
@@ -264,11 +272,9 @@ static int cliAuth() {
/* Send SELECT dbnum to the server */
/* Send SELECT dbnum to the server */
static
int
cliSelect
()
{
static
int
cliSelect
()
{
redisReply
*
reply
;
redisReply
*
reply
;
char
dbnum
[
16
];
if
(
config
.
dbnum
==
0
)
return
REDIS_OK
;
if
(
config
.
dbnum
==
0
)
return
REDIS_OK
;
snprintf
(
dbnum
,
sizeof
(
dbnum
),
"%d"
,
config
.
dbnum
);
reply
=
redisCommand
(
context
,
"SELECT %d"
,
config
.
dbnum
);
reply
=
redisCommand
(
context
,
"SELECT %s"
,
dbnum
);
if
(
reply
!=
NULL
)
{
if
(
reply
!=
NULL
)
{
freeReplyObject
(
reply
);
freeReplyObject
(
reply
);
return
REDIS_OK
;
return
REDIS_OK
;
...
@@ -489,9 +495,19 @@ static int cliSendCommand(int argc, char **argv, int repeat) {
...
@@ -489,9 +495,19 @@ static int cliSendCommand(int argc, char **argv, int repeat) {
}
}
}
}
if
(
cliReadReply
(
output_raw
)
!=
REDIS_OK
)
if
(
cliReadReply
(
output_raw
)
!=
REDIS_OK
)
{
free
(
argvlen
);
return
REDIS_ERR
;
return
REDIS_ERR
;
}
else
{
/* Store database number when SELECT was successfully executed. */
if
(
!
strcasecmp
(
command
,
"select"
)
&&
argc
==
2
)
{
config
.
dbnum
=
atoi
(
argv
[
1
]);
cliRefreshPrompt
();
}
}
}
}
free
(
argvlen
);
return
REDIS_OK
;
return
REDIS_OK
;
}
}
...
@@ -616,7 +632,8 @@ static void repl() {
...
@@ -616,7 +632,8 @@ static void repl() {
config
.
interactive
=
1
;
config
.
interactive
=
1
;
linenoiseSetCompletionCallback
(
completionCallback
);
linenoiseSetCompletionCallback
(
completionCallback
);
while
((
line
=
linenoise
(
context
?
"redis> "
:
"not connected> "
))
!=
NULL
)
{
cliRefreshPrompt
();
while
((
line
=
linenoise
(
context
?
config
.
prompt
:
"not connected> "
))
!=
NULL
)
{
if
(
line
[
0
]
!=
'\0'
)
{
if
(
line
[
0
]
!=
'\0'
)
{
argv
=
sdssplitargs
(
line
,
&
argc
);
argv
=
sdssplitargs
(
line
,
&
argc
);
linenoiseHistoryAdd
(
line
);
linenoiseHistoryAdd
(
line
);
...
...
src/redis.c
View file @
207ca3ce
...
@@ -837,7 +837,7 @@ void initServer() {
...
@@ -837,7 +837,7 @@ void initServer() {
signal
(
SIGHUP
,
SIG_IGN
);
signal
(
SIGHUP
,
SIG_IGN
);
signal
(
SIGPIPE
,
SIG_IGN
);
signal
(
SIGPIPE
,
SIG_IGN
);
setupSig
SegvAction
();
setupSig
nalHandlers
();
if
(
server
.
syslog_enabled
)
{
if
(
server
.
syslog_enabled
)
{
openlog
(
server
.
syslog_ident
,
LOG_PID
|
LOG_NDELAY
|
LOG_NOWAIT
,
openlog
(
server
.
syslog_ident
,
LOG_PID
|
LOG_NDELAY
|
LOG_NOWAIT
,
...
@@ -1574,10 +1574,8 @@ int main(int argc, char **argv) {
...
@@ -1574,10 +1574,8 @@ int main(int argc, char **argv) {
return
0
;
return
0
;
}
}
/* ============================= Backtrace support ========================= */
#ifdef HAVE_BACKTRACE
#ifdef HAVE_BACKTRACE
void
*
getMcontextEip
(
ucontext_t
*
uc
)
{
static
void
*
getMcontextEip
(
ucontext_t
*
uc
)
{
#if defined(__FreeBSD__)
#if defined(__FreeBSD__)
return
(
void
*
)
uc
->
uc_mcontext
.
mc_eip
;
return
(
void
*
)
uc
->
uc_mcontext
.
mc_eip
;
#elif defined(__dietlibc__)
#elif defined(__dietlibc__)
...
@@ -1605,7 +1603,7 @@ void *getMcontextEip(ucontext_t *uc) {
...
@@ -1605,7 +1603,7 @@ void *getMcontextEip(ucontext_t *uc) {
#endif
#endif
}
}
void
segvHandler
(
int
sig
,
siginfo_t
*
info
,
void
*
secret
)
{
static
void
sig
segvHandler
(
int
sig
,
siginfo_t
*
info
,
void
*
secret
)
{
void
*
trace
[
100
];
void
*
trace
[
100
];
char
**
messages
=
NULL
;
char
**
messages
=
NULL
;
int
i
,
trace_size
=
0
;
int
i
,
trace_size
=
0
;
...
@@ -1644,37 +1642,35 @@ void segvHandler(int sig, siginfo_t *info, void *secret) {
...
@@ -1644,37 +1642,35 @@ void segvHandler(int sig, siginfo_t *info, void *secret) {
sigaction
(
sig
,
&
act
,
NULL
);
sigaction
(
sig
,
&
act
,
NULL
);
kill
(
getpid
(),
sig
);
kill
(
getpid
(),
sig
);
}
}
#endif
/* HAVE_BACKTRACE */
void
sigtermHandler
(
int
sig
)
{
static
void
sigtermHandler
(
int
sig
)
{
REDIS_NOTUSED
(
sig
);
REDIS_NOTUSED
(
sig
);
redisLog
(
REDIS_WARNING
,
"
SIGTERM received
, scheduling shut
ting
down..."
);
redisLog
(
REDIS_WARNING
,
"
Received SIGTERM
, scheduling shutdown..."
);
server
.
shutdown_asap
=
1
;
server
.
shutdown_asap
=
1
;
}
}
void
setupSig
SegvAction
(
void
)
{
void
setupSig
nalHandlers
(
void
)
{
struct
sigaction
act
;
struct
sigaction
act
;
sigemptyset
(
&
act
.
sa_mask
);
/* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction is used.
/* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction
* Otherwise, sa_handler is used. */
* is used. Otherwise, sa_handler is used */
sigemptyset
(
&
act
.
sa_mask
);
act
.
sa_flags
=
SA_NODEFER
|
SA_ONSTACK
|
SA_RESETHAND
|
SA_SIGINFO
;
act
.
sa_sigaction
=
segvHandler
;
sigaction
(
SIGSEGV
,
&
act
,
NULL
);
sigaction
(
SIGBUS
,
&
act
,
NULL
);
sigaction
(
SIGFPE
,
&
act
,
NULL
);
sigaction
(
SIGILL
,
&
act
,
NULL
);
sigaction
(
SIGBUS
,
&
act
,
NULL
);
act
.
sa_flags
=
SA_NODEFER
|
SA_ONSTACK
|
SA_RESETHAND
;
act
.
sa_flags
=
SA_NODEFER
|
SA_ONSTACK
|
SA_RESETHAND
;
act
.
sa_handler
=
sigtermHandler
;
act
.
sa_handler
=
sigtermHandler
;
sigaction
(
SIGTERM
,
&
act
,
NULL
);
sigaction
(
SIGTERM
,
&
act
,
NULL
);
return
;
}
#else
/* HAVE_BACKTRACE */
#ifdef HAVE_BACKTRACE
void
setupSigSegvAction
(
void
)
{
sigemptyset
(
&
act
.
sa_mask
);
act
.
sa_flags
=
SA_NODEFER
|
SA_ONSTACK
|
SA_RESETHAND
|
SA_SIGINFO
;
act
.
sa_sigaction
=
sigsegvHandler
;
sigaction
(
SIGSEGV
,
&
act
,
NULL
);
sigaction
(
SIGBUS
,
&
act
,
NULL
);
sigaction
(
SIGFPE
,
&
act
,
NULL
);
sigaction
(
SIGILL
,
&
act
,
NULL
);
#endif
return
;
}
}
#endif
/* HAVE_BACKTRACE */
/* The End */
/* The End */
src/redis.h
View file @
207ca3ce
...
@@ -777,7 +777,7 @@ zskiplistNode *zslInsert(zskiplist *zsl, double score, robj *obj);
...
@@ -777,7 +777,7 @@ zskiplistNode *zslInsert(zskiplist *zsl, double score, robj *obj);
/* Core functions */
/* Core functions */
void
freeMemoryIfNeeded
(
void
);
void
freeMemoryIfNeeded
(
void
);
int
processCommand
(
redisClient
*
c
);
int
processCommand
(
redisClient
*
c
);
void
setupSig
SegvAction
(
void
);
void
setupSig
nalHandlers
(
void
);
struct
redisCommand
*
lookupCommand
(
sds
name
);
struct
redisCommand
*
lookupCommand
(
sds
name
);
struct
redisCommand
*
lookupCommandByCString
(
char
*
s
);
struct
redisCommand
*
lookupCommandByCString
(
char
*
s
);
void
call
(
redisClient
*
c
,
struct
redisCommand
*
cmd
);
void
call
(
redisClient
*
c
,
struct
redisCommand
*
cmd
);
...
...
src/sds.c
View file @
207ca3ce
...
@@ -26,6 +26,12 @@
...
@@ -26,6 +26,12 @@
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* POSSIBILITY OF SUCH DAMAGE.
*
* History:
*
* - 22 March 2011: History section created on top of sds.c
* - 22 March 2011: Fixed a problem with "\xab" escapes convertion in
* function sdssplitargs().
*/
*/
#define SDS_ABORT_ON_OOM
#define SDS_ABORT_ON_OOM
...
@@ -412,6 +418,37 @@ sds sdscatrepr(sds s, char *p, size_t len) {
...
@@ -412,6 +418,37 @@ sds sdscatrepr(sds s, char *p, size_t len) {
return
sdscatlen
(
s
,
"
\"
"
,
1
);
return
sdscatlen
(
s
,
"
\"
"
,
1
);
}
}
/* Helper function for sdssplitargs() that returns non zero if 'c'
* is a valid hex digit. */
int
is_hex_digit
(
char
c
)
{
return
(
c
>=
'0'
&&
c
<=
'9'
)
||
(
c
>=
'a'
&&
c
<=
'f'
)
||
(
c
>=
'A'
&&
c
<=
'F'
);
}
/* Helper function for sdssplitargs() that converts an hex digit into an
* integer from 0 to 15 */
int
hex_digit_to_int
(
char
c
)
{
switch
(
c
)
{
case
'0'
:
return
0
;
case
'1'
:
return
1
;
case
'2'
:
return
2
;
case
'3'
:
return
3
;
case
'4'
:
return
4
;
case
'5'
:
return
5
;
case
'6'
:
return
6
;
case
'7'
:
return
7
;
case
'8'
:
return
8
;
case
'9'
:
return
9
;
case
'a'
:
case
'A'
:
return
10
;
case
'b'
:
case
'B'
:
return
11
;
case
'c'
:
case
'C'
:
return
12
;
case
'd'
:
case
'D'
:
return
13
;
case
'e'
:
case
'E'
:
return
14
;
case
'f'
:
case
'F'
:
return
15
;
default:
return
0
;
}
}
/* Split a line into arguments, where every argument can be in the
/* Split a line into arguments, where every argument can be in the
* following programming-language REPL-alike form:
* following programming-language REPL-alike form:
*
*
...
@@ -441,7 +478,17 @@ sds *sdssplitargs(char *line, int *argc) {
...
@@ -441,7 +478,17 @@ sds *sdssplitargs(char *line, int *argc) {
if
(
current
==
NULL
)
current
=
sdsempty
();
if
(
current
==
NULL
)
current
=
sdsempty
();
while
(
!
done
)
{
while
(
!
done
)
{
if
(
inq
)
{
if
(
inq
)
{
if
(
*
p
==
'\\'
&&
*
(
p
+
1
))
{
if
(
*
p
==
'\\'
&&
*
(
p
+
1
)
==
'x'
&&
is_hex_digit
(
*
(
p
+
2
))
&&
is_hex_digit
(
*
(
p
+
3
)))
{
unsigned
char
byte
;
byte
=
(
hex_digit_to_int
(
*
(
p
+
2
))
*
16
)
+
hex_digit_to_int
(
*
(
p
+
3
));
current
=
sdscatlen
(
current
,(
char
*
)
&
byte
,
1
);
p
+=
3
;
}
else
if
(
*
p
==
'\\'
&&
*
(
p
+
1
))
{
char
c
;
char
c
;
p
++
;
p
++
;
...
...
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