transactd 2.0.1 → 2.1.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.
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
+ }