| 4398 | } |
| 4399 | |
| 4400 | static void *TimeEvent_RDBLoad(RedisModuleIO *rdb, int encver){ |
| 4401 | TimerData* td = RG_ALLOC(sizeof(*td)); |
| 4402 | td->status = TE_STATUS_RUNNING; |
| 4403 | td->period = RedisModule_LoadUnsigned(rdb); |
| 4404 | |
| 4405 | int version = 0; |
| 4406 | if(encver >= TIME_EVENT_ENCVER_WITH_VERSIONED_SESSION_PYCALLBACK){ |
| 4407 | version = RedisModule_LoadUnsigned(rdb); |
| 4408 | } |
| 4409 | |
| 4410 | size_t serializedSessionLen; |
| 4411 | char *serializedSession = RedisModule_LoadStringBuffer(rdb, &serializedSessionLen); |
| 4412 | Gears_Buffer sessionBuff = { |
| 4413 | .buff = serializedSession, |
| 4414 | .size = serializedSessionLen, |
| 4415 | .cap = serializedSessionLen, |
| 4416 | }; |
| 4417 | Gears_BufferReader br; |
| 4418 | Gears_BufferReaderInit(&br, &sessionBuff); |
| 4419 | char* err = NULL; |
| 4420 | td->session = PythonSessionCtx_Deserialize(&br, version, &err, true); |
| 4421 | if(!td->session){ |
| 4422 | RedisModule_Log(staticCtx, "warning", "Could not deserialize TimeEven Session, error='%s'", err); |
| 4423 | } |
| 4424 | RedisModule_Free(serializedSession); |
| 4425 | |
| 4426 | version = 0; |
| 4427 | if(encver >= TIME_EVENT_ENCVER_WITH_VERSIONED_SESSION_PYCALLBACK){ |
| 4428 | version = RedisModule_LoadUnsigned(rdb); |
| 4429 | } |
| 4430 | |
| 4431 | size_t len; |
| 4432 | char* buff = RedisModule_LoadStringBuffer(rdb, &len); |
| 4433 | Gears_Buffer b = { |
| 4434 | .cap = len, |
| 4435 | .size = len, |
| 4436 | .buff = buff, |
| 4437 | }; |
| 4438 | Gears_BufferReader reader; |
| 4439 | Gears_BufferReaderInit(&reader, &b); |
| 4440 | td->callback = RedisGearsPy_PyCallbackDeserialize(NULL, &reader, version, NULL); |
| 4441 | RedisModule_Assert(td->callback); |
| 4442 | |
| 4443 | // change callback global |
| 4444 | PythonExecutionCtx pectx = PythonExecutionCtx_New(td->session, NULL); |
| 4445 | RedisGearsPy_Lock(&pectx); |
| 4446 | PyFunctionObject* callback_func = (PyFunctionObject*)td->callback; |
| 4447 | PyDict_Merge(td->session->globalsDict, callback_func->func_globals, 0); |
| 4448 | GearsPyDecRef(callback_func->func_globals); |
| 4449 | callback_func->func_globals = td->session->globalsDict; |
| 4450 | Py_INCREF(callback_func->func_globals); |
| 4451 | RedisGearsPy_Unlock(&pectx); |
| 4452 | |
| 4453 | RedisModule_Free(buff); |
| 4454 | RedisModuleCtx* ctx = RedisModule_GetThreadSafeContext(NULL); |
| 4455 | td->id = RedisModule_CreateTimer(ctx, td->period * 1000, TimeEvent_Callback, td); |
| 4456 | RedisModule_FreeThreadSafeContext(ctx); |
| 4457 | return td; |
nothing calls this directly
no test coverage detected