YRMCDS_METHOD(Client, set) { char* key; size_t key_len; char* data; size_t data_len; long flags = 0; long expire = 0; long cas = 0; zend_bool quiet = 0; if( zend_parse_parameters(ZEND_NUM_ARGS(), "s!s!|lllb", &key, &key_len, &data, &data_len, &flags, &expire, &cas, &quiet) == FAILURE ) { php_error(E_ERROR, "Invalid argument"); RETURN_FALSE; } if( key_len == 0 ) { php_error(E_ERROR, "Invalid key"); RETURN_FALSE; } if( data_len == 0 ) { php_error(E_ERROR, "Empty data is not allowed"); RETURN_FALSE; } YRMCDS_CLIENT_EXPLODE(getThis()); uint32_t serial; CHECK_YRMCDS( yrmcds_set(&obj->conn->res, key, key_len, data, data_len, flags, expire, cas, quiet, &serial) ); RETURN_LONG((long)serial); }
static void *writer_main(void *_conn) { struct st_h2o_memcached_conn_t *conn = _conn; yrmcds_error err; pthread_mutex_lock(&conn->ctx->mutex); while (!__sync_add_and_fetch(&conn->writer_exit_requested, 0)) { while (!h2o_linklist_is_empty(&conn->ctx->pending)) { h2o_memcached_req_t *req = H2O_STRUCT_FROM_MEMBER(h2o_memcached_req_t, pending, conn->ctx->pending.next); h2o_linklist_unlink(&req->pending); pthread_mutex_unlock(&conn->ctx->mutex); switch (req->type) { case REQ_TYPE_GET: pthread_mutex_lock(&conn->mutex); h2o_linklist_insert(&conn->inflight, &req->inflight); pthread_mutex_unlock(&conn->mutex); if ((err = yrmcds_get(&conn->yrmcds, req->key.base, req->key.len, 0, &req->data.get.serial)) != YRMCDS_OK) goto Error; break; case REQ_TYPE_SET: err = yrmcds_set(&conn->yrmcds, req->key.base, req->key.len, req->data.set.value.base, req->data.set.value.len, 0, req->data.set.expiration, 0, !conn->yrmcds.text_mode, NULL); discard_req(req); if (err != YRMCDS_OK) goto Error; break; case REQ_TYPE_DELETE: err = yrmcds_remove(&conn->yrmcds, req->key.base, req->key.len, !conn->yrmcds.text_mode, NULL); discard_req(req); if (err != YRMCDS_OK) goto Error; break; default: fprintf(stderr, "[lib/common/memcached.c] unknown type:%d\n", (int)req->type); err = YRMCDS_NOT_IMPLEMENTED; goto Error; } pthread_mutex_lock(&conn->ctx->mutex); } pthread_cond_wait(&conn->ctx->cond, &conn->ctx->mutex); } pthread_mutex_unlock(&conn->ctx->mutex); return NULL; Error: fprintf(stderr, "[lib/common/memcached.c] failed to send request; %s\n", yrmcds_strerror(err)); /* doc says the call can be used to interrupt yrmcds_recv */ yrmcds_shutdown(&conn->yrmcds); return NULL; }
int cmd_set(int argc, char** argv, yrmcds* s) { if( argc < 2 || 5 < argc ) { fprintf(stderr, "Wrong number of arguments.\n"); return 1; } const char* key = argv[0]; char* data = NULL; size_t data_len = read_data(argv[1], &data); if( data == NULL ) { fprintf(stderr, "Failed to read data.\n"); return 2; } uint32_t expire = 0; uint32_t flags = 0; uint64_t cas = 0; if( argc > 2 ) expire = (uint32_t)strtoull(argv[2], NULL, 0); if( argc > 3 ) flags = (uint32_t)strtoull(argv[3], NULL, 0); if( argc > 4 ) cas = (uint64_t)strtoull(argv[4], NULL, 0); yrmcds_response r[1]; uint32_t serial; yrmcds_error e = yrmcds_set(s, key, strlen(key), data, data_len, flags, expire, cas, quiet, &serial); free(data); CHECK_ERROR(e); if( quiet ) { e = yrmcds_noop(s, &serial); CHECK_ERROR(e); } if( debug ) fprintf(stderr, "request serial = %u\n", serial); while( 1 ) { e = yrmcds_recv(s, r); CHECK_ERROR(e); if( debug ) print_response(r); CHECK_RESPONSE(r); if( r->serial == serial ) break; } return 0; }