@@ -96,17 +96,6 @@ func PrefixValueKey(rprefix ids.ShortID, key []byte) (k []byte) {
9696 return k
9797}
9898
99- // [expiry/pruningPrefix] + [delimiter] + [timestamp] + [delimiter] + [rawPrefix]
100- func specificTimeKey (p byte , t int64 , rprefix ids.ShortID ) (k []byte ) {
101- k = make ([]byte , 2 + 8 + 1 + shortIDLen )
102- k [0 ] = p
103- k [1 ] = parser .Delimiter
104- binary .LittleEndian .PutUint64 (k [2 :], uint64 (t ))
105- k [2 + 8 ] = parser .Delimiter
106- copy (k [2 + 8 + 1 :], rprefix [:])
107- return k
108- }
109-
11099// [expiry/pruningPrefix] + [delimiter] + [timestamp] + [delimiter]
111100func RangeTimeKey (p byte , t int64 ) (k []byte ) {
112101 k = make ([]byte , 2 + 8 + 1 )
@@ -127,6 +116,31 @@ func PrefixPruningKey(expired int64, rprefix ids.ShortID) (k []byte) {
127116 return specificTimeKey (pruningPrefix , expired , rprefix )
128117}
129118
119+ const specificTimeKeyLen = 2 + 8 + 1 + shortIDLen
120+
121+ // [expiry/pruningPrefix] + [delimiter] + [timestamp] + [delimiter] + [rawPrefix]
122+ func specificTimeKey (p byte , t int64 , rprefix ids.ShortID ) (k []byte ) {
123+ k = make ([]byte , specificTimeKeyLen )
124+ k [0 ] = p
125+ k [1 ] = parser .Delimiter
126+ binary .LittleEndian .PutUint64 (k [2 :], uint64 (t ))
127+ k [2 + 8 ] = parser .Delimiter
128+ copy (k [2 + 8 + 1 :], rprefix [:])
129+ return k
130+ }
131+
132+ var ErrInvalidKeyFormat = errors .New ("invalid key format" )
133+
134+ // extracts expiry/pruning timstamp and raw prefix
135+ func extractSpecificTimeKey (k []byte ) (timestamp int64 , rprefix ids.ShortID , err error ) {
136+ if len (k ) != specificTimeKeyLen {
137+ return - 1 , ids .ShortEmpty , ErrInvalidKeyFormat
138+ }
139+ timestamp = int64 (binary .LittleEndian .Uint64 (k [2 : 2 + 8 ]))
140+ rprefix , err = ids .ToShortID (k [2 + 8 + 1 :])
141+ return timestamp , rprefix , err
142+ }
143+
130144func GetPrefixInfo (db database.KeyValueReader , prefix []byte ) (* PrefixInfo , bool , error ) {
131145 // TODO: add caching (will need some expiry when keys cleared)
132146 // [infoPrefix] + [delimiter] + [prefix]
@@ -215,8 +229,7 @@ func ExpireNext(db database.Database, parent int64, current int64) (err error) {
215229 if err := db .Delete (k ); err != nil {
216230 return err
217231 }
218- expired := int64 (binary .LittleEndian .Uint64 (curKey [2 : 2 + 8 ]))
219- rpfx , err := ids .ToShortID (curKey [2 + 8 + 1 :])
232+ expired , rpfx , err := extractSpecificTimeKey (curKey )
220233 if err != nil {
221234 return err
222235 }
@@ -246,7 +259,7 @@ func PruneNext(db database.Database, limit int) (err error) {
246259 if bytes .Compare (curKey , endKey ) > 0 { // curKey > endKey; end search
247260 break
248261 }
249- rpfx , err := ids . ToShortID (curKey [ 2 + 8 + 1 :] )
262+ _ , rpfx , err := extractSpecificTimeKey (curKey )
250263 if err != nil {
251264 return err
252265 }
0 commit comments