transactd 2.2.0 → 2.3.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 +6 -6
- data/README +20 -18
- data/README-JA +19 -17
- data/RELEASE_NOTE +144 -0
- data/RELEASE_NOTE-JA +153 -0
- data/bin/common/tdclc_32_2_3.dll +0 -0
- data/bin/common/tdclc_64_2_3.dll +0 -0
- data/build/common/get_ruby_path.cmake +1 -1
- data/build/swig/ruby/ruby.swg +10 -9
- data/build/swig/ruby/tdclrb_wrap.cpp +1416 -561
- data/build/swig/tdcl.i +30 -3
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/BUILDNUMBER.txt +1 -0
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
- data/build/tdclrb/BUILDNUMBER.txt +1 -0
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +85 -41
- data/source/bzs/db/engine/mysql/database.h +35 -5
- data/source/bzs/db/engine/mysql/mysqlInternal.h +189 -37
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +21 -21
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +11 -0
- data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +11 -4
- data/source/bzs/db/protocol/tdap/client/client.h +30 -1
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +2 -1
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +35 -5
- data/source/bzs/db/protocol/tdap/client/field.cpp +100 -51
- data/source/bzs/db/protocol/tdap/client/field.h +7 -7
- data/source/bzs/db/protocol/tdap/client/filter.h +20 -6
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +337 -58
- data/source/bzs/db/protocol/tdap/client/groupQuery.h +56 -13
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +83 -5
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +2 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.h +2 -1
- data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +20 -6
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +7 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +8 -4
- data/source/bzs/db/protocol/tdap/client/request.h +11 -1
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +40 -2
- data/source/bzs/db/protocol/tdap/client/serializer.h +4 -2
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +1 -0
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +4 -4
- data/source/bzs/db/protocol/tdap/client/table.cpp +124 -71
- data/source/bzs/db/protocol/tdap/client/table.h +8 -7
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +33 -1
- data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +3 -1
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +20 -4
- data/source/bzs/db/protocol/tdap/mysql/request.h +14 -0
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +132 -69
- data/source/bzs/db/protocol/tdap/tdapRequest.h +18 -4
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +32 -22
- data/source/bzs/db/protocol/tdap/tdapSchema.h +69 -4
- data/source/bzs/db/protocol/tdap/tdapcapi.h +13 -5
- data/source/bzs/db/protocol/tdap/uri.h +4 -4
- data/source/bzs/db/transactd/transactd.cpp +6 -5
- data/source/bzs/env/crosscompile.cpp +17 -0
- data/source/bzs/env/crosscompile.h +4 -1
- data/source/bzs/env/mbcswchrLinux.cpp +3 -0
- data/source/bzs/example/deleteRecords.cpp +13 -0
- data/source/bzs/example/deleteRecords_c.cpp +8 -1
- data/source/bzs/example/insertRecords.cpp +14 -0
- data/source/bzs/example/insertRecords_c.cpp +8 -1
- data/source/bzs/example/ormap_c.cpp +8 -1
- data/source/bzs/example/queryData.cpp +92 -2
- data/source/bzs/example/queryData.h +3 -1
- data/source/bzs/example/readRecords.cpp +13 -0
- data/source/bzs/example/readRecords_c.cpp +8 -1
- data/source/bzs/example/updateRecords.cpp +13 -0
- data/source/bzs/example/updateRecords_c.cpp +8 -1
- data/source/bzs/example/update_with_transaction.cpp +13 -0
- data/source/bzs/example/update_with_transaction_c.cpp +8 -1
- data/source/bzs/example/useORMRecord.cpp +9 -3
- data/source/bzs/netsvc/client/iconnection.h +8 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +61 -16
- data/source/bzs/netsvc/client/tcpClient.h +430 -214
- data/source/bzs/netsvc/server/serverPipe.cpp +2 -2
- data/source/bzs/test/tdclphp/transactd_Test.php +115 -19
- data/source/bzs/test/tdclphp/transactd_blob_Test.php +33 -5
- data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +21 -3
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +17 -3
- data/source/bzs/test/tdclrb/transactd_blob_spec.rb +26 -8
- data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +13 -6
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +14 -8
- data/source/bzs/test/tdclrb/transactd_spec.rb +117 -27
- data/source/bzs/test/transactdBench/scaling_bench.cpp +5 -5
- data/source/bzs/test/transactdBench/workerBase.h +2 -2
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +898 -51
- data/source/global/tdclatl/Database.cpp +12 -0
- data/source/global/tdclatl/Database.h +4 -0
- data/source/global/tdclatl/FieldDef.cpp +19 -0
- data/source/global/tdclatl/FieldDef.h +4 -0
- data/source/global/tdclatl/FieldDefs.cpp +14 -16
- data/source/global/tdclatl/GroupQuery.cpp +21 -16
- data/source/global/tdclatl/GroupQuery.h +1 -1
- data/source/global/tdclatl/QueryBase.cpp +14 -0
- data/source/global/tdclatl/QueryBase.h +2 -0
- data/source/global/tdclatl/Record.cpp +41 -10
- data/source/global/tdclatl/Record.h +1 -1
- data/source/global/tdclatl/Recordset.cpp +117 -31
- data/source/global/tdclatl/Recordset.h +6 -5
- data/source/global/tdclatl/Table.cpp +24 -28
- data/source/global/tdclatl/Table.h +3 -4
- data/source/global/tdclatl/activeTable.cpp +149 -103
- data/source/global/tdclatl/activeTable.h +1 -1
- data/source/global/tdclatl/tdclatl.idl +38 -18
- data/transactd.gemspec +1 -1
- metadata +8 -4
- data/bin/common/tdclc_32_2_2.dll +0 -0
- data/bin/common/tdclc_64_2_2.dll +0 -0
|
@@ -213,6 +213,18 @@ STDMETHODIMP CDatabase::Disconnect(BSTR URI, VARIANT_BOOL* Param2)
|
|
|
213
213
|
return S_OK;
|
|
214
214
|
}
|
|
215
215
|
|
|
216
|
+
STDMETHODIMP CDatabase::DisconnectForReconnectTest(VARIANT_BOOL* Param2)
|
|
217
|
+
{
|
|
218
|
+
*Param2 = m_db->disconnectForReconnectTest();
|
|
219
|
+
return S_OK;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
STDMETHODIMP CDatabase::Reconnect(VARIANT_BOOL* Param2)
|
|
223
|
+
{
|
|
224
|
+
*Param2 = m_db->reconnect();
|
|
225
|
+
return S_OK;
|
|
226
|
+
}
|
|
227
|
+
|
|
216
228
|
STDMETHODIMP CDatabase::get_EnableTrn(VARIANT_BOOL* Value)
|
|
217
229
|
{
|
|
218
230
|
*Value = m_db->enableTrn();
|
|
@@ -48,6 +48,7 @@ class ATL_NO_VTABLE CDatabase
|
|
|
48
48
|
public:
|
|
49
49
|
CDatabase() : m_needRelese(true), m_IsAtatchOK(true)
|
|
50
50
|
{
|
|
51
|
+
bzs::db::protocol::tdap::client::nsdatabase::setCheckTablePtr(true);
|
|
51
52
|
m_db = bzs::db::protocol::tdap::client::database::create();
|
|
52
53
|
m_db->setOptionalData(this);
|
|
53
54
|
m_db->setOnCopyData(onCopyData);
|
|
@@ -104,6 +105,9 @@ public:
|
|
|
104
105
|
STDMETHOD(Connect)(BSTR URI, VARIANT_BOOL newConnection,
|
|
105
106
|
VARIANT_BOOL* Value);
|
|
106
107
|
STDMETHOD(Disconnect)(BSTR URI, VARIANT_BOOL* Param2);
|
|
108
|
+
STDMETHOD(DisconnectForReconnectTest)(VARIANT_BOOL* Param2);
|
|
109
|
+
STDMETHOD(Reconnect)(VARIANT_BOOL* Param2);
|
|
110
|
+
|
|
107
111
|
STDMETHOD(get_EnableTrn)(VARIANT_BOOL* Value);
|
|
108
112
|
STDMETHOD(GetBtrVersion)(int index, ITdVersion** ver);
|
|
109
113
|
|
|
@@ -275,3 +275,22 @@ STDMETHODIMP CFieldDef::get_Index(short* Value)
|
|
|
275
275
|
*Value = m_index;
|
|
276
276
|
return S_OK;
|
|
277
277
|
}
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
STDMETHODIMP CFieldDef::SetPadCharSettings(VARIANT_BOOL set, VARIANT_BOOL trim)
|
|
281
|
+
{
|
|
282
|
+
fielddef()->setPadCharSettings(set, trim);
|
|
283
|
+
return S_OK;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
STDMETHODIMP CFieldDef::get_UsePadChar(VARIANT_BOOL* Value)
|
|
287
|
+
{
|
|
288
|
+
*Value = fielddef()->usePadChar();
|
|
289
|
+
return S_OK;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
STDMETHODIMP CFieldDef::get_TrimPadChar(VARIANT_BOOL* Value)
|
|
293
|
+
{
|
|
294
|
+
*Value = fielddef()->trimPadChar();
|
|
295
|
+
return S_OK;
|
|
296
|
+
}
|
|
@@ -103,4 +103,8 @@ public:
|
|
|
103
103
|
STDMETHOD(get_CharNum)(unsigned int* Value);
|
|
104
104
|
STDMETHOD(SetLenByCharnum)(unsigned short Value);
|
|
105
105
|
STDMETHOD(get_Index)(short* Value);
|
|
106
|
+
STDMETHOD(SetPadCharSettings)(VARIANT_BOOL set, VARIANT_BOOL trim);
|
|
107
|
+
STDMETHOD(get_UsePadChar)(VARIANT_BOOL* Value);
|
|
108
|
+
STDMETHOD(get_TrimPadChar)(VARIANT_BOOL* Value);
|
|
109
|
+
|
|
106
110
|
};
|
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
|
|
23
23
|
void CFieldDefs::FinalRelease()
|
|
24
24
|
{
|
|
25
|
+
if (m_fieldDefObj)
|
|
26
|
+
m_fieldDefObj->Release();
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
short CFieldDefs::GetFieldNum(VARIANT* Index)
|
|
@@ -43,24 +45,20 @@ STDMETHODIMP CFieldDefs::IndexByName(BSTR Name, short* retVal)
|
|
|
43
45
|
STDMETHODIMP CFieldDefs::get_FieldDef(VARIANT Name, IFieldDef** retVal)
|
|
44
46
|
{
|
|
45
47
|
short index = GetFieldNum(&Name);
|
|
46
|
-
if (index
|
|
48
|
+
if (index < 0)
|
|
49
|
+
return Error("Invalid index", IID_IFieldDefs);
|
|
50
|
+
if (m_fieldDefObj == NULL)
|
|
47
51
|
{
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
if (m_fieldDefObj)
|
|
53
|
-
{
|
|
54
|
-
m_fieldDefObj->m_fielddef = &((*m_fds)[index]);
|
|
55
|
-
|
|
56
|
-
IFieldDef* fd;
|
|
57
|
-
m_fieldDefObj->QueryInterface(IID_IFieldDef, (void**)&fd);
|
|
58
|
-
_ASSERTE(fd);
|
|
59
|
-
*retVal = fd;
|
|
60
|
-
}
|
|
52
|
+
CComObject<CFieldDef>::CreateInstance(&m_fieldDefObj);
|
|
53
|
+
if (!m_fieldDefObj)
|
|
54
|
+
return Error("CreateInstance FieldDef", IID_IFieldDefs);
|
|
55
|
+
m_fieldDefObj->AddRef();
|
|
61
56
|
}
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
m_fieldDefObj->m_fielddef = &((*m_fds)[index]);
|
|
58
|
+
IFieldDef* fd;
|
|
59
|
+
m_fieldDefObj->QueryInterface(IID_IFieldDef, (void**)&fd);
|
|
60
|
+
_ASSERTE(fd);
|
|
61
|
+
*retVal = fd;
|
|
64
62
|
return S_OK;
|
|
65
63
|
}
|
|
66
64
|
|
|
@@ -68,33 +68,39 @@ STDMETHODIMP CGroupQuery::KeyField(BSTR Name0, BSTR Name1, BSTR Name2,
|
|
|
68
68
|
return S_OK;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
STDMETHODIMP CGroupQuery::AddFunction(eGroupFunc func,
|
|
71
|
+
STDMETHODIMP CGroupQuery::AddFunction(eGroupFunc func, VARIANT targetNames,
|
|
72
72
|
BSTR resultName, VARIANT iq,
|
|
73
73
|
IGroupQuery** retVal)
|
|
74
74
|
{
|
|
75
|
-
|
|
76
|
-
CFieldNames* fn =
|
|
77
|
-
if (
|
|
75
|
+
fieldNames* fns = NULL;
|
|
76
|
+
CFieldNames* fn = NULL;
|
|
77
|
+
if (targetNames.vt == VT_DISPATCH)
|
|
78
|
+
fn = dynamic_cast<CFieldNames*>(targetNames.pdispVal);
|
|
79
|
+
|
|
80
|
+
if ((func != fcount) && !fn)
|
|
78
81
|
return Error("Invalid targetNames", IID_IGroupQuery);
|
|
79
|
-
|
|
82
|
+
if (fn)
|
|
83
|
+
fns = fn->m_fnsPtr;
|
|
80
84
|
boost::shared_ptr<groupFuncBase> f;
|
|
81
|
-
|
|
82
|
-
fns = fn->m_fnsPtr;
|
|
83
|
-
|
|
85
|
+
|
|
84
86
|
if (func == fsum)
|
|
85
|
-
f.reset(
|
|
87
|
+
f.reset(sum::create(*fns, resultName), boost::bind(&sum::release, _1));
|
|
86
88
|
else if (func == fmin)
|
|
87
|
-
f.reset(
|
|
89
|
+
f.reset(min::create(*fns, resultName), boost::bind(&min::release, _1));
|
|
88
90
|
else if (func == fmax)
|
|
89
|
-
f.reset(
|
|
91
|
+
f.reset(max::create(*fns, resultName), boost::bind(&max::release, _1));
|
|
90
92
|
else if (func == favg)
|
|
91
|
-
f.reset(
|
|
93
|
+
f.reset(avg::create(*fns, resultName), boost::bind(&avg::release, _1));
|
|
94
|
+
else if (func == ffirst)
|
|
95
|
+
f.reset(first::create(*fns, resultName), boost::bind(&first::release, _1));
|
|
96
|
+
else if (func == flast)
|
|
97
|
+
f.reset(last::create(*fns, resultName), boost::bind(&last::release, _1));
|
|
92
98
|
else if (func == fcount)
|
|
93
99
|
{
|
|
94
100
|
if (resultName[0])
|
|
95
|
-
f.reset(
|
|
101
|
+
f.reset(count::create(resultName), boost::bind(&count::release, _1));
|
|
96
102
|
else
|
|
97
|
-
f.reset(
|
|
103
|
+
f.reset(count::create(fns->getValue(0)), boost::bind(&count::release, _1));
|
|
98
104
|
}
|
|
99
105
|
if (iq.vt == VT_DISPATCH)
|
|
100
106
|
{
|
|
@@ -102,8 +108,7 @@ STDMETHODIMP CGroupQuery::AddFunction(eGroupFunc func, IFieldNames* targetNames,
|
|
|
102
108
|
if (q)
|
|
103
109
|
*f = (q->m_qb);
|
|
104
110
|
}
|
|
105
|
-
|
|
106
|
-
f->reset();
|
|
111
|
+
|
|
107
112
|
m_funcs.push_back(f);
|
|
108
113
|
m_gq.addFunction(f.get());
|
|
109
114
|
|
|
@@ -56,7 +56,7 @@ public:
|
|
|
56
56
|
BSTR Name4, BSTR Name5, BSTR Name6, BSTR Name7,
|
|
57
57
|
BSTR Name8, BSTR Name9, BSTR Name10,
|
|
58
58
|
IGroupQuery** retVal);
|
|
59
|
-
STDMETHOD(AddFunction)(eGroupFunc func,
|
|
59
|
+
STDMETHOD(AddFunction)(eGroupFunc func, VARIANT targetNames,
|
|
60
60
|
BSTR resultName, VARIANT q, IGroupQuery** retVal);
|
|
61
61
|
|
|
62
62
|
STDMETHOD(Reset)(IGroupQuery** retVal);
|
|
@@ -309,3 +309,17 @@ STDMETHODIMP CQueryBase::IsBookmarkAlso(VARIANT_BOOL* retVal)
|
|
|
309
309
|
*retVal = m_qb.isBookmarkAlso();
|
|
310
310
|
return S_OK;
|
|
311
311
|
}
|
|
312
|
+
|
|
313
|
+
STDMETHODIMP CQueryBase::StopAtLimit(VARIANT_BOOL v, IQueryBase** retVal)
|
|
314
|
+
{
|
|
315
|
+
m_qb.stopAtLimit(v == -1);
|
|
316
|
+
setResult(retVal);
|
|
317
|
+
return S_OK;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
STDMETHODIMP CQueryBase::IsStopAtLimit(VARIANT_BOOL* retVal)
|
|
321
|
+
{
|
|
322
|
+
*retVal = m_qb.isStopAtLimit();
|
|
323
|
+
return S_OK;
|
|
324
|
+
}
|
|
325
|
+
|
|
@@ -87,6 +87,8 @@ public:
|
|
|
87
87
|
STDMETHOD(GetWhereToken)(short index, BSTR* retVal);
|
|
88
88
|
STDMETHOD(BookmarkAlso)(VARIANT_BOOL Value, IQueryBase** retVal);
|
|
89
89
|
STDMETHOD(IsBookmarkAlso)(VARIANT_BOOL* retVal);
|
|
90
|
+
STDMETHOD(StopAtLimit)(VARIANT_BOOL Value, IQueryBase** retVal);
|
|
91
|
+
STDMETHOD(IsStopAtLimit)(VARIANT_BOOL* retVal);
|
|
90
92
|
};
|
|
91
93
|
|
|
92
94
|
OBJECT_ENTRY_AUTO(__uuidof(QueryBase), CQueryBase)
|
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
|
|
24
24
|
void CRecord::FinalRelease()
|
|
25
25
|
{
|
|
26
|
+
if (m_fieldObj != NULL)
|
|
27
|
+
m_fieldObj->Release();
|
|
26
28
|
}
|
|
27
29
|
short CRecord::GetFieldNum(VARIANT* Index)
|
|
28
30
|
{
|
|
@@ -47,17 +49,25 @@ STDMETHODIMP CRecord::get_Field(VARIANT Index, IField** retVal)
|
|
|
47
49
|
return Error("Invalid index", IID_ITable);
|
|
48
50
|
|
|
49
51
|
if (m_fieldObj == NULL)
|
|
52
|
+
{
|
|
50
53
|
CComObject<CField>::CreateInstance(&m_fieldObj);
|
|
51
|
-
|
|
52
|
-
|
|
54
|
+
if (!m_fieldObj)
|
|
55
|
+
return Error("CreateInstance Field", IID_IRecord);
|
|
56
|
+
m_fieldObj->AddRef();
|
|
57
|
+
}
|
|
58
|
+
try
|
|
53
59
|
{
|
|
54
60
|
m_fieldObj->m_fd = (*m_rec)[index];
|
|
55
61
|
IField* fd;
|
|
56
62
|
m_fieldObj->QueryInterface(IID_IField, (void**)&fd);
|
|
57
63
|
_ASSERTE(fd);
|
|
58
64
|
*retVal = fd;
|
|
65
|
+
return S_OK;
|
|
66
|
+
}
|
|
67
|
+
catch (bzs::rtl::exception& e)
|
|
68
|
+
{
|
|
69
|
+
return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IRecord);
|
|
59
70
|
}
|
|
60
|
-
return S_OK;
|
|
61
71
|
}
|
|
62
72
|
|
|
63
73
|
STDMETHODIMP CRecord::get_IsInvalidRecord(VARIANT_BOOL* retVal)
|
|
@@ -66,8 +76,14 @@ STDMETHODIMP CRecord::get_IsInvalidRecord(VARIANT_BOOL* retVal)
|
|
|
66
76
|
return S_OK;
|
|
67
77
|
}
|
|
68
78
|
|
|
79
|
+
|
|
80
|
+
//---------------------------------------------------------------------
|
|
69
81
|
void CWritableRecord::FinalRelease()
|
|
70
82
|
{
|
|
83
|
+
if (m_fieldDefsObj != NULL)
|
|
84
|
+
m_fieldDefsObj->Release();
|
|
85
|
+
if (m_fieldObj)
|
|
86
|
+
m_fieldObj->Release();
|
|
71
87
|
}
|
|
72
88
|
|
|
73
89
|
short CWritableRecord::GetFieldNum(VARIANT* Index)
|
|
@@ -99,17 +115,25 @@ STDMETHODIMP CWritableRecord::get_Field(VARIANT Index, IField** retVal)
|
|
|
99
115
|
return Error("Invalid index", IID_IWritableRecord);
|
|
100
116
|
|
|
101
117
|
if (m_fieldObj == NULL)
|
|
118
|
+
{
|
|
102
119
|
CComObject<CField>::CreateInstance(&m_fieldObj);
|
|
103
|
-
|
|
104
|
-
|
|
120
|
+
if (!m_fieldObj)
|
|
121
|
+
return Error("CreateInstance Field", IID_IWritableRecord);
|
|
122
|
+
m_fieldObj->AddRef();
|
|
123
|
+
}
|
|
124
|
+
try
|
|
105
125
|
{
|
|
106
126
|
m_fieldObj->m_fd = (*m_rec)[index];
|
|
107
127
|
IField* fd;
|
|
108
128
|
m_fieldObj->QueryInterface(IID_IField, (void**)&fd);
|
|
109
129
|
_ASSERTE(fd);
|
|
110
130
|
*retVal = fd;
|
|
131
|
+
return S_OK;
|
|
132
|
+
}
|
|
133
|
+
catch (bzs::rtl::exception& e)
|
|
134
|
+
{
|
|
135
|
+
return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IWritableRecord);
|
|
111
136
|
}
|
|
112
|
-
return S_OK;
|
|
113
137
|
}
|
|
114
138
|
|
|
115
139
|
STDMETHODIMP CWritableRecord::Save()
|
|
@@ -181,18 +205,25 @@ STDMETHODIMP CWritableRecord::Read(VARIANT_BOOL KeysetAlrady,
|
|
|
181
205
|
STDMETHODIMP CWritableRecord::get_FieldDefs(IFieldDefs** retVal)
|
|
182
206
|
{
|
|
183
207
|
if (m_fieldDefsObj == NULL)
|
|
208
|
+
{
|
|
184
209
|
CComObject<CFieldDefs>::CreateInstance(&m_fieldDefsObj);
|
|
185
|
-
|
|
186
|
-
|
|
210
|
+
if (!m_fieldDefsObj)
|
|
211
|
+
return Error("CreateInstance FieldDefs", IID_IWritableRecord);
|
|
212
|
+
m_fieldDefsObj->AddRef();
|
|
213
|
+
}
|
|
214
|
+
try
|
|
187
215
|
{
|
|
188
216
|
m_fieldDefsObj->m_fds = m_rec->fieldDefs();
|
|
189
|
-
|
|
190
217
|
IFieldDefs* fds;
|
|
191
218
|
m_fieldDefsObj->QueryInterface(IID_IFieldDefs, (void**)&fds);
|
|
192
219
|
_ASSERTE(fds);
|
|
193
220
|
*retVal = fds;
|
|
221
|
+
return S_OK;
|
|
222
|
+
}
|
|
223
|
+
catch (bzs::rtl::exception& e)
|
|
224
|
+
{
|
|
225
|
+
return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IWritableRecord);
|
|
194
226
|
}
|
|
195
|
-
return S_OK;
|
|
196
227
|
}
|
|
197
228
|
|
|
198
229
|
STDMETHODIMP CWritableRecord::get_IsInvalidRecord(VARIANT_BOOL* retVal)
|
|
@@ -64,8 +64,8 @@ class ATL_NO_VTABLE CWritableRecord
|
|
|
64
64
|
{
|
|
65
65
|
|
|
66
66
|
CComObject<CField>* m_fieldObj;
|
|
67
|
-
short GetFieldNum(VARIANT* Index);
|
|
68
67
|
CComObject<CFieldDefs>* m_fieldDefsObj;
|
|
68
|
+
short GetFieldNum(VARIANT* Index);
|
|
69
69
|
|
|
70
70
|
public:
|
|
71
71
|
bzs::db::protocol::tdap::client::writableRecord* m_rec;
|
|
@@ -27,13 +27,23 @@
|
|
|
27
27
|
using namespace bzs::db::protocol::tdap::client;
|
|
28
28
|
|
|
29
29
|
CARecordset::CARecordset()
|
|
30
|
-
: m_rs(
|
|
30
|
+
: m_rs(recordset::create()), m_recObj(NULL), m_fieldDefsObj(NULL)
|
|
31
31
|
{
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
CARecordset
|
|
34
|
+
void CARecordset::FinalRelease()
|
|
35
35
|
{
|
|
36
36
|
|
|
37
|
+
if (m_recObj)
|
|
38
|
+
m_recObj->Release();
|
|
39
|
+
if (m_fieldDefsObj)
|
|
40
|
+
m_fieldDefsObj->Release();
|
|
41
|
+
m_rs->release();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
CARecordset::~CARecordset()
|
|
45
|
+
{
|
|
46
|
+
|
|
37
47
|
}
|
|
38
48
|
|
|
39
49
|
void CARecordset::setResult(IRecordset** retVal)
|
|
@@ -46,17 +56,25 @@ STDMETHODIMP CARecordset::Record(unsigned long Index, IRecord** retVal)
|
|
|
46
56
|
if (Index >= 0 && Index < m_rs->size())
|
|
47
57
|
{
|
|
48
58
|
if (m_recObj == NULL)
|
|
59
|
+
{
|
|
49
60
|
CComObject<CRecord>::CreateInstance(&m_recObj);
|
|
50
|
-
|
|
51
|
-
|
|
61
|
+
if (!m_recObj)
|
|
62
|
+
return Error("CreateInstance Record", IID_IRecordset);
|
|
63
|
+
m_recObj->AddRef();
|
|
64
|
+
}
|
|
65
|
+
try
|
|
52
66
|
{
|
|
53
67
|
m_recObj->m_rec = &((*m_rs)[Index]);
|
|
54
68
|
IRecord* rec;
|
|
55
69
|
m_recObj->QueryInterface(IID_IRecord, (void**)&rec);
|
|
56
70
|
_ASSERTE(rec);
|
|
57
71
|
*retVal = rec;
|
|
72
|
+
return S_OK;
|
|
73
|
+
}
|
|
74
|
+
catch (bzs::rtl::exception& e)
|
|
75
|
+
{
|
|
76
|
+
return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IRecordset);
|
|
58
77
|
}
|
|
59
|
-
return S_OK;
|
|
60
78
|
}
|
|
61
79
|
return Error("Invalid index", IID_IRecordset);
|
|
62
80
|
}
|
|
@@ -77,15 +95,23 @@ STDMETHODIMP CARecordset::Top(unsigned long Num, IRecordset** retVal)
|
|
|
77
95
|
{
|
|
78
96
|
CComObject<CARecordset>* rsObj;
|
|
79
97
|
CComObject<CARecordset>::CreateInstance(&rsObj);
|
|
80
|
-
|
|
98
|
+
try
|
|
81
99
|
{
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
100
|
+
if (rsObj)
|
|
101
|
+
{
|
|
102
|
+
m_rs->top(*rsObj->m_rs, Num);
|
|
103
|
+
IRecordset* rs;
|
|
104
|
+
rsObj->QueryInterface(IID_IRecordset, (void**)&rs);
|
|
105
|
+
_ASSERTE(rs);
|
|
106
|
+
*retVal = rs;
|
|
107
|
+
return S_OK;
|
|
108
|
+
}
|
|
109
|
+
return Error("CreateInstance Recordset", IID_IRecordset);
|
|
110
|
+
}
|
|
111
|
+
catch (bzs::rtl::exception& e)
|
|
112
|
+
{
|
|
113
|
+
return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IRecordset);
|
|
87
114
|
}
|
|
88
|
-
return S_OK;
|
|
89
115
|
}
|
|
90
116
|
return Error("Invalid top number", IID_IRecordset);
|
|
91
117
|
}
|
|
@@ -96,21 +122,36 @@ STDMETHODIMP CARecordset::Clone(IRecordset** retVal)
|
|
|
96
122
|
CComObject<CARecordset>::CreateInstance(&rsObj);
|
|
97
123
|
if (rsObj)
|
|
98
124
|
{
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
125
|
+
try
|
|
126
|
+
{
|
|
127
|
+
rsObj->setRecordset(m_rs->clone());
|
|
128
|
+
IRecordset* rs;
|
|
129
|
+
rsObj->QueryInterface(IID_IRecordset, (void**)&rs);
|
|
130
|
+
_ASSERTE(rs);
|
|
131
|
+
*retVal = rs;
|
|
132
|
+
return S_OK;
|
|
133
|
+
}
|
|
134
|
+
catch (bzs::rtl::exception& e)
|
|
135
|
+
{
|
|
136
|
+
return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IRecordset);
|
|
137
|
+
}
|
|
104
138
|
}
|
|
105
|
-
return
|
|
139
|
+
return Error("CreateInstance Recordset", IID_IRecordset);
|
|
106
140
|
}
|
|
107
141
|
|
|
108
142
|
STDMETHODIMP CARecordset::Erase(unsigned long Index)
|
|
109
143
|
{
|
|
110
144
|
if (Index >= 0 && Index < m_rs->size())
|
|
111
145
|
{
|
|
112
|
-
|
|
113
|
-
|
|
146
|
+
try
|
|
147
|
+
{
|
|
148
|
+
m_rs->erase(Index);
|
|
149
|
+
return S_OK;
|
|
150
|
+
}
|
|
151
|
+
catch (bzs::rtl::exception& e)
|
|
152
|
+
{
|
|
153
|
+
return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IRecordset);
|
|
154
|
+
}
|
|
114
155
|
}
|
|
115
156
|
return Error("Invalid index", IID_IRecordset);
|
|
116
157
|
}
|
|
@@ -247,37 +288,82 @@ STDMETHODIMP CARecordset::OrderByEx(ISortFields* sortFields,
|
|
|
247
288
|
|
|
248
289
|
STDMETHODIMP CARecordset::Reverse(IRecordset** retVal)
|
|
249
290
|
{
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
291
|
+
try
|
|
292
|
+
{
|
|
293
|
+
m_rs->reverse();
|
|
294
|
+
setResult(retVal);
|
|
295
|
+
return S_OK;
|
|
296
|
+
}
|
|
297
|
+
catch (bzs::rtl::exception& e)
|
|
298
|
+
{
|
|
299
|
+
return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IRecordset);
|
|
300
|
+
}
|
|
253
301
|
}
|
|
254
302
|
|
|
255
303
|
STDMETHODIMP CARecordset::get_FieldDefs(IFieldDefs** retVal)
|
|
256
304
|
{
|
|
257
305
|
if (m_fieldDefsObj == NULL)
|
|
306
|
+
{
|
|
258
307
|
CComObject<CFieldDefs>::CreateInstance(&m_fieldDefsObj);
|
|
259
|
-
|
|
308
|
+
if (!m_fieldDefsObj)
|
|
309
|
+
return Error("CreateInstance FieldDefs", IID_IRecordset);
|
|
310
|
+
m_fieldDefsObj->AddRef();
|
|
311
|
+
}
|
|
312
|
+
try
|
|
260
313
|
{
|
|
261
314
|
m_fieldDefsObj->m_fds = m_rs->fieldDefs();
|
|
262
|
-
|
|
263
315
|
IFieldDefs* fds;
|
|
264
316
|
m_fieldDefsObj->QueryInterface(IID_IFieldDefs, (void**)&fds);
|
|
265
317
|
_ASSERTE(fds);
|
|
266
318
|
*retVal = fds;
|
|
319
|
+
return S_OK;
|
|
320
|
+
}
|
|
321
|
+
catch (bzs::rtl::exception& e)
|
|
322
|
+
{
|
|
323
|
+
return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IRecordset);
|
|
267
324
|
}
|
|
268
|
-
return S_OK;
|
|
269
325
|
}
|
|
270
326
|
|
|
271
|
-
|
|
272
327
|
STDMETHODIMP CARecordset::Clear()
|
|
273
328
|
{
|
|
274
|
-
|
|
275
|
-
|
|
329
|
+
try
|
|
330
|
+
{
|
|
331
|
+
m_rs->clear();
|
|
332
|
+
return S_OK;
|
|
333
|
+
}
|
|
334
|
+
catch (bzs::rtl::exception& e)
|
|
335
|
+
{
|
|
336
|
+
return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IRecordset);
|
|
337
|
+
}
|
|
276
338
|
}
|
|
277
339
|
|
|
278
340
|
STDMETHODIMP CARecordset::ClearRecords()
|
|
279
341
|
{
|
|
280
|
-
|
|
281
|
-
|
|
342
|
+
try
|
|
343
|
+
{
|
|
344
|
+
m_rs->clearRecords();
|
|
345
|
+
return S_OK;
|
|
346
|
+
}
|
|
347
|
+
catch (bzs::rtl::exception& e)
|
|
348
|
+
{
|
|
349
|
+
return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IRecordset);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
STDMETHODIMP CARecordset::UnionRecordset(IRecordset* rs, IRecordset** retVal)
|
|
354
|
+
{
|
|
355
|
+
try
|
|
356
|
+
{
|
|
357
|
+
CARecordset* p = dynamic_cast<CARecordset*>(rs);
|
|
358
|
+
if (!p)
|
|
359
|
+
return Error(_T("Invalid ActiveTable::UnionRecordset param 1"), IID_IRecordset);
|
|
360
|
+
*m_rs += *(p->m_rs);
|
|
361
|
+
setResult(retVal);
|
|
362
|
+
return S_OK;
|
|
363
|
+
}
|
|
364
|
+
catch (bzs::rtl::exception& e)
|
|
365
|
+
{
|
|
366
|
+
return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IRecordset);
|
|
367
|
+
}
|
|
282
368
|
}
|
|
283
369
|
|
|
@@ -35,9 +35,7 @@ class ATL_NO_VTABLE CARecordset
|
|
|
35
35
|
void setResult(IRecordset** retVal);
|
|
36
36
|
CComObject<CRecord>* m_recObj;
|
|
37
37
|
CComObject<CFieldDefs>* m_fieldDefsObj;
|
|
38
|
-
typedef
|
|
39
|
-
internal_ptr;
|
|
40
|
-
|
|
38
|
+
typedef bzs::db::protocol::tdap::client::recordset* internal_ptr;
|
|
41
39
|
public:
|
|
42
40
|
internal_ptr m_rs;
|
|
43
41
|
|
|
@@ -45,7 +43,9 @@ public:
|
|
|
45
43
|
~CARecordset();
|
|
46
44
|
void setRecordset(bzs::db::protocol::tdap::client::recordset* rs)
|
|
47
45
|
{
|
|
48
|
-
m_rs
|
|
46
|
+
if (m_rs)
|
|
47
|
+
m_rs->release();
|
|
48
|
+
m_rs = rs;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
BEGIN_COM_MAP(CARecordset)
|
|
@@ -57,7 +57,7 @@ public:
|
|
|
57
57
|
|
|
58
58
|
HRESULT FinalConstruct() { return S_OK; }
|
|
59
59
|
|
|
60
|
-
void FinalRelease()
|
|
60
|
+
void FinalRelease();
|
|
61
61
|
|
|
62
62
|
public:
|
|
63
63
|
STDMETHOD(Record)(unsigned long Index, IRecord** retVal);
|
|
@@ -82,5 +82,6 @@ public:
|
|
|
82
82
|
STDMETHOD(Clone)(IRecordset** retVal);
|
|
83
83
|
STDMETHOD(Clear)();
|
|
84
84
|
STDMETHOD(ClearRecords)();
|
|
85
|
+
STDMETHOD(UnionRecordset)(IRecordset* rs, IRecordset** retVal);
|
|
85
86
|
|
|
86
87
|
};
|
|
@@ -385,15 +385,18 @@ STDMETHODIMP CTableTd::put_FilterRejectCount(long Value)
|
|
|
385
385
|
|
|
386
386
|
STDMETHODIMP CTableTd::Field(VARIANT Index, IField** retVal)
|
|
387
387
|
{
|
|
388
|
-
|
|
389
388
|
short index = GetFieldNum(&Index);
|
|
390
389
|
if (index < 0)
|
|
391
390
|
return Error("Invalid index", IID_ITable);
|
|
392
391
|
|
|
393
392
|
if (m_fieldObj == NULL)
|
|
393
|
+
{
|
|
394
394
|
CComObject<CField>::CreateInstance(&m_fieldObj);
|
|
395
|
-
|
|
396
|
-
|
|
395
|
+
if (!m_fieldObj)
|
|
396
|
+
return Error("CreateInstance Field", IID_ITable);
|
|
397
|
+
m_fieldObj->AddRef();
|
|
398
|
+
}
|
|
399
|
+
try
|
|
397
400
|
{
|
|
398
401
|
client::fields fds(*m_tb);
|
|
399
402
|
m_fieldObj->m_fd = fds[index];
|
|
@@ -401,8 +404,12 @@ STDMETHODIMP CTableTd::Field(VARIANT Index, IField** retVal)
|
|
|
401
404
|
m_fieldObj->QueryInterface(IID_IField, (void**)&fd);
|
|
402
405
|
_ASSERTE(fd);
|
|
403
406
|
*retVal = fd;
|
|
407
|
+
return S_OK;
|
|
408
|
+
}
|
|
409
|
+
catch (bzs::rtl::exception& e)
|
|
410
|
+
{
|
|
411
|
+
return Error((*bzs::rtl::getMsg(e)).c_str(), IID_ITable);
|
|
404
412
|
}
|
|
405
|
-
return S_OK;
|
|
406
413
|
}
|
|
407
414
|
|
|
408
415
|
STDMETHODIMP CTableTd::get_CanDelete(VARIANT_BOOL* Value)
|
|
@@ -542,30 +549,6 @@ STDMETHODIMP CTableTd::put_LogicalToString(VARIANT_BOOL Value)
|
|
|
542
549
|
return S_OK;
|
|
543
550
|
}
|
|
544
551
|
|
|
545
|
-
STDMETHODIMP CTableTd::get_TrimPadChar(VARIANT_BOOL* Value)
|
|
546
|
-
{
|
|
547
|
-
*Value = m_tb->trimPadChar();
|
|
548
|
-
return S_OK;
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
STDMETHODIMP CTableTd::put_TrimPadChar(VARIANT_BOOL Value)
|
|
552
|
-
{
|
|
553
|
-
m_tb->setTrimPadChar(Value);
|
|
554
|
-
return S_OK;
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
STDMETHODIMP CTableTd::get_UsePadChar(VARIANT_BOOL* Value)
|
|
558
|
-
{
|
|
559
|
-
*Value = m_tb->usePadChar();
|
|
560
|
-
return S_OK;
|
|
561
|
-
}
|
|
562
|
-
|
|
563
|
-
STDMETHODIMP CTableTd::put_UsePadChar(VARIANT_BOOL Value)
|
|
564
|
-
{
|
|
565
|
-
m_tb->setUsePadChar(Value);
|
|
566
|
-
return S_OK;
|
|
567
|
-
}
|
|
568
|
-
|
|
569
552
|
STDMETHODIMP CTableTd::MoveBookmarksId(long Value)
|
|
570
553
|
{
|
|
571
554
|
m_tb->moveBookmarksId(Value);
|
|
@@ -654,3 +637,16 @@ STDMETHODIMP CTableTd::FieldNumByName(BSTR Name, short* Value)
|
|
|
654
637
|
*Value = m_tb->fieldNumByName(Name);
|
|
655
638
|
return S_FALSE;
|
|
656
639
|
}
|
|
640
|
+
|
|
641
|
+
STDMETHODIMP CTableTd::get_StatReasonOfFind(short* Value)
|
|
642
|
+
{
|
|
643
|
+
*Value = m_tb->statReasonOfFind();
|
|
644
|
+
return S_FALSE;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
STDMETHODIMP CTableTd::get_LastFindDirection(short* Value)
|
|
648
|
+
{
|
|
649
|
+
*Value = (short)m_tb->lastFindDirection();
|
|
650
|
+
return S_FALSE;
|
|
651
|
+
}
|
|
652
|
+
|