transactd 1.0.1

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.
Files changed (218) hide show
  1. checksums.yaml +7 -0
  2. data/BUILD_UNIX-JA +174 -0
  3. data/BUILD_WIN-JA +256 -0
  4. data/CMakeLists.txt +96 -0
  5. data/COPYING +339 -0
  6. data/README +406 -0
  7. data/README-JA +424 -0
  8. data/bin/common/tdclc_32_1_0.dll +0 -0
  9. data/bin/common/tdclc_64_1_0.dll +0 -0
  10. data/build/common/check_for_link_iconv.cmake +73 -0
  11. data/build/common/copyifgreater.cmd +30 -0
  12. data/build/common/copyifgreater.js +290 -0
  13. data/build/common/get_boost_libs.cmake +106 -0
  14. data/build/common/get_ruby_path.cmake +115 -0
  15. data/build/common/options.cmake +127 -0
  16. data/build/common/smart_install.cmake +263 -0
  17. data/build/common/system.cmake +122 -0
  18. data/build/common/transactd.rc.in +52 -0
  19. data/build/common/transactd_cl_common.cmake +101 -0
  20. data/build/common/transactd_cl_output.cmake +93 -0
  21. data/build/common/transactd_common.cmake +237 -0
  22. data/build/common/transactd_required.cmake +28 -0
  23. data/build/swig/ruby/generate.cmake.in +35 -0
  24. data/build/swig/ruby/generate.cmd.in +19 -0
  25. data/build/swig/ruby/ruby.swg +101 -0
  26. data/build/swig/tdcl.i +188 -0
  27. data/build/tdclc/BUILDNUMBER.txt +1 -0
  28. data/build/tdclc/CMakeLists.txt +170 -0
  29. data/build/tdclc/tdclc_32.cbproj +181 -0
  30. data/build/tdclc/tdclc_64.cbproj +205 -0
  31. data/build/tdclcpp/BUILDNUMBER.txt +1 -0
  32. data/build/tdclcpp/CMakeLists.txt +142 -0
  33. data/build/tdclcpp/tdclcpp_bcb_32.cbproj +239 -0
  34. data/build/tdclcpp/tdclcpp_bcb_64.cbproj +304 -0
  35. data/build/tdclrb/BUILDNUMBER.txt +1 -0
  36. data/build/tdclrb/CMakeLists.txt +258 -0
  37. data/build/tdclrb/GEM_VERSION +3 -0
  38. data/build/tdclrb/bldgem/extconf.rb +123 -0
  39. data/build/tdclrb/gem/INSTALLLOG.win32 +9 -0
  40. data/build/tdclrb/gem/Makefile.win32-VS +65 -0
  41. data/build/tdclrb/gem/Makefile.win32-prebuilt +48 -0
  42. data/build/tdclrb/gem/detect.rb +31 -0
  43. data/build/tdclrb/gem/helper.rb +113 -0
  44. data/build/tdclrb/gem/transactd.rb +22 -0
  45. data/build/tdclrb/gem_output.cmake +44 -0
  46. data/source/bzs/db/IBlobBuffer.h +51 -0
  47. data/source/bzs/db/blobBuffer.h +177 -0
  48. data/source/bzs/db/blobStructs.h +85 -0
  49. data/source/bzs/db/engine/mysql/IReadRecords.h +52 -0
  50. data/source/bzs/db/engine/mysql/bookmark.h +195 -0
  51. data/source/bzs/db/engine/mysql/database.cpp +1882 -0
  52. data/source/bzs/db/engine/mysql/database.h +465 -0
  53. data/source/bzs/db/engine/mysql/dbManager.cpp +303 -0
  54. data/source/bzs/db/engine/mysql/dbManager.h +143 -0
  55. data/source/bzs/db/engine/mysql/errorMessage.cpp +75 -0
  56. data/source/bzs/db/engine/mysql/errorMessage.h +43 -0
  57. data/source/bzs/db/engine/mysql/fieldAccess.h +158 -0
  58. data/source/bzs/db/engine/mysql/mydebuglog.cpp +349 -0
  59. data/source/bzs/db/engine/mysql/mydebuglog.h +89 -0
  60. data/source/bzs/db/engine/mysql/mysqlInternal.h +171 -0
  61. data/source/bzs/db/engine/mysql/mysqlThd.cpp +169 -0
  62. data/source/bzs/db/engine/mysql/mysqlThd.h +35 -0
  63. data/source/bzs/db/engine/mysql/percentageKey.h +260 -0
  64. data/source/bzs/db/protocol/ICommandExecuter.h +49 -0
  65. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +689 -0
  66. data/source/bzs/db/protocol/hs/hsCommandExecuter.h +228 -0
  67. data/source/bzs/db/protocol/tdap/btrDate.cpp +437 -0
  68. data/source/bzs/db/protocol/tdap/btrDate.h +227 -0
  69. data/source/bzs/db/protocol/tdap/client/bulkInsert.h +127 -0
  70. data/source/bzs/db/protocol/tdap/client/client.cpp +106 -0
  71. data/source/bzs/db/protocol/tdap/client/client.h +292 -0
  72. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +144 -0
  73. data/source/bzs/db/protocol/tdap/client/connMgr.h +82 -0
  74. data/source/bzs/db/protocol/tdap/client/database.cpp +863 -0
  75. data/source/bzs/db/protocol/tdap/client/database.h +118 -0
  76. data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +100 -0
  77. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +1640 -0
  78. data/source/bzs/db/protocol/tdap/client/dbDef.h +135 -0
  79. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +434 -0
  80. data/source/bzs/db/protocol/tdap/client/errorMessage.cpp +92 -0
  81. data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +98 -0
  82. data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +174 -0
  83. data/source/bzs/db/protocol/tdap/client/fieldDDF.h +91 -0
  84. data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +140 -0
  85. data/source/bzs/db/protocol/tdap/client/fileDDF.h +86 -0
  86. data/source/bzs/db/protocol/tdap/client/filter.cpp +527 -0
  87. data/source/bzs/db/protocol/tdap/client/filter.h +154 -0
  88. data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +137 -0
  89. data/source/bzs/db/protocol/tdap/client/indexDDF.h +84 -0
  90. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +724 -0
  91. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +123 -0
  92. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +899 -0
  93. data/source/bzs/db/protocol/tdap/client/nsTable.h +199 -0
  94. data/source/bzs/db/protocol/tdap/client/request.h +198 -0
  95. data/source/bzs/db/protocol/tdap/client/sharedData.cpp +58 -0
  96. data/source/bzs/db/protocol/tdap/client/sharedData.h +56 -0
  97. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +574 -0
  98. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +53 -0
  99. data/source/bzs/db/protocol/tdap/client/stringConverter.h +627 -0
  100. data/source/bzs/db/protocol/tdap/client/table.cpp +2613 -0
  101. data/source/bzs/db/protocol/tdap/client/table.h +221 -0
  102. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +1096 -0
  103. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +179 -0
  104. data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +40 -0
  105. data/source/bzs/db/protocol/tdap/client/trnsctcl.def +11 -0
  106. data/source/bzs/db/protocol/tdap/myDateTime.cpp +500 -0
  107. data/source/bzs/db/protocol/tdap/mysql/characterset.cpp +184 -0
  108. data/source/bzs/db/protocol/tdap/mysql/characterset.h +60 -0
  109. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +284 -0
  110. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +53 -0
  111. data/source/bzs/db/protocol/tdap/mysql/debuglog.cpp +383 -0
  112. data/source/bzs/db/protocol/tdap/mysql/debuglog.h +106 -0
  113. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +680 -0
  114. data/source/bzs/db/protocol/tdap/mysql/request.h +202 -0
  115. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +1020 -0
  116. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +141 -0
  117. data/source/bzs/db/protocol/tdap/tdapRequest.h +190 -0
  118. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +295 -0
  119. data/source/bzs/db/protocol/tdap/tdapSchema.h +558 -0
  120. data/source/bzs/db/protocol/tdap/tdapcapi.h +423 -0
  121. data/source/bzs/db/transactd/appBuilderImple.h +55 -0
  122. data/source/bzs/db/transactd/appModule.cpp +183 -0
  123. data/source/bzs/db/transactd/appModule.h +80 -0
  124. data/source/bzs/db/transactd/connManager.cpp +201 -0
  125. data/source/bzs/db/transactd/connManager.h +60 -0
  126. data/source/bzs/db/transactd/connectionRecord.h +69 -0
  127. data/source/bzs/db/transactd/transactd.cpp +325 -0
  128. data/source/bzs/env/compiler.h +135 -0
  129. data/source/bzs/env/crosscompile.cpp +130 -0
  130. data/source/bzs/env/crosscompile.h +150 -0
  131. data/source/bzs/env/fileopen.h +36 -0
  132. data/source/bzs/env/mbcswchrLinux.cpp +40 -0
  133. data/source/bzs/env/mbcswchrLinux.h +88 -0
  134. data/source/bzs/env/tstring.h +183 -0
  135. data/source/bzs/example/changeSchema.cpp +117 -0
  136. data/source/bzs/example/changeSchema_c.cpp +78 -0
  137. data/source/bzs/example/connection_pool_c.cpp +171 -0
  138. data/source/bzs/example/createDatabase.cpp +305 -0
  139. data/source/bzs/example/createDatabase_c.cpp +202 -0
  140. data/source/bzs/example/deleteRecords.cpp +87 -0
  141. data/source/bzs/example/deleteRecords_c.cpp +57 -0
  142. data/source/bzs/example/dropDatabase.cpp +59 -0
  143. data/source/bzs/example/dropDatabase_c.cpp +34 -0
  144. data/source/bzs/example/insertRecords.cpp +212 -0
  145. data/source/bzs/example/insertRecords_c.cpp +153 -0
  146. data/source/bzs/example/readRecords.cpp +141 -0
  147. data/source/bzs/example/readRecords_c.cpp +107 -0
  148. data/source/bzs/example/updateRecords.cpp +99 -0
  149. data/source/bzs/example/updateRecords_c.cpp +71 -0
  150. data/source/bzs/example/update_with_transaction.cpp +104 -0
  151. data/source/bzs/example/update_with_transaction_c.cpp +80 -0
  152. data/source/bzs/netsvc/client/tcpClient.cpp +226 -0
  153. data/source/bzs/netsvc/client/tcpClient.h +489 -0
  154. data/source/bzs/netsvc/server/IAppModule.h +94 -0
  155. data/source/bzs/netsvc/server/iserver.h +65 -0
  156. data/source/bzs/netsvc/server/serverCpt.cpp +522 -0
  157. data/source/bzs/netsvc/server/serverCpt.h +88 -0
  158. data/source/bzs/netsvc/server/serverPipe.cpp +705 -0
  159. data/source/bzs/netsvc/server/serverPipe.h +96 -0
  160. data/source/bzs/netsvc/server/serverTpool.cpp +416 -0
  161. data/source/bzs/netsvc/server/serverTpool.h +84 -0
  162. data/source/bzs/rtl/benchmark.cpp +96 -0
  163. data/source/bzs/rtl/benchmark.h +65 -0
  164. data/source/bzs/rtl/datetime.cpp +375 -0
  165. data/source/bzs/rtl/datetime.h +53 -0
  166. data/source/bzs/rtl/debuglog.cpp +106 -0
  167. data/source/bzs/rtl/debuglog.h +97 -0
  168. data/source/bzs/rtl/exception.h +116 -0
  169. data/source/bzs/rtl/stl_uty.cpp +35 -0
  170. data/source/bzs/rtl/stl_uty.h +29 -0
  171. data/source/bzs/rtl/stringBuffers.cpp +101 -0
  172. data/source/bzs/rtl/stringBuffers.h +58 -0
  173. data/source/bzs/rtl/strtrim.cpp +135 -0
  174. data/source/bzs/rtl/strtrim.h +46 -0
  175. data/source/bzs/test/tdclatl/bench_tdclatl.js +445 -0
  176. data/source/bzs/test/tdclrb/bench_tdclcpp.rb +375 -0
  177. data/source/bzs/test/tdclrb/prepare.rb +226 -0
  178. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +172 -0
  179. data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +208 -0
  180. data/source/bzs/test/tdclrb/transactd_spec.rb +1536 -0
  181. data/source/bzs/test/transactdBench/transactdBench.cpp +430 -0
  182. data/source/bzs/test/transactdBench/transactdBench2.cpp +342 -0
  183. data/source/bzs/test/trdclengn/test_trdclengn.cpp +2030 -0
  184. data/source/global/tdclatl/Database.cpp +503 -0
  185. data/source/global/tdclatl/Database.h +139 -0
  186. data/source/global/tdclatl/DbDef.cpp +242 -0
  187. data/source/global/tdclatl/DbDef.h +79 -0
  188. data/source/global/tdclatl/Field.cpp +92 -0
  189. data/source/global/tdclatl/Field.h +59 -0
  190. data/source/global/tdclatl/FieldDef.cpp +238 -0
  191. data/source/global/tdclatl/FieldDef.h +87 -0
  192. data/source/global/tdclatl/Flags.cpp +111 -0
  193. data/source/global/tdclatl/Flags.h +55 -0
  194. data/source/global/tdclatl/KeyDef.cpp +51 -0
  195. data/source/global/tdclatl/KeyDef.h +55 -0
  196. data/source/global/tdclatl/KeySegment.cpp +55 -0
  197. data/source/global/tdclatl/Table.cpp +600 -0
  198. data/source/global/tdclatl/Table.h +144 -0
  199. data/source/global/tdclatl/TableDef.cpp +291 -0
  200. data/source/global/tdclatl/TableDef.h +86 -0
  201. data/source/global/tdclatl/TdVersion.cpp +74 -0
  202. data/source/global/tdclatl/TdVersion.h +54 -0
  203. data/source/global/tdclatl/_IDatabaseEvents_CP.h +113 -0
  204. data/source/global/tdclatl/dllmain.cpp +30 -0
  205. data/source/global/tdclatl/dllmain.h +27 -0
  206. data/source/global/tdclatl/keySegment.h +57 -0
  207. data/source/global/tdclatl/resource.h +0 -0
  208. data/source/global/tdclatl/stdafx.cpp +2 -0
  209. data/source/global/tdclatl/stdafx.h +25 -0
  210. data/source/global/tdclatl/targetver.h +4 -0
  211. data/source/global/tdclatl/tdclatl.cpp +68 -0
  212. data/source/global/tdclatl/tdclatl.def +10 -0
  213. data/source/global/tdclatl/tdclatl.idl +1035 -0
  214. data/source/linux/charsetConvert.h +112 -0
  215. data/source/linux/linuxTypes.h +33 -0
  216. data/source/linux/tchar.h +428 -0
  217. data/transactd.gemspec +97 -0
  218. metadata +267 -0
