transactd 2.3.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/{BUILD_UNIX-JA → BUILD_UNIX-JA.md} +6 -6
- data/CMakeLists.txt +20 -15
- data/{README-JA → README-JA.md} +23 -23
- data/{README → README.md} +22 -24
- data/RELEASE_NOTE +120 -0
- data/RELEASE_NOTE-JA +110 -0
- data/bin/common/tdclc_32_2_4.dll +0 -0
- data/bin/common/tdclc_64_2_4.dll +0 -0
- data/build/common/get_ruby_path.cmake +1 -1
- data/build/swig/ruby/tdclrb_wrap.cpp +1319 -830
- data/build/swig/tdcl.i +22 -2
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +2 -1
- data/build/tdclrb/CMakeLists.txt +6 -1
- data/build/tdclrb/bldgem/extconf.rb +5 -1
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +44 -40
- data/source/bzs/db/engine/mysql/database.h +28 -8
- data/source/bzs/db/engine/mysql/dbManager.cpp +2 -0
- data/source/bzs/db/engine/mysql/dbManager.h +2 -7
- data/source/bzs/db/engine/mysql/mysqlInternal.h +79 -7
- data/source/bzs/db/protocol/hs/hsCommandExecuter.h +5 -1
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +32 -8
- data/source/bzs/db/protocol/tdap/client/activeTable.h +17 -4
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
- data/source/bzs/db/protocol/tdap/client/client.cpp +51 -6
- data/source/bzs/db/protocol/tdap/client/client.h +41 -11
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +51 -15
- data/source/bzs/db/protocol/tdap/client/connMgr.h +6 -1
- data/source/bzs/db/protocol/tdap/client/database.cpp +26 -5
- data/source/bzs/db/protocol/tdap/client/database.h +3 -2
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +38 -28
- data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -1
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +2 -32
- data/source/bzs/db/protocol/tdap/client/field.cpp +0 -1
- data/source/bzs/db/protocol/tdap/client/filter.h +60 -33
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +2 -5
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +9 -0
- data/source/bzs/db/protocol/tdap/client/memRecord.h +1 -0
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +99 -48
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +5 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +76 -26
- data/source/bzs/db/protocol/tdap/client/nsTable.h +6 -4
- data/source/bzs/db/protocol/tdap/client/request.h +28 -11
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +19 -11
- data/source/bzs/db/protocol/tdap/client/table.cpp +157 -70
- data/source/bzs/db/protocol/tdap/client/table.h +20 -5
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +57 -4
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +55 -20
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +65 -31
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +2 -0
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +24 -36
- data/source/bzs/db/protocol/tdap/mysql/request.h +1 -1
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +98 -18
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +12 -7
- data/source/bzs/db/protocol/tdap/tdapRequest.h +3 -8
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +1 -9
- data/source/bzs/db/protocol/tdap/tdapSchema.h +31 -1
- data/source/bzs/db/protocol/tdap/tdapcapi.h +49 -6
- data/source/bzs/db/protocol/tdap/uri.h +41 -6
- data/source/bzs/db/transactd/appModule.cpp +0 -1
- data/source/bzs/db/transactd/appModule.h +0 -2
- data/source/bzs/db/transactd/connManager.cpp +202 -33
- data/source/bzs/db/transactd/connManager.h +11 -4
- data/source/bzs/db/transactd/connectionRecord.h +19 -5
- data/source/bzs/db/transactd/transactd.cpp +39 -8
- data/source/bzs/env/crosscompile.cpp +1 -1
- data/source/bzs/example/queryData.cpp +1 -1
- data/source/bzs/netsvc/client/iconnection.h +2 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +48 -26
- data/source/bzs/netsvc/client/tcpClient.h +171 -106
- data/source/bzs/netsvc/server/IAppModule.h +0 -1
- data/source/bzs/netsvc/server/serverPipe.cpp +5 -1
- data/source/bzs/netsvc/server/serverPipe.h +2 -1
- data/source/bzs/test/tdclatl/test_query_atl.js +105 -0
- data/source/bzs/test/tdclphp/transactd_Test.php +129 -11
- data/source/bzs/test/tdclrb/transactd_spec.rb +74 -2
- data/source/bzs/test/transactdBench/scaling_bench.cpp +1 -1
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +45 -20
- data/source/global/tdclatl/Bookmark.cpp +28 -0
- data/source/global/tdclatl/Bookmark.h +65 -0
- data/source/global/tdclatl/Database.cpp +2 -2
- data/source/global/tdclatl/Database.h +1 -3
- data/source/global/tdclatl/DbDef.cpp +6 -0
- data/source/global/tdclatl/DbDef.h +1 -0
- data/source/global/tdclatl/QueryBase.cpp +29 -0
- data/source/global/tdclatl/QueryBase.h +4 -0
- data/source/global/tdclatl/Record.cpp +14 -2
- data/source/global/tdclatl/Record.h +1 -1
- data/source/global/tdclatl/Table.cpp +80 -16
- data/source/global/tdclatl/Table.h +23 -8
- data/source/global/tdclatl/_IDatabaseEvents_CP.h +39 -0
- data/source/global/tdclatl/activeTable.cpp +2 -2
- data/source/global/tdclatl/activeTable.h +1 -1
- data/source/global/tdclatl/tdclatl.idl +64 -14
- metadata +12 -12
- data/bin/common/tdclc_32_2_3.dll +0 -0
- data/bin/common/tdclc_64_2_3.dll +0 -0
- data/build/tdclcpp/BUILDNUMBER.txt +0 -1
- data/build/tdclrb/BUILDNUMBER.txt +0 -1
- /data/{BUILD_WIN-JA → BUILD_WIN-JA.md} +0 -0
- /data/{README_ORMSRCGEN-JA → README_ORMSRCGEN-JA.md} +0 -0
- /data/{README_ORMSRCGEN → README_ORMSRCGEN.md} +0 -0
|
@@ -23,12 +23,18 @@
|
|
|
23
23
|
|
|
24
24
|
#include <boost/asio/write.hpp>
|
|
25
25
|
#include <boost/asio/read.hpp>
|
|
26
|
-
#include <boost/system/system_error.hpp>
|
|
27
26
|
#include <boost/bind.hpp>
|
|
28
27
|
#include <boost/thread/mutex.hpp>
|
|
29
28
|
#if (BOOST_VERSION > 104900)
|
|
30
29
|
#include <boost/asio/deadline_timer.hpp>
|
|
30
|
+
#else
|
|
31
|
+
#ifdef __APPLE__
|
|
32
|
+
#include <boost/asio.hpp>
|
|
33
|
+
#include <boost/date_time/posix_time/posix_time.hpp>
|
|
31
34
|
#endif
|
|
35
|
+
#endif
|
|
36
|
+
|
|
37
|
+
|
|
32
38
|
#include <stdio.h>
|
|
33
39
|
#include <vector>
|
|
34
40
|
#ifdef LINUX
|
|
@@ -103,10 +109,12 @@ class connections
|
|
|
103
109
|
boost::asio::io_service m_ios;
|
|
104
110
|
boost::asio::ip::tcp::resolver m_resolver;
|
|
105
111
|
mutex m_mutex;
|
|
112
|
+
boost::system::error_code m_e;
|
|
106
113
|
static bool m_usePipedLocal;
|
|
107
114
|
|
|
108
115
|
connection* getConnection(asio::ip::tcp::endpoint& ep);
|
|
109
116
|
asio::ip::tcp::endpoint endpoint(const std::string& host,
|
|
117
|
+
const char* port,
|
|
110
118
|
boost::system::error_code& ec);
|
|
111
119
|
bool isUseNamedPipe(asio::ip::tcp::endpoint& ep);
|
|
112
120
|
#ifdef USE_PIPE_CLIENT
|
|
@@ -118,15 +126,16 @@ class connections
|
|
|
118
126
|
public:
|
|
119
127
|
connections(const char* pipeName);
|
|
120
128
|
~connections();
|
|
121
|
-
connection* connect(const std::string& host, handshake f,
|
|
129
|
+
connection* connect(const std::string& host, const char* port, handshake f,
|
|
122
130
|
void* data, bool newConnection = false);
|
|
123
|
-
bool reconnect(connection* c, const std::string& host,
|
|
131
|
+
bool reconnect(connection* c, const std::string& host, const char* port,
|
|
124
132
|
handshake f, void* data);
|
|
125
133
|
|
|
126
|
-
connection* getConnection(const std::string& host);
|
|
134
|
+
connection* getConnection(const std::string& host, const char* port);
|
|
127
135
|
bool disconnect(connection* c);
|
|
128
136
|
int connectionCount();
|
|
129
|
-
|
|
137
|
+
const boost::system::error_code& connectError() const { return m_e; };
|
|
138
|
+
static char m_port[PORTNUMBUF_SIZE];
|
|
130
139
|
static int connectTimeout;
|
|
131
140
|
static int netTimeout;
|
|
132
141
|
};
|
|
@@ -146,6 +155,7 @@ protected:
|
|
|
146
155
|
int m_charsetServer;
|
|
147
156
|
bool m_connected;
|
|
148
157
|
bool m_isHandShakable;
|
|
158
|
+
boost::system::error_code m_e;
|
|
149
159
|
|
|
150
160
|
void addref() { ++m_refCount; }
|
|
151
161
|
|
|
@@ -169,9 +179,10 @@ public:
|
|
|
169
179
|
}
|
|
170
180
|
void setDirectReadHandler(idirectReadHandler* p){ m_reader = p; }
|
|
171
181
|
bool isHandShakable() const {return m_isHandShakable;};
|
|
182
|
+
const boost::system::error_code& error() const { return m_e; };
|
|
172
183
|
};
|
|
173
184
|
|
|
174
|
-
|
|
185
|
+
|
|
175
186
|
template <class T>
|
|
176
187
|
class asio_tcp_io
|
|
177
188
|
{
|
|
@@ -179,37 +190,43 @@ class asio_tcp_io
|
|
|
179
190
|
public:
|
|
180
191
|
asio_tcp_io(T& socket):m_socket(socket){}
|
|
181
192
|
|
|
182
|
-
size_t readAll(char* buf, size_t size)
|
|
193
|
+
size_t readAll(char* buf, size_t size, system::error_code& e)
|
|
183
194
|
{
|
|
184
195
|
return asio::read(m_socket, asio::buffer(buf, size),
|
|
185
|
-
asio::transfer_all());
|
|
196
|
+
asio::transfer_all(), e);
|
|
186
197
|
}
|
|
187
198
|
|
|
188
|
-
size_t readSome(char* buf, size_t size, size_t minimum
|
|
199
|
+
size_t readSome(char* buf, size_t size, size_t minimum,
|
|
200
|
+
boost::system::error_code& e)
|
|
189
201
|
{
|
|
190
202
|
return asio::read(m_socket, asio::buffer(buf, size),
|
|
191
|
-
asio::transfer_at_least(minimum));
|
|
203
|
+
asio::transfer_at_least(minimum), e);
|
|
192
204
|
}
|
|
193
205
|
|
|
194
|
-
void write(const char* buf, size_t size, int /*flag
|
|
206
|
+
void write(const char* buf, size_t size, int /*flag*/, boost::system::error_code& e)
|
|
195
207
|
{
|
|
196
208
|
asio::write(m_socket, asio::buffer(buf, size),
|
|
197
|
-
asio::transfer_all());
|
|
209
|
+
asio::transfer_all(), e);
|
|
198
210
|
}
|
|
199
211
|
|
|
200
212
|
template <typename MutableBufferSequence>
|
|
201
|
-
void writeMultibuffer(const MutableBufferSequence& buffer
|
|
213
|
+
void writeMultibuffer(const MutableBufferSequence& buffer,
|
|
214
|
+
boost::system::error_code& e)
|
|
202
215
|
{
|
|
203
|
-
asio::write(m_socket, buffer, asio::transfer_all());
|
|
216
|
+
asio::write(m_socket, buffer, asio::transfer_all(), e);
|
|
204
217
|
}
|
|
205
218
|
|
|
206
219
|
void on_connected() {}
|
|
207
220
|
|
|
208
221
|
};
|
|
222
|
+
#else // __APPLE__ (not __APPLE__)
|
|
209
223
|
|
|
210
224
|
#if (defined(_WIN32))
|
|
211
225
|
#define MSG_WAITALL 0x8
|
|
212
226
|
#define MSG_EOR 0
|
|
227
|
+
#endif
|
|
228
|
+
|
|
229
|
+
#ifndef MSG_MORE
|
|
213
230
|
#define MSG_MORE 0
|
|
214
231
|
#endif
|
|
215
232
|
|
|
@@ -223,39 +240,42 @@ public:
|
|
|
223
240
|
#define SYSTEM_CATEGORY system_category
|
|
224
241
|
#endif
|
|
225
242
|
|
|
226
|
-
|
|
227
|
-
template <class T>
|
|
228
|
-
class native_tcp_io
|
|
243
|
+
inline int getErrorCode()
|
|
229
244
|
{
|
|
230
|
-
T& m_socket;
|
|
231
|
-
int getErrorCode()
|
|
232
|
-
{
|
|
233
245
|
#ifndef _WIN32
|
|
234
|
-
|
|
246
|
+
return errno;
|
|
235
247
|
#else
|
|
236
|
-
|
|
248
|
+
return WSAGetLastError();
|
|
237
249
|
#endif
|
|
238
|
-
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
template <class T>
|
|
253
|
+
class native_tcp_io
|
|
254
|
+
{
|
|
255
|
+
T& m_socket;
|
|
239
256
|
|
|
240
257
|
public:
|
|
241
258
|
native_tcp_io(T& socket):m_socket(socket){}
|
|
242
259
|
|
|
243
260
|
#ifdef _WIN32
|
|
244
|
-
size_t readAll2(char* buf, size_t size)
|
|
261
|
+
size_t readAll2(char* buf, size_t size, system::error_code& e)
|
|
245
262
|
{
|
|
246
263
|
int n = 0;
|
|
247
|
-
do
|
|
264
|
+
do
|
|
248
265
|
{
|
|
249
266
|
int nn = recv(m_socket.native(), buf + n, (int)size - n, 0);
|
|
250
267
|
if (n == SOCKET_ERROR)
|
|
251
|
-
|
|
268
|
+
{
|
|
269
|
+
e = error_code(getErrorCode(), SYSTEM_CATEGORY);
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
252
272
|
n += nn;
|
|
253
273
|
}while (n != size);
|
|
254
274
|
return (size_t)n;
|
|
255
275
|
}
|
|
256
276
|
#endif
|
|
257
277
|
|
|
258
|
-
size_t readAll(char* buf, size_t size)
|
|
278
|
+
size_t readAll(char* buf, size_t size, system::error_code& e)
|
|
259
279
|
{
|
|
260
280
|
errno = 0;
|
|
261
281
|
int n = recv(m_socket.native(), buf, (int)size, MSG_WAITALL);
|
|
@@ -263,33 +283,34 @@ public:
|
|
|
263
283
|
{
|
|
264
284
|
#ifdef _WIN32
|
|
265
285
|
if (WSAEOPNOTSUPP == getErrorCode())
|
|
266
|
-
return readAll2(buf, size);
|
|
286
|
+
return readAll2(buf, size, e);
|
|
267
287
|
else
|
|
268
288
|
#endif
|
|
269
|
-
|
|
289
|
+
e = error_code(getErrorCode(), SYSTEM_CATEGORY);
|
|
270
290
|
}
|
|
271
291
|
return (size_t)n;
|
|
272
292
|
}
|
|
273
293
|
|
|
274
|
-
size_t readSome(char* buf, size_t size, size_t minimum
|
|
294
|
+
size_t readSome(char* buf, size_t size, size_t minimum,
|
|
295
|
+
boost::system::error_code& e)
|
|
275
296
|
{
|
|
276
297
|
errno = 0;
|
|
277
298
|
int n = recv(m_socket.native(), buf, (int)size, 0);
|
|
278
299
|
if (n == SOCKET_ERROR)
|
|
279
|
-
|
|
300
|
+
e = error_code(getErrorCode(), SYSTEM_CATEGORY);
|
|
280
301
|
return (size_t)n;
|
|
281
302
|
}
|
|
282
303
|
|
|
283
|
-
void write(const char* buf, size_t size, int flag)
|
|
304
|
+
void write(const char* buf, size_t size, int flag, boost::system::error_code& e)
|
|
284
305
|
{
|
|
285
306
|
errno = 0;
|
|
286
307
|
int n = send(m_socket.native(), buf, (int)size, flag);
|
|
287
308
|
if (n == SOCKET_ERROR)
|
|
288
|
-
|
|
309
|
+
e = error_code(getErrorCode(), SYSTEM_CATEGORY);
|
|
289
310
|
}
|
|
290
311
|
|
|
291
312
|
template <typename MutableBufferSequence>
|
|
292
|
-
void writeMultibuffer(const MutableBufferSequence& buffer)
|
|
313
|
+
void writeMultibuffer(const MutableBufferSequence& buffer, boost::system::error_code& e)
|
|
293
314
|
{
|
|
294
315
|
buffers::const_iterator it = buffer.begin();
|
|
295
316
|
buffers::const_iterator ite = buffer.end();
|
|
@@ -297,12 +318,13 @@ public:
|
|
|
297
318
|
{
|
|
298
319
|
std::size_t s = asio::buffer_size(*it);
|
|
299
320
|
const char* p = asio::buffer_cast<const char*>(*it);
|
|
300
|
-
write(p, s, (it == (ite - 1)) ? MSG_EOR : MSG_MORE);
|
|
321
|
+
write(p, s, (it == (ite - 1)) ? MSG_EOR : MSG_MORE, e);
|
|
322
|
+
if (e) break;
|
|
301
323
|
++it;
|
|
302
324
|
}
|
|
303
325
|
}
|
|
304
326
|
|
|
305
|
-
void on_connected()
|
|
327
|
+
void on_connected()
|
|
306
328
|
{
|
|
307
329
|
#ifndef _WIN32
|
|
308
330
|
int val = 0;
|
|
@@ -313,7 +335,7 @@ public:
|
|
|
313
335
|
#endif
|
|
314
336
|
}
|
|
315
337
|
};
|
|
316
|
-
#endif
|
|
338
|
+
#endif // __APPLE__
|
|
317
339
|
|
|
318
340
|
template <class T> class connectionImple : public connectionBase
|
|
319
341
|
{
|
|
@@ -321,14 +343,11 @@ protected:
|
|
|
321
343
|
T m_socket;
|
|
322
344
|
buffers m_optionalBuffes;
|
|
323
345
|
|
|
324
|
-
|
|
346
|
+
bool checkError(const system::error_code& e)
|
|
325
347
|
{
|
|
326
|
-
if (e)
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
throw system_error(asio::error::timed_out);
|
|
330
|
-
throw system_error(e);
|
|
331
|
-
}
|
|
348
|
+
if (e)
|
|
349
|
+
return false;
|
|
350
|
+
return true;
|
|
332
351
|
}
|
|
333
352
|
|
|
334
353
|
void cleanup()
|
|
@@ -355,11 +374,13 @@ protected:
|
|
|
355
374
|
|
|
356
375
|
char* asyncWriteRead(unsigned int writeSize)
|
|
357
376
|
{
|
|
358
|
-
#ifndef _WIN32
|
|
377
|
+
#ifndef _WIN32
|
|
359
378
|
signalmask smask;
|
|
360
379
|
#endif
|
|
361
380
|
write(writeSize);
|
|
362
|
-
|
|
381
|
+
if (m_e) return NULL;
|
|
382
|
+
char* p = read();
|
|
383
|
+
return p;
|
|
363
384
|
}
|
|
364
385
|
|
|
365
386
|
buffers* optionalBuffers() { return &m_optionalBuffes; }
|
|
@@ -379,12 +400,12 @@ public:
|
|
|
379
400
|
}
|
|
380
401
|
};
|
|
381
402
|
|
|
382
|
-
#define _size_holder asio::placeholders::bytes_transferred
|
|
383
|
-
#define _error_holder asio::placeholders::error
|
|
403
|
+
#define _size_holder asio::placeholders::bytes_transferred
|
|
404
|
+
#define _error_holder asio::placeholders::error
|
|
384
405
|
|
|
385
406
|
/** Implementation of The TCP connection.
|
|
386
407
|
*/
|
|
387
|
-
#if
|
|
408
|
+
#if defined(LINUX)
|
|
388
409
|
#define USE_CONNECT_TIMER
|
|
389
410
|
#endif
|
|
390
411
|
|
|
@@ -452,7 +473,9 @@ class tcpConnection : public connectionImple<asio::ip::tcp::socket>
|
|
|
452
473
|
#ifdef USE_CONNECT_TIMER
|
|
453
474
|
m_timer.cancel();
|
|
454
475
|
#endif
|
|
455
|
-
|
|
476
|
+
m_e = e;
|
|
477
|
+
if (!checkError(e))
|
|
478
|
+
return ;
|
|
456
479
|
s_io.on_connected();
|
|
457
480
|
m_socket.set_option(boost::asio::ip::tcp::no_delay(true));
|
|
458
481
|
m_connected = true;
|
|
@@ -461,7 +484,11 @@ class tcpConnection : public connectionImple<asio::ip::tcp::socket>
|
|
|
461
484
|
|
|
462
485
|
void on_timer(const boost::system::error_code& e)
|
|
463
486
|
{
|
|
464
|
-
if (e)
|
|
487
|
+
if (e)
|
|
488
|
+
{
|
|
489
|
+
m_e = asio::error::timed_out;
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
465
492
|
#pragma warning(disable : 4996)
|
|
466
493
|
try{ m_socket.cancel(); } catch (...) {}
|
|
467
494
|
#pragma warning(default : 4996)
|
|
@@ -480,10 +507,10 @@ class tcpConnection : public connectionImple<asio::ip::tcp::socket>
|
|
|
480
507
|
#ifdef USE_CONNECT_TIMER
|
|
481
508
|
void connect()
|
|
482
509
|
{
|
|
510
|
+
setTimer(connections::connectTimeout);
|
|
483
511
|
m_socket.async_connect(m_ep,
|
|
484
512
|
bind(&tcpConnection::on_connect, this, _error_holder));
|
|
485
|
-
|
|
486
|
-
m_ios.run();
|
|
513
|
+
m_ios.run();
|
|
487
514
|
m_ios.reset();
|
|
488
515
|
}
|
|
489
516
|
|
|
@@ -491,45 +518,55 @@ class tcpConnection : public connectionImple<asio::ip::tcp::socket>
|
|
|
491
518
|
{
|
|
492
519
|
setTimeouts(connections::connectTimeout);
|
|
493
520
|
m_socket.connect(m_ep);
|
|
494
|
-
|
|
495
|
-
on_connect(
|
|
521
|
+
m_e = error_code(getErrorCode(), SYSTEM_CATEGORY);
|
|
522
|
+
on_connect(m_e);
|
|
496
523
|
m_ios.reset();
|
|
497
524
|
}
|
|
498
525
|
#endif
|
|
499
526
|
|
|
500
527
|
unsigned int directRead(void* buf, unsigned int size)
|
|
501
528
|
{
|
|
502
|
-
|
|
529
|
+
m_e.clear();
|
|
530
|
+
unsigned int len = (unsigned int)s_io.readAll((char*)buf, size, m_e);
|
|
531
|
+
return len;
|
|
503
532
|
}
|
|
504
|
-
|
|
533
|
+
|
|
505
534
|
void* directReadRemain(unsigned int size)
|
|
506
535
|
{
|
|
507
536
|
if (size > m_readbuf.size())
|
|
508
537
|
m_readbuf.resize(size);
|
|
509
|
-
|
|
538
|
+
m_e.clear();
|
|
539
|
+
m_readLen += s_io.readAll(&m_readbuf[0], size, m_e);
|
|
510
540
|
return &m_readbuf[0];
|
|
511
541
|
}
|
|
512
542
|
|
|
513
543
|
char* read()
|
|
514
544
|
{
|
|
515
|
-
if (!m_connected)
|
|
516
|
-
throw system_error(asio::error::not_connected);
|
|
517
545
|
m_readLen = 0;
|
|
518
|
-
|
|
546
|
+
if (!m_connected)
|
|
547
|
+
{
|
|
548
|
+
m_e = asio::error::not_connected;
|
|
549
|
+
return &m_readbuf[0];
|
|
550
|
+
}
|
|
551
|
+
unsigned int n;
|
|
552
|
+
m_e.clear();
|
|
519
553
|
if (m_reader)
|
|
520
554
|
{
|
|
521
|
-
m_readLen = s_io.readAll((char*)&n, 4);
|
|
555
|
+
m_readLen = s_io.readAll((char*)&n, 4, m_e);
|
|
522
556
|
m_readLen += m_reader->onRead(n - 4, this);
|
|
523
557
|
}else
|
|
524
558
|
{
|
|
525
|
-
m_readLen = s_io.readSome(&m_readbuf[0], m_readbuf.size(), 4);
|
|
559
|
+
m_readLen = s_io.readSome(&m_readbuf[0], m_readbuf.size(), 4, m_e);
|
|
526
560
|
n = *((unsigned int*)(&m_readbuf[0]));
|
|
527
561
|
}
|
|
528
|
-
|
|
529
|
-
if (n > m_readLen)
|
|
562
|
+
if (!m_e)
|
|
530
563
|
{
|
|
531
|
-
|
|
532
|
-
|
|
564
|
+
|
|
565
|
+
if (n > m_readLen)
|
|
566
|
+
{
|
|
567
|
+
resizeReadBuffer(n);
|
|
568
|
+
m_readLen += s_io.readAll(&m_readbuf[m_readLen], n - m_readLen, m_e);
|
|
569
|
+
}
|
|
533
570
|
}
|
|
534
571
|
return &m_readbuf[0];
|
|
535
572
|
}
|
|
@@ -537,16 +574,20 @@ class tcpConnection : public connectionImple<asio::ip::tcp::socket>
|
|
|
537
574
|
void write(unsigned int writeSize)
|
|
538
575
|
{
|
|
539
576
|
if (!m_connected)
|
|
540
|
-
|
|
577
|
+
{
|
|
578
|
+
m_e = asio::error::not_connected;
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
m_e.clear();
|
|
541
582
|
if (m_optionalBuffes.size())
|
|
542
583
|
{
|
|
543
584
|
m_optionalBuffes.insert(m_optionalBuffes.begin(),
|
|
544
585
|
asio::buffer(sendBuffer(0), writeSize));
|
|
545
|
-
s_io.writeMultibuffer(m_optionalBuffes);
|
|
586
|
+
s_io.writeMultibuffer(m_optionalBuffes, m_e);
|
|
546
587
|
m_optionalBuffes.clear();
|
|
547
588
|
}
|
|
548
589
|
else
|
|
549
|
-
s_io.write(sendBuffer(0), writeSize, MSG_EOR);
|
|
590
|
+
s_io.write(sendBuffer(0), writeSize, 0/*MSG_EOR*/, m_e);
|
|
550
591
|
}
|
|
551
592
|
public:
|
|
552
593
|
tcpConnection(asio::ip::tcp::endpoint& ep)
|
|
@@ -611,18 +652,6 @@ class pipeConnection : public connectionImple<platform_stream>
|
|
|
611
652
|
return (char*)lpMsgBuf;
|
|
612
653
|
}
|
|
613
654
|
|
|
614
|
-
void throwException(const char* msg, int errorCode)
|
|
615
|
-
{
|
|
616
|
-
char buf[4096];
|
|
617
|
-
char user[128];
|
|
618
|
-
char* p = GetErrorMessage(GetLastError());
|
|
619
|
-
DWORD size = 128;
|
|
620
|
-
GetUserName(user, &size);
|
|
621
|
-
sprintf_s(buf, 4096, "User:%s %s %d %s", user, msg, GetLastError(), p);
|
|
622
|
-
LocalFree(p);
|
|
623
|
-
throw exception(errorCode, buf);
|
|
624
|
-
}
|
|
625
|
-
|
|
626
655
|
char* getUniqName(const char* name, char* buf)
|
|
627
656
|
{
|
|
628
657
|
char* p = buf;
|
|
@@ -646,47 +675,66 @@ class pipeConnection : public connectionImple<platform_stream>
|
|
|
646
675
|
CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0,
|
|
647
676
|
m_sendBufferSize * 2, getUniqName(tmp, buf));
|
|
648
677
|
if (m_mapFile == NULL)
|
|
649
|
-
|
|
678
|
+
{
|
|
679
|
+
m_e = boost::system::error_code(CLIENT_ERROR_SHAREMEM_DENIED, get_system_category());
|
|
680
|
+
return;
|
|
681
|
+
}
|
|
650
682
|
|
|
651
683
|
m_writebuf_p = (char*)MapViewOfFile(m_mapFile, FILE_MAP_ALL_ACCESS, 0,
|
|
652
684
|
0, m_sendBufferSize);
|
|
653
685
|
if (m_writebuf_p == NULL)
|
|
654
|
-
|
|
686
|
+
{
|
|
687
|
+
m_e = boost::system::error_code(CLIENT_ERROR_SHAREMEM_DENIED, get_system_category());
|
|
688
|
+
return;
|
|
689
|
+
}
|
|
655
690
|
|
|
656
691
|
m_readbuf_p = (char*)MapViewOfFile(m_mapFile, FILE_MAP_ALL_ACCESS, 0,
|
|
657
692
|
m_sendBufferSize, m_sendBufferSize);
|
|
658
693
|
if (m_readbuf_p == NULL)
|
|
659
|
-
|
|
694
|
+
{
|
|
695
|
+
m_e = boost::system::error_code(CLIENT_ERROR_SHAREMEM_DENIED, get_system_category());
|
|
696
|
+
return;
|
|
697
|
+
}
|
|
660
698
|
|
|
661
699
|
sprintf_s(tmp, 50, "Global\\%sToClnt", m_pipeName.c_str());
|
|
662
700
|
m_recvEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, getUniqName(tmp, buf));
|
|
663
701
|
if (m_recvEvent == NULL)
|
|
664
|
-
|
|
702
|
+
{
|
|
703
|
+
m_e = boost::system::error_code(CLIENT_ERROR_SHAREMEM_DENIED, get_system_category());
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
665
706
|
|
|
666
707
|
sprintf_s(tmp, 50, "Global\\%sToSrv", m_pipeName.c_str());
|
|
667
708
|
m_sendEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, getUniqName(tmp, buf));
|
|
668
709
|
if (m_sendEvent == NULL)
|
|
669
|
-
|
|
710
|
+
m_e = boost::system::error_code(CLIENT_ERROR_SHAREMEM_DENIED, get_system_category());
|
|
670
711
|
}
|
|
671
712
|
|
|
672
713
|
void write(unsigned int writeSize)
|
|
673
714
|
{
|
|
674
715
|
//m_datalen = 0;
|
|
675
716
|
//m_rows = 0;
|
|
717
|
+
m_e.clear();
|
|
676
718
|
BOOL ret = SetEvent(m_sendEvent);
|
|
677
719
|
if (ret == FALSE)
|
|
678
|
-
|
|
720
|
+
m_e = asio::error::connection_aborted;
|
|
679
721
|
}
|
|
680
722
|
|
|
681
723
|
char* read()
|
|
682
724
|
{
|
|
683
|
-
|
|
725
|
+
int t = 0;
|
|
726
|
+
m_e.clear();
|
|
727
|
+
while (WAIT_TIMEOUT == WaitForSingleObject(m_recvEvent, 1000))
|
|
684
728
|
{
|
|
729
|
+
t += 1000;
|
|
685
730
|
DWORD n = 0;
|
|
686
731
|
BOOL ret = GetNamedPipeHandleState(m_socket.native(), NULL, &n,
|
|
687
732
|
NULL, NULL, NULL, 0);
|
|
688
|
-
if(ret == FALSE || n
|
|
689
|
-
|
|
733
|
+
if(ret == FALSE || n < 2)
|
|
734
|
+
m_e = boost::system::error_code(CLIENT_ERROR_CONNECTION_FAILURE, get_system_category());
|
|
735
|
+
else if (connections::netTimeout == t)
|
|
736
|
+
m_e = asio::error::timed_out;
|
|
737
|
+
if (m_e) break;
|
|
690
738
|
}
|
|
691
739
|
return m_readbuf_p;
|
|
692
740
|
}
|
|
@@ -705,15 +753,15 @@ class pipeConnection : public connectionImple<platform_stream>
|
|
|
705
753
|
DWORD n = 0;
|
|
706
754
|
BOOL ret = GetNamedPipeHandleState(m_socket.native(), NULL, &n,
|
|
707
755
|
NULL, NULL, NULL, 0);
|
|
708
|
-
if(m_sendEvent && ret && n)
|
|
756
|
+
if(m_sendEvent && ret && n > 1)
|
|
709
757
|
{
|
|
710
758
|
SetEvent(m_sendEvent);
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
;
|
|
759
|
+
while (WAIT_TIMEOUT ==
|
|
760
|
+
WaitForSingleObject(m_recvEvent, 1000))
|
|
761
|
+
;
|
|
715
762
|
}
|
|
716
763
|
}
|
|
764
|
+
|
|
717
765
|
if (m_recvEvent)
|
|
718
766
|
CloseHandle(m_recvEvent);
|
|
719
767
|
if (m_sendEvent)
|
|
@@ -736,8 +784,12 @@ class pipeConnection : public connectionImple<platform_stream>
|
|
|
736
784
|
{
|
|
737
785
|
platform_descriptor fd;
|
|
738
786
|
#ifdef WIN32
|
|
787
|
+
m_e.clear();
|
|
739
788
|
char pipeName[100];
|
|
740
|
-
|
|
789
|
+
if (m_ep.port() != 8610)
|
|
790
|
+
sprintf_s(pipeName, 100, "\\\\.\\pipe\\%s%u", m_pipeName.c_str(), m_ep.port());
|
|
791
|
+
else
|
|
792
|
+
sprintf_s(pipeName, 100, "\\\\.\\pipe\\%s", m_pipeName.c_str());
|
|
741
793
|
int i = 1000;
|
|
742
794
|
while (--i)
|
|
743
795
|
{
|
|
@@ -750,11 +802,14 @@ class pipeConnection : public connectionImple<platform_stream>
|
|
|
750
802
|
Sleep(1);
|
|
751
803
|
}
|
|
752
804
|
if (fd == INVALID_HANDLE_VALUE)
|
|
753
|
-
|
|
805
|
+
{
|
|
806
|
+
m_e = boost::system::error_code(CLIENT_ERROR_CANT_CREATEPIPE, get_system_category());
|
|
807
|
+
return;
|
|
808
|
+
}
|
|
754
809
|
#endif // NOT WIN32
|
|
755
|
-
m_socket.assign(fd);
|
|
756
|
-
m_connected = true;
|
|
757
810
|
|
|
811
|
+
m_socket.assign(fd);
|
|
812
|
+
|
|
758
813
|
// send processId and clientid;
|
|
759
814
|
DWORD processId = GetCurrentProcessId();
|
|
760
815
|
int size = 16;
|
|
@@ -764,12 +819,22 @@ class pipeConnection : public connectionImple<platform_stream>
|
|
|
764
819
|
memcpy(p + 4, &processId, sizeof(DWORD));
|
|
765
820
|
__int64 clientid = (__int64) this;
|
|
766
821
|
memcpy(p + 8, &clientid, sizeof(__int64));
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
822
|
+
try
|
|
823
|
+
{
|
|
824
|
+
boost::asio::write(m_socket, boost::asio::buffer(p, size));
|
|
825
|
+
boost::asio::read(m_socket, boost::asio::buffer(p, 7));
|
|
826
|
+
}
|
|
827
|
+
catch (boost::system::system_error& e)
|
|
828
|
+
{
|
|
829
|
+
m_e = e.code();
|
|
830
|
+
}
|
|
831
|
+
if (!m_e)
|
|
832
|
+
{
|
|
833
|
+
unsigned int* shareMemSize = (unsigned int*)(p+3);
|
|
834
|
+
m_isHandShakable = (p[0] == 0x00);
|
|
835
|
+
m_connected = true;
|
|
836
|
+
createKernelObjects(*shareMemSize);
|
|
837
|
+
}
|
|
773
838
|
}
|
|
774
839
|
|
|
775
840
|
char* sendBuffer(size_t size) { return m_writebuf_p; }
|
|
@@ -82,7 +82,6 @@ public:
|
|
|
82
82
|
virtual bool isShutDown() = 0;
|
|
83
83
|
virtual bool checkHost(const char* hostCheckname, /*out*/char* hostName, int size) = 0;
|
|
84
84
|
virtual void cleanup() = 0;
|
|
85
|
-
virtual boost::mutex& mutex() const = 0;
|
|
86
85
|
};
|
|
87
86
|
|
|
88
87
|
// Defines at Implementing of IAppModule , two variables below.
|
|
@@ -448,6 +448,7 @@ public:
|
|
|
448
448
|
m_comm->send();
|
|
449
449
|
asio::write(m_socket, buffer(tmp, 7), e);
|
|
450
450
|
run();
|
|
451
|
+
DisconnectNamedPipe(m_socket.native());
|
|
451
452
|
}
|
|
452
453
|
|
|
453
454
|
void cancel()
|
|
@@ -628,6 +629,7 @@ inotifyHandler* server::erh = NULL;
|
|
|
628
629
|
* and will go into an infinite loop.
|
|
629
630
|
*/
|
|
630
631
|
server::server(shared_ptr<IAppModuleBuilder> app, const std::string& name,
|
|
632
|
+
const char* port,
|
|
631
633
|
std::size_t max_connections, unsigned int shareMemSize,
|
|
632
634
|
const char* hostCheckName)
|
|
633
635
|
: m_app(app), m_maxConnections(max_connections), m_stopped(false)
|
|
@@ -637,7 +639,9 @@ server::server(shared_ptr<IAppModuleBuilder> app, const std::string& name,
|
|
|
637
639
|
m_newConnection.reset(new connection());
|
|
638
640
|
connection::m_pipeName = name;
|
|
639
641
|
connection::m_shareMemSize = shareMemSize;
|
|
640
|
-
|
|
642
|
+
std::string tmp = name;
|
|
643
|
+
tmp += port;
|
|
644
|
+
m_acceptor.open(tmp);
|
|
641
645
|
}
|
|
642
646
|
|
|
643
647
|
/** Start the server
|
|
@@ -80,7 +80,8 @@ class server : public iserver, private boost::noncopyable
|
|
|
80
80
|
|
|
81
81
|
public:
|
|
82
82
|
server(boost::shared_ptr<IAppModuleBuilder>, const std::string& name,
|
|
83
|
-
|
|
83
|
+
const char* port,
|
|
84
|
+
std::size_t max_connections, unsigned int shareMemSize,
|
|
84
85
|
const char* hostCheckName);
|
|
85
86
|
void start();
|
|
86
87
|
void stop();
|