static int uwsgi_api_cache_set(lua_State *L) { int args = lua_gettop(L); const char *key ; const char *value ; uint64_t expires = 0; size_t vallen; if (!uwsgi.caches) goto error; if (args > 1) { key = lua_tolstring(L, 1, NULL); value = lua_tolstring(L, 2, &vallen); if (args > 2) { expires = lua_tonumber(L, 3); } uwsgi_wlock(uwsgi.caches->lock); uwsgi_cache_set((char *)key, strlen(key), (char *)value, (uint16_t) vallen, expires, 0); uwsgi_rwunlock(uwsgi.caches->lock); } error: lua_pushnil(L); return 1; }
int uwsgi_cache_request(struct wsgi_request *wsgi_req) { uint64_t vallen = 0; char *value; char *argv[3]; uint16_t argvs[3]; uint8_t argc = 0; switch(wsgi_req->uh.modifier2) { case 0: // get if (wsgi_req->uh.pktsize > 0) { value = uwsgi_cache_get(wsgi_req->buffer, wsgi_req->uh.pktsize, &vallen); if (value && vallen > 0) { wsgi_req->uh.pktsize = vallen; wsgi_req->response_size = wsgi_req->socket->proto_write(wsgi_req, (char *)&wsgi_req->uh, 4); wsgi_req->response_size += wsgi_req->socket->proto_write(wsgi_req, value, vallen); } } break; case 1: // set if (wsgi_req->uh.pktsize > 0) { argc = 3; if (!uwsgi_parse_array(wsgi_req->buffer, wsgi_req->uh.pktsize, argv, argvs, &argc)) { if (argc > 1) { uwsgi_cache_set(argv[0], argvs[0], argv[1], argvs[1], 0, 0); } } } break; case 2: // del if (wsgi_req->uh.pktsize > 0) { uwsgi_cache_del(wsgi_req->buffer, wsgi_req->uh.pktsize, 0); } break; case 3: case 4: // dict if (wsgi_req->uh.pktsize > 0) { uwsgi_hooked_parse(wsgi_req->buffer, wsgi_req->uh.pktsize, cache_command, (void *) wsgi_req); } break; case 5: // get (uwsgi + stream) if (wsgi_req->uh.pktsize > 0) { value = uwsgi_cache_get(wsgi_req->buffer, wsgi_req->uh.pktsize, &vallen); if (value && vallen > 0) { wsgi_req->uh.pktsize = 0; wsgi_req->uh.modifier2 = 1; wsgi_req->response_size = wsgi_req->socket->proto_write(wsgi_req, (char *)&wsgi_req->uh, 4); wsgi_req->response_size += wsgi_req->socket->proto_write(wsgi_req, value, vallen); } else { wsgi_req->uh.pktsize = 0; wsgi_req->uh.modifier2 = 0; wsgi_req->response_size = wsgi_req->socket->proto_write(wsgi_req, (char *)&wsgi_req->uh, 4); } } break; } return 0; }