transactd 2.0.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/BUILD_UNIX-JA +6 -6
  3. data/README +16 -16
  4. data/README-JA +16 -16
  5. data/bin/common/tdclc_32_2_1.dll +0 -0
  6. data/bin/common/tdclc_64_2_1.dll +0 -0
  7. data/build/common/transactd_cl_common.cmake +0 -1
  8. data/build/common/transactd_common.cmake +28 -38
  9. data/build/swig/ruby/ruby.swg +36 -30
  10. data/build/swig/ruby/tdclrb_wrap.cpp +35016 -0
  11. data/build/swig/tdcl.i +217 -62
  12. data/build/tdclc/CMakeLists.txt +14 -26
  13. data/build/tdclc/libtdclcm.map +4 -0
  14. data/build/tdclc/tdclc.cbproj +1 -1
  15. data/build/tdclc/tdclc.rc +0 -0
  16. data/build/tdclcpp/CMakeLists.txt +7 -22
  17. data/build/tdclcpp/tdclcpp.rc +0 -0
  18. data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
  19. data/build/tdclrb/CMakeLists.txt +7 -49
  20. data/build/tdclrb/tdclrb.rc +62 -0
  21. data/source/bzs/db/blobBuffer.h +5 -0
  22. data/source/bzs/db/blobStructs.h +2 -0
  23. data/source/bzs/db/engine/mysql/IReadRecords.h +9 -0
  24. data/source/bzs/db/engine/mysql/database.cpp +391 -169
  25. data/source/bzs/db/engine/mysql/database.h +178 -40
  26. data/source/bzs/db/engine/mysql/dbManager.cpp +45 -3
  27. data/source/bzs/db/engine/mysql/dbManager.h +3 -39
  28. data/source/bzs/db/engine/mysql/errorMessage.cpp +11 -7
  29. data/source/bzs/db/engine/mysql/errorMessage.h +1 -1
  30. data/source/bzs/db/engine/mysql/mydebuglog.cpp +1 -2
  31. data/source/bzs/db/engine/mysql/mysqlInternal.h +8 -8
  32. data/source/bzs/db/engine/mysql/mysqlThd.cpp +11 -0
  33. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +1 -1
  34. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +41 -6
  35. data/source/bzs/db/protocol/tdap/client/activeTable.h +177 -8
  36. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +141 -62
  37. data/source/bzs/db/protocol/tdap/client/client.cpp +39 -35
  38. data/source/bzs/db/protocol/tdap/client/client.h +52 -25
  39. data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +17 -0
  40. data/source/bzs/db/protocol/tdap/client/connectionPool.h +1 -0
  41. data/source/bzs/db/protocol/tdap/client/database.cpp +5 -1
  42. data/source/bzs/db/protocol/tdap/client/database.h +1 -1
  43. data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +49 -12
  44. data/source/bzs/db/protocol/tdap/client/databaseManager.h +42 -5
  45. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +4 -2
  46. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +71 -41
  47. data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +49 -49
  48. data/source/bzs/db/protocol/tdap/client/field.cpp +22 -13
  49. data/source/bzs/db/protocol/tdap/client/field.h +7 -3
  50. data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +1 -1
  51. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +0 -1
  52. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +1 -0
  53. data/source/bzs/db/protocol/tdap/client/fields.h +111 -24
  54. data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +1 -1
  55. data/source/bzs/db/protocol/tdap/client/filter.h +687 -310
  56. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +12 -4
  57. data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +1 -1
  58. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +190 -32
  59. data/source/bzs/db/protocol/tdap/client/memRecord.h +64 -22
  60. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +4 -4
  61. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -2
  62. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +6 -3
  63. data/source/bzs/db/protocol/tdap/client/nsTable.h +1 -1
  64. data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +19 -8
  65. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +194 -87
  66. data/source/bzs/db/protocol/tdap/client/request.h +84 -26
  67. data/source/bzs/db/protocol/tdap/client/stringConverter.h +22 -12
  68. data/source/bzs/db/protocol/tdap/client/table.cpp +494 -286
  69. data/source/bzs/db/protocol/tdap/client/table.h +48 -5
  70. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +133 -87
  71. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +22 -22
  72. data/source/bzs/db/protocol/tdap/client/trdormapi.h +43 -18
  73. data/source/bzs/db/protocol/tdap/client/trnsctcl.def +3 -3
  74. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +1 -0
  75. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +268 -74
  76. data/source/bzs/db/protocol/tdap/mysql/request.h +4 -4
  77. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +179 -43
  78. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +4 -4
  79. data/source/bzs/db/protocol/tdap/tdapRequest.h +15 -14
  80. data/source/bzs/db/protocol/tdap/tdapSchema.h +125 -90
  81. data/source/bzs/db/protocol/tdap/tdapcapi.h +46 -5
  82. data/source/bzs/db/transactd/appModule.h +1 -1
  83. data/source/bzs/db/transactd/connManager.cpp +2 -0
  84. data/source/bzs/db/transactd/transactd.cpp +1 -0
  85. data/source/bzs/env/compiler.h +10 -0
  86. data/source/bzs/env/mbcswchrLinux.cpp +42 -6
  87. data/source/bzs/env/mbcswchrLinux.h +40 -12
  88. data/source/bzs/example/queryData.cpp +33 -4
  89. data/source/bzs/netsvc/client/iconnection.h +107 -0
  90. data/source/bzs/netsvc/client/tcpClient.cpp +15 -1
  91. data/source/bzs/netsvc/client/tcpClient.h +96 -87
  92. data/source/bzs/netsvc/server/serverCpt.cpp +5 -6
  93. data/source/bzs/rtl/benchmark.cpp +2 -2
  94. data/source/bzs/rtl/stringBuffers.cpp +3 -3
  95. data/source/bzs/rtl/stringBuffers.h +2 -2
  96. data/source/bzs/test/tdclatl/bench_query_atl.js +92 -99
  97. data/source/bzs/test/tdclatl/test_query_atl.js +224 -115
  98. data/source/bzs/test/tdclphp/bench.php +126 -101
  99. data/source/bzs/test/tdclphp/transactd_Test.php +1122 -158
  100. data/source/bzs/test/tdclrb/bench_tdclcpp.rb +12 -14
  101. data/source/bzs/test/tdclrb/transactd_spec.rb +1127 -142
  102. data/source/bzs/test/transactdBench/query_bench.cpp +32 -15
  103. data/source/bzs/test/transactdBench/scaling_bench.cpp +32 -7
  104. data/source/bzs/test/transactdBench/transactdBench.cpp +1 -1
  105. data/source/bzs/test/transactdBench/workerBase.h +46 -0
  106. data/source/bzs/test/transactdBench/workerMySQLImple.h +15 -7
  107. data/source/bzs/test/transactdBench/workerTransactdImple.h +10 -18
  108. data/source/bzs/test/trdclengn/test_trdclengn.cpp +1487 -174
  109. data/source/global/ormsrcgen/main.cpp +2 -0
  110. data/source/global/tdclatl/Database.cpp +2 -2
  111. data/source/global/tdclatl/Database.h +1 -1
  112. data/source/global/tdclatl/FieldDefs.cpp +0 -3
  113. data/source/global/tdclatl/PooledDbManager.cpp +2 -2
  114. data/source/global/tdclatl/PooledDbManager.h +1 -1
  115. data/source/global/tdclatl/PreparedQuery.cpp +53 -0
  116. data/source/global/tdclatl/PreparedQuery.h +61 -0
  117. data/source/global/tdclatl/QueryBase.cpp +2 -1
  118. data/source/global/tdclatl/QueryBase.h +1 -1
  119. data/source/global/tdclatl/Record.cpp +3 -15
  120. data/source/global/tdclatl/Recordset.cpp +15 -10
  121. data/source/global/tdclatl/Recordset.h +3 -0
  122. data/source/global/tdclatl/Table.cpp +42 -7
  123. data/source/global/tdclatl/Table.h +3 -1
  124. data/source/global/tdclatl/activeTable.cpp +264 -76
  125. data/source/global/tdclatl/activeTable.h +12 -3
  126. data/source/global/tdclatl/tdclatl.idl +92 -10
  127. data/source/linux/charsetConvert.h +7 -7
  128. data/transactd.gemspec +14 -27
  129. metadata +18 -27
  130. data/bin/common/tdclc_32_2_0.dll +0 -0
  131. data/bin/common/tdclc_64_2_0.dll +0 -0
  132. data/build/swig/php/generate.cmake.in +0 -56
  133. data/build/swig/php/generate.cmd.in +0 -47
  134. data/build/swig/php/php.swg +0 -197
  135. data/build/swig/php/transactd.no_yield.php +0 -4494
  136. data/build/swig/php/transactd.no_yield.php.git.patch +0 -685
  137. data/build/swig/php/transactd.no_yield.php.patch +0 -685
  138. data/build/swig/php/transactd.yield.php +0 -4461
  139. data/build/swig/php/transactd.yield.php.git.patch +0 -652
  140. data/build/swig/php/transactd.yield.php.patch +0 -652
  141. data/build/swig/ruby/generate.cmake.in +0 -35
  142. data/build/swig/ruby/generate.cmd.in +0 -19
  143. data/build/tdclc/BUILDNUMBER.txt +0 -1
  144. data/build/tdclcpp/BUILDNUMBER.txt +0 -1
  145. data/build/tdclrb/BUILDNUMBER.txt +0 -1
  146. data/build/tdclrb/GEM_RELEASE_VERSION +0 -1
