transactd 2.4.5 → 3.0.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/CMakeLists.txt +1 -1
- data/README-JA.md +52 -529
- data/README.md +52 -523
- data/bin/common/tdclc_32_3_0.dll +0 -0
- data/bin/common/tdclc_64_3_0.dll +0 -0
- data/build/common/system.cmake +2 -1
- data/build/common/transactd_cl_common.cmake +3 -6
- data/build/swig/ruby/ruby.swg +85 -28
- data/build/swig/ruby/tdclrb_wrap.cpp +3195 -1578
- data/build/swig/tdcl.i +161 -5
- data/build/tdclc/CMakeLists.txt +1 -0
- data/build/tdclc/tdclc.cbproj +7 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +2 -5
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/blobStructs.h +1 -1
- data/source/bzs/db/engine/mysql/database.cpp +199 -74
- data/source/bzs/db/engine/mysql/database.h +47 -18
- data/source/bzs/db/engine/mysql/dbManager.cpp +1 -0
- data/source/bzs/db/engine/mysql/mysqlInternal.h +32 -8
- data/source/bzs/db/protocol/tdap/btrDate.cpp +110 -75
- data/source/bzs/db/protocol/tdap/btrDate.h +46 -21
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +18 -18
- data/source/bzs/db/protocol/tdap/client/activeTable.h +25 -25
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
- data/source/bzs/db/protocol/tdap/client/client.cpp +6 -5
- data/source/bzs/db/protocol/tdap/client/client.h +82 -15
- data/source/bzs/db/protocol/tdap/client/database.cpp +531 -142
- data/source/bzs/db/protocol/tdap/client/database.h +19 -6
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +461 -408
- data/source/bzs/db/protocol/tdap/client/dbDef.h +11 -17
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +61 -13
- data/source/bzs/db/protocol/tdap/client/field.cpp +1592 -1398
- data/source/bzs/db/protocol/tdap/client/field.h +110 -121
- data/source/bzs/db/protocol/tdap/client/fields.h +40 -10
- data/source/bzs/db/protocol/tdap/client/filter.h +69 -55
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +296 -164
- data/source/bzs/db/protocol/tdap/client/groupQuery.h +77 -25
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +31 -13
- data/source/bzs/db/protocol/tdap/client/memRecord.h +31 -21
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +69 -24
- data/source/bzs/db/protocol/tdap/client/nsTable.h +3 -1
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +1 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +46 -27
- data/source/bzs/db/protocol/tdap/client/request.h +2 -1
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +44 -9
- data/source/bzs/db/protocol/tdap/client/serializer.h +1 -1
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +182 -76
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +23 -12
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +8 -10
- data/source/bzs/db/protocol/tdap/client/table.cpp +172 -93
- data/source/bzs/db/protocol/tdap/client/table.h +112 -37
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +17 -0
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +0 -1
- data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +0 -2
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +1 -1
- data/source/bzs/db/protocol/tdap/fieldComp.h +698 -14
- data/source/bzs/db/protocol/tdap/myDateTime.cpp +723 -307
- data/source/bzs/db/protocol/tdap/myDateTime.h +294 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +164 -54
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +6 -3
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +133 -550
- data/source/bzs/db/protocol/tdap/mysql/request.h +6 -5
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +217 -82
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +1 -1
- data/source/bzs/db/protocol/tdap/tdapRequest.h +4 -9
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +808 -17
- data/source/bzs/db/protocol/tdap/tdapSchema.h +656 -164
- data/source/bzs/db/protocol/tdap/tdapcapi.h +130 -28
- data/source/bzs/db/protocol/tdap/uri.h +40 -32
- data/source/bzs/db/transactd/connManager.cpp +1 -1
- data/source/bzs/db/transactd/transactd.cpp +7 -0
- data/source/bzs/env/compiler.h +107 -94
- data/source/bzs/env/crosscompile.cpp +24 -12
- data/source/bzs/env/crosscompile.h +75 -6
- data/source/bzs/env/mbcswchrLinux.cpp +2 -2
- data/source/bzs/env/tcharMinGW.h +4 -0
- data/source/bzs/example/changeSchema.cpp +22 -17
- data/source/bzs/example/queryData.cpp +4 -0
- data/source/bzs/netsvc/client/iconnection.h +3 -1
- data/source/bzs/netsvc/client/tcpClient.h +10 -3
- data/source/bzs/rtl/stringBuffers.cpp +7 -0
- data/source/bzs/test/tdclatl/bench_query_atl.js +6 -0
- data/source/bzs/test/tdclatl/bench_tdclatl.js +8 -1
- data/source/bzs/test/tdclatl/test_query_atl.js +22 -2
- data/source/bzs/test/tdclatl/test_v3.js +1017 -0
- data/source/bzs/test/tdclphp/transactd_Test.php +55 -21
- data/source/bzs/test/tdclphp/transactd_datetime_Test.php +0 -5
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +2 -0
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +743 -0
- data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -5
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +2 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +39 -16
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +748 -0
- data/source/bzs/test/transactdBench/transactdBench.cpp +55 -58
- data/source/bzs/test/transactdBench/transactdBench2.cpp +1 -3
- data/source/bzs/test/trdclengn/testField.h +3305 -0
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +1050 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +112 -190
- data/source/bzs/test/trdclengn/testbase.h +137 -0
- data/source/global/ormsrcgen/srcgen.cpp +23 -12
- data/source/global/ormsrcgen/template/ormDataClass_template.h +2 -0
- data/source/global/querystmts/querystmts.cpp +2 -3
- data/source/global/tdclatl/Bitset.cpp +38 -0
- data/source/global/tdclatl/Bitset.h +63 -0
- data/source/global/tdclatl/Database.cpp +59 -18
- data/source/global/tdclatl/Database.h +7 -4
- data/source/global/tdclatl/DbDef.cpp +6 -6
- data/source/global/tdclatl/DbDef.h +2 -1
- data/source/global/tdclatl/Field.cpp +112 -0
- data/source/global/tdclatl/Field.h +19 -5
- data/source/global/tdclatl/FieldDef.cpp +137 -16
- data/source/global/tdclatl/FieldDef.h +18 -2
- data/source/global/tdclatl/FieldDefs.cpp +54 -1
- data/source/global/tdclatl/FieldDefs.h +3 -0
- data/source/global/tdclatl/GroupQuery.cpp +8 -8
- data/source/global/tdclatl/QueryBase.cpp +65 -0
- data/source/global/tdclatl/QueryBase.h +10 -0
- data/source/global/tdclatl/Record.cpp +33 -2
- data/source/global/tdclatl/Record.h +3 -1
- data/source/global/tdclatl/RecordsetQuery.cpp +42 -0
- data/source/global/tdclatl/RecordsetQuery.h +8 -0
- data/source/global/tdclatl/Table.cpp +127 -3
- data/source/global/tdclatl/Table.h +10 -1
- data/source/global/tdclatl/TableDef.cpp +41 -8
- data/source/global/tdclatl/TableDef.h +7 -2
- data/source/global/tdclatl/activeTable.cpp +40 -71
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/tdclatl.idl +222 -28
- data/source/linux/tchar.h +100 -96
- data/transactd.gemspec +2 -2
- metadata +13 -11
- data/BUILD_UNIX-JA.md +0 -161
- data/BUILD_WIN-JA.md +0 -326
- data/README_ORMSRCGEN-JA.md +0 -115
- data/README_ORMSRCGEN.md +0 -118
- data/RELEASE_NOTE-JA.md +0 -356
- data/RELEASE_NOTE.md +0 -360
- data/bin/common/tdclc_32_2_4.dll +0 -0
- data/bin/common/tdclc_64_2_4.dll +0 -0
- data/source/bzs/test/trdclengn/test_blob.cpp +0 -375
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*=================================================================
|
|
2
|
-
Copyright (C) 2014 BizStation Corp All rights reserved.
|
|
2
|
+
Copyright (C) 2014,2015 BizStation Corp All rights reserved.
|
|
3
3
|
|
|
4
4
|
This program is free software; you can redistribute it and/or
|
|
5
5
|
modify it under the terms of the GNU General Public License
|
|
@@ -17,10 +17,13 @@
|
|
|
17
17
|
02111-1307, USA.
|
|
18
18
|
=================================================================*/
|
|
19
19
|
#pragma hdrstop
|
|
20
|
+
#pragma warning(disable : 4996)
|
|
20
21
|
#include "groupQuery.h"
|
|
21
22
|
#include "recordsetImple.h"
|
|
22
23
|
#include "filter.h"
|
|
24
|
+
#include <bzs/db/protocol/tdap/fieldComp.h>
|
|
23
25
|
#include <boost/algorithm/string.hpp>
|
|
26
|
+
#pragma warning(default : 4996)
|
|
24
27
|
|
|
25
28
|
#pragma package(smart_init)
|
|
26
29
|
|
|
@@ -38,12 +41,20 @@ namespace client
|
|
|
38
41
|
// ---------------------------------------------------------------------------
|
|
39
42
|
// struct fieldNamesImple
|
|
40
43
|
// ---------------------------------------------------------------------------
|
|
44
|
+
struct valueItem
|
|
45
|
+
{
|
|
46
|
+
std::_tstring value;
|
|
47
|
+
bool null;
|
|
48
|
+
};
|
|
49
|
+
|
|
41
50
|
struct fieldNamesImple
|
|
42
51
|
{
|
|
43
|
-
std::vector<
|
|
52
|
+
std::vector<valueItem> keyFields;
|
|
44
53
|
fieldNamesImple() {}
|
|
45
54
|
};
|
|
46
55
|
|
|
56
|
+
|
|
57
|
+
|
|
47
58
|
// ---------------------------------------------------------------------------
|
|
48
59
|
// class fieldNames
|
|
49
60
|
// ---------------------------------------------------------------------------
|
|
@@ -87,6 +98,14 @@ fieldNames& fieldNames::reset()
|
|
|
87
98
|
return *this;
|
|
88
99
|
}
|
|
89
100
|
|
|
101
|
+
void fieldNames::doAddValue(const _TCHAR* v, bool isNull)
|
|
102
|
+
{
|
|
103
|
+
valueItem itm;
|
|
104
|
+
itm.value = v;
|
|
105
|
+
itm.null = isNull;
|
|
106
|
+
m_impl->keyFields.push_back(itm);
|
|
107
|
+
}
|
|
108
|
+
|
|
90
109
|
fieldNames& fieldNames::keyField(const _TCHAR* name, const _TCHAR* name1,
|
|
91
110
|
const _TCHAR* name2, const _TCHAR* name3,
|
|
92
111
|
const _TCHAR* name4, const _TCHAR* name5,
|
|
@@ -96,27 +115,49 @@ fieldNames& fieldNames::keyField(const _TCHAR* name, const _TCHAR* name1,
|
|
|
96
115
|
{
|
|
97
116
|
m_impl->keyFields.clear();
|
|
98
117
|
if (name)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
{
|
|
119
|
+
doAddValue(name, false);
|
|
120
|
+
if (name1)
|
|
121
|
+
{
|
|
122
|
+
doAddValue(name1, false);
|
|
123
|
+
if (name2)
|
|
124
|
+
{
|
|
125
|
+
doAddValue(name2, false);
|
|
126
|
+
if (name3)
|
|
127
|
+
{
|
|
128
|
+
doAddValue(name3, false);
|
|
129
|
+
if (name4)
|
|
130
|
+
{
|
|
131
|
+
doAddValue(name4, false);
|
|
132
|
+
{
|
|
133
|
+
if (name5)
|
|
134
|
+
{
|
|
135
|
+
doAddValue(name5, false);
|
|
136
|
+
if (name6)
|
|
137
|
+
{
|
|
138
|
+
doAddValue(name6, false);
|
|
139
|
+
if (name7)
|
|
140
|
+
{
|
|
141
|
+
doAddValue(name7, false);
|
|
142
|
+
if (name8)
|
|
143
|
+
{
|
|
144
|
+
doAddValue(name8, false);
|
|
145
|
+
if (name9)
|
|
146
|
+
{
|
|
147
|
+
doAddValue(name9, false);
|
|
148
|
+
if (name10)
|
|
149
|
+
doAddValue(name10, false);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
120
161
|
return *this;
|
|
121
162
|
}
|
|
122
163
|
|
|
@@ -128,25 +169,63 @@ int fieldNames::count() const
|
|
|
128
169
|
const _TCHAR* fieldNames::getValue(int index) const
|
|
129
170
|
{
|
|
130
171
|
assert(index >= 0 && index < count());
|
|
131
|
-
return m_impl->keyFields[index].c_str();
|
|
172
|
+
return m_impl->keyFields[index].value.c_str();
|
|
132
173
|
}
|
|
133
174
|
|
|
134
175
|
const _TCHAR* fieldNames::operator[](int index) const
|
|
135
176
|
{
|
|
136
177
|
assert(index >= 0 && index < count());
|
|
137
|
-
return m_impl->keyFields[index].c_str();
|
|
178
|
+
return m_impl->keyFields[index].value.c_str();
|
|
138
179
|
}
|
|
139
180
|
|
|
140
181
|
void fieldNames::addValue(const _TCHAR* v)
|
|
141
182
|
{
|
|
142
|
-
|
|
183
|
+
doAddValue(v, false);
|
|
143
184
|
}
|
|
144
185
|
|
|
145
186
|
void fieldNames::addValues(const _TCHAR* values, const _TCHAR* delmi)
|
|
146
187
|
{
|
|
147
|
-
|
|
188
|
+
std::vector<std::_tstring> tmp;
|
|
189
|
+
boost::algorithm::split(tmp, values, boost::is_any_of(delmi));
|
|
190
|
+
valueItem itm;
|
|
191
|
+
itm.null = false;
|
|
192
|
+
for (int i=0;i < (int)tmp.size(); ++i)
|
|
193
|
+
{
|
|
194
|
+
itm.value = tmp[i];
|
|
195
|
+
m_impl->keyFields.push_back(itm);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
// class fieldValues
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
fieldValues::fieldValues() : fieldNames() {}
|
|
204
|
+
|
|
205
|
+
fieldValues::fieldValues(const fieldValues& r): fieldNames(r) {}
|
|
206
|
+
|
|
207
|
+
fieldValues& fieldValues::operator=(const fieldValues& r)
|
|
208
|
+
{
|
|
209
|
+
if (this != &r)
|
|
210
|
+
{
|
|
211
|
+
fieldNames::operator=(r);
|
|
212
|
+
}
|
|
213
|
+
return *this;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
void fieldValues::addValue(const _TCHAR* v, bool isNull)
|
|
217
|
+
{
|
|
218
|
+
doAddValue(v, isNull);
|
|
148
219
|
}
|
|
149
220
|
|
|
221
|
+
bool fieldValues::isNull(int index) const
|
|
222
|
+
{
|
|
223
|
+
assert(index >= 0 && index < count());
|
|
224
|
+
return m_impl->keyFields[index].null;
|
|
225
|
+
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
|
|
150
229
|
// ---------------------------------------------------------------------------
|
|
151
230
|
// struct recordsetQueryImple
|
|
152
231
|
// ---------------------------------------------------------------------------
|
|
@@ -155,18 +234,25 @@ struct recordsetQueryImple
|
|
|
155
234
|
row_ptr row;
|
|
156
235
|
struct compItem
|
|
157
236
|
{
|
|
158
|
-
|
|
237
|
+
judgeFunc isMatchFunc;
|
|
238
|
+
comp1Func compFunc;
|
|
159
239
|
short index;
|
|
160
|
-
|
|
240
|
+
uchar_td compType;
|
|
161
241
|
char combine;
|
|
242
|
+
struct
|
|
243
|
+
{
|
|
244
|
+
bool nullable : 1;
|
|
245
|
+
bool nulllog : 1;
|
|
246
|
+
};
|
|
162
247
|
};
|
|
163
248
|
std::vector<compItem> compItems;
|
|
164
|
-
|
|
165
|
-
short endIndex;
|
|
166
249
|
fielddefs compFields;
|
|
167
|
-
|
|
250
|
+
short endIndex;
|
|
251
|
+
bool mysqlnull;
|
|
252
|
+
|
|
253
|
+
recordsetQueryImple() : row(NULL),mysqlnull(false) {}
|
|
168
254
|
recordsetQueryImple(const recordsetQueryImple& r)
|
|
169
|
-
: row(r.row), compItems(r.compItems), compFields(r.compFields)
|
|
255
|
+
: row(r.row), compItems(r.compItems), compFields(r.compFields), mysqlnull(r.mysqlnull)
|
|
170
256
|
{
|
|
171
257
|
if (row)
|
|
172
258
|
row->addref();
|
|
@@ -219,6 +305,7 @@ recordsetQuery::~recordsetQuery()
|
|
|
219
305
|
|
|
220
306
|
void recordsetQuery::init(const fielddefs* fdinfo)
|
|
221
307
|
{
|
|
308
|
+
m_imple->mysqlnull = fdinfo->mysqlnullEnable();
|
|
222
309
|
const std::vector<std::_tstring>& tokns = getWheres();
|
|
223
310
|
m_imple->compFields.clear();
|
|
224
311
|
m_imple->compItems.clear();
|
|
@@ -226,9 +313,12 @@ void recordsetQuery::init(const fielddefs* fdinfo)
|
|
|
226
313
|
{
|
|
227
314
|
recordsetQueryImple::compItem itm;
|
|
228
315
|
itm.index = fdinfo->indexByName(tokns[i].c_str());
|
|
316
|
+
if (itm.index >= 0)
|
|
317
|
+
itm.nullable = (*fdinfo)[itm.index].isNullable();
|
|
229
318
|
m_imple->compItems.push_back(itm);
|
|
230
|
-
m_imple->compFields.push_back(&((*fdinfo)[itm.index])
|
|
319
|
+
m_imple->compFields.push_back(&((*fdinfo)[itm.index]));
|
|
231
320
|
}
|
|
321
|
+
m_imple->compFields.calcFieldPos(0 /*startIndex*/, true);
|
|
232
322
|
m_imple->row = memoryRecord::create(m_imple->compFields);
|
|
233
323
|
m_imple->row->addref();
|
|
234
324
|
m_imple->row->setRecordData(autoMemory::create(), 0, 0, &m_imple->endIndex, true);
|
|
@@ -241,16 +331,23 @@ void recordsetQuery::init(const fielddefs* fdinfo)
|
|
|
241
331
|
fd = tokns[i + 2].c_str();
|
|
242
332
|
bool part = fd.isCompPartAndMakeValue();
|
|
243
333
|
itm.compType = getFilterLogicTypeCode(tokns[i + 1].c_str());
|
|
334
|
+
eCompType log = (eCompType)(itm.compType & 0xf);
|
|
335
|
+
itm.nulllog = ((log == eIsNull) || (log == eIsNotNull));
|
|
244
336
|
if (!part)
|
|
245
337
|
itm.compType |= CMPLOGICAL_VAR_COMP_ALL;
|
|
246
338
|
fielddef& fdd = const_cast<fielddef&>(m_imple->compFields[index]);
|
|
247
|
-
fdd.len =
|
|
248
|
-
|
|
249
|
-
|
|
339
|
+
fdd.len = m_imple->compFields[index].compDataLen((const uchar_td*)fd.ptr(), part);
|
|
340
|
+
uchar_td type = fdd.type;
|
|
341
|
+
if (fdd.isLegacyTimeFormat())
|
|
342
|
+
{
|
|
343
|
+
if (type == ft_mytime) type = ft_mytime_num_cmp;
|
|
344
|
+
if (type == ft_mydatetime) type = ft_mydatetime_num_cmp;
|
|
345
|
+
if (type == ft_mytimestamp) type = ft_mytimestamp_num_cmp;
|
|
346
|
+
}
|
|
250
347
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
348
|
+
itm.compFunc = getCompFunc(type, fdd.len, itm.compType,
|
|
349
|
+
fdd.varLenBytes() + fdd.blobLenBytes());
|
|
350
|
+
itm.isMatchFunc = getJudgeFunc((eCompType)itm.compType);
|
|
254
351
|
|
|
255
352
|
if (i + 3 < (int)tokns.size())
|
|
256
353
|
{
|
|
@@ -266,44 +363,22 @@ void recordsetQuery::init(const fielddefs* fdinfo)
|
|
|
266
363
|
}
|
|
267
364
|
}
|
|
268
365
|
|
|
269
|
-
bool recordsetQuery::isMatch(int ret, unsigned char compType) const
|
|
270
|
-
{
|
|
271
|
-
compType &= 0xf; // lower than 15
|
|
272
|
-
switch ((eCompType)compType)
|
|
273
|
-
{
|
|
274
|
-
case eEqual:
|
|
275
|
-
case eBitAnd:
|
|
276
|
-
return (ret == 0);
|
|
277
|
-
case eGreaterEq:
|
|
278
|
-
return (ret >= 0);
|
|
279
|
-
case eLessEq:
|
|
280
|
-
return (ret <= 0);
|
|
281
|
-
case eGreater:
|
|
282
|
-
return (ret > 0);
|
|
283
|
-
case eLess:
|
|
284
|
-
return (ret < 0);
|
|
285
|
-
case eNotEq:
|
|
286
|
-
case eNotBitAnd:
|
|
287
|
-
return (ret != 0);
|
|
288
|
-
}
|
|
289
|
-
return false;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
366
|
bool recordsetQuery::match(const row_ptr row) const
|
|
293
367
|
{
|
|
294
368
|
for (int i = 0; i < (int)m_imple->compItems.size(); ++i)
|
|
295
369
|
{
|
|
296
370
|
recordsetQueryImple::compItem& itm = m_imple->compItems[i];
|
|
297
|
-
bool ret
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
371
|
+
bool ret;
|
|
372
|
+
int nullJudge = 2;
|
|
373
|
+
const field& f = (*row)[itm.index];
|
|
374
|
+
if (m_imple->mysqlnull && (itm.nullable || itm.nulllog))
|
|
375
|
+
nullJudge = f.nullComp((eCompType)(itm.compType & 0xf));
|
|
376
|
+
if (nullJudge < 2)
|
|
377
|
+
ret = (nullJudge == 0) ? true : false;
|
|
378
|
+
else
|
|
379
|
+
ret = itm.isMatchFunc(itm.compFunc((const char*)f.ptr(), (const char*)((*m_imple->row)[i].ptr()), (*m_imple->row)[i].len()));
|
|
380
|
+
|
|
381
|
+
if (isEndComp(itm.combine, ret)) return ret;
|
|
307
382
|
}
|
|
308
383
|
assert(0);
|
|
309
384
|
return false;
|
|
@@ -330,7 +405,7 @@ class groupQueryImple : public fieldNames
|
|
|
330
405
|
bool enabled = false;
|
|
331
406
|
for (int j = 0; j < (int)m_impl->keyFields.size(); ++j)
|
|
332
407
|
{
|
|
333
|
-
if (m_impl->keyFields[j] == fds[i].name())
|
|
408
|
+
if (m_impl->keyFields[j].value == fds[i].name())
|
|
334
409
|
{
|
|
335
410
|
enabled = true;
|
|
336
411
|
break;
|
|
@@ -386,17 +461,16 @@ public:
|
|
|
386
461
|
std::vector<recordsetImple::key_type> keyFields;
|
|
387
462
|
|
|
388
463
|
for (int i = 0; i < (int)m_impl->keyFields.size(); ++i)
|
|
389
|
-
keyFields.push_back(resolvKeyValue(mdls, m_impl->keyFields[i]));
|
|
464
|
+
keyFields.push_back(resolvKeyValue(mdls, m_impl->keyFields[i].value));
|
|
390
465
|
|
|
391
466
|
for (int i = 0; i < (int)m_funcs.size(); ++i)
|
|
392
467
|
{
|
|
393
|
-
|
|
394
468
|
groupFuncBase* f = m_funcs[i];
|
|
395
469
|
f->init(mdls.fieldDefs());
|
|
396
470
|
|
|
397
471
|
if (f->resultKey() == (int)mdls.fieldDefs()->size())
|
|
398
472
|
mdls.appendField(f->resultName(), f->resultType(),
|
|
399
|
-
|
|
473
|
+
f->resultLen(), f->decimals());
|
|
400
474
|
}
|
|
401
475
|
|
|
402
476
|
grouping_comp<recordsetImple> groupingComp(mdls, keyFields);
|
|
@@ -407,8 +481,7 @@ public:
|
|
|
407
481
|
while (it != ite)
|
|
408
482
|
{
|
|
409
483
|
bool found = false;
|
|
410
|
-
i = binary_search(n, index, 0, (int)index.size(), groupingComp,
|
|
411
|
-
found);
|
|
484
|
+
i = binary_search(n, index, 0, (int)index.size(), groupingComp, found);
|
|
412
485
|
if (!found)
|
|
413
486
|
index.insert(index.begin() + i, n);
|
|
414
487
|
for (int j = 0; j < (int)m_funcs.size(); ++j)
|
|
@@ -428,12 +501,13 @@ public:
|
|
|
428
501
|
|
|
429
502
|
for (int j = 0; j < (int)m_funcs.size(); ++j)
|
|
430
503
|
{
|
|
431
|
-
if (m_funcs[j]->
|
|
504
|
+
if (m_funcs[j]->isNull(i))
|
|
505
|
+
(*cur).setInvalidMemblock(m_funcs[j]->resultKey());
|
|
506
|
+
else if (m_funcs[j]->resultType() == ft_float)
|
|
432
507
|
setValue(cur, m_funcs[j]->resultKey(), m_funcs[j]->numericResult(i));
|
|
433
508
|
else
|
|
434
509
|
memcpy((*cur)[m_funcs[j]->resultKey()].ptr() ,
|
|
435
|
-
m_funcs[j]->stringResult(i),
|
|
436
|
-
m_funcs[j]->resultLen());
|
|
510
|
+
m_funcs[j]->stringResult(i), m_funcs[j]->resultLen());
|
|
437
511
|
}
|
|
438
512
|
mdls.push_back(cur);
|
|
439
513
|
}
|
|
@@ -534,10 +608,12 @@ private:
|
|
|
534
608
|
friend class groupQueryImple;
|
|
535
609
|
fieldNames m_targetNames;
|
|
536
610
|
std::_tstring m_resultName;
|
|
537
|
-
int m_resultKey;
|
|
538
611
|
std::vector<int> m_targetKeys;
|
|
612
|
+
int m_resultKey;
|
|
539
613
|
ushort_td m_resultLen;
|
|
540
614
|
uchar_td m_resultType;
|
|
615
|
+
uchar_td m_decimals;
|
|
616
|
+
bool m_insertFlag;
|
|
541
617
|
void clearStrings()
|
|
542
618
|
{
|
|
543
619
|
std::vector<unsigned char*>::iterator it = m_strings.begin();
|
|
@@ -561,33 +637,32 @@ public:
|
|
|
561
637
|
std::vector<groupFuncBase::numeric_type> m_values;
|
|
562
638
|
std::vector<__int64> m_counts;
|
|
563
639
|
std::vector<unsigned char*> m_strings;
|
|
640
|
+
std::vector<bool> m_nulls;
|
|
564
641
|
|
|
565
642
|
inline groupFuncBaseImple() : m_resultKey(-1),
|
|
566
|
-
m_resultLen(sizeof(double)),
|
|
567
|
-
|
|
643
|
+
m_resultLen(sizeof(double)), m_resultType(ft_float),
|
|
644
|
+
m_decimals(0)
|
|
645
|
+
|
|
568
646
|
{
|
|
569
647
|
}
|
|
570
648
|
|
|
571
|
-
inline groupFuncBaseImple(const fieldNames& targetNames,
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
m_resultLen(sizeof(double)),
|
|
575
|
-
m_resultType(ft_float)
|
|
649
|
+
inline groupFuncBaseImple(const fieldNames& targetNames, const _TCHAR* resultName = NULL)
|
|
650
|
+
: m_resultKey(-1), m_resultLen(sizeof(double)), m_resultType(ft_float), m_decimals(0)
|
|
651
|
+
|
|
576
652
|
{
|
|
577
653
|
m_targetNames = targetNames;
|
|
578
654
|
m_resultName = (m_targetNames.count() &&
|
|
579
655
|
((resultName == NULL) || resultName[0] == 0x00))
|
|
580
|
-
? targetNames[0]
|
|
581
|
-
: resultName;
|
|
656
|
+
? targetNames[0] : resultName;
|
|
582
657
|
}
|
|
583
658
|
|
|
584
659
|
inline groupFuncBaseImple(const groupFuncBaseImple& r)
|
|
585
660
|
: m_targetNames(r.m_targetNames), m_resultName(r.m_resultName),
|
|
586
661
|
m_resultKey(r.m_resultKey),
|
|
587
|
-
m_resultLen(r.m_resultLen), m_resultType(r.m_resultType),
|
|
588
|
-
m_values(r.m_values), m_counts(r.m_counts)
|
|
662
|
+
m_resultLen(r.m_resultLen), m_resultType(r.m_resultType), m_decimals(r.m_decimals),
|
|
663
|
+
m_values(r.m_values), m_counts(r.m_counts),m_nulls(r.m_nulls)
|
|
589
664
|
{
|
|
590
|
-
copyStrings(r.m_strings);
|
|
665
|
+
copyStrings(r.m_strings);
|
|
591
666
|
}
|
|
592
667
|
|
|
593
668
|
groupFuncBaseImple& operator=(const groupFuncBaseImple& r)
|
|
@@ -599,8 +674,10 @@ public:
|
|
|
599
674
|
m_resultKey = r.m_resultKey;
|
|
600
675
|
m_resultType = r.m_resultType;
|
|
601
676
|
m_resultLen = r.m_resultLen;
|
|
677
|
+
m_decimals = r.m_decimals;
|
|
602
678
|
m_values = r.m_values;
|
|
603
679
|
m_counts = r.m_counts;
|
|
680
|
+
m_nulls = r.m_nulls;
|
|
604
681
|
m_strings.clear();
|
|
605
682
|
copyStrings(r.m_strings);
|
|
606
683
|
}
|
|
@@ -618,9 +695,9 @@ public:
|
|
|
618
695
|
m_resultLen = len;
|
|
619
696
|
}
|
|
620
697
|
|
|
621
|
-
inline uchar_td resultType() { return m_resultType; }
|
|
698
|
+
inline uchar_td resultType() const { return m_resultType; }
|
|
622
699
|
|
|
623
|
-
inline ushort_td resultLen() { return m_resultLen; }
|
|
700
|
+
inline ushort_td resultLen() const { return m_resultLen; }
|
|
624
701
|
|
|
625
702
|
inline void appendStringBuffer(int index)
|
|
626
703
|
{
|
|
@@ -643,15 +720,26 @@ public:
|
|
|
643
720
|
}
|
|
644
721
|
else
|
|
645
722
|
appendStringBuffer(index);
|
|
723
|
+
std::vector<bool>::iterator it = m_nulls.begin();
|
|
724
|
+
if (index)
|
|
725
|
+
it += index;
|
|
726
|
+
m_nulls.insert(it, true);
|
|
727
|
+
m_insertFlag = true;
|
|
646
728
|
}
|
|
647
729
|
|
|
648
730
|
inline void init(const fielddefs* fdinfo)
|
|
649
731
|
{
|
|
650
732
|
m_targetKeys.clear();
|
|
651
733
|
for (int i = 0; i < m_targetNames.count(); ++i)
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
: -1
|
|
734
|
+
{
|
|
735
|
+
int index = (m_targetNames[i][0] != 0x00)
|
|
736
|
+
? fdinfo->indexByName(m_targetNames[i]) : -1;
|
|
737
|
+
m_targetKeys.push_back(index);
|
|
738
|
+
|
|
739
|
+
//Auto set decimals
|
|
740
|
+
if (index != -1)
|
|
741
|
+
m_decimals = std::max<uchar_td>(m_decimals, (*fdinfo)[index].decimals);
|
|
742
|
+
}
|
|
655
743
|
m_resultKey = fdinfo->indexByName(m_resultName);
|
|
656
744
|
if (m_resultKey == -1)
|
|
657
745
|
m_resultKey = (int)fdinfo->size();
|
|
@@ -687,6 +775,15 @@ public:
|
|
|
687
775
|
}
|
|
688
776
|
|
|
689
777
|
inline int targetKeys() const { return (int)m_targetKeys.size(); }
|
|
778
|
+
|
|
779
|
+
inline bool insertFlag() const { return m_insertFlag; }
|
|
780
|
+
|
|
781
|
+
inline void clearFlag() { m_insertFlag = false;}
|
|
782
|
+
|
|
783
|
+
inline void setDecimals(uchar_td v) { m_decimals = v; }
|
|
784
|
+
|
|
785
|
+
inline uchar_td decimals() const { return m_decimals; }
|
|
786
|
+
|
|
690
787
|
};
|
|
691
788
|
|
|
692
789
|
// ---------------------------------------------------------------------------
|
|
@@ -727,10 +824,6 @@ void groupFuncBase::initResultVariable(int index)
|
|
|
727
824
|
m_imple->initResultVariable(index);
|
|
728
825
|
}
|
|
729
826
|
|
|
730
|
-
void groupFuncBase::doCalc(const row_ptr& row, int groupIndex)
|
|
731
|
-
{
|
|
732
|
-
}
|
|
733
|
-
|
|
734
827
|
void groupFuncBase::doInit(const fielddefs* fdinfo)
|
|
735
828
|
{
|
|
736
829
|
if (whereTokens() != 0)
|
|
@@ -744,6 +837,16 @@ void groupFuncBase::init(const fielddefs* fdinfo)
|
|
|
744
837
|
doInit(fdinfo);
|
|
745
838
|
}
|
|
746
839
|
|
|
840
|
+
bool groupFuncBase::insertFlag() const
|
|
841
|
+
{
|
|
842
|
+
return m_imple->insertFlag();
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
void groupFuncBase::clearInsertFlag()
|
|
846
|
+
{
|
|
847
|
+
m_imple->clearFlag();
|
|
848
|
+
}
|
|
849
|
+
|
|
747
850
|
groupFuncBase& groupFuncBase::operator=(const recordsetQuery& v)
|
|
748
851
|
{
|
|
749
852
|
recordsetQuery::operator=(v);
|
|
@@ -770,6 +873,11 @@ int groupFuncBase::resultKey() const
|
|
|
770
873
|
return m_imple->resultKey();
|
|
771
874
|
}
|
|
772
875
|
|
|
876
|
+
bool groupFuncBase::isNull(int index) const
|
|
877
|
+
{
|
|
878
|
+
return m_imple->m_nulls[index];
|
|
879
|
+
}
|
|
880
|
+
|
|
773
881
|
void groupFuncBase::reset()
|
|
774
882
|
{
|
|
775
883
|
recordsetQuery::reset();
|
|
@@ -781,10 +889,25 @@ void groupFuncBase::doReset()
|
|
|
781
889
|
m_imple->reset();
|
|
782
890
|
}
|
|
783
891
|
|
|
892
|
+
void groupFuncBase::doCalcEachkey(const field& fd, int index) {}
|
|
893
|
+
|
|
894
|
+
void groupFuncBase::doCalc(const row_ptr& row, int index)
|
|
895
|
+
{
|
|
896
|
+
for (int i = 0; i < m_imple->targetKeys(); ++i)
|
|
897
|
+
{
|
|
898
|
+
const field& fd = (*row)[m_imple->targetKey(i)];
|
|
899
|
+
if (!fd.isNull())
|
|
900
|
+
{
|
|
901
|
+
doCalcEachkey(fd, index);
|
|
902
|
+
m_imple->m_nulls[index] = false;
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
}
|
|
906
|
+
|
|
784
907
|
void groupFuncBase::operator()(const row_ptr& row, int index, bool insert)
|
|
785
908
|
{
|
|
786
909
|
if (insert)
|
|
787
|
-
initResultVariable(index);
|
|
910
|
+
initResultVariable(index);
|
|
788
911
|
bool flag = (whereTokens() == 0);
|
|
789
912
|
|
|
790
913
|
if (!flag)
|
|
@@ -813,6 +936,8 @@ uchar_td groupFuncBase::resultType() const
|
|
|
813
936
|
return m_imple->resultType();
|
|
814
937
|
}
|
|
815
938
|
|
|
939
|
+
uchar_td groupFuncBase::decimals() const { return m_imple->decimals();}
|
|
940
|
+
|
|
816
941
|
// ---------------------------------------------------------------------------
|
|
817
942
|
// class sum
|
|
818
943
|
// ---------------------------------------------------------------------------
|
|
@@ -826,12 +951,10 @@ sum::sum(const fieldNames& targetNames, const _TCHAR* resultName)
|
|
|
826
951
|
{
|
|
827
952
|
}
|
|
828
953
|
|
|
829
|
-
void sum::
|
|
954
|
+
void sum::doCalcEachkey(const field& fd, int index)
|
|
830
955
|
{
|
|
831
956
|
numeric_type tmp = 0;
|
|
832
|
-
|
|
833
|
-
m_imple->m_values[index] +=
|
|
834
|
-
fieldValue((*row)[m_imple->targetKey(i)], tmp);
|
|
957
|
+
m_imple->m_values[index] += fieldValue(fd, tmp);
|
|
835
958
|
}
|
|
836
959
|
|
|
837
960
|
groupFuncBase* sum::clone()
|
|
@@ -849,16 +972,38 @@ count* count::create(const _TCHAR* resultName)
|
|
|
849
972
|
return new count(resultName);
|
|
850
973
|
}
|
|
851
974
|
|
|
975
|
+
count* count::create(const fieldNames& targetNames, const _TCHAR* resultName)
|
|
976
|
+
{
|
|
977
|
+
return new count(targetNames, resultName);
|
|
978
|
+
}
|
|
979
|
+
|
|
852
980
|
count::count(const _TCHAR* resultName) : groupFuncBase()
|
|
853
981
|
{
|
|
854
982
|
setResultName(resultName);
|
|
855
983
|
}
|
|
856
984
|
|
|
857
|
-
|
|
985
|
+
count::count(const fieldNames& targetNames, const _TCHAR* resultName)
|
|
986
|
+
: groupFuncBase(targetNames, resultName) {}
|
|
987
|
+
|
|
988
|
+
void count::initResultVariable(int index)
|
|
989
|
+
{
|
|
990
|
+
groupFuncBase::initResultVariable(index);
|
|
991
|
+
m_imple->m_nulls[index] = false;
|
|
992
|
+
}
|
|
993
|
+
|
|
994
|
+
void count::doCalcEachkey(const field& fd, int index)
|
|
858
995
|
{
|
|
859
996
|
m_imple->m_values[index] = m_imple->m_values[index] + 1;
|
|
860
997
|
}
|
|
861
998
|
|
|
999
|
+
void count::doCalc(const row_ptr& row, int index)
|
|
1000
|
+
{
|
|
1001
|
+
if (m_imple->targetKeys())
|
|
1002
|
+
groupFuncBase::doCalc(row, index);
|
|
1003
|
+
else
|
|
1004
|
+
m_imple->m_values[index] = m_imple->m_values[index] + 1;
|
|
1005
|
+
}
|
|
1006
|
+
|
|
862
1007
|
groupFuncBase* count::clone()
|
|
863
1008
|
{
|
|
864
1009
|
count* p = new count();
|
|
@@ -874,26 +1019,35 @@ avg* avg::create(const fieldNames& targetNames, const _TCHAR* resultName)
|
|
|
874
1019
|
return new avg(targetNames, resultName);
|
|
875
1020
|
}
|
|
876
1021
|
|
|
1022
|
+
avg::avg() : groupFuncBase()
|
|
1023
|
+
{
|
|
1024
|
+
m_imple->setDecimals(4);
|
|
1025
|
+
}
|
|
1026
|
+
|
|
877
1027
|
avg::avg(const fieldNames& targetNames, const _TCHAR* resultName)
|
|
878
|
-
:
|
|
1028
|
+
: groupFuncBase(targetNames, resultName)
|
|
879
1029
|
{
|
|
1030
|
+
m_imple->setDecimals(4);
|
|
880
1031
|
}
|
|
881
1032
|
|
|
882
1033
|
void avg::initResultVariable(int index)
|
|
883
1034
|
{
|
|
884
|
-
|
|
1035
|
+
groupFuncBase::initResultVariable(index);
|
|
885
1036
|
m_imple->m_counts.insert(m_imple->m_counts.begin() + index, 0);
|
|
886
1037
|
}
|
|
887
1038
|
|
|
888
|
-
void avg::
|
|
1039
|
+
void avg::doCalcEachkey(const field& fd, int index)
|
|
889
1040
|
{
|
|
890
|
-
|
|
1041
|
+
numeric_type tmp = 0;
|
|
1042
|
+
m_imple->m_values[index] += fieldValue(fd, tmp);
|
|
891
1043
|
m_imple->m_counts[index] = m_imple->m_counts[index] + 1;
|
|
892
1044
|
}
|
|
893
1045
|
|
|
894
1046
|
avg::numeric_type avg::numericResult(int index) const
|
|
895
1047
|
{
|
|
896
|
-
|
|
1048
|
+
if (m_imple->m_counts[index])
|
|
1049
|
+
return m_imple->m_values[index] / m_imple->m_counts[index];
|
|
1050
|
+
return 0;
|
|
897
1051
|
}
|
|
898
1052
|
|
|
899
1053
|
groupFuncBase* avg::clone()
|
|
@@ -912,20 +1066,17 @@ min* min::create(const fieldNames& targetNames, const _TCHAR* resultName)
|
|
|
912
1066
|
}
|
|
913
1067
|
|
|
914
1068
|
min::min(const fieldNames& targetNames, const _TCHAR* resultName)
|
|
915
|
-
:
|
|
1069
|
+
: groupFuncBase(targetNames, resultName)
|
|
916
1070
|
{
|
|
917
1071
|
}
|
|
918
1072
|
|
|
919
|
-
void min::
|
|
1073
|
+
void min::doCalcEachkey(const field& fd, int index)
|
|
920
1074
|
{
|
|
921
1075
|
numeric_type tmp = 0;
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
tmp = fieldValue((*row)[m_imple->targetKey(i)], tmp);
|
|
925
|
-
if (m_flag || m_imple->m_values[index] > tmp)
|
|
926
|
-
m_flag = false;
|
|
1076
|
+
tmp = fieldValue(fd, tmp);
|
|
1077
|
+
if (insertFlag() || (tmp < m_imple->m_values[index]))
|
|
927
1078
|
m_imple->m_values[index] = tmp;
|
|
928
|
-
|
|
1079
|
+
clearInsertFlag();
|
|
929
1080
|
}
|
|
930
1081
|
|
|
931
1082
|
groupFuncBase* min::clone()
|
|
@@ -938,10 +1089,7 @@ groupFuncBase* min::clone()
|
|
|
938
1089
|
min& min::operator=(const min& r)
|
|
939
1090
|
{
|
|
940
1091
|
if (this != &r)
|
|
941
|
-
{
|
|
942
|
-
m_flag = r.m_flag;
|
|
943
1092
|
groupFuncBase::operator=(r);
|
|
944
|
-
}
|
|
945
1093
|
return *this;
|
|
946
1094
|
|
|
947
1095
|
}
|
|
@@ -955,20 +1103,17 @@ max* max::create(const fieldNames& targetNames, const _TCHAR* resultName)
|
|
|
955
1103
|
}
|
|
956
1104
|
|
|
957
1105
|
max::max(const fieldNames& targetNames, const _TCHAR* resultName)
|
|
958
|
-
:
|
|
1106
|
+
: groupFuncBase(targetNames, resultName)
|
|
959
1107
|
{
|
|
960
1108
|
}
|
|
961
1109
|
|
|
962
|
-
void max::
|
|
1110
|
+
void max::doCalcEachkey(const field& fd, int index)
|
|
963
1111
|
{
|
|
964
1112
|
numeric_type tmp = 0;
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
tmp = fieldValue((*row)[m_imple->targetKey(i)], tmp);
|
|
968
|
-
if (m_flag || m_imple->m_values[index] < tmp)
|
|
969
|
-
m_flag = false;
|
|
1113
|
+
tmp = fieldValue(fd, tmp);
|
|
1114
|
+
if (insertFlag() || (tmp > m_imple->m_values[index]))
|
|
970
1115
|
m_imple->m_values[index] = tmp;
|
|
971
|
-
|
|
1116
|
+
clearInsertFlag();
|
|
972
1117
|
}
|
|
973
1118
|
|
|
974
1119
|
groupFuncBase* max::clone()
|
|
@@ -981,10 +1126,7 @@ groupFuncBase* max::clone()
|
|
|
981
1126
|
max& max::operator=(const max& r)
|
|
982
1127
|
{
|
|
983
1128
|
if (this != &r)
|
|
984
|
-
{
|
|
985
|
-
m_flag = r.m_flag;
|
|
986
1129
|
groupFuncBase::operator=(r);
|
|
987
|
-
}
|
|
988
1130
|
return *this;
|
|
989
1131
|
}
|
|
990
1132
|
|
|
@@ -1014,23 +1156,31 @@ void last::doInit(const fielddefs* fdinfo)
|
|
|
1014
1156
|
}
|
|
1015
1157
|
}
|
|
1016
1158
|
|
|
1017
|
-
void last::
|
|
1159
|
+
void last::storeValue(const row_ptr& row, int index)
|
|
1018
1160
|
{
|
|
1019
|
-
|
|
1161
|
+
const field& fd = (*row)[m_imple->targetKey(0)];
|
|
1162
|
+
if (!fd.isNull())
|
|
1020
1163
|
{
|
|
1021
1164
|
numeric_type tmp = 0;
|
|
1022
1165
|
if (m_imple->resultType() == ft_float)
|
|
1023
|
-
m_imple->m_values[index] =
|
|
1024
|
-
fieldValue((*row)[m_imple->targetKey(0)], tmp);
|
|
1166
|
+
m_imple->m_values[index] = fieldValue(fd, tmp);
|
|
1025
1167
|
else
|
|
1026
1168
|
{
|
|
1027
1169
|
ushort_td len = m_imple->resultLen();
|
|
1028
1170
|
unsigned char* p = m_imple->m_strings[index];
|
|
1029
|
-
memcpy(p,
|
|
1171
|
+
memcpy(p, fd.ptr(), len);
|
|
1030
1172
|
}
|
|
1173
|
+
m_imple->m_nulls[index] = false;
|
|
1174
|
+
clearInsertFlag();
|
|
1031
1175
|
}
|
|
1032
1176
|
}
|
|
1033
1177
|
|
|
1178
|
+
void last::doCalc(const row_ptr& row, int index)
|
|
1179
|
+
{
|
|
1180
|
+
if (m_imple->targetKeys())
|
|
1181
|
+
storeValue(row, index);
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1034
1184
|
groupFuncBase* last::clone()
|
|
1035
1185
|
{
|
|
1036
1186
|
last* p = new last();
|
|
@@ -1047,30 +1197,15 @@ first* first::create(const fieldNames& targetNames, const _TCHAR* resultName)
|
|
|
1047
1197
|
}
|
|
1048
1198
|
|
|
1049
1199
|
first::first(const fieldNames& targetNames, const _TCHAR* resultName)
|
|
1050
|
-
: last(targetNames, resultName)
|
|
1200
|
+
: last(targetNames, resultName)
|
|
1051
1201
|
{
|
|
1052
1202
|
|
|
1053
1203
|
}
|
|
1054
1204
|
|
|
1055
1205
|
void first::doCalc(const row_ptr& row, int index)
|
|
1056
1206
|
{
|
|
1057
|
-
if (
|
|
1058
|
-
|
|
1059
|
-
if (m_imple->targetKeys())
|
|
1060
|
-
{
|
|
1061
|
-
numeric_type tmp = 0;
|
|
1062
|
-
if (m_imple->resultType() == ft_float)
|
|
1063
|
-
m_imple->m_values[index] =
|
|
1064
|
-
fieldValue((*row)[m_imple->targetKey(0)], tmp);
|
|
1065
|
-
else
|
|
1066
|
-
{
|
|
1067
|
-
ushort_td len = m_imple->resultLen();
|
|
1068
|
-
unsigned char* p = m_imple->m_strings[index];
|
|
1069
|
-
memcpy(p, (*row)[m_imple->targetKey(0)].ptr(), len);
|
|
1070
|
-
}
|
|
1071
|
-
}
|
|
1072
|
-
m_readed = true;
|
|
1073
|
-
}
|
|
1207
|
+
if (insertFlag() && m_imple->targetKeys())
|
|
1208
|
+
storeValue(row, index);
|
|
1074
1209
|
}
|
|
1075
1210
|
|
|
1076
1211
|
groupFuncBase* first::clone()
|
|
@@ -1082,17 +1217,13 @@ groupFuncBase* first::clone()
|
|
|
1082
1217
|
|
|
1083
1218
|
void first::doReset()
|
|
1084
1219
|
{
|
|
1085
|
-
m_readed = false;
|
|
1086
1220
|
groupFuncBase::reset();
|
|
1087
1221
|
}
|
|
1088
1222
|
|
|
1089
1223
|
first& first::operator=(const first& r)
|
|
1090
1224
|
{
|
|
1091
1225
|
if (this != &r)
|
|
1092
|
-
{
|
|
1093
|
-
m_readed = r.m_readed;
|
|
1094
1226
|
last::operator=(r);
|
|
1095
|
-
}
|
|
1096
1227
|
return *this;
|
|
1097
1228
|
}
|
|
1098
1229
|
|
|
@@ -1102,3 +1233,4 @@ first& first::operator=(const first& r)
|
|
|
1102
1233
|
} // namespace protocol
|
|
1103
1234
|
} // namespace db
|
|
1104
1235
|
} // namespace bzs
|
|
1236
|
+
|