Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
镜像
OpenAtomFoundation
pika
提交
bd0fe7d6
pika
项目概览
镜像
/
OpenAtomFoundation
/
pika
11 个月 前同步成功
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
pika
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
bd0fe7d6
编写于
8月 07, 2015
作者:
K
KernelMaker
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add lpushx lpop rpush rpushx rpop llen lrange lset
上级
3419cd31
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
303 addition
and
2 deletion
+303
-2
include/pika_command.h
include/pika_command.h
+47
-0
src/pika.cc
src/pika.cc
+17
-1
src/pika_list.cc
src/pika_list.cc
+238
-0
third/nemo
third/nemo
+1
-1
未找到文件。
include/pika_command.h
浏览文件 @
bd0fe7d6
...
@@ -117,10 +117,57 @@ public:
...
@@ -117,10 +117,57 @@ public:
/*
/*
* Lists
* Lists
*/
*/
class
LLenCmd
:
public
Cmd
{
public:
LLenCmd
(
int
a
)
:
Cmd
(
a
)
{};
virtual
void
Do
(
std
::
list
<
std
::
string
>
&
argvs
,
std
::
string
&
ret
);
};
class
LPopCmd
:
public
Cmd
{
public:
LPopCmd
(
int
a
)
:
Cmd
(
a
)
{};
virtual
void
Do
(
std
::
list
<
std
::
string
>
&
argvs
,
std
::
string
&
ret
);
};
class
LPushCmd
:
public
Cmd
{
class
LPushCmd
:
public
Cmd
{
public:
public:
LPushCmd
(
int
a
)
:
Cmd
(
a
)
{};
LPushCmd
(
int
a
)
:
Cmd
(
a
)
{};
virtual
void
Do
(
std
::
list
<
std
::
string
>
&
argvs
,
std
::
string
&
ret
);
virtual
void
Do
(
std
::
list
<
std
::
string
>
&
argvs
,
std
::
string
&
ret
);
};
};
class
LPushxCmd
:
public
Cmd
{
public:
LPushxCmd
(
int
a
)
:
Cmd
(
a
)
{};
virtual
void
Do
(
std
::
list
<
std
::
string
>
&
argvs
,
std
::
string
&
ret
);
};
class
LRangeCmd
:
public
Cmd
{
public:
LRangeCmd
(
int
a
)
:
Cmd
(
a
)
{};
virtual
void
Do
(
std
::
list
<
std
::
string
>
&
argvs
,
std
::
string
&
ret
);
};
class
LSetCmd
:
public
Cmd
{
public:
LSetCmd
(
int
a
)
:
Cmd
(
a
)
{};
virtual
void
Do
(
std
::
list
<
std
::
string
>
&
argvs
,
std
::
string
&
ret
);
};
class
RPopCmd
:
public
Cmd
{
public:
RPopCmd
(
int
a
)
:
Cmd
(
a
)
{};
virtual
void
Do
(
std
::
list
<
std
::
string
>
&
argvs
,
std
::
string
&
ret
);
};
class
RPushCmd
:
public
Cmd
{
public:
RPushCmd
(
int
a
)
:
Cmd
(
a
)
{};
virtual
void
Do
(
std
::
list
<
std
::
string
>
&
argvs
,
std
::
string
&
ret
);
};
class
RPushxCmd
:
public
Cmd
{
public:
RPushxCmd
(
int
a
)
:
Cmd
(
a
)
{};
virtual
void
Do
(
std
::
list
<
std
::
string
>
&
argvs
,
std
::
string
&
ret
);
};
#endif
#endif
src/pika.cc
浏览文件 @
bd0fe7d6
...
@@ -157,10 +157,26 @@ int main(int argc, char **argv)
...
@@ -157,10 +157,26 @@ int main(int argc, char **argv)
g_pikaCmd
.
insert
(
std
::
pair
<
std
::
string
,
Cmd
*>
(
"hscan"
,
hscanptr
));
g_pikaCmd
.
insert
(
std
::
pair
<
std
::
string
,
Cmd
*>
(
"hscan"
,
hscanptr
));
/*
/*
*
hash
*
lists
*/
*/
LLenCmd
*
llenptr
=
new
LLenCmd
(
2
);
g_pikaCmd
.
insert
(
std
::
pair
<
std
::
string
,
Cmd
*>
(
"llen"
,
llenptr
));
LPopCmd
*
lpopptr
=
new
LPopCmd
(
2
);
g_pikaCmd
.
insert
(
std
::
pair
<
std
::
string
,
Cmd
*>
(
"lpop"
,
lpopptr
));
LPushCmd
*
lpushptr
=
new
LPushCmd
(
-
3
);
LPushCmd
*
lpushptr
=
new
LPushCmd
(
-
3
);
g_pikaCmd
.
insert
(
std
::
pair
<
std
::
string
,
Cmd
*>
(
"lpush"
,
lpushptr
));
g_pikaCmd
.
insert
(
std
::
pair
<
std
::
string
,
Cmd
*>
(
"lpush"
,
lpushptr
));
LPushxCmd
*
lpushxptr
=
new
LPushxCmd
(
3
);
g_pikaCmd
.
insert
(
std
::
pair
<
std
::
string
,
Cmd
*>
(
"lpushx"
,
lpushxptr
));
LRangeCmd
*
lrangeptr
=
new
LRangeCmd
(
4
);
g_pikaCmd
.
insert
(
std
::
pair
<
std
::
string
,
Cmd
*>
(
"lrange"
,
lrangeptr
));
LSetCmd
*
lsetptr
=
new
LSetCmd
(
4
);
g_pikaCmd
.
insert
(
std
::
pair
<
std
::
string
,
Cmd
*>
(
"lset"
,
lsetptr
));
RPopCmd
*
rpopptr
=
new
RPopCmd
(
2
);
g_pikaCmd
.
insert
(
std
::
pair
<
std
::
string
,
Cmd
*>
(
"rpop"
,
rpopptr
));
RPushCmd
*
rpushptr
=
new
RPushCmd
(
-
3
);
g_pikaCmd
.
insert
(
std
::
pair
<
std
::
string
,
Cmd
*>
(
"rpush"
,
rpushptr
));
RPushxCmd
*
rpushxptr
=
new
RPushxCmd
(
3
);
g_pikaCmd
.
insert
(
std
::
pair
<
std
::
string
,
Cmd
*>
(
"rpushx"
,
rpushxptr
));
/*
/*
* Init the server
* Init the server
...
...
src/pika_list.cc
浏览文件 @
bd0fe7d6
...
@@ -7,6 +7,56 @@
...
@@ -7,6 +7,56 @@
extern
PikaServer
*
g_pikaServer
;
extern
PikaServer
*
g_pikaServer
;
extern
std
::
map
<
std
::
string
,
Cmd
*>
g_pikaCmd
;
extern
std
::
map
<
std
::
string
,
Cmd
*>
g_pikaCmd
;
void
LLenCmd
::
Do
(
std
::
list
<
std
::
string
>
&
argv
,
std
::
string
&
ret
)
{
if
((
arity
>
0
&&
(
int
)
argv
.
size
()
!=
arity
)
||
(
arity
<
0
&&
(
int
)
argv
.
size
()
<
-
arity
))
{
ret
=
"-ERR wrong number of arguments for "
;
ret
.
append
(
argv
.
front
());
ret
.
append
(
" command
\r\n
"
);
return
;
}
argv
.
pop_front
();
std
::
string
key
=
argv
.
front
();
argv
.
pop_front
();
uint64_t
llen
;
nemo
::
Status
s
=
g_pikaServer
->
GetHandle
()
->
LLen
(
key
,
&
llen
);
if
(
s
.
IsCorruption
())
{
ret
=
"+ERR "
;
ret
.
append
(
s
.
ToString
().
c_str
());
ret
.
append
(
"
\r\n
"
);
}
else
{
char
buf
[
32
];
snprintf
(
buf
,
sizeof
(
buf
),
":%lu
\r\n
"
,
llen
);
ret
.
append
(
buf
);
}
}
void
LPopCmd
::
Do
(
std
::
list
<
std
::
string
>
&
argv
,
std
::
string
&
ret
)
{
if
((
arity
>
0
&&
(
int
)
argv
.
size
()
!=
arity
)
||
(
arity
<
0
&&
(
int
)
argv
.
size
()
<
-
arity
))
{
ret
=
"-ERR wrong number of arguments for "
;
ret
.
append
(
argv
.
front
());
ret
.
append
(
" command
\r\n
"
);
return
;
}
argv
.
pop_front
();
std
::
string
key
=
argv
.
front
();
argv
.
pop_front
();
std
::
string
value
;
nemo
::
Status
s
=
g_pikaServer
->
GetHandle
()
->
LPop
(
key
,
&
value
);
if
(
s
.
ok
())
{
char
buf
[
32
];
snprintf
(
buf
,
sizeof
(
buf
),
"$%lu
\r\n
"
,
value
.
size
());
ret
.
append
(
buf
);
ret
.
append
(
value
.
data
(),
value
.
size
());
ret
.
append
(
"
\r\n
"
);
}
else
if
(
s
.
IsNotFound
())
{
ret
.
append
(
"$-1
\r\n
"
);
}
else
{
ret
.
append
(
"-ERR "
);
ret
.
append
(
s
.
ToString
().
c_str
());
ret
.
append
(
"
\r\n
"
);
}
}
void
LPushCmd
::
Do
(
std
::
list
<
std
::
string
>
&
argv
,
std
::
string
&
ret
)
{
void
LPushCmd
::
Do
(
std
::
list
<
std
::
string
>
&
argv
,
std
::
string
&
ret
)
{
if
((
arity
>
0
&&
(
int
)
argv
.
size
()
!=
arity
)
||
(
arity
<
0
&&
(
int
)
argv
.
size
()
<
-
arity
))
{
if
((
arity
>
0
&&
(
int
)
argv
.
size
()
!=
arity
)
||
(
arity
<
0
&&
(
int
)
argv
.
size
()
<
-
arity
))
{
ret
=
"-ERR wrong number of arguments for "
;
ret
=
"-ERR wrong number of arguments for "
;
...
@@ -38,3 +88,191 @@ void LPushCmd::Do(std::list<std::string> &argv, std::string &ret) {
...
@@ -38,3 +88,191 @@ void LPushCmd::Do(std::list<std::string> &argv, std::string &ret) {
ret
.
append
(
buf
);
ret
.
append
(
buf
);
}
}
}
}
void
LPushxCmd
::
Do
(
std
::
list
<
std
::
string
>
&
argv
,
std
::
string
&
ret
)
{
if
((
arity
>
0
&&
(
int
)
argv
.
size
()
!=
arity
)
||
(
arity
<
0
&&
(
int
)
argv
.
size
()
<
-
arity
))
{
ret
=
"-ERR wrong number of arguments for "
;
ret
.
append
(
argv
.
front
());
ret
.
append
(
" command
\r\n
"
);
return
;
}
argv
.
pop_front
();
std
::
string
key
=
argv
.
front
();
argv
.
pop_front
();
std
::
string
value
=
argv
.
front
();
argv
.
pop_front
();
uint64_t
llen
=
0
;
nemo
::
Status
s
=
g_pikaServer
->
GetHandle
()
->
LPushx
(
key
,
value
,
&
llen
);
if
(
s
.
IsCorruption
())
{
ret
=
"+ERR "
;
ret
.
append
(
s
.
ToString
().
c_str
());
ret
.
append
(
"
\r\n
"
);
}
else
{
char
buf
[
32
];
snprintf
(
buf
,
sizeof
(
buf
),
":%lu
\r\n
"
,
llen
);
ret
.
append
(
buf
);
}
}
void
LRangeCmd
::
Do
(
std
::
list
<
std
::
string
>
&
argv
,
std
::
string
&
ret
)
{
if
((
arity
>
0
&&
(
int
)
argv
.
size
()
!=
arity
)
||
(
arity
<
0
&&
(
int
)
argv
.
size
()
<
-
arity
))
{
ret
=
"-ERR wrong number of arguments for "
;
ret
.
append
(
argv
.
front
());
ret
.
append
(
" command
\r\n
"
);
return
;
}
argv
.
pop_front
();
std
::
string
key
=
argv
.
front
();
argv
.
pop_front
();
std
::
string
left
=
argv
.
front
();
argv
.
pop_front
();
std
::
string
right
=
argv
.
front
();
argv
.
pop_front
();
long
l_left
,
l_right
;
if
(
!
string2l
(
left
.
data
(),
left
.
size
(),
&
l_left
))
{
ret
=
"-ERR value is not an integer or out of range
\r\n
"
;
return
;
}
if
(
!
string2l
(
right
.
data
(),
right
.
size
(),
&
l_right
))
{
ret
=
"-ERR value is not an integer or out of range
\r\n
"
;
return
;
}
std
::
vector
<
nemo
::
IV
>
ivs
;
nemo
::
Status
s
=
g_pikaServer
->
GetHandle
()
->
LRange
(
key
,
l_left
,
l_right
,
ivs
);
if
(
s
.
ok
())
{
char
buf
[
32
];
snprintf
(
buf
,
sizeof
(
buf
),
"*%lu
\r\n
"
,
ivs
.
size
());
ret
.
append
(
buf
);
std
::
vector
<
nemo
::
IV
>::
iterator
iter
;
for
(
iter
=
ivs
.
begin
();
iter
!=
ivs
.
end
();
iter
++
)
{
snprintf
(
buf
,
sizeof
(
buf
),
"$%lu
\r\n
"
,
iter
->
val
.
size
());
ret
.
append
(
buf
);
ret
.
append
(
iter
->
val
.
data
(),
iter
->
val
.
size
());
ret
.
append
(
"
\r\n
"
);
}
}
else
if
(
s
.
IsNotFound
())
{
ret
=
":0
\r\n
"
;
}
else
{
ret
=
"+ERR "
;
ret
.
append
(
s
.
ToString
().
c_str
());
ret
.
append
(
"
\r\n
"
);
}
}
void
LSetCmd
::
Do
(
std
::
list
<
std
::
string
>
&
argv
,
std
::
string
&
ret
)
{
if
((
arity
>
0
&&
(
int
)
argv
.
size
()
!=
arity
)
||
(
arity
<
0
&&
(
int
)
argv
.
size
()
<
-
arity
))
{
ret
=
"-ERR wrong number of arguments for "
;
ret
.
append
(
argv
.
front
());
ret
.
append
(
" command
\r\n
"
);
return
;
}
argv
.
pop_front
();
std
::
string
key
=
argv
.
front
();
argv
.
pop_front
();
std
::
string
index
=
argv
.
front
();
argv
.
pop_front
();
long
l_index
=
0
;
if
(
!
string2l
(
index
.
data
(),
index
.
size
(),
&
l_index
))
{
ret
=
"-ERR value is not an integer or out of range
\r\n
"
;
return
;
}
std
::
string
new_val
=
argv
.
front
();
argv
.
pop_front
();
nemo
::
Status
s
=
g_pikaServer
->
GetHandle
()
->
LSet
(
key
,
l_index
,
new_val
);
if
(
s
.
ok
())
{
ret
=
"+OK
\r\n
"
;
}
else
if
(
s
.
IsNotFound
())
{
ret
=
"+ERR no such key
\r\n
"
;
}
else
if
(
s
.
IsCorruption
()
&&
s
.
ToString
()
==
"Corruption: index out of range"
)
{
ret
=
"+ERR index out of range
\r\n
"
;
}
else
{
ret
=
"+ERR "
;
ret
.
append
(
s
.
ToString
().
c_str
());
ret
.
append
(
"
\r\n
"
);
}
}
void
RPopCmd
::
Do
(
std
::
list
<
std
::
string
>
&
argv
,
std
::
string
&
ret
)
{
if
((
arity
>
0
&&
(
int
)
argv
.
size
()
!=
arity
)
||
(
arity
<
0
&&
(
int
)
argv
.
size
()
<
-
arity
))
{
ret
=
"-ERR wrong number of arguments for "
;
ret
.
append
(
argv
.
front
());
ret
.
append
(
" command
\r\n
"
);
return
;
}
argv
.
pop_front
();
std
::
string
key
=
argv
.
front
();
argv
.
pop_front
();
std
::
string
value
;
nemo
::
Status
s
=
g_pikaServer
->
GetHandle
()
->
RPop
(
key
,
&
value
);
if
(
s
.
ok
())
{
char
buf
[
32
];
snprintf
(
buf
,
sizeof
(
buf
),
"$%lu
\r\n
"
,
value
.
size
());
ret
.
append
(
buf
);
ret
.
append
(
value
.
data
(),
value
.
size
());
ret
.
append
(
"
\r\n
"
);
}
else
if
(
s
.
IsNotFound
())
{
ret
.
append
(
"$-1
\r\n
"
);
}
else
{
ret
.
append
(
"-ERR "
);
ret
.
append
(
s
.
ToString
().
c_str
());
ret
.
append
(
"
\r\n
"
);
}
}
void
RPushCmd
::
Do
(
std
::
list
<
std
::
string
>
&
argv
,
std
::
string
&
ret
)
{
if
((
arity
>
0
&&
(
int
)
argv
.
size
()
!=
arity
)
||
(
arity
<
0
&&
(
int
)
argv
.
size
()
<
-
arity
))
{
ret
=
"-ERR wrong number of arguments for "
;
ret
.
append
(
argv
.
front
());
ret
.
append
(
" command
\r\n
"
);
return
;
}
argv
.
pop_front
();
std
::
string
key
=
argv
.
front
();
argv
.
pop_front
();
std
::
string
value
;
nemo
::
Status
s
;
uint64_t
llen
=
0
;
while
(
argv
.
size
()
>
0
)
{
value
=
argv
.
front
();
s
=
g_pikaServer
->
GetHandle
()
->
RPush
(
key
,
value
,
&
llen
);
if
(
s
.
IsCorruption
())
{
break
;
}
argv
.
pop_front
();
}
if
(
argv
.
size
()
>
0
)
{
ret
=
"+ERR "
;
ret
.
append
(
s
.
ToString
().
c_str
());
ret
.
append
(
"
\r\n
"
);
}
else
{
char
buf
[
32
];
snprintf
(
buf
,
sizeof
(
buf
),
":%lu
\r\n
"
,
llen
);
ret
.
append
(
buf
);
}
}
void
RPushxCmd
::
Do
(
std
::
list
<
std
::
string
>
&
argv
,
std
::
string
&
ret
)
{
if
((
arity
>
0
&&
(
int
)
argv
.
size
()
!=
arity
)
||
(
arity
<
0
&&
(
int
)
argv
.
size
()
<
-
arity
))
{
ret
=
"-ERR wrong number of arguments for "
;
ret
.
append
(
argv
.
front
());
ret
.
append
(
" command
\r\n
"
);
return
;
}
argv
.
pop_front
();
std
::
string
key
=
argv
.
front
();
argv
.
pop_front
();
std
::
string
value
=
argv
.
front
();
argv
.
pop_front
();
uint64_t
llen
=
0
;
nemo
::
Status
s
=
g_pikaServer
->
GetHandle
()
->
RPushx
(
key
,
value
,
&
llen
);
if
(
s
.
IsCorruption
())
{
ret
=
"+ERR "
;
ret
.
append
(
s
.
ToString
().
c_str
());
ret
.
append
(
"
\r\n
"
);
}
else
{
char
buf
[
32
];
snprintf
(
buf
,
sizeof
(
buf
),
":%lu
\r\n
"
,
llen
);
ret
.
append
(
buf
);
}
}
nemo
@
37a764fd
比较
387d6104
...
37a764fd
Subproject commit 3
87d61046901dfb38c87d1089fcbdce3200be2f6
Subproject commit 3
7a764fd93e76ae02ca09bca9b8564302d7499e7
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录