@@ -24,7 +24,9 @@
24
24
  #include <boost/program_options.hpp>
25
25
  #include <boost/filesystem.hpp>
26
26
  #include <bzs/db/protocol/tdap/client/trdboostapi.h>
27
+ #ifndef TRDCL_AUTOLINK
27
28
  #define TRDCL_AUTOLINK
29
+ #endif
28
30
  #include <bzs/db/protocol/tdap/client/trdclcppautolink.h>
29
31
  #include "confParam.h"
30
32
  #include "srcgen.h"
@@ -162,9 +162,9 @@ STDMETHODIMP CDatabase::get_NativeDatabase(__int64** Value)
162
162
  return S_OK;
163
163
  }
164
164
 
165
- STDMETHODIMP CDatabase::BeginSnapshot()
165
+ STDMETHODIMP CDatabase::BeginSnapshot(eStLockType bias)
166
166
  {
167
- m_db->beginSnapshot();
167
+ m_db->beginSnapshot(bias);
168
168
  return S_OK;
169
169
  }
170
170
 
@@ -93,7 +93,7 @@ public:
93
93
  STDMETHOD(AbortTrn)();
94
94
  STDMETHOD(BeginTrn)(eLockType bias);
95
95
  STDMETHOD(EndTrn)();
96
- STDMETHOD(BeginSnapshot)();
96
+ STDMETHOD(BeginSnapshot)(eStLockType bias);
97
97
  STDMETHOD(EndSnapshot)();
98
98
  STDMETHOD(get_NativeDatabase)(__int64** Value);
99
99
 
@@ -22,8 +22,6 @@
22
22
 
23
23
  void CFieldDefs::FinalRelease()
24
24
  {
25
- if (m_fieldDefObj)
26
- m_fieldDefObj->AddRef();
27
25
  }
28
26
 
29
27
  short CFieldDefs::GetFieldNum(VARIANT* Index)
@@ -50,7 +48,6 @@ STDMETHODIMP CFieldDefs::get_FieldDef(VARIANT Name, IFieldDef** retVal)
50
48
  if (m_fieldDefObj == NULL)
51
49
  {
52
50
  CComObject<CFieldDef>::CreateInstance(&m_fieldDefObj);
53
- m_fieldDefObj->AddRef();
54
51
  }
