@@ -11,6 +11,7 @@ struct RdbxFilter {
11
11
12
12
int regexInitialized ; /* for filter keys */
13
13
RdbDataType type ; /* for filter types */
14
+ int isExpireFilter ; /* for filter expired */
14
15
int dbnum ; /* for filter db */
15
16
};
16
17
@@ -22,45 +23,6 @@ static void deleteFilterCtx(RdbParser *p, void *data) {
22
23
RDB_free (p , ctx );
23
24
}
24
25
25
- /* mapping opcode to type */
26
- static void initOpcodeToType (RdbxFilter * ctx ) {
27
- memset (ctx -> opToType , 0 , sizeof (ctx -> opToType ));
28
- /*string*/
29
- ctx -> opToType [RDB_TYPE_STRING ] = RDB_DATA_TYPE_STRING ;
30
- /*list*/
31
- ctx -> opToType [RDB_TYPE_LIST ] = RDB_DATA_TYPE_LIST ;
32
- ctx -> opToType [RDB_TYPE_LIST_ZIPLIST ] = RDB_DATA_TYPE_LIST ;
33
- ctx -> opToType [RDB_TYPE_LIST_QUICKLIST ] = RDB_DATA_TYPE_LIST ;
34
- ctx -> opToType [RDB_TYPE_LIST_QUICKLIST_2 ] = RDB_DATA_TYPE_LIST ;
35
- /*set*/
36
- ctx -> opToType [RDB_TYPE_SET ] = RDB_DATA_TYPE_SET ;
37
- ctx -> opToType [RDB_TYPE_SET_INTSET ] = RDB_DATA_TYPE_SET ;
38
- ctx -> opToType [RDB_TYPE_SET_LISTPACK ] = RDB_DATA_TYPE_SET ;
39
- /*zset*/
40
- ctx -> opToType [RDB_TYPE_ZSET ] = RDB_DATA_TYPE_ZSET ;
41
- ctx -> opToType [RDB_TYPE_ZSET_2 ] = RDB_DATA_TYPE_ZSET ;
42
- ctx -> opToType [RDB_TYPE_ZSET_ZIPLIST ] = RDB_DATA_TYPE_ZSET ;
43
- ctx -> opToType [RDB_TYPE_ZSET_LISTPACK ] = RDB_DATA_TYPE_ZSET ;
44
- /*hash*/
45
- ctx -> opToType [RDB_TYPE_HASH ] = RDB_DATA_TYPE_HASH ;
46
- ctx -> opToType [RDB_TYPE_HASH_METADATA_PRE_GA ] = RDB_DATA_TYPE_HASH ;
47
- ctx -> opToType [RDB_TYPE_HASH_METADATA ] = RDB_DATA_TYPE_HASH ;
48
- ctx -> opToType [RDB_TYPE_HASH_ZIPMAP ] = RDB_DATA_TYPE_HASH ;
49
- ctx -> opToType [RDB_TYPE_HASH_ZIPLIST ] = RDB_DATA_TYPE_HASH ;
50
- ctx -> opToType [RDB_TYPE_HASH_LISTPACK ] = RDB_DATA_TYPE_HASH ;
51
- ctx -> opToType [RDB_TYPE_HASH_LISTPACK_EX_PRE_GA ] = RDB_DATA_TYPE_HASH ;
52
- ctx -> opToType [RDB_TYPE_HASH_LISTPACK_EX ] = RDB_DATA_TYPE_HASH ;
53
- /*module*/
54
- ctx -> opToType [RDB_TYPE_MODULE_2 ] = RDB_DATA_TYPE_MODULE ;
55
- ctx -> opToType [RDB_OPCODE_MODULE_AUX ] = RDB_DATA_TYPE_MODULE ;
56
- /*stream*/
57
- ctx -> opToType [RDB_TYPE_STREAM_LISTPACKS ] = RDB_DATA_TYPE_STREAM ;
58
- ctx -> opToType [RDB_TYPE_STREAM_LISTPACKS_2 ] = RDB_DATA_TYPE_STREAM ;
59
- ctx -> opToType [RDB_TYPE_STREAM_LISTPACKS_3 ] = RDB_DATA_TYPE_STREAM ;
60
- /*func*/
61
- ctx -> opToType [RDB_OPCODE_FUNCTION2 ] = RDB_DATA_TYPE_FUNCTION ;
62
- }
63
-
64
26
/*** filtering BY key, type or dbnum ***/
65
27
66
28
static RdbRes filterNewKeyByRegex (RdbParser * p , void * userData , RdbBulk key , RdbKeyInfo * info ) {
@@ -75,12 +37,32 @@ static RdbRes filterNewKeyByRegex(RdbParser *p, void *userData, RdbBulk key, Rdb
75
37
static RdbRes filterNewKeyByType (RdbParser * p , void * userData , RdbBulk key , RdbKeyInfo * info ) {
76
38
UNUSED (p , key );
77
39
RdbxFilter * ctx = userData ;
78
- if (ctx -> opToType [info -> opcode ] == ctx -> type ) /* if match */
40
+
41
+ if (info -> dataType == (int ) ctx -> type )
79
42
return ctx -> cbReturnValue = (ctx -> exclude ) ? RDB_OK_DONT_PROPAGATE : RDB_OK ;
80
43
else
81
44
return ctx -> cbReturnValue = (ctx -> exclude ) ? RDB_OK : RDB_OK_DONT_PROPAGATE ;
82
45
}
83
46
47
+ static RdbRes filterNewKeyByExpiry (RdbParser * p , void * userData , RdbBulk key , RdbKeyInfo * info ) {
48
+ UNUSED (p , key );
49
+ RdbxFilter * ctx = userData ;
50
+
51
+ /* if persistent key */
52
+ if (info -> expiretime == -1 )
53
+ return ctx -> cbReturnValue = (ctx -> exclude ) ? RDB_OK : RDB_OK_DONT_PROPAGATE ;
54
+
55
+ struct timeval te ;
56
+ gettimeofday (& te , NULL );
57
+ long long milliseconds = te .tv_sec * 1000LL + te .tv_usec /1000 ;
58
+
59
+ if (info -> expiretime > milliseconds )
60
+ return ctx -> cbReturnValue = (ctx -> exclude ) ? RDB_OK : RDB_OK_DONT_PROPAGATE ;
61
+
62
+ return ctx -> cbReturnValue = (ctx -> exclude ) ? RDB_OK_DONT_PROPAGATE
63
+ : RDB_OK ;
64
+ }
65
+
84
66
static RdbRes filterNewDbByNumber (RdbParser * p , void * userData , int dbnum ) {
85
67
UNUSED (p );
86
68
RdbxFilter * ctx = userData ;
@@ -356,15 +338,15 @@ static RdbxFilter *createHandlersFilterCommon(RdbParser *p,
356
338
const char * keyRegex ,
357
339
RdbDataType * type ,
358
340
int * dbnum ,
341
+ int isExpireFilter ,
359
342
uint32_t exclude ) {
360
343
RdbRes (* handleNewKey )(RdbParser * p , void * userData , RdbBulk key , RdbKeyInfo * info ) = filterNewKey ;
361
344
RdbRes (* handleNewDb )(RdbParser * p , void * userData , int dbnum ) = filterNewDb ;
362
345
RdbxFilter * ctx ;
363
346
364
347
if ( (ctx = RDB_alloc (p , sizeof (RdbxFilter ))) == NULL )
365
348
return NULL ;
366
-
367
- ctx -> regexInitialized = 0 ;
349
+ memset (ctx , 0 , sizeof (RdbxFilter ));
368
350
369
351
/* specific if-else init to filter regex/type/dbnum */
370
352
if (keyRegex ) { /* filter keys by regex */
@@ -383,7 +365,9 @@ static RdbxFilter *createHandlersFilterCommon(RdbParser *p,
383
365
} else if (type ) { /* filter keys by type */
384
366
ctx -> type = * type ;
385
367
handleNewKey = filterNewKeyByType ;
386
- initOpcodeToType (ctx );
368
+ } else if (isExpireFilter ) {
369
+ ctx -> isExpireFilter = 1 ;
370
+ handleNewKey = filterNewKeyByExpiry ;
387
371
} else { /* filter by dbnum */
388
372
ctx -> dbnum = * dbnum ;
389
373
handleNewDb = filterNewDbByNumber ;
@@ -421,13 +405,17 @@ static RdbxFilter *createHandlersFilterCommon(RdbParser *p,
421
405
/*** API ***/
422
406
423
407
_LIBRDB_API RdbxFilter * RDBX_createHandlersFilterKey (RdbParser * p , const char * keyRegex , uint32_t exclude ) {
424
- return createHandlersFilterCommon (p , keyRegex , NULL , NULL , exclude );
408
+ return createHandlersFilterCommon (p , keyRegex , NULL , NULL , 0 , exclude );
425
409
}
426
410
427
411
_LIBRDB_API RdbxFilter * RDBX_createHandlersFilterType (RdbParser * p , RdbDataType type , uint32_t exclude ) {
428
- return createHandlersFilterCommon (p , NULL , & type , NULL , exclude );
412
+ return createHandlersFilterCommon (p , NULL , & type , NULL , 0 , exclude );
429
413
}
430
414
431
415
_LIBRDB_API RdbxFilter * RDBX_createHandlersFilterDbNum (RdbParser * p , int dbnum , uint32_t exclude ) {
432
- return createHandlersFilterCommon (p , NULL , NULL , & dbnum , exclude );
416
+ return createHandlersFilterCommon (p , NULL , NULL , & dbnum , 0 , exclude );
417
+ }
418
+
419
+ _LIBRDB_API RdbxFilter * RDBX_createHandlersFilterExpired (RdbParser * p , uint32_t exclude ) {
420
+ return createHandlersFilterCommon (p , NULL , NULL , NULL , 1 , exclude );
433
421
}
0 commit comments