annotate src/lib-dict/dict-client.c @ 6142:6c0bfc35af03 HEAD

Removed memory pool parameter from iostreams. Default pool was almost always used, and the stream usually required destroying anyway so it didn't even make freeing memory easier.
author Timo Sirainen <tss@iki.fi>
date Tue, 24 Jul 2007 06:59:56 +0300
parents 4be4c887deb7
children c62f7ee79446
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (C) 2005 Timo Sirainen */
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "str.h"
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "network.h"
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "istream.h"
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "ostream.h"
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "dict-private.h"
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "dict-client.h"
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include <unistd.h>
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include <fcntl.h>
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 struct client_dict {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 struct dict dict;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 pool_t pool;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 int fd;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 const char *uri;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 const char *username;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 const char *path;
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
22 enum dict_data_type value_type;
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 struct istream *input;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 struct ostream *output;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 unsigned int connect_counter;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 unsigned int transaction_id_counter;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 unsigned int in_iteration:1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 unsigned int handshaked:1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 };
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 struct client_dict_iterate_context {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 struct dict_iterate_context ctx;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 pool_t pool;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3858
diff changeset
38 bool failed;
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 };
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 struct client_dict_transaction_context {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 struct dict_transaction_context ctx;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 unsigned int id;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 unsigned int connect_counter;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
4512
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
47 unsigned int failed:1;
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
48 unsigned int sent_begin:1;
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 };
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 static int client_dict_connect(struct client_dict *dict);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 static void client_dict_disconnect(struct client_dict *dict);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 const char *dict_client_escape(const char *src)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 const char *p;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 string_t *dest;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 /* first do a quick lookup to see if there's anything to escape.
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 probably not. */
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 for (p = src; *p != '\0'; p++) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 if (*p == '\t' || *p == '\n' || *p == '\001')
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 break;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 if (*p == '\0')
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 return src;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 dest = t_str_new(256);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 str_append_n(dest, src, p - src);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71
3858
2e5c34fe9634 Small (compiling) fixes
Timo Sirainen <tss@iki.fi>
parents: 3852
diff changeset
72 for (; *p != '\0'; p++) {
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 switch (*p) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 case '\t':
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 str_append_c(dest, '\001');
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 str_append_c(dest, 't');
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 break;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 case '\n':
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 str_append_c(dest, '\001');
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 str_append_c(dest, 'n');
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 break;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 case '\001':
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 str_append_c(dest, '\001');
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 str_append_c(dest, '1');
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 break;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 default:
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 str_append_c(dest, *p);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 break;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 return str_c(dest);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 const char *dict_client_unescape(const char *src)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 const char *p;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 string_t *dest;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 /* first do a quick lookup to see if there's anything to unescape.
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 probably not. */
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 for (p = src; *p != '\0'; p++) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 if (*p == '\001')
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 break;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 if (*p == '\0')
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 return src;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 dest = t_str_new(256);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 str_append_n(dest, src, p - src);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 for (; *p != '\0'; p++) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 if (*p != '\001')
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 str_append_c(dest, *p);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 else if (p[1] != '\0') {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 p++;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 switch (*p) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 case '1':
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 str_append_c(dest, '\001');
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 break;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 case 't':
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 str_append_c(dest, '\t');
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 break;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 case 'n':
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 str_append_c(dest, '\n');
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 break;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 return str_c(dest);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 static int client_dict_send_query(struct client_dict *dict, const char *query)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 {
4368
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
134 if (dict->output == NULL) {
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
135 /* not connected currently */
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
136 if (client_dict_connect(dict) < 0)
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
137 return -1;
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
138 }
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
139
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 if (o_stream_send_str(dict->output, query) < 0 ||
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 o_stream_flush(dict->output) < 0) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 /* Send failed */
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 if (!dict->handshaked) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 /* we're trying to send hello, don't try to reconnect */
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 return -1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 /* Reconnect and try again. */
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 client_dict_disconnect(dict);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 if (client_dict_connect(dict) < 0)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 return -1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 if (o_stream_send_str(dict->output, query) < 0 ||
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 o_stream_flush(dict->output) < 0) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 i_error("write(%s) failed: %m", dict->path);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 return -1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 return 0;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161
4368
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
162 static int
4512
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
163 client_dict_transaction_send_begin(struct client_dict_transaction_context *ctx)
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
164 {
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
165 struct client_dict *dict = (struct client_dict *)ctx->ctx.dict;
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
166 const char *query;
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
167
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
168 if (ctx->failed)
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
169 return -1;
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
170
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
171 t_push();
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
172 query = t_strdup_printf("%c%u\n", DICT_PROTOCOL_CMD_BEGIN, ctx->id);
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
173 if (client_dict_send_query(dict, query) < 0)
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
174 ctx->failed = TRUE;
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
175 else
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
176 ctx->connect_counter = dict->connect_counter;
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
177 t_pop();
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
178
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
179 return ctx->failed ? -1 : 0;
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
180 }
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
181
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
182 static int
4368
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
183 client_dict_send_transaction_query(struct client_dict_transaction_context *ctx,
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
184 const char *query)
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
185 {
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
186 struct client_dict *dict = (struct client_dict *)ctx->ctx.dict;
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
187
4512
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
188 if (!ctx->sent_begin) {
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
189 if (client_dict_transaction_send_begin(ctx) < 0)
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
190 return -1;
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
191 ctx->sent_begin = TRUE;
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
192 }
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
193
4385
Timo Sirainen <tss@iki.fi>
parents: 4368
diff changeset
194 if (ctx->connect_counter != dict->connect_counter || ctx->failed)
Timo Sirainen <tss@iki.fi>
parents: 4368
diff changeset
195 return -1;
Timo Sirainen <tss@iki.fi>
parents: 4368
diff changeset
196
Timo Sirainen <tss@iki.fi>
parents: 4368
diff changeset
197 if (dict->output == NULL) {
4512
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
198 /* not connected, this'll fail */
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
199 return -1;
4385
Timo Sirainen <tss@iki.fi>
parents: 4368
diff changeset
200 }
Timo Sirainen <tss@iki.fi>
parents: 4368
diff changeset
201
4368
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
202 if (o_stream_send_str(dict->output, query) < 0 ||
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
203 o_stream_flush(dict->output) < 0) {
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
204 /* Send failed. Our transactions have died, so don't even try
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
205 to re-send the command */
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
206 ctx->failed = TRUE;
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
207 client_dict_disconnect(dict);
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
208 return -1;
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
209 }
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
210 return 0;
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
211 }
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
212
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 static char *client_dict_read_line(struct client_dict *dict)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 char *line;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 int ret;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217
4519
4be4c887deb7 dict proxy: Dictionary iteration was broken.
Timo Sirainen <tss@iki.fi>
parents: 4517
diff changeset
218 line = i_stream_next_line(dict->input);
4be4c887deb7 dict proxy: Dictionary iteration was broken.
Timo Sirainen <tss@iki.fi>
parents: 4517
diff changeset
219 if (line != NULL)
4be4c887deb7 dict proxy: Dictionary iteration was broken.
Timo Sirainen <tss@iki.fi>
parents: 4517
diff changeset
220 return line;
4be4c887deb7 dict proxy: Dictionary iteration was broken.
Timo Sirainen <tss@iki.fi>
parents: 4517
diff changeset
221
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 while ((ret = i_stream_read(dict->input)) > 0) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 line = i_stream_next_line(dict->input);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 if (line != NULL)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 return line;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 i_error("read(%s) failed: %m", dict->path);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 return NULL;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 static int client_dict_connect(struct client_dict *dict)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 const char *query;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 i_assert(dict->fd == -1);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 dict->fd = net_connect_unix(dict->path);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 if (dict->fd == -1) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 i_error("net_connect_unix(%s) failed: %m", dict->path);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 return -1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 /* Dictionary lookups are blocking */
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 net_set_nonblock(dict->fd, FALSE);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 4519
diff changeset
247 dict->input = i_stream_create_file(dict->fd, (size_t)-1, FALSE);
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 4519
diff changeset
248 dict->output = o_stream_create_file(dict->fd, 4096, FALSE);
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 dict->transaction_id_counter = 0;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 t_push();
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
252 query = t_strdup_printf("%c%u\t%u\t%d\t%s\t%s\n",
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
253 DICT_PROTOCOL_CMD_HELLO,
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 DICT_CLIENT_PROTOCOL_MAJOR_VERSION,
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 DICT_CLIENT_PROTOCOL_MINOR_VERSION,
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
256 dict->value_type, dict->username, dict->uri);
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 if (client_dict_send_query(dict, query) < 0) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 client_dict_disconnect(dict);
4367
763401b5b344 t_pop() calls were missing from some error handling paths
Timo Sirainen <tss@iki.fi>
parents: 4070
diff changeset
259 t_pop();
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 return -1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 t_pop();
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 dict->handshaked = TRUE;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 return 0;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 static void client_dict_disconnect(struct client_dict *dict)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 dict->connect_counter++;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 dict->handshaked = FALSE;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
273 if (dict->input != NULL)
4070
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 3990
diff changeset
274 i_stream_destroy(&dict->input);
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
275 if (dict->output != NULL)
4070
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 3990
diff changeset
276 o_stream_destroy(&dict->output);
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 if (dict->fd != -1) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 if (close(dict->fd) < 0)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 i_error("close(%s) failed: %m", dict->path);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 dict->fd = -1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
285 static struct dict *
4517
e661182eab75 Berkeley DB dict support is now enabled only when using --with-db configure option.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4516
diff changeset
286 client_dict_init(struct dict *driver, const char *uri,
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
287 enum dict_data_type value_type, const char *username)
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 struct client_dict *dict;
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
290 const char *dest_uri;
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 pool_t pool;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
293 /* uri = [<path>] ":" <uri> */
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 dest_uri = strchr(uri, ':');
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 if (dest_uri == NULL) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 i_error("dict-client: Invalid URI: %s", uri);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 return NULL;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 pool = pool_alloconly_create("client dict", 1024);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 dict = p_new(pool, struct client_dict, 1);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 dict->pool = pool;
4517
e661182eab75 Berkeley DB dict support is now enabled only when using --with-db configure option.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4516
diff changeset
303 dict->dict = *driver;
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
304 dict->value_type = value_type;
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
305 dict->username = p_strdup(pool, username);
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 dict->fd = -1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
309 if (*uri != ':') {
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 /* path given */
3967
6fabe878c46d Dictionary takes now a username parameter, which is used for private
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
311 dict->path = p_strdup_until(pool, uri, dest_uri);
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 } else {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 dict->path = DEFAULT_DICT_SERVER_SOCKET_PATH;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 dict->uri = p_strdup(pool, dest_uri + 1);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 (void)client_dict_connect(dict);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 return &dict->dict;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 static void client_dict_deinit(struct dict *_dict)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 struct client_dict *dict = (struct client_dict *)_dict;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 client_dict_disconnect(dict);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 pool_unref(dict->pool);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 static int client_dict_lookup(struct dict *_dict, pool_t pool,
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 const char *key, const char **value_r)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 struct client_dict *dict = (struct client_dict *)_dict;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 const char *line;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 if (dict->fd == -1)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 return -1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 t_push();
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 line = t_strdup_printf("%c%s\n", DICT_PROTOCOL_CMD_LOOKUP,
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 dict_client_escape(key));
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 if (client_dict_send_query(dict, line) < 0) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 t_pop();
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 return -1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 t_pop();
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 /* read reply */
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 line = client_dict_read_line(dict);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 if (line == NULL)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 return -1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 if (*line == DICT_PROTOCOL_REPLY_OK) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 *value_r = p_strdup(pool, dict_client_unescape(line + 1));
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 return 1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 } else {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 *value_r = NULL;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 return *line == DICT_PROTOCOL_REPLY_NOTFOUND ? 0 : -1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 static struct dict_iterate_context *
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
362 client_dict_iterate_init(struct dict *_dict, const char *path,
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
363 enum dict_iterate_flags flags)
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 struct client_dict *dict = (struct client_dict *)_dict;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 struct client_dict_iterate_context *ctx;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 const char *query;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 if (dict->in_iteration)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 i_panic("dict-client: Only one iteration supported");
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 dict->in_iteration = TRUE;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 ctx = i_new(struct client_dict_iterate_context, 1);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 ctx->ctx.dict = _dict;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 ctx->pool = pool_alloconly_create("client dict iteration", 512);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 t_push();
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 query = t_strdup_printf("%c%d\t%s\n", DICT_PROTOCOL_CMD_ITERATE,
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
379 flags, dict_client_escape(path));
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 if (client_dict_send_query(dict, query) < 0)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 ctx->failed = TRUE;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 t_pop();
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 return &ctx->ctx;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 static int client_dict_iterate(struct dict_iterate_context *_ctx,
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 const char **key_r, const char **value_r)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 struct client_dict_iterate_context *ctx =
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 (struct client_dict_iterate_context *)_ctx;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 struct client_dict *dict = (struct client_dict *)_ctx->dict;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 char *line, *value;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 if (ctx->failed)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 return -1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 /* read next reply */
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 line = client_dict_read_line(dict);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 if (line == NULL)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 return -1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 if (*line == '\0') {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 /* end of iteration */
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405 return 0;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 /* line contains key \t value */
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
409 p_clear(ctx->pool);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 value = strchr(line, '\t');
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 if (value == NULL) {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 /* broken protocol */
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 i_error("dict client (%s) sent broken reply", dict->path);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415 return -1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 *value++ = '\0';
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 *key_r = p_strdup(ctx->pool, dict_client_unescape(line));
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 *value_r = p_strdup(ctx->pool, dict_client_unescape(value));
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 return 1;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 static void client_dict_iterate_deinit(struct dict_iterate_context *_ctx)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 struct client_dict *dict = (struct client_dict *)_ctx->dict;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 struct client_dict_iterate_context *ctx =
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428 (struct client_dict_iterate_context *)_ctx;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 pool_unref(ctx->pool);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 i_free(ctx);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 dict->in_iteration = TRUE;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 static struct dict_transaction_context *
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436 client_dict_transaction_init(struct dict *_dict)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 struct client_dict *dict = (struct client_dict *)_dict;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
439 struct client_dict_transaction_context *ctx;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441 ctx = i_new(struct client_dict_transaction_context, 1);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 ctx->ctx.dict = _dict;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443 ctx->id = ++dict->transaction_id_counter;
4368
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
444
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445 return &ctx->ctx;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448 static int client_dict_transaction_commit(struct dict_transaction_context *_ctx)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 struct client_dict_transaction_context *ctx =
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 (struct client_dict_transaction_context *)_ctx;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452 struct client_dict *dict = (struct client_dict *)_ctx->dict;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453 const char *query, *line;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 int ret = ctx->failed ? -1 : 0;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455
4512
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
456 if (ctx->sent_begin) {
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
457 t_push();
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
458 query = t_strdup_printf("%c%u\n", !ctx->failed ?
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
459 DICT_PROTOCOL_CMD_COMMIT :
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
460 DICT_PROTOCOL_CMD_ROLLBACK, ctx->id);
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
461 if (client_dict_send_transaction_query(ctx, query) < 0)
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 ret = -1;
4512
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
463 else if (ret == 0) {
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
464 /* read reply */
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
465 line = client_dict_read_line(dict);
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
466 if (line == NULL || *line != DICT_PROTOCOL_REPLY_OK)
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
467 ret = -1;
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
468 }
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
469 t_pop();
4385
Timo Sirainen <tss@iki.fi>
parents: 4368
diff changeset
470 }
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
472 i_free(ctx);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473 return ret;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
474 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
475
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
476 static void
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477 client_dict_transaction_rollback(struct dict_transaction_context *_ctx)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
479 struct client_dict_transaction_context *ctx =
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480 (struct client_dict_transaction_context *)_ctx;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
481 const char *query;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
482
4512
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
483 if (ctx->sent_begin) {
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
484 t_push();
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
485 query = t_strdup_printf("%c%u\n", DICT_PROTOCOL_CMD_ROLLBACK,
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
486 ctx->id);
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
487 (void)client_dict_send_transaction_query(ctx, query);
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
488 t_pop();
b5d4c1e9a492 Delay sending the transaction begin command to server until the first
Timo Sirainen <tss@iki.fi>
parents: 4385
diff changeset
489 }
4385
Timo Sirainen <tss@iki.fi>
parents: 4368
diff changeset
490
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
491 i_free(ctx);
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
492 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
494 static void client_dict_set(struct dict_transaction_context *_ctx,
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
495 const char *key, const char *value)
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
496 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
497 struct client_dict_transaction_context *ctx =
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
498 (struct client_dict_transaction_context *)_ctx;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499 const char *query;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
500
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
501 t_push();
3990
e2e6919c6c4d LF wasn't sent at the end of all commands.
Timo Sirainen <tss@iki.fi>
parents: 3967
diff changeset
502 query = t_strdup_printf("%c%u\t%s\t%s\n",
e2e6919c6c4d LF wasn't sent at the end of all commands.
Timo Sirainen <tss@iki.fi>
parents: 3967
diff changeset
503 DICT_PROTOCOL_CMD_SET, ctx->id,
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
504 dict_client_escape(key),
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
505 dict_client_escape(value));
4368
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
506 (void)client_dict_send_transaction_query(ctx, query);
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
507 t_pop();
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
508 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
509
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
510 static void client_dict_unset(struct dict_transaction_context *_ctx,
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
511 const char *key)
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
512 {
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
513 struct client_dict_transaction_context *ctx =
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
514 (struct client_dict_transaction_context *)_ctx;
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
515 const char *query;
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
517 t_push();
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
518 query = t_strdup_printf("%c%u\t%s\n",
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
519 DICT_PROTOCOL_CMD_UNSET, ctx->id,
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
520 dict_client_escape(key));
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
521 (void)client_dict_send_transaction_query(ctx, query);
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
522 t_pop();
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
523 }
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
524
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525 static void client_dict_atomic_inc(struct dict_transaction_context *_ctx,
3990
e2e6919c6c4d LF wasn't sent at the end of all commands.
Timo Sirainen <tss@iki.fi>
parents: 3967
diff changeset
526 const char *key, long long diff)
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
528 struct client_dict_transaction_context *ctx =
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
529 (struct client_dict_transaction_context *)_ctx;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
530 const char *query;
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532 t_push();
3990
e2e6919c6c4d LF wasn't sent at the end of all commands.
Timo Sirainen <tss@iki.fi>
parents: 3967
diff changeset
533 query = t_strdup_printf("%c%u\t%s\t%lld\n",
e2e6919c6c4d LF wasn't sent at the end of all commands.
Timo Sirainen <tss@iki.fi>
parents: 3967
diff changeset
534 DICT_PROTOCOL_CMD_ATOMIC_INC,
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
535 ctx->id, dict_client_escape(key), diff);
4368
51a1d0fbbc94 Fixes to dict proxy
Timo Sirainen <tss@iki.fi>
parents: 4367
diff changeset
536 (void)client_dict_send_transaction_query(ctx, query);
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
537 t_pop();
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
538 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
539
4517
e661182eab75 Berkeley DB dict support is now enabled only when using --with-db configure option.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4516
diff changeset
540 struct dict dict_driver_client = {
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
541 MEMBER(name) "proxy",
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
542
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
543 {
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
544 client_dict_init,
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
545 client_dict_deinit,
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
546 client_dict_lookup,
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
547 client_dict_iterate_init,
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548 client_dict_iterate,
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
549 client_dict_iterate_deinit,
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
550 client_dict_transaction_init,
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
551 client_dict_transaction_commit,
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
552 client_dict_transaction_rollback,
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
553 client_dict_set,
4516
aa2f73a4df26 Dictionary changes: Added support for defining value's type. Key is still always a string. Added support for sorting the iteration replies. Added dict_unset(). Added Berkeley DB support. Most of the code written by Tianyan Liu.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4512
diff changeset
554 client_dict_unset,
3793
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
555 client_dict_atomic_inc
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
556 }
0b3f3323e460 Forgot to add
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
557 };