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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
f5dc8abad16b dict memcached-ascii bugfixes
Timo Sirainen <tss@iki.fi>
parents: 14906
diff changeset
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
f5dc8abad16b dict memcached-ascii bugfixes
Timo Sirainen <tss@iki.fi>
parents: 14906
diff changeset
226 while ((ret = memcached_ascii_input_reply(conn->dict)) > 0) ;
f5dc8abad16b dict memcached-ascii bugfixes
Timo Sirainen <tss@iki.fi>
parents: 14906
diff changeset
227 if (ret < 0)
f5dc8abad16b dict memcached-ascii bugfixes
Timo Sirainen <tss@iki.fi>
parents: 14906
diff changeset
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
f5dc8abad16b dict memcached-ascii bugfixes
Timo Sirainen <tss@iki.fi>
parents: 14906
diff changeset
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 };