55
52
  if (m_fieldDefObj)
56
53
  {
@@ -88,9 +88,9 @@ STDMETHODIMP CPooledDbManager::AbortTrn(void)
88
88
  return S_OK;
89
89
  }
90
90
 
91
- STDMETHODIMP CPooledDbManager::BeginSnapshot(void)
91
+ STDMETHODIMP CPooledDbManager::BeginSnapshot(eStLockType bias)
92
92
  {
93
- m_mgr.beginSnapshot();
93
+ m_mgr.beginSnapshot(bias);
94
94
  return S_OK;
95
95
  }
96
96
 
@@ -58,7 +58,7 @@ public:
58
58
  STDMETHOD(BeginTrn)(eLockType Bias);
59
59
  STDMETHOD(EndTrn)(void);
60
60
  STDMETHOD(AbortTrn)(void);
61
- STDMETHOD(BeginSnapshot)(void);
61
+ STDMETHOD(BeginSnapshot)(eStLockType bias);
62
62
  STDMETHOD(EndSnapshot)(void);
63
63
  STDMETHOD(Use)(VARIANT Uri);
64
64
  STDMETHOD(Unuse)();
@@ -0,0 +1,53 @@
1
+ /*=================================================================
2
+ Copyright (C) 2014 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 "stdafx.h"
20
+ #include "PreparedQuery.h"
21
+
22
+ STDMETHODIMP CPreparedQuery::SupplyValue(int Index, VARIANT Value, VARIANT_BOOL* retVal)
23
+ {
24
+ if (Value.vt != VT_BSTR)
25
+ VariantChangeType(&Value, &Value, 0, VT_BSTR);
26
+
27
+ if (Value.bstrVal && Value.bstrVal[0])
28
+ {
29
+ *retVal = m_pq->supplyValue(Index, Value.bstrVal);
30
+ return S_OK;
31
+ }
32
+ return Error(_T("Invalid PreparedQuery::SupplyValue param 2."), IID_IPreparedQuery);
33
+ }
34
+
35
+ STDMETHODIMP CPreparedQuery::AddValue(VARIANT Value, VARIANT_BOOL* retVal)
36
+ {
37
+ if (Value.vt != VT_BSTR)
38
+ VariantChangeType(&Value, &Value, 0, VT_BSTR);
39
+
40
+ if (Value.bstrVal && Value.bstrVal[0])
41
+ {
42
+ *retVal = m_pq->addValue(Value.bstrVal);
43
+ return S_OK;
44
+ }
45
+ return Error(_T("Invalid PreparedQuery::AddValue param 1."), IID_IPreparedQuery);
46
+ }
47
+
48
+ STDMETHODIMP CPreparedQuery::ResetAddIndex()
49
+ {
50
+ m_pq->resetAddIndex();
51
+ return S_OK;
52
+ }
53
+
@@ -0,0 +1,61 @@
1
+ #pragma once
2
+ /*=================================================================
3
+ Copyright (C) 2014 BizStation Corp All rights reserved.
4
+
5
+ This program is free software; you can redistribute it and/or
6
+ modify it under the terms of the GNU General Public License
7
+ as published by the Free Software Foundation; either version 2
8
+ of the License, or (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License
16
+ along with this program; if not, write to the Free Software
17
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
18
+ 02111-1307, USA.
19
+ =================================================================*/
20
+ #include "resource.h"
21
+
22
+ #include "tdclatl_i.h"
23
+ #include <bzs/db/protocol/tdap/client/activeTable.h>
24
+
25
+ using namespace ATL;
26
+ class ATL_NO_VTABLE CPreparedQuery
27
+ : public CComObjectRootEx<CComSingleThreadModel>,
28
+ public CComCoClass<CPreparedQuery, &CLSID_PreparedQuery>,
29
+ public IDispatchImpl<IPreparedQuery, &IID_IPreparedQuery, &LIBID_transactd,
30
+ /* wMajor = */ 1, /* wMinor = */ 0>
31
+ {
32
+ bzs::db::protocol::tdap::client::preparedQuery* m_pq;
33
+ public:
34
+
35
+ CPreparedQuery():m_pq(NULL){}
36
+ void setPqHandle(bzs::db::protocol::tdap::client::pq_handle& stmt)
37
+ {
38
+ if (m_pq)
39
+ delete m_pq;
40
+ m_pq = new bzs::db::protocol::tdap::client::preparedQuery(stmt);
41
+ }
42
+ bzs::db::protocol::tdap::client::pq_handle& getFilter() {return m_pq->getFilter();}
43
+
44
+ BEGIN_COM_MAP(CPreparedQuery)
45
+ COM_INTERFACE_ENTRY(IPreparedQuery)
46
+ COM_INTERFACE_ENTRY(IDispatch)
47
+ END_COM_MAP()
48
+
49
+ DECLARE_PROTECT_FINAL_CONSTRUCT()
50
+
51
+ HRESULT FinalConstruct() { return S_OK; }
52
+
53
+ void FinalRelease(){delete m_pq;};
54
+
55
+ public:
56
+ STDMETHOD(SupplyValue)(int Index, VARIANT Value, VARIANT_BOOL* retVal);
57
+ STDMETHOD(AddValue)(VARIANT Value, VARIANT_BOOL* retVal);
58
+ STDMETHOD(ResetAddIndex)();
59
+ void addValue(BSTR v) {m_pq->addValue(v);}
60
+ };
61
+
@@ -20,9 +20,10 @@
20
20
  #include "QueryBase.h"
21
21
  #include "Table.h"
22
22
 
23
- STDMETHODIMP CQueryBase::Reset(void)
23
+ STDMETHODIMP CQueryBase::Reset(IQueryBase** retVal)
24
24
  {
25
25
  m_qb.reset();
26
+ setResult(retVal);
26
27
  return S_OK;
27
28
  }
