feat: add support for COPY command (#2016)

This commit is contained in:
Alex Kahn 2022-02-27 12:07:49 -05:00 committed by GitHub
parent 627f4dab54
commit 730afbcffb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 37 additions and 0 deletions

View File

@ -143,6 +143,7 @@ type Cmdable interface {
SetXX(ctx context.Context, key string, value interface{}, expiration time.Duration) *BoolCmd SetXX(ctx context.Context, key string, value interface{}, expiration time.Duration) *BoolCmd
SetRange(ctx context.Context, key string, offset int64, value string) *IntCmd SetRange(ctx context.Context, key string, offset int64, value string) *IntCmd
StrLen(ctx context.Context, key string) *IntCmd StrLen(ctx context.Context, key string) *IntCmd
Copy(ctx context.Context, sourceKey string, destKey string, db int, replace bool) *IntCmd
GetBit(ctx context.Context, key string, offset int64) *IntCmd GetBit(ctx context.Context, key string, offset int64) *IntCmd
SetBit(ctx context.Context, key string, offset int64, value int) *IntCmd SetBit(ctx context.Context, key string, offset int64, value int) *IntCmd
@ -1025,6 +1026,16 @@ func (c cmdable) StrLen(ctx context.Context, key string) *IntCmd {
return cmd return cmd
} }
func (c cmdable) Copy(ctx context.Context, sourceKey, destKey string, db int, replace bool) *IntCmd {
args := []interface{}{"copy", sourceKey, destKey, "DB", db}
if replace {
args = append(args, "REPLACE")
}
cmd := NewIntCmd(ctx, args...)
_ = c(ctx, cmd)
return cmd
}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
func (c cmdable) GetBit(ctx context.Context, key string, offset int64) *IntCmd { func (c cmdable) GetBit(ctx context.Context, key string, offset int64) *IntCmd {

View File

@ -1633,6 +1633,32 @@ var _ = Describe("Commands", func() {
Expect(strLen.Err()).NotTo(HaveOccurred()) Expect(strLen.Err()).NotTo(HaveOccurred())
Expect(strLen.Val()).To(Equal(int64(0))) Expect(strLen.Val()).To(Equal(int64(0)))
}) })
It("should Copy", func() {
set := client.Set(ctx, "key", "hello", 0)
Expect(set.Err()).NotTo(HaveOccurred())
Expect(set.Val()).To(Equal("OK"))
copy := client.Copy(ctx, "key", "newKey", redisOptions().DB, false)
Expect(copy.Err()).NotTo(HaveOccurred())
Expect(copy.Val()).To(Equal(int64(1)))
// Value is available by both keys now
getOld := client.Get(ctx, "key")
Expect(getOld.Err()).NotTo(HaveOccurred())
Expect(getOld.Val()).To(Equal("hello"))
getNew := client.Get(ctx, "newKey")
Expect(getNew.Err()).NotTo(HaveOccurred())
Expect(getNew.Val()).To(Equal("hello"))
// Overwriting an existing key should not succeed
overwrite := client.Copy(ctx, "newKey", "key", redisOptions().DB, false)
Expect(overwrite.Val()).To(Equal(int64(0)))
// Overwrite is allowed when replace=rue
replace := client.Copy(ctx, "newKey", "key", redisOptions().DB, true)
Expect(replace.Val()).To(Equal(int64(1)))
})
}) })
Describe("hashes", func() { Describe("hashes", func() {