Mercurial > dovecot > core-2.2
annotate src/lib-dict/dict-memcached-ascii.c @ 22652:09523ad05bef
director: Log whenever HOST-RESET-USERS is used
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sun, 05 Nov 2017 22:53:23 +0200 |
parents | 16835a26b202 |
children | cb108f786fb4 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21389
diff
changeset
|
1 /* Copyright (c) 2008-2017 Dovecot authors, see the included COPYING memcached_ascii */ |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "str.h" |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "istream.h" |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "ostream.h" |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "connection.h" |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "dict-transaction-memory.h" |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "dict-private.h" |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #define MEMCACHED_DEFAULT_PORT 11211 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #define MEMCACHED_DEFAULT_LOOKUP_TIMEOUT_MSECS (1000*30) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #define DICT_USERNAME_SEPARATOR '/' |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 enum memcached_ascii_input_state { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 /* GET: expecting VALUE or END */ |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 MEMCACHED_INPUT_STATE_GET, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 /* SET/(APPEND+ADD): expecting STORED / NOT_STORED */ |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 MEMCACHED_INPUT_STATE_STORED, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 /* DELETE: expecting DELETED */ |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 MEMCACHED_INPUT_STATE_DELETED, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 /* (INCR+ADD)/DECR: expecting number / NOT_FOUND / STORED / NOT_STORED */ |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 MEMCACHED_INPUT_STATE_INCRDECR |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 }; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 struct memcached_ascii_connection { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 struct connection conn; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 struct memcached_ascii_dict *dict; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 string_t *reply_str; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 unsigned int reply_bytes_left; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 bool value_received; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 bool value_waiting_end; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 }; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 struct memcached_ascii_dict_reply { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 unsigned int reply_count; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 dict_transaction_commit_callback_t *callback; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 void *context; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 }; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 struct dict_memcached_ascii_commit_ctx { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 struct memcached_ascii_dict *dict; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 struct dict_transaction_memory_context *memctx; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 string_t *str; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 dict_transaction_commit_callback_t *callback; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 void *context; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 }; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 struct memcached_ascii_dict { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 struct dict dict; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 struct ip_addr ip; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 char *username, *key_prefix; |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18137
diff
changeset
|
56 in_port_t port; |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 unsigned int timeout_msecs; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 |
17733
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
59 struct ioloop *ioloop, *prev_ioloop; |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 struct timeout *to; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 struct memcached_ascii_connection conn; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 |
14920
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14908
diff
changeset
|
63 ARRAY(enum memcached_ascii_input_state) input_states; |
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14908
diff
changeset
|
64 ARRAY(struct memcached_ascii_dict_reply) replies; |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 }; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 static struct connection_list *memcached_ascii_connections; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 |
17733
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
69 static void |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
70 memcached_ascii_callback(struct memcached_ascii_dict *dict, |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
71 const struct memcached_ascii_dict_reply *reply, int ret) |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
72 { |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
73 if (reply->callback != NULL) { |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
74 if (dict->prev_ioloop != NULL) { |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
75 /* Don't let callback see that we've created our |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
76 internal ioloop in case it wants to add some ios |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
77 or timeouts. */ |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
78 current_ioloop = dict->prev_ioloop; |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
79 } |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
80 reply->callback(ret, reply->context); |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
81 if (dict->prev_ioloop != NULL) |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
82 current_ioloop = dict->ioloop; |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
83 } |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
84 } |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
85 |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 static void memcached_ascii_conn_destroy(struct connection *_conn) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 struct memcached_ascii_connection *conn = |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 (struct memcached_ascii_connection *)_conn; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 const struct memcached_ascii_dict_reply *reply; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 connection_disconnect(_conn); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 if (conn->dict->ioloop != NULL) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 io_loop_stop(conn->dict->ioloop); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 |
17733
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
96 array_foreach(&conn->dict->replies, reply) |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
97 memcached_ascii_callback(conn->dict, reply, -1); |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 array_clear(&conn->dict->replies); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 array_clear(&conn->dict->input_states); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 conn->reply_bytes_left = 0; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 static bool memcached_ascii_input_value(struct memcached_ascii_connection *conn) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 const unsigned char *data; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 size_t size; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 data = i_stream_get_data(conn->conn.input, &size); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 if (size > conn->reply_bytes_left) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 size = conn->reply_bytes_left; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 conn->reply_bytes_left -= size; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 str_append_n(conn->reply_str, data, size); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 i_stream_skip(conn->conn.input, size); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 if (conn->reply_bytes_left > 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 return FALSE; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 /* finished. drop the trailing CRLF */ |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 str_truncate(conn->reply_str, str_len(conn->reply_str)-2); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 conn->value_received = TRUE; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 return TRUE; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 static int memcached_ascii_input_reply_read(struct memcached_ascii_dict *dict) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 struct memcached_ascii_connection *conn = &dict->conn; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 const enum memcached_ascii_input_state *states; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 const char *line, *p; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 unsigned int count; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 long long num; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 if (conn->reply_bytes_left > 0) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 /* continue reading bulk reply */ |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 if (!memcached_ascii_input_value(conn)) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 return 0; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 conn->value_waiting_end = TRUE; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 } else if (conn->value_waiting_end) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 conn->value_waiting_end = FALSE; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 } else { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 str_truncate(conn->reply_str, 0); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 conn->value_received = FALSE; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 line = i_stream_next_line(conn->conn.input); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 if (line == NULL) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 return 0; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 states = array_get(&dict->input_states, &count); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 if (count == 0) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 i_error("memcached_ascii: Unexpected input (expected nothing): %s", |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 line); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 return -1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 switch (states[0]) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 case MEMCACHED_INPUT_STATE_GET: |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 /* VALUE <key> <flags> <bytes> |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 END */ |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 if (strncmp(line, "VALUE ", 6) == 0) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 p = strrchr(line, ' '); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 if (str_to_uint(p+1, &conn->reply_bytes_left) < 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 break; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 conn->reply_bytes_left += 2; /* CRLF */ |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 return memcached_ascii_input_reply_read(dict); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 } else if (strcmp(line, "END") == 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 return 1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 break; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 case MEMCACHED_INPUT_STATE_STORED: |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 if (strcmp(line, "STORED") != 0 && |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 strcmp(line, "NOT_STORED") != 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 break; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 return 1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 case MEMCACHED_INPUT_STATE_DELETED: |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 if (strcmp(line, "DELETED") != 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 break; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 return 1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 case MEMCACHED_INPUT_STATE_INCRDECR: |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 if (strcmp(line, "NOT_FOUND") != 0 && |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 strcmp(line, "STORED") != 0 && |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 strcmp(line, "NOT_STORED") != 0 && |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 str_to_llong(line, &num) < 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 break; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 return 1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 i_error("memcached_ascii: Unexpected input (state=%d): %s", |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 states[0], line); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 return -1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 static int memcached_ascii_input_reply(struct memcached_ascii_dict *dict) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 struct memcached_ascii_dict_reply *replies; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 unsigned int count; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 int ret; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 if ((ret = memcached_ascii_input_reply_read(dict)) <= 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 return ret; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 /* finished a reply */ |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 array_delete(&dict->input_states, 0, 1); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 replies = array_get_modifiable(&dict->replies, &count); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 i_assert(count > 0); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 i_assert(replies[0].reply_count > 0); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 if (--replies[0].reply_count == 0) { |
17733
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
204 memcached_ascii_callback(dict, &replies[0], 1); |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 array_delete(&dict->replies, 0, 1); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 return 1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 static void memcached_ascii_conn_input(struct connection *_conn) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 struct memcached_ascii_connection *conn = |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 (struct memcached_ascii_connection *)_conn; |
14907 | 214 int ret; |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 switch (i_stream_read(_conn->input)) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 case 0: |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 return; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 case -1: |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 memcached_ascii_conn_destroy(_conn); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 return; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 default: |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 break; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 |
14907 | 226 while ((ret = memcached_ascii_input_reply(conn->dict)) > 0) ; |
227 if (ret < 0) | |
228 memcached_ascii_conn_destroy(_conn); | |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 io_loop_stop(conn->dict->ioloop); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 static int memcached_ascii_input_wait(struct memcached_ascii_dict *dict) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 { |
17733
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
234 dict->prev_ioloop = current_ioloop; |
16964
b740824110f4
Use io_loop_set_current() instead of directly setting it.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
235 io_loop_set_current(dict->ioloop); |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 if (dict->to != NULL) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 dict->to = io_loop_move_timeout(&dict->to); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 connection_switch_ioloop(&dict->conn.conn); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 io_loop_run(dict->ioloop); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 |
17733
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
241 io_loop_set_current(dict->prev_ioloop); |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
242 dict->prev_ioloop = NULL; |
a7a5e0737d53
lib-dict: Hide internal ioloop from async commit callbacks. (Redis & memcached fix)
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
243 |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 if (dict->to != NULL) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 dict->to = io_loop_move_timeout(&dict->to); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 connection_switch_ioloop(&dict->conn.conn); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 return dict->conn.conn.fd_in == -1 ? -1 : 0; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 static void memcached_ascii_input_timeout(struct memcached_ascii_dict *dict) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 i_error("memcached_ascii: Request timed out in %u.%03u secs", |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 dict->timeout_msecs/1000, dict->timeout_msecs%1000); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 memcached_ascii_conn_destroy(&dict->conn.conn); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 static int memcached_ascii_wait_replies(struct memcached_ascii_dict *dict) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 { |
14907 | 260 int ret = 0; |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 dict->to = timeout_add(dict->timeout_msecs, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 memcached_ascii_input_timeout, dict); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 while (array_count(&dict->input_states) > 0) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
265 i_assert(array_count(&dict->replies) > 0); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 if ((ret = memcached_ascii_input_reply(dict)) != 0) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 if (ret < 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 memcached_ascii_conn_destroy(&dict->conn.conn); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 break; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 ret = memcached_ascii_input_wait(dict); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 if (ret != 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 break; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
275 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 timeout_remove(&dict->to); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 return ret < 0 ? -1 : 0; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
281 static int memcached_ascii_wait(struct memcached_ascii_dict *dict) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
283 int ret; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 i_assert(dict->conn.conn.fd_in != -1); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
287 if (dict->conn.conn.input == NULL) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 /* waiting for connection to finish */ |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 dict->to = timeout_add(dict->timeout_msecs, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 memcached_ascii_input_timeout, dict); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 ret = memcached_ascii_input_wait(dict); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 timeout_remove(&dict->to); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 if (ret < 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 return -1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 if (memcached_ascii_wait_replies(dict) < 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 return -1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 i_assert(array_count(&dict->input_states) == 0); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 i_assert(array_count(&dict->replies) == 0); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 return 0; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 |
14908
deb47efdc006
connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents:
14907
diff
changeset
|
303 static void |
deb47efdc006
connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents:
14907
diff
changeset
|
304 memcached_ascii_conn_connected(struct connection *_conn, bool success) |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 struct memcached_ascii_connection *conn = (struct memcached_ascii_connection *)_conn; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 |
14908
deb47efdc006
connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents:
14907
diff
changeset
|
308 if (!success) { |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 i_error("memcached_ascii: connect(%s, %u) failed: %m", |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 net_ip2addr(&conn->dict->ip), conn->dict->port); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 if (conn->dict->ioloop != NULL) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 io_loop_stop(conn->dict->ioloop); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 static const struct connection_settings memcached_ascii_conn_set = { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 .input_max_size = (size_t)-1, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 .output_max_size = (size_t)-1, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 .client = TRUE |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 }; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 static const struct connection_vfuncs memcached_ascii_conn_vfuncs = { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 .destroy = memcached_ascii_conn_destroy, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 .input = memcached_ascii_conn_input, |
14908
deb47efdc006
connection API: Fixed connected() callback to actually allow detecting failed connects.
Timo Sirainen <tss@iki.fi>
parents:
14907
diff
changeset
|
325 .client_connected = memcached_ascii_conn_connected |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 }; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 static const char *memcached_ascii_escape_username(const char *username) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 const char *p; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 string_t *str = t_str_new(64); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 for (p = username; *p != '\0'; p++) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 switch (*p) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 case DICT_USERNAME_SEPARATOR: |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 str_append(str, "\\-"); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 break; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 case '\\': |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 str_append(str, "\\\\"); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 break; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
341 default: |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 str_append_c(str, *p); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
345 return str_c(str); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
346 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 |
15067
9bff478f81fd
dict_init() API changed to return int.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
348 static int |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
349 memcached_ascii_dict_init(struct dict *driver, const char *uri, |
17751
77e71a45a475
lib-dict: Changed dict.init() API to take struct dict_settings and added dict_init_full().
Timo Sirainen <tss@iki.fi>
parents:
17733
diff
changeset
|
350 const struct dict_settings *set, |
15218
22c22d704422
lib-dict: dict_init() now returns error string instead of logging it
Timo Sirainen <tss@iki.fi>
parents:
15184
diff
changeset
|
351 struct dict **dict_r, const char **error_r) |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
353 struct memcached_ascii_dict *dict; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 const char *const *args; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 struct ioloop *old_ioloop = current_ioloop; |
15184
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
356 int ret = 0; |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
357 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 if (memcached_ascii_connections == NULL) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
359 memcached_ascii_connections = |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
360 connection_list_init(&memcached_ascii_conn_set, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
361 &memcached_ascii_conn_vfuncs); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
363 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 dict = i_new(struct memcached_ascii_dict, 1); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
365 if (net_addr2ip("127.0.0.1", &dict->ip) < 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
366 i_unreached(); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
367 dict->port = MEMCACHED_DEFAULT_PORT; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
368 dict->timeout_msecs = MEMCACHED_DEFAULT_LOOKUP_TIMEOUT_MSECS; |
15184
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
369 dict->key_prefix = i_strdup(""); |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
370 |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
371 args = t_strsplit(uri, ":"); |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
372 for (; *args != NULL; args++) { |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
373 if (strncmp(*args, "host=", 5) == 0) { |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
374 if (net_addr2ip(*args+5, &dict->ip) < 0) { |
15218
22c22d704422
lib-dict: dict_init() now returns error string instead of logging it
Timo Sirainen <tss@iki.fi>
parents:
15184
diff
changeset
|
375 *error_r = t_strdup_printf("Invalid IP: %s", |
22c22d704422
lib-dict: dict_init() now returns error string instead of logging it
Timo Sirainen <tss@iki.fi>
parents:
15184
diff
changeset
|
376 *args+5); |
15184
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
377 ret = -1; |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
378 } |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
379 } else if (strncmp(*args, "port=", 5) == 0) { |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18137
diff
changeset
|
380 if (net_str2port(*args+5, &dict->port) < 0) { |
15218
22c22d704422
lib-dict: dict_init() now returns error string instead of logging it
Timo Sirainen <tss@iki.fi>
parents:
15184
diff
changeset
|
381 *error_r = t_strdup_printf("Invalid port: %s", |
22c22d704422
lib-dict: dict_init() now returns error string instead of logging it
Timo Sirainen <tss@iki.fi>
parents:
15184
diff
changeset
|
382 *args+5); |
15184
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
383 ret = -1; |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
384 } |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
385 } else if (strncmp(*args, "prefix=", 7) == 0) { |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
386 i_free(dict->key_prefix); |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
387 dict->key_prefix = i_strdup(*args + 7); |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
388 } else if (strncmp(*args, "timeout_msecs=", 14) == 0) { |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
389 if (str_to_uint(*args+14, &dict->timeout_msecs) < 0) { |
15218
22c22d704422
lib-dict: dict_init() now returns error string instead of logging it
Timo Sirainen <tss@iki.fi>
parents:
15184
diff
changeset
|
390 *error_r = t_strdup_printf( |
22c22d704422
lib-dict: dict_init() now returns error string instead of logging it
Timo Sirainen <tss@iki.fi>
parents:
15184
diff
changeset
|
391 "Invalid timeout_msecs: %s", *args+14); |
15184
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
392 ret = -1; |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
393 } |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
394 } else { |
15218
22c22d704422
lib-dict: dict_init() now returns error string instead of logging it
Timo Sirainen <tss@iki.fi>
parents:
15184
diff
changeset
|
395 *error_r = t_strdup_printf("Unknown parameter: %s", |
22c22d704422
lib-dict: dict_init() now returns error string instead of logging it
Timo Sirainen <tss@iki.fi>
parents:
15184
diff
changeset
|
396 *args); |
15184
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
397 ret = -1; |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
398 } |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
399 } |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
400 if (ret < 0) { |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
401 i_free(dict->key_prefix); |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
402 i_free(dict); |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
403 return -1; |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
404 } |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
405 |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
406 connection_init_client_ip(memcached_ascii_connections, &dict->conn.conn, |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
407 &dict->ip, dict->port); |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
408 dict->dict = *driver; |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
409 dict->conn.reply_str = str_new(default_pool, 256); |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
410 dict->conn.dict = dict; |
9f86c18e6b2c
lib-dict: Fixed error handling on initialization.
Timo Sirainen <tss@iki.fi>
parents:
15067
diff
changeset
|
411 |
17751
77e71a45a475
lib-dict: Changed dict.init() API to take struct dict_settings and added dict_init_full().
Timo Sirainen <tss@iki.fi>
parents:
17733
diff
changeset
|
412 if (strchr(set->username, DICT_USERNAME_SEPARATOR) == NULL) |
77e71a45a475
lib-dict: Changed dict.init() API to take struct dict_settings and added dict_init_full().
Timo Sirainen <tss@iki.fi>
parents:
17733
diff
changeset
|
413 dict->username = i_strdup(set->username); |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
414 else { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
415 /* escape the username */ |
17751
77e71a45a475
lib-dict: Changed dict.init() API to take struct dict_settings and added dict_init_full().
Timo Sirainen <tss@iki.fi>
parents:
17733
diff
changeset
|
416 dict->username = i_strdup(memcached_ascii_escape_username(set->username)); |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
417 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
418 i_array_init(&dict->input_states, 4); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
419 i_array_init(&dict->replies, 4); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
420 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
421 dict->ioloop = io_loop_create(); |
16964
b740824110f4
Use io_loop_set_current() instead of directly setting it.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
422 io_loop_set_current(old_ioloop); |
15067
9bff478f81fd
dict_init() API changed to return int.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
423 *dict_r = &dict->dict; |
9bff478f81fd
dict_init() API changed to return int.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
424 return 0; |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
425 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
426 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
427 static void memcached_ascii_dict_deinit(struct dict *_dict) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
428 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
429 struct memcached_ascii_dict *dict = |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
430 (struct memcached_ascii_dict *)_dict; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
431 struct ioloop *old_ioloop = current_ioloop; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
432 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
433 if (array_count(&dict->input_states) > 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
434 (void)memcached_ascii_wait(dict); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
435 connection_deinit(&dict->conn.conn); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
436 |
16964
b740824110f4
Use io_loop_set_current() instead of directly setting it.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
437 io_loop_set_current(dict->ioloop); |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
438 io_loop_destroy(&dict->ioloop); |
16964
b740824110f4
Use io_loop_set_current() instead of directly setting it.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
439 io_loop_set_current(old_ioloop); |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
440 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
441 str_free(&dict->conn.reply_str); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
442 array_free(&dict->replies); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
443 array_free(&dict->input_states); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
444 i_free(dict->key_prefix); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
445 i_free(dict->username); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
446 i_free(dict); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
447 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
448 if (memcached_ascii_connections->connections == NULL) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
449 connection_list_deinit(&memcached_ascii_connections); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
450 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
451 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
452 static int memcached_ascii_connect(struct memcached_ascii_dict *dict) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
453 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
454 if (dict->conn.conn.input != NULL) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
455 return 0; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
456 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
457 if (dict->conn.conn.fd_in == -1) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
458 if (connection_client_connect(&dict->conn.conn) < 0) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
459 i_error("memcached_ascii: Couldn't connect to %s:%u", |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
460 net_ip2addr(&dict->ip), dict->port); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
461 return -1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
462 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
463 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
464 return memcached_ascii_wait(dict); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
465 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
466 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
467 static const char * |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
468 memcached_ascii_dict_get_full_key(struct memcached_ascii_dict *dict, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
469 const char *key) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
470 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
471 if (strncmp(key, DICT_PATH_SHARED, strlen(DICT_PATH_SHARED)) == 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
472 key += strlen(DICT_PATH_SHARED); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
473 else if (strncmp(key, DICT_PATH_PRIVATE, strlen(DICT_PATH_PRIVATE)) == 0) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
474 key = t_strdup_printf("%s%c%s", dict->username, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
475 DICT_USERNAME_SEPARATOR, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
476 key + strlen(DICT_PATH_PRIVATE)); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
477 } else { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
478 i_unreached(); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
479 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
480 if (*dict->key_prefix != '\0') |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
481 key = t_strconcat(dict->key_prefix, key, NULL); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
482 return key; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
483 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
484 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
485 static int |
22516
16835a26b202
lib-dict: Moved/removed explicit stack frames in dict drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
486 memcached_ascii_dict_lookup(struct dict *_dict, pool_t pool, |
16835a26b202
lib-dict: Moved/removed explicit stack frames in dict drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
487 const char *key, const char **value_r) |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
488 { |
22516
16835a26b202
lib-dict: Moved/removed explicit stack frames in dict drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
489 struct memcached_ascii_dict *dict = (struct memcached_ascii_dict *)_dict; |
16835a26b202
lib-dict: Moved/removed explicit stack frames in dict drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
490 struct memcached_ascii_dict_reply *reply; |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
491 enum memcached_ascii_input_state state = MEMCACHED_INPUT_STATE_GET; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
492 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
493 if (memcached_ascii_connect(dict) < 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
494 return -1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
495 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
496 key = memcached_ascii_dict_get_full_key(dict, key); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
497 o_stream_nsend_str(dict->conn.conn.output, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
498 t_strdup_printf("get %s\r\n", key)); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
499 array_append(&dict->input_states, &state, 1); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
500 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
501 reply = array_append_space(&dict->replies); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
502 reply->reply_count = 1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
503 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
504 if (memcached_ascii_wait(dict) < 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
505 return -1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
506 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
507 *value_r = p_strdup(pool, str_c(dict->conn.reply_str)); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
508 return dict->conn.value_received ? 1 : 0; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
509 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
510 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
511 static struct dict_transaction_context * |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
512 memcached_ascii_transaction_init(struct dict *_dict) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
513 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
514 struct dict_transaction_memory_context *ctx; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
515 pool_t pool; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
516 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
517 pool = pool_alloconly_create("file dict transaction", 2048); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
518 ctx = p_new(pool, struct dict_transaction_memory_context, 1); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
519 dict_transaction_memory_init(ctx, _dict, pool); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
520 return &ctx->ctx; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
521 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
522 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
523 static void |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
524 memcached_send_change(struct dict_memcached_ascii_commit_ctx *ctx, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
525 const struct dict_transaction_memory_change *change) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
526 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
527 enum memcached_ascii_input_state state; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
528 const char *key, *value; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
529 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
530 key = memcached_ascii_dict_get_full_key(ctx->dict, change->key); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
531 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
532 str_truncate(ctx->str, 0); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
533 switch (change->type) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
534 case DICT_CHANGE_TYPE_SET: |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
535 state = MEMCACHED_INPUT_STATE_STORED; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
536 str_printfa(ctx->str, "set %s 0 0 %"PRIuSIZE_T"\r\n%s\r\n", |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
537 key, strlen(change->value.str), change->value.str); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
538 break; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
539 case DICT_CHANGE_TYPE_UNSET: |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
540 state = MEMCACHED_INPUT_STATE_DELETED; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
541 str_printfa(ctx->str, "delete %s\r\n", key); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
542 break; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
543 case DICT_CHANGE_TYPE_APPEND: |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
544 state = MEMCACHED_INPUT_STATE_STORED; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
545 str_printfa(ctx->str, "append %s 0 0 %"PRIuSIZE_T"\r\n%s\r\n", |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
546 key, strlen(change->value.str), change->value.str); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
547 array_append(&ctx->dict->input_states, &state, 1); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
548 /* we'd preferably want an append that always works, but |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
549 this kludge works for that too.. */ |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
550 str_printfa(ctx->str, "add %s 0 0 %"PRIuSIZE_T"\r\n%s\r\n", |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
551 key, strlen(change->value.str), change->value.str); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
552 break; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
553 case DICT_CHANGE_TYPE_INC: |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
554 state = MEMCACHED_INPUT_STATE_INCRDECR; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
555 if (change->value.diff > 0) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
556 str_printfa(ctx->str, "incr %s %lld\r\n", |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
557 key, change->value.diff); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
558 array_append(&ctx->dict->input_states, &state, 1); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
559 /* same kludge as with append */ |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
560 value = t_strdup_printf("%lld", change->value.diff); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
561 str_printfa(ctx->str, "add %s 0 0 %u\r\n%s\r\n", |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
562 key, (unsigned int)strlen(value), value); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
563 } else { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
564 str_printfa(ctx->str, "decr %s %lld\r\n", |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
565 key, -change->value.diff); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
566 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
567 break; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
568 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
569 array_append(&ctx->dict->input_states, &state, 1); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
570 o_stream_nsend(ctx->dict->conn.conn.output, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
571 str_data(ctx->str), str_len(ctx->str)); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
572 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
573 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
574 static int |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
575 memcached_ascii_transaction_send(struct dict_memcached_ascii_commit_ctx *ctx) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
576 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
577 struct memcached_ascii_dict *dict = ctx->dict; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
578 struct memcached_ascii_dict_reply *reply; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
579 const struct dict_transaction_memory_change *changes; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
580 unsigned int i, count, old_state_count; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
581 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
582 if (memcached_ascii_connect(dict) < 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
583 return -1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
584 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
585 old_state_count = array_count(&dict->input_states); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
586 changes = array_get(&ctx->memctx->changes, &count); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
587 i_assert(count > 0); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
588 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
589 o_stream_cork(dict->conn.conn.output); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
590 for (i = 0; i < count; i++) T_BEGIN { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
591 memcached_send_change(ctx, &changes[i]); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
592 } T_END; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
593 o_stream_uncork(dict->conn.conn.output); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
594 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
595 reply = array_append_space(&dict->replies); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
596 reply->callback = ctx->callback; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
597 reply->context = ctx->context; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
598 reply->reply_count = array_count(&dict->input_states) - old_state_count; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
599 return 1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
600 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
601 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
602 static int |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
603 memcached_ascii_transaction_commit(struct dict_transaction_context *_ctx, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
604 bool async, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
605 dict_transaction_commit_callback_t *callback, |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
606 void *context) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
607 { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
608 struct dict_transaction_memory_context *ctx = |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
609 (struct dict_transaction_memory_context *)_ctx; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
610 struct memcached_ascii_dict *dict = |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
611 (struct memcached_ascii_dict *)_ctx->dict; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
612 struct dict_memcached_ascii_commit_ctx commit_ctx; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
613 int ret = 1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
614 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
615 if (_ctx->changed) { |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
20386
diff
changeset
|
616 i_zero(&commit_ctx); |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
617 commit_ctx.dict = dict; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
618 commit_ctx.memctx = ctx; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
619 commit_ctx.callback = callback; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
620 commit_ctx.context = context; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
621 commit_ctx.str = str_new(default_pool, 128); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
622 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
623 ret = memcached_ascii_transaction_send(&commit_ctx); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
624 if (!async && ret >= 0) { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
625 if (memcached_ascii_wait(dict) < 0) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
626 ret = -1; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
627 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
628 str_free(&commit_ctx.str); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
629 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
630 if (callback != NULL) |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
631 callback(ret, context); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
632 pool_unref(&ctx->pool); |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
633 return ret; |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
634 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
635 |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
636 struct dict dict_driver_memcached_ascii = { |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
637 .name = "memcached_ascii", |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
638 { |
20386
564a32262929
lib-dict: Explicitly specify used dict_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20341
diff
changeset
|
639 .init = memcached_ascii_dict_init, |
564a32262929
lib-dict: Explicitly specify used dict_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20341
diff
changeset
|
640 .deinit = memcached_ascii_dict_deinit, |
564a32262929
lib-dict: Explicitly specify used dict_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20341
diff
changeset
|
641 .lookup = memcached_ascii_dict_lookup, |
564a32262929
lib-dict: Explicitly specify used dict_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20341
diff
changeset
|
642 .transaction_init = memcached_ascii_transaction_init, |
564a32262929
lib-dict: Explicitly specify used dict_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20341
diff
changeset
|
643 .transaction_commit = memcached_ascii_transaction_commit, |
564a32262929
lib-dict: Explicitly specify used dict_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20341
diff
changeset
|
644 .transaction_rollback = dict_transaction_memory_rollback, |
564a32262929
lib-dict: Explicitly specify used dict_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20341
diff
changeset
|
645 .set = dict_transaction_memory_set, |
564a32262929
lib-dict: Explicitly specify used dict_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20341
diff
changeset
|
646 .unset = dict_transaction_memory_unset, |
564a32262929
lib-dict: Explicitly specify used dict_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20341
diff
changeset
|
647 .append = dict_transaction_memory_append, |
564a32262929
lib-dict: Explicitly specify used dict_vfuncs methods for drivers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20341
diff
changeset
|
648 .atomic_inc = dict_transaction_memory_atomic_inc, |
14906
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
649 } |
96a9a086c052
lib-dict: Added memcached_ascii backend.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
650 }; |