28
29
 
@@ -53,7 +53,7 @@ public:
53
53
 
54
54
  public:
55
55
  bzs::db::protocol::tdap::client::queryBase& query() { return m_qb; };
56
- STDMETHOD(Reset)(void);
56
+ STDMETHOD(Reset)(IQueryBase** retVal);
57
57
  STDMETHOD(ClearSeekKeyValues)(void);
58
58
  STDMETHOD(ClearSelectFields)(void);
59
59
  STDMETHOD(Select)(BSTR Value, BSTR Value1, BSTR Value2, BSTR Value3,
@@ -23,8 +23,6 @@
23
23
 
24
24
  void CRecord::FinalRelease()
25
25
  {
26
- if (m_fieldObj)
27
- m_fieldObj->Release();
28
26
  }
29
27
  short CRecord::GetFieldNum(VARIANT* Index)
30
28
  {
@@ -49,10 +47,8 @@ STDMETHODIMP CRecord::get_Field(VARIANT Index, IField** retVal)
49
47
  return Error("Invalid index", IID_ITable);
50
48
 
51
49
  if (m_fieldObj == NULL)
52
- {
53
50
  CComObject<CField>::CreateInstance(&m_fieldObj);
54
- m_fieldObj->AddRef();
55
- }
51
+
56
52
  if (m_fieldObj)
57
53
  {
58
54
  m_fieldObj->m_fd = (*m_rec)[index];
@@ -72,10 +68,6 @@ STDMETHODIMP CRecord::get_IsInvalidRecord(VARIANT_BOOL* retVal)
72
68
 
73
69
  void CWritableRecord::FinalRelease()
74
70
  {
75
- if (m_fieldObj)
76
- m_fieldObj->Release();
77
- if (m_fieldDefsObj)
78
- m_fieldDefsObj->Release();
79
71
  }
80
72
 
81
73
  short CWritableRecord::GetFieldNum(VARIANT* Index)
@@ -107,10 +99,8 @@ STDMETHODIMP CWritableRecord::get_Field(VARIANT Index, IField** retVal)
107
99
  return Error("Invalid index", IID_IWritableRecord);
108
100
 
109
101
  if (m_fieldObj == NULL)
110
- {
111
102
  CComObject<CField>::CreateInstance(&m_fieldObj);
112
- m_fieldObj->AddRef();
113
- }
103
+
114
104
  if (m_fieldObj)
115
105
  {
116
106
  m_fieldObj->m_fd = (*m_rec)[index];
@@ -191,10 +181,8 @@ STDMETHODIMP CWritableRecord::Read(VARIANT_BOOL KeysetAlrady,
191
181
  STDMETHODIMP CWritableRecord::get_FieldDefs(IFieldDefs** retVal)
192
182
  {
193
183
  if (m_fieldDefsObj == NULL)
194
- {
195
184
  CComObject<CFieldDefs>::CreateInstance(&m_fieldDefsObj);
196
- m_fieldDefsObj->AddRef();
197
- }
185
+
198
186
  if (m_fieldDefsObj)
199
187
  {
200
188
  m_fieldDefsObj->m_fds = m_rec->fieldDefs();
@@ -34,10 +34,6 @@ CARecordset::CARecordset()
34
34
  CARecordset::~CARecordset()
35
35
  {
36
36
 
37
- if (m_recObj)
38
- m_recObj->Release();
39
- if (m_fieldDefsObj)
40
- m_fieldDefsObj->Release();
41
37
  }
42
38
 
43
39
  void CARecordset::setResult(IRecordset** retVal)
@@ -50,10 +46,8 @@ STDMETHODIMP CARecordset::Record(unsigned long Index, IRecord** retVal)
50
46
  if (Index >= 0 && Index < m_rs->size())
51
47
  {
52
48
  if (m_recObj == NULL)
53
- {
54
49
  CComObject<CRecord>::CreateInstance(&m_recObj);
55
- m_recObj->AddRef();
56
- }
50
+
57
51
  if (m_recObj)
58
52
  {
59
53
  m_recObj->m_rec = &((*m_rs)[Index]);
@@ -261,10 +255,7 @@ STDMETHODIMP CARecordset::Reverse(IRecordset** retVal)
261
255
  STDMETHODIMP CARecordset::get_FieldDefs(IFieldDefs** retVal)
262
256
  {
263
257
  if (m_fieldDefsObj == NULL)
264
- {
265
258
  CComObject<CFieldDefs>::CreateInstance(&m_fieldDefsObj);
266
- m_fieldDefsObj->AddRef();
267
- }
268
259
  if (m_fieldDefsObj)
269
260
  {
270
261
  m_fieldDefsObj->m_fds = m_rs->fieldDefs();
@@ -276,3 +267,17 @@ STDMETHODIMP CARecordset::get_FieldDefs(IFieldDefs** retVal)
276
267
  }
277
268
  return S_OK;
278
269
  }
270
+
271
+
272
+ STDMETHODIMP CARecordset::Clear()
273
+ {
274
+ m_rs->clear();
275
+ return S_OK;
276
+ }
277
+
278
+ STDMETHODIMP CARecordset::ClearRecords()
279
+ {
280
+ m_rs->clearRecords();
281
+ return S_OK;
282
+ }
283
+
@@ -80,4 +80,7 @@ public:
80
80
  STDMETHOD(Reverse)(IRecordset** retVal);
81
81
  STDMETHOD(get_FieldDefs)(IFieldDefs** retVal);
82
82
  STDMETHOD(Clone)(IRecordset** retVal);
83
+ STDMETHOD(Clear)();
84
+ STDMETHOD(ClearRecords)();
85
+
83
86
  };
@@ -22,6 +22,7 @@
22
22
  #include "DbDef.h"
23
23
  #include "TableDef.h"
24
24
  #include "QueryBase.h"
25
+ #include "PreparedQuery.h"
25
26
  #include <bzs/db/protocol/tdap/client/fields.h>
26
27
 
27
28
  using namespace bzs::db::protocol::tdap;
@@ -390,11 +391,8 @@ STDMETHODIMP CTableTd::Field(VARIANT Index, IField** retVal)
390
391
  return Error("Invalid index", IID_ITable);
391
392
 
392
393
  if (m_fieldObj == NULL)
393
- {
394
394
  CComObject<CField>::CreateInstance(&m_fieldObj);
395
- if (m_fieldObj)
396
- m_fieldObj->AddRef();
397
- }
395
+
398
396
  if (m_fieldObj)
399
397
  {
400
398
  client::fields fds(*m_tb);
@@ -600,20 +598,57 @@ STDMETHODIMP CTableTd::KeyValueDescription(BSTR* Value)
600
598
  return S_OK;
601
599
  }
602
600
 
603
- STDMETHODIMP CTableTd::SetQuery(IQueryBase* Value)
601
+ STDMETHODIMP CTableTd::SetQuery(IQueryBase* Value, VARIANT_BOOL ServerPrepare, IPreparedQuery** retVal)
604
602
  {
605
603
  if (Value)
606
604
  {
607
605
  CQueryBase* p = dynamic_cast<CQueryBase*>(Value);
608
606
  if (p)
609
607
  {
610
- m_tb->setQuery(&p->query());
611
- return S_OK;
608
+ CComObject<CPreparedQuery>* rsObj;
609
+ CComObject<CPreparedQuery>::CreateInstance(&rsObj);
610
+
611
+ if (!rsObj)
612
+ return Error(_T("Can not create preparedQuery"), IID_ITable);
613
+ client::pq_handle pq = m_tb->setQuery(&p->query(), (bool)ServerPrepare);
614
+ if (pq)
615
+ {
616
+ rsObj->setPqHandle(pq);
617
+ IPreparedQuery* pd;
618
+ rsObj->QueryInterface(IID_IPreparedQuery, (void**)&pd);
619
+ _ASSERTE(pd);
620
+ *retVal = pd;
621
+ return S_OK;
622
+ }else
623
+ {
624
+ _TCHAR buf[1024];
625
+ client::table::tdapErr(NULL, m_tb->stat(), m_tb->tableDef()->tableName(), buf);
626
+ return Error(buf, IID_ITable);
627
+ }
612
628
  }
613
629
  }
614
630
  return S_FALSE;
615
631
  }
616
632
 
633
+ STDMETHODIMP CTableTd::Prepare(IQueryBase* Value, VARIANT_BOOL ServerPrepare, IPreparedQuery** retVal)
634
+ {
635
+ return SetQuery(Value, ServerPrepare, retVal);
636
+ }
637
+
638
+ STDMETHODIMP CTableTd::SetPrepare(IPreparedQuery* Value)
639
+ {
640
+ if (Value)
641
+ {
642
+ CPreparedQuery* p = dynamic_cast<CPreparedQuery*>(Value);
643
+ if (p)
644
+ {
645
+ m_tb->setPrepare(p->getFilter());
646
+ return S_OK;
647
+ }
648
+ }
649
+ return Error(_T("PreparedQuery is NULL"), IID_ITable);
650
+ }
651
+
617
652
  STDMETHODIMP CTableTd::FieldNumByName(BSTR Name, short* Value)
618
653
  {
619
654
  *Value = m_tb->fieldNumByName(Name);
@@ -143,6 +143,8 @@ public:
143
143
  STDMETHOD(get_ValiableFormatType)(VARIANT_BOOL* Value);
144
144
  STDMETHOD(SmartUpdate)(void);
145
145
  STDMETHOD(KeyValueDescription)(BSTR* Value);
146
- STDMETHOD(SetQuery)(IQueryBase* Value);
146
+ STDMETHOD(SetQuery)(IQueryBase* Value, VARIANT_BOOL ServerPrepare, IPreparedQuery** retVal);
147
+ STDMETHOD(Prepare)(IQueryBase* Value, VARIANT_BOOL ServerPrepare, IPreparedQuery** retVal);
148
+ STDMETHOD(SetPrepare)(IPreparedQuery* Value);
147
149
  STDMETHOD(FieldNumByName)(BSTR Name, short* Value);
148
150
  };
@@ -24,6 +24,8 @@
24
24
  #include "Record.h"
25
25
  #include "TableDef.h"
26
26
  #include "PooledDbManager.h"
27
+ #include "PreparedQuery.h"
28
+ #include "Table.h"
27
29
 
28
30
  using namespace bzs::db::protocol::tdap::client;
29
31
  using namespace bzs::db::protocol::tdap;
@@ -35,8 +37,6 @@ void CActiveTable::setResult(IActiveTable** retVal)
35
37
 
36
38
  void CActiveTable::FinalRelease()
37
39
  {
38
- if (m_recObj)
39
- m_recObj->Release();
40
40
  delete m_at;
41
41
  }
42
42
 
@@ -45,7 +45,11 @@ STDMETHODIMP CActiveTable::SetDatabase(VARIANT Value, BSTR tableName)
45
45
  try
46
46
  {
47
47
  if (Value.vt != VT_DISPATCH)
48
- return Error(_T("SetDatabase Type error"), IID_IActiveTable);
48
+ {
49
+ _TCHAR tmp[256];
50
+ wsprintf(tmp, _T("SetDatabase Type error type = %d"), Value.vt);
51
+ return Error(tmp, IID_IActiveTable);
52
+ }
49
53
  CPooledDbManager* pm = dynamic_cast<CPooledDbManager*>(Value.pdispVal);
50
54
  if (pm)
51
55
  {
@@ -164,41 +168,103 @@ STDMETHODIMP CActiveTable::Option(int Value, IActiveTable** retVal)
164
168
  return S_OK;
165
169
  }
166
170
 
167
- STDMETHODIMP CActiveTable::Read(VARIANT /*IQueryBase**/ query,
171
+ STDMETHODIMP CActiveTable::Read(VARIANT query,
172
+ VARIANT Value0, VARIANT Value1,
173
+ VARIANT Value2, VARIANT Value3,
174
+ VARIANT Value4, VARIANT Value5,
175
+ VARIANT Value6, VARIANT Value7,
168
176
  IRecordset** retVal)
169
177
  {
170
178
 
171
179
  CComObject<CARecordset>* rsObj;
172
180
  CComObject<CARecordset>::CreateInstance(&rsObj);
173
181
 
174
- if (rsObj)
175
- {
176
- IRecordset* rs;
177
- rsObj->QueryInterface(IID_IRecordset, (void**)&rs);
178
- _ASSERTE(rs);
179
- *retVal = rs;
180
- }
181
- else
182
- {
183
- *retVal = 0;
184
- return S_OK;
185
- }
182
+ if (!rsObj)
183
+ return Error(_T("Can not create recordset"), IID_IActiveTable);
184
+ IRecordset* rs;
185
+ rsObj->QueryInterface(IID_IRecordset, (void**)&rs);
186
+ _ASSERTE(rs);
187
+ *retVal = rs;
188
+
186
189
  try
187
190
  {
188
- if (query.vt != VT_ERROR)
191
+ if (query.vt == VT_DISPATCH)
189
192
  {
190
193
  CQueryBase* p = dynamic_cast<CQueryBase*>(query.pdispVal);
191
194
  if (p)
195
+ {
196
+ if (Value0.vt != VT_ERROR)
197
+ return Error(_T("Invalid ActiveTable::Read param 2"), IID_IActiveTable);
192
198
  m_at->read(*rsObj->m_rs, p->query());
199
+ return S_OK;
200
+ }
201
+ else
202
+ {
203
+ CPreparedQuery* pq = dynamic_cast<CPreparedQuery*>(query.pdispVal);
204
+ if (pq)
205
+ {
206
+ pq->ResetAddIndex();
207
+ if (Value0.vt != VT_ERROR)
208
+ {
209
+ if (Value0.vt != VT_BSTR)
210
+ VariantChangeType(&Value0, &Value0, 0, VT_BSTR);
211
+ pq->addValue(Value0.bstrVal);
212
+ }
213
+ if (Value1.vt != VT_ERROR)
214
+ {
215
+ if (Value1.vt != VT_BSTR)
216
+ VariantChangeType(&Value1, &Value1, 0, VT_BSTR);
217
+ pq->addValue(Value1.bstrVal);
218
+ }
219
+ if (Value2.vt != VT_ERROR)
220
+ {
221
+ if (Value2.vt != VT_BSTR)
222
+ VariantChangeType(&Value2, &Value2, 0, VT_BSTR);
223
+ pq->addValue(Value2.bstrVal);
224
+ }
225
+ if (Value3.vt != VT_ERROR)
226
+ {
227
+ if (Value3.vt != VT_BSTR)
228
+ VariantChangeType(&Value3, &Value3, 0, VT_BSTR);
229
+ pq->addValue(Value3.bstrVal);
230
+ }
231
+ if (Value4.vt != VT_ERROR)
232
+ {
233
+ if (Value4.vt != VT_BSTR)
234
+ VariantChangeType(&Value4, &Value4, 0, VT_BSTR);
235
+ pq->addValue(Value4.bstrVal);
236
+ }
237
+ if (Value5.vt != VT_ERROR)
238
+ {
239
+ if (Value5.vt != VT_BSTR)
240
+ VariantChangeType(&Value5, &Value5, 0, VT_BSTR);
241
+ pq->addValue(Value5.bstrVal);
242
+ }
243
+ if (Value6.vt != VT_ERROR)
244
+ {
245
+ if (Value6.vt != VT_BSTR)
246
+ VariantChangeType(&Value6, &Value6, 0, VT_BSTR);
247
+ pq->addValue(Value6.bstrVal);
248
+ }
249
+ if (Value7.vt != VT_ERROR)
250
+ {
251
+ if (Value7.vt != VT_BSTR)
252
+ VariantChangeType(&Value7, &Value7, 0, VT_BSTR);
253
+ pq->addValue(Value7.bstrVal);
254
+ }
255
+ m_at->read(*rsObj->m_rs, pq->getFilter());
256
+ return S_OK;
257
+ }
258
+ }
193
259
  }
194
260
  else
195
261
  {
196
262
  queryBase q;
197
263
  q.reject(1).limit(1);
198
264
  m_at->read(*rsObj->m_rs, q);
265
+ return S_OK;
199
266
  }
200
-
201
- return S_OK;
267
+ return Error(_T("Invalid ActiveTable::Read param 1"), IID_IActiveTable);
202
268
  }
203
269
  catch (bzs::rtl::exception& e)
204
270
  {
@@ -220,45 +286,80 @@ STDMETHODIMP CActiveTable::ResetAlias(IActiveTable** retVal)
220
286
  return S_OK;
221
287
  }
222
288
 
223
- STDMETHODIMP CActiveTable::Join(IRecordset* rs, IQueryBase* query, BSTR Name0,
289
+ STDMETHODIMP CActiveTable::Join(IRecordset* rs, VARIANT query, BSTR Name0,
224
290
  BSTR Name1, BSTR Name2, BSTR Name3, BSTR Name4,
225
291
  BSTR Name5, BSTR Name6, BSTR Name7,
226
292
  IRecordset** retVal)
227
293
  {
228
294
  try
229
295
  {
230
- if (query)
296
+ if ((query.vt == VT_DISPATCH) && query.pdispVal)
231
297
  {
232
298
  CARecordset* p = dynamic_cast<CARecordset*>(rs);
233
- p->AddRef();
234
- p->QueryInterface(IID_IRecordset, (void**)retVal);
235
- CQueryBase* qb = dynamic_cast<CQueryBase*>(query);
236
- queryBase* q = &qb->query();
237
- if (p && q)
299
+ CQueryBase* qb = dynamic_cast<CQueryBase*>(query.pdispVal);
300
+ CPreparedQuery* pq = dynamic_cast<CPreparedQuery*>(query.pdispVal);
301
+ if (p)
238
302
  {
239
- if (!Name1 || !Name1[0])
240
- m_at->join(*p->m_rs, *q, Name0);
241
- else if (!Name2 || !Name2[0])
242
- m_at->join(*p->m_rs, *q, Name0, Name1);
243
- else if (!Name3 || !Name3[0])
244
- m_at->join(*p->m_rs, *q, Name0, Name1, Name2);
245
- else if (!Name4 || !Name4[0])
246
- m_at->join(*p->m_rs, *q, Name0, Name1, Name2, Name3);
247
- else if (!Name5 || !Name5[0])
248
- m_at->join(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4);
249
- else if (!Name6 || !Name6[0])
250
- m_at->join(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4,
251
- Name5);
252
- else if (!Name7 || !Name7[0])
253
- m_at->join(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4,
254
- Name5, Name6);
255
- else
256
- m_at->join(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4,
257
- Name5, Name6, Name7);
303
+ if (qb)
304
+ {
305
+ queryBase* q = &qb->query();
306
+ if (q)
307
+ {
308
+ if (!Name1 || !Name1[0])
309
+ m_at->join(*p->m_rs, *q, Name0);
310
+ else if (!Name2 || !Name2[0])
311
+ m_at->join(*p->m_rs, *q, Name0, Name1);
312
+ else if (!Name3 || !Name3[0])
313
+ m_at->join(*p->m_rs, *q, Name0, Name1, Name2);
314
+ else if (!Name4 || !Name4[0])
315
+ m_at->join(*p->m_rs, *q, Name0, Name1, Name2, Name3);
316
+ else if (!Name5 || !Name5[0])
317
+ m_at->join(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4);
318
+ else if (!Name6 || !Name6[0])
319
+ m_at->join(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4,
320
+ Name5);
321
+ else if (!Name7 || !Name7[0])
322
+ m_at->join(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4,
323
+ Name5, Name6);
324
+ else
325
+ m_at->join(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4,
326
+ Name5, Name6, Name7);
327
+
328
+ p->QueryInterface(IID_IRecordset, (void**)retVal);
329
+ return S_OK;
330
+ }
331
+ }
332
+ else if (pq)
333
+ {
334
+ bzs::db::protocol::tdap::client::pq_handle& stmt = pq->getFilter();
335
+ if (stmt)
336
+ {
337
+ if (!Name1 || !Name1[0])
338
+ m_at->join(*p->m_rs, stmt, Name0);
339
+ else if (!Name2 || !Name2[0])
340
+ m_at->join(*p->m_rs, stmt, Name0, Name1);
341
+ else if (!Name3 || !Name3[0])
342
+ m_at->join(*p->m_rs, stmt, Name0, Name1, Name2);
343
+ else if (!Name4 || !Name4[0])
344
+ m_at->join(*p->m_rs, stmt, Name0, Name1, Name2, Name3);
345
+ else if (!Name5 || !Name5[0])
346
+ m_at->join(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4);
347
+ else if (!Name6 || !Name6[0])
348
+ m_at->join(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4,
349
+ Name5);
350
+ else if (!Name7 || !Name7[0])
351
+ m_at->join(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4,
352
+ Name5, Name6);
353
+ else
354
+ m_at->join(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4,
355
+ Name5, Name6, Name7);
356
+ p->QueryInterface(IID_IRecordset, (void**)retVal);
357
+ return S_OK;
358
+ }
359
+ }
258
360
  }
259
- p->Release();
260
361
  }
261
- return S_OK;
362
+ return Error(_T("Invalid ActiveTable::Join param 2"), IID_IActiveTable);
262
363
  }
263
364
  catch (bzs::rtl::exception& e)
264
365
  {
@@ -266,7 +367,7 @@ STDMETHODIMP CActiveTable::Join(IRecordset* rs, IQueryBase* query, BSTR Name0,
266
367
  }
267
368
  }
268
369
 
269
- STDMETHODIMP CActiveTable::OuterJoin(IRecordset* rs, IQueryBase* query,
370
+ STDMETHODIMP CActiveTable::OuterJoin(IRecordset* rs, VARIANT query,
270
371
  BSTR Name0, BSTR Name1, BSTR Name2,
271
372
  BSTR Name3, BSTR Name4, BSTR Name5,
272
373
  BSTR Name6, BSTR Name7,
@@ -274,52 +375,112 @@ STDMETHODIMP CActiveTable::OuterJoin(IRecordset* rs, IQueryBase* query,
274
375
  {
275
376
  try
276
377
  {
277
- if (query)
378
+ if ((query.vt == VT_DISPATCH) && query.pdispVal)
278
379
  {
279
380
  CARecordset* p = dynamic_cast<CARecordset*>(rs);
280
- p->QueryInterface(IID_IRecordset, (void**)retVal);
281
- CQueryBase* qb = dynamic_cast<CQueryBase*>(query);
282
- queryBase* q = &qb->query();
283
- if (p && q)
381
+ CQueryBase* qb = dynamic_cast<CQueryBase*>(query.pdispVal);
382
+ CPreparedQuery* pq = dynamic_cast<CPreparedQuery*>(query.pdispVal);
383
+ if (p)
284
384
  {
285
- if (!Name1 || !Name1[0])
286
- m_at->outerJoin(*p->m_rs, *q, Name0);
287
- else if (!Name2 || !Name2[0])
288
- m_at->outerJoin(*p->m_rs, *q, Name0, Name1);
289
- else if (!Name3 || !Name3[0])
290
- m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2);
291
- else if (!Name4 || !Name4[0])
292
- m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2, Name3);
293
- else if (!Name5 || !Name5[0])
294
- m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2, Name3,
295
- Name4);
296
- else if (!Name6 || !Name6[0])
297
- m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2, Name3,
298
- Name4, Name5);
299
- else if (!Name7 || !Name7[0])
300
- m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2, Name3,
301
- Name4, Name5, Name6);
302
- else
303
- m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2, Name3,
304
- Name4, Name5, Name6, Name7);
385
+ if (qb)
386
+ {
387
+ queryBase* q = &qb->query();
388
+ if (q)
389
+ {
390
+ if (!Name1 || !Name1[0])
391
+ m_at->outerJoin(*p->m_rs, *q, Name0);
392
+ else if (!Name2 || !Name2[0])
393
+ m_at->outerJoin(*p->m_rs, *q, Name0, Name1);
394
+ else if (!Name3 || !Name3[0])
395
+ m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2);
396
+ else if (!Name4 || !Name4[0])
397
+ m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2, Name3);
398
+ else if (!Name5 || !Name5[0])
399
+ m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4);
400
+ else if (!Name6 || !Name6[0])
401
+ m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4,
402
+ Name5);
403
+ else if (!Name7 || !Name7[0])
404
+ m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4,
405
+ Name5, Name6);
406
+ else
407
+ m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4,
408
+ Name5, Name6, Name7);
409
+
410
+ p->QueryInterface(IID_IRecordset, (void**)retVal);
411
+ return S_OK;
412
+ }
413
+ }
414
+ else if (pq)
415
+ {
416
+ bzs::db::protocol::tdap::client::pq_handle& stmt = pq->getFilter();
417
+ if (stmt)
418
+ {
419
+ if (!Name1 || !Name1[0])
420
+ m_at->outerJoin(*p->m_rs, stmt, Name0);
421
+ else if (!Name2 || !Name2[0])
422
+ m_at->outerJoin(*p->m_rs, stmt, Name0, Name1);
423
+ else if (!Name3 || !Name3[0])
424
+ m_at->outerJoin(*p->m_rs, stmt, Name0, Name1, Name2);
425
+ else if (!Name4 || !Name4[0])
426
+ m_at->outerJoin(*p->m_rs, stmt, Name0, Name1, Name2, Name3);
427
+ else if (!Name5 || !Name5[0])
428
+ m_at->outerJoin(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4);
429
+ else if (!Name6 || !Name6[0])
430
+ m_at->outerJoin(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4,
431
+ Name5);
432
+ else if (!Name7 || !Name7[0])
433
+ m_at->outerJoin(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4,
434
+ Name5, Name6);
435
+ else
436
+ m_at->outerJoin(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4,
437
+ Name5, Name6, Name7);
438
+ p->QueryInterface(IID_IRecordset, (void**)retVal);
439
+ return S_OK;
440
+ }
441
+ }
305
442
  }
306
443
  }
307
- *retVal = rs;
308
- return S_OK;
444
+ return Error(_T("Invalid ActiveTable::OuterJoin param 2"), IID_IActiveTable);
309
445
  }
310
446
  catch (bzs::rtl::exception& e)
311
447
  {
312
448
  return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IActiveTable);
313
449
  }
450
+
451
+ }
452
+
453
+ STDMETHODIMP CActiveTable::Prepare(IQueryBase* Value, VARIANT_BOOL ServerPrepare, IPreparedQuery** retVal)
454
+ {
455
+ if (Value)
456
+ {
457
+ CQueryBase* p = dynamic_cast<CQueryBase*>(Value);
458
+ if (p)
459
+ {
460
+ CComObject<CPreparedQuery>* rsObj;
461
+ CComObject<CPreparedQuery>::CreateInstance(&rsObj);
462
+
463
+ if (!rsObj)
464
+ return Error(_T("Can not create preparedQuery"), IID_ITable);
465
+
466
+ rsObj->setPqHandle(m_at->prepare(p->query(), (bool)ServerPrepare));
467
+ IPreparedQuery* pd;
468
+ rsObj->QueryInterface(IID_IPreparedQuery, (void**)&pd);
469
+ _ASSERTE(pd);
470
+ *retVal = pd;
471
+ return S_OK;
472
+ }
473
+ }
474
+ return Error(_T("Invalid ActiveTable::Prepare param 1"), IID_IActiveTable);
314
475
  }
315
476
 
477
+
316
478
  STDMETHODIMP CActiveTable::GetWritableRecord(IWritableRecord** retVal)
317
479
  {
318
480
 
319
481
  if (m_recObj == NULL)
320
482
  {
321
483
  CComObject<CWritableRecord>::CreateInstance(&m_recObj);
322
- m_recObj->AddRef();
323
484
  m_recObj->m_rec = &m_at->getWritableRecord();
324
485
  }
325
486
  if (m_recObj)
@@ -353,3 +514,30 @@ STDMETHODIMP CActiveTable::get_TableDef(ITableDef** Value)
353
514
  *Value = 0;
354
515
  return S_OK;
355
516
  }
517
+
518
+ STDMETHODIMP CActiveTable::Table(ITable** retVal)
519
+ {
520
+ try
521
+ {
522
+ CComObject<CTableTd>* ptb;
523
+ CComObject<CTableTd>::CreateInstance(&ptb);
524
+
525
+ if (ptb)
526
+ {
527
+ ptb->m_tb = m_at->table();
528
+ ptb->m_tb->setOptionalData((void*)NULL);
529
+ ITable* itb;
530
+ ptb->QueryInterface(IID_ITable, (void**)&itb);
531
+ _ASSERTE(itb);
532
+ *retVal = itb;
533
+ }
534
+ else
535
+ *retVal = NULL;
536
+ return S_OK;
537
+ }
538
+
539
+ catch (bzs::rtl::exception& e)
540
+ {
541
+ return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IActiveTable);
542
+ }
543
+ }