Make WvStreams compile with gcc 4.4.
[wvstreams.git] / uniconf / uniretrygen.cc
blobd378c629edbbd47dc2c7b2c4764c9132288de8c0
1 /*
2 * Worldvisions Weaver Software:
3 * Copyright (C) 2002 Net Integration Technologies, Inc.
4 *
5 * A UniConfGen that reconnects to an inner generator whenever the inner
6 * generator is no longer OK.
7 */
8 #include "uniretrygen.h"
9 #include "wvmoniker.h"
10 #include "wvtclstring.h"
11 #include "wvstringlist.h"
12 #include "wvlinkerhack.h"
14 WV_LINK(UniRetryGen);
17 #if 0
18 #define DPRINTF(format, args...) fprintf(stderr, format ,##args);
19 #else
20 #define DPRINTF if (0) printf
21 #endif
24 static IUniConfGen *creator(WvStringParm encoded_params, IObject *_obj)
26 DPRINTF("encoded_params = %s\n", encoded_params.cstr());
27 WvStringList params;
28 wvtcl_decode(params, encoded_params);
29 if (params.count() == 0)
30 return NULL;
32 WvString moniker = params.popstr();
33 if (params.count() == 0)
34 return new UniRetryGen(moniker);
36 WvString retry_interval_ms_str = params.popstr();
37 time_t retry_interval_ms = retry_interval_ms_str.num();
38 if (retry_interval_ms < 0)
39 retry_interval_ms = 0;
40 return new UniRetryGen(moniker,
41 UniRetryGen::ReconnectCallback(),
42 retry_interval_ms);
45 static WvMoniker<IUniConfGen> reg("retry", creator);
48 /***** UniRetryGen *****/
50 UniRetryGen::UniRetryGen(WvStringParm _moniker,
51 ReconnectCallback _reconnect_callback,
52 time_t _retry_interval_ms)
53 : UniFilterGen(NULL),
54 log(WvString("UniRetryGen %s", _moniker), WvLog::Debug1),
55 moniker(_moniker),
56 reconnect_callback(_reconnect_callback),
57 retry_interval_ms(_retry_interval_ms),
58 next_reconnect_attempt(wvtime())
60 DPRINTF("UniRetryGen::UniRetryGen(%s, %ld)\n",
61 moniker.cstr(), retry_interval_ms);
63 maybe_reconnect();
67 void UniRetryGen::maybe_reconnect()
69 if (!inner())
71 if (!(wvtime() < next_reconnect_attempt))
73 IUniConfGen *gen = wvcreate<IUniConfGen>(moniker);
75 if (!gen)
77 DPRINTF("UniRetryGen::maybe_reconnect: !gen\n");
78 return;
81 if (gen->isok())
83 DPRINTF("UniRetryGen::maybe_reconnect: gen->isok()\n");
85 log("Connected\n");
87 setinner(gen);
89 if (!!reconnect_callback) reconnect_callback(*this);
91 else
93 DPRINTF("UniRetryGen::maybe_reconnect: !gen->isok()\n");
95 WVRELEASE(gen);
97 next_reconnect_attempt =
98 msecadd(next_reconnect_attempt, retry_interval_ms);
105 void UniRetryGen::maybe_disconnect()
107 if (inner() && !inner()->isok())
109 DPRINTF("UniRetryGen::maybe_disconnect: inner() && !inner()->isok()\n");
111 log("Disconnected\n");
113 IUniConfGen *old_inner = inner();
115 setinner(NULL);
117 WVRELEASE(old_inner);
119 next_reconnect_attempt = msecadd(wvtime(), retry_interval_ms);
124 void UniRetryGen::commit()
126 maybe_reconnect();
128 if (UniFilterGen::isok())
129 UniFilterGen::commit();
131 maybe_disconnect();
135 bool UniRetryGen::refresh()
137 maybe_reconnect();
139 bool result;
140 if (UniFilterGen::isok())
141 result = UniFilterGen::refresh();
142 else
143 result = false;
145 maybe_disconnect();
147 return result;
151 void UniRetryGen::prefetch(const UniConfKey &key, bool recursive)
153 maybe_reconnect();
155 if (UniFilterGen::isok())
156 UniFilterGen::prefetch(key, recursive);
158 maybe_disconnect();
162 WvString UniRetryGen::get(const UniConfKey &key)
164 maybe_reconnect();
166 WvString result;
167 if (UniFilterGen::isok())
169 result = UniFilterGen::get(key);
170 DPRINTF("UniRetryGen::get(%s) returns %s\n", key.printable().cstr(), result.cstr());
172 else if (key == "")
174 result = "";
175 DPRINTF("UniRetryGen::get(%s) returns %s because it is root key\n", key.printable().cstr(), result.cstr());
177 else
179 DPRINTF("UniRetryGen::get(%s): !isok()\n", key.printable().cstr());
180 result = WvString::null;
183 maybe_disconnect();
185 return result;
189 void UniRetryGen::set(const UniConfKey &key, WvStringParm value)
191 maybe_reconnect();
193 if (UniFilterGen::isok())
194 UniFilterGen::set(key, value);
196 maybe_disconnect();
200 bool UniRetryGen::exists(const UniConfKey &key)
202 maybe_reconnect();
204 DPRINTF("UniRetryGen::exists(%s)\n", key.printable().cstr());
206 bool result;
207 if (UniFilterGen::isok())
209 result = UniFilterGen::exists(key);
210 DPRINTF("UniRetryGen::exists: returns %s\n", result? "true": "false");
212 else
214 DPRINTF("UniRetryGen::exists: !isok()\n");
215 if (key == "")
217 // here we assume that at least the mount point exists
218 // see void UniMountGen::makemount() that create all the keys with
219 // an empty string
220 result = true;
222 else
224 result = false;
228 maybe_disconnect();
230 return result;
234 bool UniRetryGen::haschildren(const UniConfKey &key)
236 maybe_reconnect();
238 bool result;
239 if (UniFilterGen::isok())
240 result = UniFilterGen::haschildren(key);
241 else
242 result = false;
244 maybe_disconnect();
246 return result;
250 bool UniRetryGen::isok()
252 maybe_reconnect();
254 bool result = UniFilterGen::isok();
256 maybe_disconnect();
258 return result;
262 UniConfGen::Iter *UniRetryGen::iterator(const UniConfKey &key)
264 maybe_reconnect();
266 Iter *result;
267 if (UniFilterGen::isok())
268 result = UniFilterGen::iterator(key);
269 else
270 result = NULL;
272 maybe_disconnect();
274 return result;
278 UniConfGen::Iter *UniRetryGen::recursiveiterator(const UniConfKey &key)
280 maybe_reconnect();
282 Iter *result = UniFilterGen::recursiveiterator(key);
284 maybe_disconnect();
286 return result;