@@ -0,0 +1,228 @@
1
+ #ifndef BZS_DB_PROTOCOL_HS_HSCOMMANDEXECUTER_H
2
+ #define BZS_DB_PROTOCOL_HS_HSCOMMANDEXECUTER_H
3
+ /*=================================================================
4
+ Copyright (C) 2013 BizStation Corp All rights reserved.
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License
8
+ as published by the Free Software Foundation; either version 2
9
+ of the License, or (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program; if not, write to the Free Software
18
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19
+ 02111-1307, USA.
20
+ =================================================================*/
21
+ #include <bzs/db/engine/mysql/dbManager.h>
22
+ #include <bzs/db/protocol/ICommandExecuter.h>
23
+ #include <bzs/env/crosscompile.h>
24
+
25
+ namespace bzs
26
+ {
27
+ namespace db
28
+ {
29
+ namespace protocol
30
+ {
31
+ namespace hs
32
+ {
33
+
34
+ #define HS_OP_READ 'R'
35
+ #define HS_OP_OPEN 'P'
36
+ #define HS_OP_AUTH 'A'
37
+ #define HS_OP_INSERT '+'
38
+ #define HS_OP_DELETE 'D'
39
+ #define HS_OP_UPDATE 'U'
40
+ #define HS_OP_UPDATE_INC '+'+0xff
41
+ #define HS_OP_UPDATE_DEC '-'
42
+ #define HS_OP_QUIT 'Q'
43
+
44
+ #define HS_LG_EQUAL '='
45
+ #define HS_LG_GREATER '>'
46
+ #define HS_LG_LESS '<'
47
+ #define HS_LG_NOTEQUAL '<'+0xfe //<>
48
+ #define HS_LG_GREATEROREQUAL '>'+0xff //>=
49
+ #define HS_LG_LESSOREQUAL '<'+0xff //<=
50
+
51
+
52
+ #define DEBNAME_SIZE 64
53
+ #define TABELNAME_SIZE 64
54
+ #define INDEXNAME_SIZE 64
55
+
56
+ #define HS_OP_RESULTBUFSIZE 64000
57
+
58
+ //-----------------------------------------------------------------------
59
+ // result buffer
60
+ //-----------------------------------------------------------------------
61
+
62
+ class resultBuffer
63
+ {
64
+ char* m_ptr;
65
+ char* m_cur;
66
+
67
+ public:
68
+ resultBuffer(char* ptr):m_ptr(ptr),m_cur(m_ptr){}
69
+
70
+ void append(const char* ptr, size_t size)
71
+ {
72
+ const char* p = ptr;
73
+ const char* end = ptr + size;
74
+ for (;p < end; ++p)
75
+ {
76
+ if ((*p >= 0x00) && (*p <= 0x10))
77
+ {
78
+ *m_cur = 0x01;
79
+ *(++m_cur) = *p + 0x40;
80
+ }else
81
+ *m_cur = *p;
82
+ ++m_cur;
83
+ }
84
+ }
85
+
86
+ void append(const char* ptr)
87
+ {
88
+ const char* p = ptr;
89
+ while(*p)
90
+ {
91
+ *m_cur = *p;
92
+ ++p;
93
+ ++m_cur;
94
+ }
95
+ }
96
+
97
+ void append(int v)
98
+ {
99
+ char tmp[50];
100
+ sprintf_s(tmp, 50, "%d", v);
101
+ append(tmp);
102
+ }
103
+
104
+ size_t size()
105
+ {
106
+ *m_ptr = 0x00;
107
+ return m_cur - m_ptr;
108
+ }
109
+ const char* c_str(){return m_ptr;}
110
+
111
+ };
112
+ //-----------------------------------------------------------------------
113
+ // request
114
+ //-----------------------------------------------------------------------
115
+
116
+ struct request
117
+ {
118
+ short op;
119
+ int handle;
120
+
121
+ struct result
122
+ {
123
+ result():limit(1),offset(0),returnBeforeValue(0){};
124
+ int limit;
125
+ int offset;
126
+ bool returnBeforeValue;
127
+ }result;
128
+
129
+ struct db
130
+ {
131
+ char name[DEBNAME_SIZE];
132
+ }db;
133
+
134
+ struct table
135
+ {
136
+ table():openMode(0){}
137
+ char name[TABELNAME_SIZE];
138
+ short openMode;
139
+
140
+ struct key
141
+ {
142
+ key():logical(0){};
143
+ char name[INDEXNAME_SIZE];
144
+ std::vector<std::string> values;
145
+ short logical;
146
+ }key;
147
+
148
+ std::string fields;
149
+ std::vector<std::string> values;
150
+ struct in
151
+ {
152
+ in():keypart(0){}
153
+ uint keypart;
154
+ std::vector<std::string> values;
155
+ }in;
156
+
157
+ struct filter
158
+ {
159
+ filter():type(0),logical(0),col(0){}
160
+ char type;
161
+ short logical;
162
+ short col;
163
+ std::string value;
164
+ };
165
+
166
+ typedef std::vector<filter> filters_type;
167
+ filters_type filters;
168
+
169
+ }table;
170
+
171
+ request():op(HS_OP_READ),handle(0){}
172
+ ha_rkey_function seekFlag();
173
+ bool naviForward();
174
+ bool naviSame();
175
+ };
176
+
177
+
178
+
179
+ //-----------------------------------------------------------------------
180
+ // class dbExecuter
181
+ //-----------------------------------------------------------------------
182
+ /** Current, no support auth command .
183
+ */
184
+ typedef int (*changeFunc)(request& req, engine::mysql::table* tb, int type);
185
+ class dbExecuter : public engine::mysql::dbManager
186
+ {
187
+ void doRecordOperation( request& req, engine::mysql::table* tb, resultBuffer& buf, changeFunc func);
188
+ inline int readAfter(request& req, engine::mysql::table* tb, resultBuffer& buf, changeFunc func);
189
+
190
+ public:
191
+ int commandExec(std::vector<request>& requests, char* result, size_t& size, netsvc::server::buffers* optionalData);
192
+ int errorCode(int ha_error){return 0;};
193
+
194
+ };
195
+
196
+ //-----------------------------------------------------------------------
197
+ // class commandExecuter
198
+ //-----------------------------------------------------------------------
199
+ class commandExecuter : public ICommandExecuter, public engine::mysql::igetDatabases
200
+ {
201
+ boost::shared_ptr<dbExecuter> m_dbExec;
202
+ mutable std::vector<request> m_requests;
203
+
204
+ public:
205
+ commandExecuter(__int64 parent);
206
+ ~commandExecuter();
207
+ size_t perseRequestEnd(const char* p, size_t size, bool& comp)const;
208
+ size_t getAcceptMessage(char* message, size_t size){return 0;};
209
+ bool parse(const char* p, size_t size) ;
210
+ int execute(char* resultBuffer, size_t& size, netsvc::server::buffers* optionalData)
211
+ {
212
+ return m_dbExec->commandExec(m_requests, resultBuffer, size, optionalData);
213
+ }
214
+ void cleanup(){};
215
+ bool isShutDown(){return m_dbExec->isShutDown();}
216
+ const engine::mysql::databases& dbs() const{return m_dbExec->dbs();};
217
+
218
+ };
219
+
220
+
221
+ }//namespace hs
222
+ }//namespace protocol
223
+ }//namespace db
224
+ }//namespace bzs
225
+
226
+
227
+ #endif //BZS_DB_PROTOCOL_HS_HSCOMMANDEXECUTER_H
228
+
@@ -0,0 +1,437 @@
1
+ /*=================================================================
2
+ Copyright (C) 2000-2013 BizStation Corp All rights reserved.
3
+
4
+ This program is free software; you can redistribute it and/or
5
+ modify it under the terms of the GNU General Public License
6
+ as published by the Free Software Foundation; either version 2
7
+ of the License, or (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program; if not, write to the Free Software
16
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17
+ 02111-1307, USA.
18
+ =================================================================*/
19
+ #include <bzs/env/tstring.h>
20
+ #pragma hdrstop
21
+
22
+ #include "btrDate.h"
23
+ #include <bzs/rtl/datetime.h>
24
+ #include <stdio.h>
25
+ #include <stdlib.h>
26
+ #include <time.h>
27
+ #include <bzs/env/compiler.h>
28
+ #ifdef LINUX
29
+ #include <bzs/env/mbcswchrLinux.h>
30
+ #endif
31
+
32
+ #pragma package(smart_init)
33
+
34
+
35
+ #if (defined(_WIN32) && _MSC_VER)
36
+ extern DWORD g_tlsiID_SC2;
37
+ #else
38
+ __THREAD _TCHAR __THREAD_BCB g_date2[45];
39
+ #endif
40
+
41
+ inline _TCHAR* databuf()
42
+ {
43
+ #if (defined(_WIN32) && _MSC_VER)
44
+ return (_TCHAR*)TlsGetValue(g_tlsiID_SC2);
45
+ #else
46
+ return g_date2;
47
+ #endif
48
+ }
49
+
50
+
51
+ namespace bzs
52
+ {
53
+ using namespace rtl;
54
+ namespace db
55
+ {
56
+ namespace protocol
57
+ {
58
+ namespace tdap
59
+ {
60
+
61
+
62
+
63
+
64
+ #define dateToi64(p) (((__int64)JDate2Num(p) - 1721426)*86400) + _timezone
65
+ #define timeToi64(t) t.ss+t.nn*60+t.hh*3600
66
+
67
+ __int64 btrTimeStamp::getDateTimeInt(int& time)
68
+ {
69
+ // seconds from 0000-01-01 00:00:00
70
+ __int64 sec = i64 / 10000000 - _timezone;
71
+ time = sec % 86400;
72
+ // 1721426 days differs from JDate2Num.
73
+ __int64 days = sec / 86400 + 1721426;
74
+ return days;
75
+ }
76
+
77
+
78
+ btrTimeStamp::btrTimeStamp(unsigned __int64 i):i64(i){};
79
+
80
+ btrTimeStamp::btrTimeStamp(const char* p)
81
+ {
82
+ fromString(p);
83
+ }
84
+
85
+ btrTimeStamp::btrTimeStamp(btrDate d, btrTime t):i64(0)
86
+ {
87
+ i64 += timeToi64(t);
88
+ i64 += dateToi64(btrdtoa(d, (_TCHAR*)NULL));
89
+ i64 *= 10000000;
90
+
91
+ }
92
+
93
+ #ifdef _WIN32
94
+ btrTimeStamp::btrTimeStamp(const wchar_t* p)
95
+ {
96
+ fromString(p);
97
+ }
98
+
99
+ wchar_t* btrTimeStamp::toString(wchar_t* p)
100
+ {
101
+ int time;
102
+ int v = (int)getDateTimeInt(time);
103
+ #ifdef _UNICODE
104
+ swprintf_s(p, 20, _T("%s %02d:%02d:%02d"), JNum2Date(v), time/3600,time%3600/60,time%3600%60);
105
+ return p;
106
+ #else
107
+ char buf[30];
108
+ sprintf_s(buf, 30, _T("%s %02d:%02d:%02d"), JNum2Date(v), time/3600,time%3600/60,time%3600%60);
109
+ MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, buf, -1, p, 20);
110
+ return p;
111
+ #endif
112
+
113
+ }
114
+
115
+ void btrTimeStamp::fromString(const wchar_t* p)
116
+ {
117
+ i64 = 0;
118
+ const wchar_t* p2 = wcsstr(p, L" ");
119
+
120
+ if (p2)
121
+ {
122
+ btrTime t = atobtrt(p2+1);
123
+ i64 += timeToi64(t);
124
+ }
125
+ i64 += dateToi64(p);
126
+ i64 *= 10000000;
127
+ }
128
+ #endif //_WIN32
129
+
130
+ char* btrTimeStamp::toString(char* p)
131
+ {
132
+ int time;
133
+ int v = (int)getDateTimeInt(time);
134
+ #ifndef _UNICODE
135
+ sprintf_s(p, 20, _T("%s %02d:%02d:%02d"), JNum2Date(v), time/3600,time%3600/60,time%3600%60);
136
+ return p;
137
+ #else
138
+ wchar_t buf[30];
139
+ swprintf_s(buf, 30, _T("%s %02d:%02d:%02d"), JNum2Date(v), time/3600,time%3600/60,time%3600%60);
140
+ wtoa(p, buf, 20);
141
+ return p;
142
+ #endif
143
+ }
144
+
145
+ void btrTimeStamp::fromString(const char* p)
146
+ {
147
+ i64 = 0;
148
+ const char* p2 = strstr(p, " ");
149
+
150
+ if (p2)
151
+ {
152
+ btrTime t = atobtrt(p2+1);
153
+ i64 += timeToi64(t);
154
+ }
155
+ i64 += dateToi64(p);
156
+ i64 *= 10000000;
157
+ }
158
+
159
+
160
+
161
+ bdate::bdate(int date)
162
+ {
163
+ m_date.i = date;
164
+ }
165
+
166
+ bdate::bdate(const _TCHAR* date)
167
+ {
168
+ btrDate bt;
169
+ bt.yy = (short)GetYear(date, false);
170
+ bt.mm = (char)GetMonth(date, false);
171
+ bt.dd = (char)bzs::rtl::GetDate(date);
172
+ m_date = bt;
173
+ }
174
+
175
+ const _TCHAR* bdate::year_str()
176
+ {
177
+ _TCHAR* p = databuf();
178
+ _stprintf_s(p , 30, _T("%d"), (int)m_date.yy);
179
+ return p;
180
+ }
181
+
182
+ const _TCHAR* bdate::month_str()
183
+ {
184
+ _TCHAR* p = databuf();
185
+ _stprintf_s(p, 30,_T("%d"), (int)m_date.mm);
186
+ return p;
187
+ }
188
+
189
+ const _TCHAR* bdate::date_str()
190
+ {
191
+ _TCHAR* p = databuf();
192
+ _stprintf_s(p, 30, _T("%d"), (int)m_date.dd);
193
+ return p;
194
+ }
195
+
196
+ const _TCHAR* bdate::c_str()
197
+ {
198
+ return btrdtoa(m_date, (_TCHAR*)NULL);
199
+ }
200
+
201
+ const char* dateFormatString(const char*){return "%04d/%02d/%02d";}
202
+ const wchar_t* dateFormatString(const wchar_t*){return L"%04d/%02d/%02d";}
203
+
204
+ const char* dateFormatString_h(const char*){return "%04d-%02d-%02d";}
205
+ const wchar_t* dateFormatString_h(const wchar_t*){return L"%04d-%02d-%02d";}
206
+
207
+ const char* timeFormatString(const char*){return "%02d:%02d:%02d";}
208
+ const wchar_t* timeFormatString(const wchar_t*){return L"%02d:%02d:%02d";}
209
+
210
+ const char* timeFormatString_h(const char*){return "%02d-%02d-%02d";}
211
+ const wchar_t* timeFormatString_h(const wchar_t*){return L"%02d-%02d-%02d";}
212
+
213
+ template <class T>
214
+ size_t _tcslen_(const T* p);
215
+
216
+ template <> size_t _tcslen_(const char* p){return strlen(p);}
217
+ template <> size_t _tcslen_(const wchar_t* p){return wcslen(p);}
218
+
219
+
220
+ template <class T>
221
+ int _ttoi_(const T* p);
222
+
223
+ template <> int _ttoi_(const char* p){return atoi(p);}
224
+ template <> int _ttoi_(const wchar_t* p){return _wtoi(p);}
225
+
226
+ template <class T>
227
+ T* formatDate(T* p, const btrDate& d, bool type_vb);
228
+
229
+ template <> char* formatDate(char* p, const btrDate& d, bool type_vb)
230
+ {
231
+ if (type_vb)
232
+ sprintf_s(p, 11, dateFormatString_h(p), d.yy, d.mm, d.dd);
233
+ else
234
+ sprintf_s(p, 11, dateFormatString(p), d.yy, d.mm, d.dd);
235
+ return p;
236
+ }
237
+
238
+ template <> wchar_t* formatDate(wchar_t* p, const btrDate& d, bool type_vb)
239
+ {
240
+ if (type_vb)
241
+ swprintf_s(p, 11, dateFormatString_h(p), d.yy, d.mm, d.dd);
242
+ else
243
+ swprintf_s(p, 11, dateFormatString(p), d.yy, d.mm, d.dd);
244
+ return p;
245
+ }
246
+
247
+
248
+ template <class T>
249
+ T* formatTime(T* p, const btrTime& d, bool type_vb);
250
+
251
+ template <> char* formatTime(char* p, const btrTime& t, bool type_vb)
252
+ {
253
+ if (type_vb)
254
+ sprintf_s(p, 9, timeFormatString_h(p), t.hh, t.nn, t.ss);
255
+ else
256
+ sprintf_s(p, 9, timeFormatString(p), t.hh, t.nn, t.ss);
257
+ return p;
258
+ }
259
+
260
+ template <> wchar_t* formatTime(wchar_t* p, const btrTime& t, bool type_vb)
261
+ {
262
+ if (type_vb)
263
+ swprintf_s(p, 9, timeFormatString_h(p), t.hh, t.nn, t.ss);
264
+ else
265
+ swprintf_s(p, 9, timeFormatString(p), t.hh, t.nn, t.ss);
266
+ return p;
267
+ }
268
+
269
+ template <class T>
270
+ btrDate atobtrd(const T* date)
271
+ {
272
+ btrDate bt;
273
+ bt.i=0;
274
+ if (date &&
275
+ ((_tcslen_(date)==10) || ((_tcslen_(date) > 10) && (date[10]== 'T' || date[10]== ' '))))
276
+ {
277
+ bt.yy = (short)_ttoi_(date);
278
+ bt.mm = (char)_ttoi_(date + 5);
279
+ bt.dd = (char)_ttoi_(date + 8);
280
+ }
281
+ return bt;
282
+
283
+ }
284
+
285
+
286
+ template <class T>
287
+ const T* btrdtoa(const btrDate& d, T* retbuf, bool type_vb)
288
+ {
289
+ T* p = retbuf;
290
+ if (p == NULL)
291
+ p = (T*)databuf();
292
+ return formatDate(p, d, type_vb);
293
+ }
294
+
295
+ template <class T>
296
+ const T* btrttoa(const btrTime& t, T* retbuf, bool type_vb)
297
+ {
298
+ T* p = retbuf;
299
+ if (p == NULL)
300
+ p = (T*)databuf();
301
+ return formatTime(p, t, type_vb);
302
+ }
303
+
304
+ template <class T>
305
+ btrTime atobtrt(const T* p)
306
+ {
307
+ btrTime retVal;
308
+ retVal.i = 0;
309
+ if (p && (_tcslen_(p) == 8))
310
+ {
311
+ retVal.hh = (char)_ttoi_(p);
312
+ retVal.nn = (char)_ttoi_(p + 3);
313
+ retVal.ss = (char)_ttoi_(p + 6);
314
+ }else
315
+ retVal.i = 0;
316
+ return retVal;
317
+ }
318
+
319
+ btrDate atobtrd(const char* p){return atobtrd<char>(p);}
320
+
321
+ const char* btrdtoa(const btrDate& d, char* retbuf, bool type_vb)
322
+ {
323
+ return btrdtoa<char>(d, retbuf, type_vb);
324
+ }
325
+
326
+ const char* btrttoa(const btrTime& t, char* retbuf, bool type_vb)
327
+ {
328
+ return btrttoa<char>(t, retbuf, type_vb);
329
+ }
330
+
331
+ btrTime atobtrt(const char* p){return atobtrt<char>(p);}
332
+
333
+
334
+ #ifdef _WIN32
335
+ const wchar_t* btrdtoa(const btrDate& d, wchar_t* retbuf, bool type_vb)
336
+ {
337
+ return btrdtoa<wchar_t>(d, retbuf, type_vb);
338
+ }
339
+
340
+ const wchar_t* btrttoa(const btrTime& t, wchar_t* retbuf, bool type_vb)
341
+ {
342
+ return btrttoa<wchar_t>(t, retbuf, type_vb);
343
+ }
344
+
345
+ btrDate atobtrd(const wchar_t* p){return atobtrd<wchar_t>(p);}
346
+
347
+ btrTime atobtrt(const wchar_t* p){return atobtrt<wchar_t>(p);}
348
+
349
+ #endif
350
+
351
+ const _TCHAR* btrstoa(const btrDateTime& s, _TCHAR* retbuf, bool type_vb)
352
+ {
353
+ _TCHAR * p= retbuf;
354
+ const btrDate& d = s.date;
355
+ const btrTime& t = s.time;
356
+ if (p==NULL)
357
+ p = databuf();;
358
+ if (type_vb)
359
+ _stprintf_s(p, 21, _T("%04d-%02d-%02dT%02d:%02d:%02d"), d.yy, d.mm, d.dd, t.hh, t.nn, t.ss);
360
+ else
361
+ _stprintf_s(p, 21, _T("%04d/%02d/%02d %02d:%02d:%02d"), d.yy, d.mm, d.dd, t.hh, t.nn, t.ss);
362
+ return p;
363
+ }
364
+
365
+ btrDateTime atobtrs(const _TCHAR* p)
366
+ {
367
+ btrDateTime s;
368
+ s.i64 = 0;
369
+ s.date = atobtrd(p);
370
+ const _TCHAR* tmp = _tcsstr(p, _T("T"));
371
+ if (tmp)
372
+ s.time = atobtrt(tmp + 1);
373
+ else if ((tmp = _tcsstr(p, _T(" ")))!=NULL)
374
+ s.time = atobtrt(tmp + 1);
375
+ return s;
376
+ }
377
+
378
+
379
+
380
+ int getNowDate()
381
+ {
382
+ btrDate dtb;
383
+ #ifdef _WIN32
384
+ SYSTEMTIME pst;
385
+ GetLocalTime(&pst);
386
+
387
+ dtb.yy = (short)pst.wYear;
388
+ dtb.mm = (char)(pst.wMonth);
389
+ dtb.dd = (char)pst.wDay;
390
+ #else
391
+ //not _WIN32
392
+ struct tm* date;
393
+ time_t now;
394
+ time(&now);
395
+ struct tm tmp;
396
+ date = &tmp;
397
+ localtime_x(date, &now);
398
+
399
+ dtb.yy = (short)date->tm_year + 1900;
400
+ dtb.mm = (char)date->tm_mon + 1;
401
+ dtb.dd = (char)date->tm_mday;
402
+ #endif //NOT _WIN32
403
+ return dtb.i;
404
+
405
+ }
406
+
407
+ int getNowTime()
408
+ {
409
+ btrTime tmb;
410
+ #ifdef _WIN32
411
+
412
+ tmb.i = 0;
413
+ SYSTEMTIME pst;
414
+ GetLocalTime(&pst);
415
+ tmb.hh = (char)pst.wHour; tmb.nn = (char)pst.wMinute;
416
+ tmb.ss = (char)pst.wSecond;
417
+ tmb.uu = (char)(pst.wMilliseconds/10);
418
+ #else
419
+ struct tm* date;
420
+ time_t now;
421
+ time(&now);
422
+ struct tm tmp;
423
+ date = &tmp;
424
+ localtime_x(date, &now);
425
+ tmb.hh = (char)date->tm_hour;
426
+ tmb.nn = (char)date->tm_min;
427
+ tmb.ss = (char)date->tm_sec;
428
+ tmb.uu = 00;
429
+ #endif
430
+ return tmb.i;
431
+ }
432
+
433
+
434
+ }//namespace tdap
435
+ }//namespace protocol
436
+ }//namespace db
437
+ }//namespace bzs