Skip to content

Commit 798faae

Browse files
authored
Merge pull request #3 from elliotchenzichang/string_http_operation
feat: string http operation first version
2 parents 44405fe + c0efcf0 commit 798faae

File tree

5 files changed

+331
-1
lines changed

5 files changed

+331
-1
lines changed

core_string.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package nutshttp
2+
3+
import "github.com/xujiajun/nutsdb"
4+
5+
// Update handle insert and update operation
6+
func (c *core) Update(bucket string, key string, value string, ttl uint32) error {
7+
err := c.db.Update(func(tx *nutsdb.Tx) error {
8+
err := tx.Put(bucket, []byte(key), []byte(value), ttl)
9+
return err
10+
})
11+
return err
12+
}
13+
14+
// Delete handle delete operation
15+
func (c *core) Delete(bucket string, key string) error {
16+
err := c.db.Update(func(tx *nutsdb.Tx) error {
17+
err := tx.Delete(bucket, []byte(key))
18+
return err
19+
})
20+
return err
21+
}
22+
23+
// Get handle get key operation
24+
func (c *core) Get(bucket string, key string) (value string, err error) {
25+
err = c.db.View(func(tx *nutsdb.Tx) error {
26+
entry, err := tx.Get(bucket, []byte(key))
27+
if err != nil {
28+
return err
29+
}
30+
value = string(entry.Value)
31+
return nil
32+
})
33+
return value, err
34+
}
35+
36+
func (c *core) PrefixScan(bucket string, prefix string, offSet int, limNum int) (entries nutsdb.Entries, err error) {
37+
err = c.db.View(func(tx *nutsdb.Tx) error {
38+
entries, _, err = tx.PrefixScan(bucket, []byte(prefix), offSet, limNum)
39+
return err
40+
})
41+
return entries, err
42+
}
43+
44+
func (c *core) PrefixSearchScan(bucket, prefix string, reg string, offSet int, limNum int) (entries nutsdb.Entries, err error) {
45+
err = c.db.View(func(tx *nutsdb.Tx) error {
46+
entries, _, err = tx.PrefixSearchScan(bucket, []byte(prefix), reg, offSet, limNum)
47+
return err
48+
})
49+
return entries, err
50+
}
51+
52+
func (c *core) RangeScan(bucket string, start string, end string) (entries nutsdb.Entries, err error) {
53+
err = c.db.View(func(tx *nutsdb.Tx) error {
54+
entries, err = tx.RangeScan(bucket, []byte(start), []byte(end))
55+
return err
56+
})
57+
return entries, err
58+
}
59+
60+
func (c *core) GetAll(bucket string) (entries nutsdb.Entries, err error) {
61+
err = c.db.View(func(tx *nutsdb.Tx) error {
62+
entries, err = tx.GetAll(bucket)
63+
return err
64+
})
65+
return entries, err
66+
}

response.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ var (
1717
ErrBadRequest = APIMessage{Code: 400, Message: "Bad Request"}
1818
ErrNotFound = APIMessage{404, "Not Found"}
1919
ErrInternalServerError = APIMessage{500, "Internal Server Error"}
20+
ErrKeyNotFoundInBucket = APIMessage{40001, "Key Not Found In Bucket"}
21+
ErrPrefixScan = APIMessage{40002, "Prefix Scans Not Found"}
22+
ErrPrefixSearchScan = APIMessage{40003, "Prefix Search Scans Not Found"}
23+
ErrRangeScan = APIMessage{40004, "Range Scans Not Found"}
24+
ErrBucketEmpty = APIMessage{40005, "Bucket Empty"}
25+
ErrUnknown = APIMessage{40404, "UnKnown Err"}
2026
)
2127

