2 * Worldvisions Weaver Software:
3 * Copyright (C) 2002 Net Integration Technologies, Inc.
5 * A UniConfGen that reconnects to an inner generator whenever the inner
6 * generator is no longer OK.
8 #include "uniretrygen.h"
10 #include "wvtclstring.h"
11 #include "wvstringlist.h"
12 #include "wvlinkerhack.h"
18 #define DPRINTF(format, args...) fprintf(stderr, format ,##args);
20 #define DPRINTF if (0) printf
24 static IUniConfGen
*creator(WvStringParm encoded_params
, IObject
*_obj
)
26 DPRINTF("encoded_params = %s\n", encoded_params
.cstr());
28 wvtcl_decode(params
, encoded_params
);
29 if (params
.count() == 0)
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(),
45 static WvMoniker
<IUniConfGen
> reg("retry", creator
);
48 /***** UniRetryGen *****/
50 UniRetryGen::UniRetryGen(WvStringParm _moniker
,
51 ReconnectCallback _reconnect_callback
,
52 time_t _retry_interval_ms
)
54 log(WvString("UniRetryGen %s", _moniker
), WvLog::Debug1
),
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
);
67 void UniRetryGen::maybe_reconnect()
71 if (!(wvtime() < next_reconnect_attempt
))
73 IUniConfGen
*gen
= wvcreate
<IUniConfGen
>(moniker
);
77 DPRINTF("UniRetryGen::maybe_reconnect: !gen\n");
83 DPRINTF("UniRetryGen::maybe_reconnect: gen->isok()\n");
89 if (!!reconnect_callback
) reconnect_callback(*this);
93 DPRINTF("UniRetryGen::maybe_reconnect: !gen->isok()\n");
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();
117 WVRELEASE(old_inner
);
119 next_reconnect_attempt
= msecadd(wvtime(), retry_interval_ms
);
124 void UniRetryGen::commit()
128 if (UniFilterGen::isok())
129 UniFilterGen::commit();
135 bool UniRetryGen::refresh()
140 if (UniFilterGen::isok())
141 result
= UniFilterGen::refresh();
151 void UniRetryGen::prefetch(const UniConfKey
&key
, bool recursive
)
155 if (UniFilterGen::isok())
156 UniFilterGen::prefetch(key
, recursive
);
162 WvString
UniRetryGen::get(const UniConfKey
&key
)
167 if (UniFilterGen::isok())
169 result
= UniFilterGen::get(key
);
170 DPRINTF("UniRetryGen::get(%s) returns %s\n", key
.printable().cstr(), result
.cstr());
175 DPRINTF("UniRetryGen::get(%s) returns %s because it is root key\n", key
.printable().cstr(), result
.cstr());
179 DPRINTF("UniRetryGen::get(%s): !isok()\n", key
.printable().cstr());
180 result
= WvString::null
;
189 void UniRetryGen::set(const UniConfKey
&key
, WvStringParm value
)
193 if (UniFilterGen::isok())
194 UniFilterGen::set(key
, value
);
200 bool UniRetryGen::exists(const UniConfKey
&key
)
204 DPRINTF("UniRetryGen::exists(%s)\n", key
.printable().cstr());
207 if (UniFilterGen::isok())
209 result
= UniFilterGen::exists(key
);
210 DPRINTF("UniRetryGen::exists: returns %s\n", result
? "true": "false");
214 DPRINTF("UniRetryGen::exists: !isok()\n");
217 // here we assume that at least the mount point exists
218 // see void UniMountGen::makemount() that create all the keys with
234 bool UniRetryGen::haschildren(const UniConfKey
&key
)
239 if (UniFilterGen::isok())
240 result
= UniFilterGen::haschildren(key
);
250 bool UniRetryGen::isok()
254 bool result
= UniFilterGen::isok();
262 UniConfGen::Iter
*UniRetryGen::iterator(const UniConfKey
&key
)
267 if (UniFilterGen::isok())
268 result
= UniFilterGen::iterator(key
);
278 UniConfGen::Iter
*UniRetryGen::recursiveiterator(const UniConfKey
&key
)
282 Iter
*result
= UniFilterGen::recursiveiterator(key
);