diff --git a/ledis/const.go b/ledis/const.go index ef4ae87..d35ca3b 100644 --- a/ledis/const.go +++ b/ledis/const.go @@ -101,6 +101,7 @@ var ( errSetMemberSize = errors.New("invalid set member size") errZSetMemberSize = errors.New("invalid zset member size") errExpireValue = errors.New("invalid expire value") + errListIndex = errors.New("invalid list index") ) const ( diff --git a/ledis/t_list.go b/ledis/t_list.go index 24ec6d2..718ad8e 100644 --- a/ledis/t_list.go +++ b/ledis/t_list.go @@ -477,6 +477,39 @@ func (db *DB) LTrimBack(key []byte, trimSize int32) (int32, error) { func (db *DB) LPush(key []byte, args ...[]byte) (int64, error) { return db.lpush(key, listHeadSeq, args...) } +func (db *DB) LSet(key []byte, index int32, value []byte) error { + if err := checkKeySize(key); err != nil { + return err + } + + var seq int32 + var headSeq int32 + var tailSeq int32 + //var size int32 + var err error + t := db.listBatch + t.Lock() + defer t.Unlock() + metaKey := db.lEncodeMetaKey(key) + + headSeq, tailSeq, _, err = db.lGetMeta(nil, metaKey) + if err != nil { + return err + } + + if index >= 0 { + seq = headSeq + index + } else { + seq = tailSeq + index + 1 + } + if seq < headSeq || seq > tailSeq { + return errListIndex + } + sk := db.lEncodeListKey(key, seq) + t.Put(sk, value) + err = t.Commit() + return err +} func (db *DB) LRange(key []byte, start int32, stop int32) ([][]byte, error) { if err := checkKeySize(key); err != nil {