2228
type Response struct {
@@ -35,7 +41,7 @@ func WriteSucc(c *gin.Context, data interface{}) {
3541
}
3642

3743
func WriteError(c *gin.Context, msg APIMessage) {
38-
c.JSON(msg.Code, Response{
44+
c.JSON(http.StatusOK, Response{
3945
Code: msg.Code,
4046
Error: msg.Message,
4147
})

router_string.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package nutshttp
2+
3+
func (s *NutsHTTPServer) initStringRouter() {
4+
sr := s.r.Group("/string")
5+
6+
sr.GET("get/:bucket/:key", s.Get)
7+
8+
sr.POST("update/:bucket/:key", s.Update)
9+
10+
sr.POST("delete/:bucket/:key", s.Delete)
11+
12+
sr.GET("scan/:bucket/:scanType", s.Scan)
13+
}

server.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ func (s *NutsHTTPServer) initRouter() {
3535
s.initSetRouter()
3636

3737
s.initListRouter()
38+
39+
s.initStringRouter()
3840
}
3941

4042
func (s *NutsHTTPServer) initListRouter() {

server_string.go

Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
package nutshttp
2+
3+
import (
4+
"github.com/gin-gonic/gin"
5+
"github.com/xujiajun/nutsdb"
6+
)
7+
8+
func (s *NutsHTTPServer) Get(c *gin.Context) {
9+
var (
10+
err error
11+
baseUri BaseUri
12+
)
13+
14+
if err = c.ShouldBindUri(&baseUri); err != nil {
15+
WriteError(c, APIMessage{
16+
Message: err.Error(),
17+
})
18+
return
19+
}
20+
21+
value, err := s.core.Get(baseUri.Bucket, baseUri.Key)
22+
if err != nil {
23+
switch err {
24+
case nutsdb.ErrNotFoundKey:
25+
WriteError(c, ErrKeyNotFoundInBucket)
26+
default:
27+
WriteError(c, ErrUnknown)
28+
}
29+
return
30+
}
31+
32+
WriteSucc(c, value)
33+
34+
}
35+
36+
func (s *NutsHTTPServer) Update(c *gin.Context) {
37+
type UpdateStringRequest struct {
38+
Value string `json:"value" binding:"required"`
39+
Ttl uint32 `json:"ttl"`
40+
}
41+
var (
42+
err error
43+
baseUri BaseUri
44+
updateStringRequest UpdateStringRequest
45+
)
46+
47+
if err = c.ShouldBindUri(&baseUri); err != nil {
48+
WriteError(c, APIMessage{
49+
Message: err.Error(),
50+
})
51+
return
52+
}
53+
54+
if err = c.ShouldBindJSON(&updateStringRequest); err != nil {
55+
WriteError(c, APIMessage{
56+
Message: err.Error(),
57+
})
58+
return
59+
}
60+
61+
err = s.core.Update(baseUri.Bucket, baseUri.Key, updateStringRequest.Value, updateStringRequest.Ttl)
62+
if err != nil {
63+
switch err {
64+
case nutsdb.ErrNotFoundKey:
65+
WriteError(c, ErrKeyNotFoundInBucket)
66+
default:
67+
WriteError(c, ErrUnknown)
68+
}
69+
return
70+
}
71+
WriteSucc(c, struct{}{})
72+
}
73+
74+
func (s *NutsHTTPServer) Delete(c *gin.Context) {
75+
var (
76+
err error
77+
baseUri BaseUri
78+
)
79+
80+
if err = c.ShouldBindUri(&baseUri); err != nil {
81+
WriteError(c, APIMessage{
82+
Message: err.Error(),
83+
})
84+
return
85+
}
86+
87+
_, err = s.core.Get(baseUri.Bucket, baseUri.Key)
88+
if err != nil {
89+
switch err {
90+
case nutsdb.ErrNotFoundKey:
91+
WriteError(c, ErrKeyNotFoundInBucket)
92+
default:
93+
WriteError(c, ErrUnknown)
94+
}
95+
return
96+
}
97+
98+
err = s.core.Delete(baseUri.Bucket, baseUri.Key)
99+
100+
if err != nil {
101+
switch err {
102+
case nutsdb.ErrKeyEmpty:
103+
WriteError(c, ErrKeyNotFoundInBucket)
104+
default:
105+
WriteError(c, ErrUnknown)
106+
}
107+
return
108+
}
109+
WriteSucc(c, struct{}{})
110+
}
111+
112+
func (s *NutsHTTPServer) Scan(c *gin.Context) {
113+
const (
114+
PrefixScan = "prefixScan"
115+
PrefixSearchScan = "prefixSearchScan"
116+
RangeScan = "rangeScan"
117+
GetAll = "getAll"
118+
)
119+
120+
type ScanParam struct {
121+
Bucket string `uri:"bucket" binding:"required"`
122+
ScanType string `uri:"scanType" binding:"required"`
123+
}
124+
125+
var (
126+
err error
127+
entries nutsdb.Entries
128+
scanParam ScanParam
129+
)
130+
131+
if err = c.ShouldBindUri(&scanParam); err != nil {
132+
WriteError(c, APIMessage{
133+
Message: err.Error(),
134+
})
135+
return
136+
}
137+
138+
switch scanParam.ScanType {
139+
case PrefixScan:
140+
type ScanRequest struct {
141+
OffSet *int `json:"offSet" binding:"required"`
142+
LimitNum *int `json:"limitNum" binding:"required"`
143+
Prefix *string `json:"prefix" binding:"required"`
144+
}
145+
146+
var scanReq ScanRequest
147+
if err = c.ShouldBindJSON(&scanReq); err != nil {
148+
WriteError(c, APIMessage{
149+
Message: err.Error(),
150+
})
151+
return
152+
}
153+
entries, err = s.core.PrefixScan(scanParam.Bucket, *scanReq.Prefix, *scanReq.OffSet, *scanReq.LimitNum)
154+
if err != nil {
155+
switch err {
156+
case nutsdb.ErrPrefixScan:
157+
WriteError(c, ErrPrefixScan)
158+
default:
159+
WriteError(c, ErrUnknown)
160+
}
161+
return
162+
}
163+
var res = map[string]string{}
164+
for _, e := range entries {
165+
res[string(e.Key)] = string(e.Value)
166+
}
167+
WriteSucc(c, res)
168+
case PrefixSearchScan:
169+
type ScanSearchReq struct {
170+
OffSet *int `json:"offSet" binding:"required"`
171+
LimitNum *int `json:"limitNum" binding:"required"`
172+
Prefix *string `json:"prefix" binding:"required"`
173+
Reg *string `json:"reg" binding:"required"`
174+
}
175+
var scanSearchReq ScanSearchReq
176+
if err = c.ShouldBindJSON(&scanSearchReq); err != nil {
177+
WriteError(c, APIMessage{
178+
Message: err.Error(),
179+
})
180+
return
181+
}
182+
entries, err = s.core.PrefixSearchScan(scanParam.Bucket, *scanSearchReq.Prefix, *scanSearchReq.Reg, *scanSearchReq.OffSet, *scanSearchReq.LimitNum)
183+
if err != nil {
184+
switch err {
185+
case nutsdb.ErrPrefixSearchScan:
186+
WriteError(c, ErrPrefixSearchScan)
187+
default:
188+
WriteError(c, ErrUnknown)
189+
}
190+
return
191+
}
192+
var res = map[string]string{}
193+
for _, e := range entries {
194+
res[string(e.Key)] = string(e.Value)
195+
}
196+
WriteSucc(c, res)
197+
case RangeScan:
198+
type RangeScanReq struct {
199+
Start *string `json:"start" binding:"required"`
200+
End *string `json:"end" binding:"required"`
201+
}
202+
var rangeScanReq RangeScanReq
203+
if err = c.ShouldBindJSON(&rangeScanReq); err != nil {
204+
WriteError(c, APIMessage{
205+
Message: err.Error(),
206+
})
207+
return
208+
}
209+
entries, err = s.core.RangeScan(scanParam.Bucket, *rangeScanReq.Start, *rangeScanReq.End)
210+
if err != nil {
211+
switch err {
212+
case nutsdb.ErrRangeScan:
213+
WriteError(c, ErrRangeScan)
214+
default:
215+
WriteError(c, ErrUnknown)
216+
}
217+
return
218+
}
219+
var res = map[string]string{}
220+
for _, e := range entries {
221+
res[string(e.Key)] = string(e.Value)
222+
}
223+
WriteSucc(c, res)
224+
case GetAll:
225+
entries, err = s.core.GetAll(scanParam.Bucket)
226+
if err != nil {
227+
switch err {
228+
case nutsdb.ErrBucketEmpty:
229+
WriteError(c, ErrBucketEmpty)
230+
default:
231+
WriteError(c, ErrUnknown)
232+
}
233+
return
234+
}
235+
var res = map[string]string{}
236+
for _, e := range entries {
237+
res[string(e.Key)] = string(e.Value)
238+
}
239+
WriteSucc(c, res)
240+
}
241+
242+
return
243+
}

0 commit comments

Comments
 (0)