author | Tero Marttila <terom@fixme.fi> |
Thu, 28 Aug 2008 00:29:39 +0300 | |
changeset 43 | e5b714190dee |
parent 42 | 0e503189af2f |
child 44 | 03a7e064f833 |
permissions | -rw-r--r-- |
40 | 1 |
|
2 |
#include <stdlib.h> |
|
3 |
#include <assert.h> |
|
4 |
||
5 |
#include "request.h" |
|
6 |
#include "memcache.h" |
|
7 |
#include "../common.h" |
|
8 |
||
41
540737bf6bac
sending requests, and partial support for receiving -- incomplete, not tested
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
9 |
struct memcache_req *memcache_req_alloc (struct memcache *mc, enum memcache_command cmd_type, const struct memcache_key *key, void *cb_arg) { |
40 | 10 |
struct memcache_req *req = NULL; |
11 |
||
12 |
// allocate it |
|
13 |
if ((req = calloc(1, sizeof(*req))) == NULL) |
|
14 |
ERROR("calloc"); |
|
15 |
||
16 |
// state |
|
41
540737bf6bac
sending requests, and partial support for receiving -- incomplete, not tested
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
17 |
req->state = MEMCACHE_STATE_INVALID; |
40 | 18 |
|
19 |
// copy the key |
|
20 |
if ((req->key.buf = malloc(key->len)) == NULL) |
|
21 |
ERROR("malloc key buf"); |
|
22 |
||
23 |
// copy over the key |
|
24 |
memcpy(req->key.buf, key->buf, key->len); |
|
25 |
req->key.len = key->len; |
|
26 |
||
41
540737bf6bac
sending requests, and partial support for receiving -- incomplete, not tested
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
27 |
// store the other data |
40 | 28 |
req->mc = mc; |
41
540737bf6bac
sending requests, and partial support for receiving -- incomplete, not tested
Tero Marttila <terom@fixme.fi>
parents:
40
diff
changeset
|
29 |
req->cmd_type = cmd_type; |
40 | 30 |
req->cb_arg = cb_arg; |
31 |
||
32 |
// success |
|
33 |
return req; |
|
34 |
||
35 |
error: |
|
36 |
if (req) { |
|
37 |
free(req->key.buf); |
|
38 |
free(req); |
|
39 |
} |
|
40 |
||
41 |
return NULL; |
|
42 |
} |
|
43 |
||
42
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
44 |
static void _memcache_req_notify (struct memcache_req *req) { |
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
45 |
req->mc->cb_fn(req, req->cb_arg); |
40 | 46 |
} |
47 |
||
42
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
48 |
void memcache_req_queued (struct memcache_req *req) { |
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
49 |
req->state = MEMCACHE_STATE_QUEUED; |
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
50 |
|
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
51 |
// _memcache_req_notify(req); |
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
52 |
} |
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
53 |
|
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
54 |
void memcache_req_send (struct memcache_req *req) { |
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
55 |
req->state = MEMCACHE_STATE_SEND; |
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
56 |
|
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
57 |
// _memcache_req_notify(req); |
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
58 |
} |
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
59 |
|
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
60 |
void memcache_req_reply (struct memcache_req *req, enum memcache_reply reply_type) { |
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
61 |
req->state = MEMCACHE_STATE_REPLY; |
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
62 |
req->reply_type = reply_type; |
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
63 |
|
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
64 |
_memcache_req_notify(req); |
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
65 |
} |
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
66 |
|
43
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
67 |
void memcache_req_data (struct memcache_req *req) { |
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
68 |
assert(req->state == MEMCACHE_STATE_REPLY || req->state == MEMCACHE_STATE_REPLY_DATA); |
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
69 |
|
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
70 |
req->state = MEMCACHE_STATE_REPLY_DATA; |
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
71 |
|
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
72 |
_memcache_req_notify(req); |
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
73 |
} |
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
74 |
|
42
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
75 |
void memcache_req_done (struct memcache_req *req) { |
43
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
76 |
// make sure we are in the REPLY/REPLY_DATA state |
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
77 |
assert(req->state == MEMCACHE_STATE_REPLY || req->state == MEMCACHE_STATE_REPLY_DATA); |
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
78 |
|
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
79 |
// make sure we really have the full data, if applicable |
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
80 |
assert(req->buf.data == NULL || req->buf.offset == req->buf.len); |
42
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
81 |
|
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
82 |
// forget the connection |
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
83 |
req->conn = NULL; |
43
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
84 |
|
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
85 |
// state depends on if we have data or not... |
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
86 |
req->state = req->buf.data ? MEMCACHE_STATE_DATA_DONE : MEMCACHE_STATE_DONE; |
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
87 |
} |
42
0e503189af2f
more reply-receiving code, but still incomplete
Tero Marttila <terom@fixme.fi>
parents:
41
diff
changeset
|
88 |
|
43
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
89 |
void memcache_req_error (struct memcache_req *req) { |
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
90 |
// forget our connection |
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
91 |
req->conn = NULL; |
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
92 |
|
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
93 |
req->state = MEMCACHE_STATE_ERROR; |
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
94 |
|
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
95 |
_memcache_req_notify(req); |
40 | 96 |
} |
97 |
||
98 |
void memcache_req_free (struct memcache_req *req) { |
|
99 |
// must be unused |
|
100 |
assert(req->conn == NULL); |
|
43
e5b714190dee
the request/reply code should be complete now, but still needs testing
Tero Marttila <terom@fixme.fi>
parents:
42
diff
changeset
|
101 |
assert(req->state == MEMCACHE_STATE_INVALID || req->state == MEMCACHE_STATE_ERROR || req->state == MEMCACHE_STATE_DONE || req->state == MEMCACHE_STATE_DATA_DONE); |
40 | 102 |
|
103 |
free(req->key.buf); |
|
104 |
free(req); |
|
105 |
} |
|
106 |