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.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/BUILD_UNIX-JA +6 -6
  3. data/README +20 -18
  4. data/README-JA +19 -17
  5. data/RELEASE_NOTE +144 -0
  6. data/RELEASE_NOTE-JA +153 -0
  7. data/bin/common/tdclc_32_2_3.dll +0 -0
  8. data/bin/common/tdclc_64_2_3.dll +0 -0
  9. data/build/common/get_ruby_path.cmake +1 -1
  10. data/build/swig/ruby/ruby.swg +10 -9
  11. data/build/swig/ruby/tdclrb_wrap.cpp +1416 -561
  12. data/build/swig/tdcl.i +30 -3
  13. data/build/tdclc/tdclc.cbproj +1 -1
  14. data/build/tdclc/tdclc.rc +4 -4
  15. data/build/tdclcpp/BUILDNUMBER.txt +1 -0
  16. data/build/tdclcpp/tdclcpp.rc +4 -4
  17. data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
  18. data/build/tdclrb/BUILDNUMBER.txt +1 -0
  19. data/build/tdclrb/tdclrb.rc +4 -4
  20. data/source/bzs/db/engine/mysql/database.cpp +85 -41
  21. data/source/bzs/db/engine/mysql/database.h +35 -5
  22. data/source/bzs/db/engine/mysql/mysqlInternal.h +189 -37
  23. data/source/bzs/db/engine/mysql/mysqlThd.cpp +21 -21
  24. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +11 -0
  25. data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
  26. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +11 -4
  27. data/source/bzs/db/protocol/tdap/client/client.h +30 -1
  28. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +2 -1
  29. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +35 -5
  30. data/source/bzs/db/protocol/tdap/client/field.cpp +100 -51
  31. data/source/bzs/db/protocol/tdap/client/field.h +7 -7
  32. data/source/bzs/db/protocol/tdap/client/filter.h +20 -6
  33. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +337 -58
  34. data/source/bzs/db/protocol/tdap/client/groupQuery.h +56 -13
  35. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +83 -5
  36. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
  37. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +2 -2
  38. data/source/bzs/db/protocol/tdap/client/nsTable.h +2 -1
  39. data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +20 -6
  40. data/source/bzs/db/protocol/tdap/client/recordset.cpp +7 -0
  41. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +8 -4
  42. data/source/bzs/db/protocol/tdap/client/request.h +11 -1
  43. data/source/bzs/db/protocol/tdap/client/serializer.cpp +40 -2
  44. data/source/bzs/db/protocol/tdap/client/serializer.h +4 -2
  45. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +1 -0
  46. data/source/bzs/db/protocol/tdap/client/stringConverter.h +4 -4
  47. data/source/bzs/db/protocol/tdap/client/table.cpp +124 -71
  48. data/source/bzs/db/protocol/tdap/client/table.h +8 -7
  49. data/source/bzs/db/protocol/tdap/client/trdormapi.h +33 -1
  50. data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
  51. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +3 -1
  52. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +20 -4
  53. data/source/bzs/db/protocol/tdap/mysql/request.h +14 -0
  54. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +132 -69
  55. data/source/bzs/db/protocol/tdap/tdapRequest.h +18 -4
  56. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +32 -22
  57. data/source/bzs/db/protocol/tdap/tdapSchema.h +69 -4
  58. data/source/bzs/db/protocol/tdap/tdapcapi.h +13 -5
  59. data/source/bzs/db/protocol/tdap/uri.h +4 -4
  60. data/source/bzs/db/transactd/transactd.cpp +6 -5
  61. data/source/bzs/env/crosscompile.cpp +17 -0
  62. data/source/bzs/env/crosscompile.h +4 -1
  63. data/source/bzs/env/mbcswchrLinux.cpp +3 -0
  64. data/source/bzs/example/deleteRecords.cpp +13 -0
  65. data/source/bzs/example/deleteRecords_c.cpp +8 -1
  66. data/source/bzs/example/insertRecords.cpp +14 -0
  67. data/source/bzs/example/insertRecords_c.cpp +8 -1
  68. data/source/bzs/example/ormap_c.cpp +8 -1
  69. data/source/bzs/example/queryData.cpp +92 -2
  70. data/source/bzs/example/queryData.h +3 -1
  71. data/source/bzs/example/readRecords.cpp +13 -0
  72. data/source/bzs/example/readRecords_c.cpp +8 -1
  73. data/source/bzs/example/updateRecords.cpp +13 -0
  74. data/source/bzs/example/updateRecords_c.cpp +8 -1
  75. data/source/bzs/example/update_with_transaction.cpp +13 -0
  76. data/source/bzs/example/update_with_transaction_c.cpp +8 -1
  77. data/source/bzs/example/useORMRecord.cpp +9 -3
  78. data/source/bzs/netsvc/client/iconnection.h +8 -0
  79. data/source/bzs/netsvc/client/tcpClient.cpp +61 -16
  80. data/source/bzs/netsvc/client/tcpClient.h +430 -214
  81. data/source/bzs/netsvc/server/serverPipe.cpp +2 -2
  82. data/source/bzs/test/tdclphp/transactd_Test.php +115 -19
  83. data/source/bzs/test/tdclphp/transactd_blob_Test.php +33 -5
  84. data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +21 -3
  85. data/source/bzs/test/tdclphp/transactd_pool_Test.php +17 -3
  86. data/source/bzs/test/tdclrb/transactd_blob_spec.rb +26 -8
  87. data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +13 -6
  88. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +14 -8
  89. data/source/bzs/test/tdclrb/transactd_spec.rb +117 -27
  90. data/source/bzs/test/transactdBench/scaling_bench.cpp +5 -5
  91. data/source/bzs/test/transactdBench/workerBase.h +2 -2
  92. data/source/bzs/test/trdclengn/test_trdclengn.cpp +898 -51
  93. data/source/global/tdclatl/Database.cpp +12 -0
  94. data/source/global/tdclatl/Database.h +4 -0
  95. data/source/global/tdclatl/FieldDef.cpp +19 -0
  96. data/source/global/tdclatl/FieldDef.h +4 -0
  97. data/source/global/tdclatl/FieldDefs.cpp +14 -16
  98. data/source/global/tdclatl/GroupQuery.cpp +21 -16
  99. data/source/global/tdclatl/GroupQuery.h +1 -1
  100. data/source/global/tdclatl/QueryBase.cpp +14 -0
  101. data/source/global/tdclatl/QueryBase.h +2 -0
  102. data/source/global/tdclatl/Record.cpp +41 -10
  103. data/source/global/tdclatl/Record.h +1 -1
  104. data/source/global/tdclatl/Recordset.cpp +117 -31
  105. data/source/global/tdclatl/Recordset.h +6 -5
  106. data/source/global/tdclatl/Table.cpp +24 -28
  107. data/source/global/tdclatl/Table.h +3 -4
  108. data/source/global/tdclatl/activeTable.cpp +149 -103
  109. data/source/global/tdclatl/activeTable.h +1 -1
  110. data/source/global/tdclatl/tdclatl.idl +38 -18
  111. data/transactd.gemspec +1 -1
  112. metadata +8 -4
  113. data/bin/common/tdclc_32_2_2.dll +0 -0
  114. 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 >= 0)
48
+ if (index < 0)
49
+ return Error("Invalid index", IID_IFieldDefs);
50
+ if (m_fieldDefObj == NULL)
47
51
  {
48
- if (m_fieldDefObj == NULL)
49
- {
50
- CComObject<CFieldDef>::CreateInstance(&m_fieldDefObj);
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
- else
63
- return Error("Invalid index", IID_IFieldDefs);
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, IFieldNames* targetNames,
71
+ STDMETHODIMP CGroupQuery::AddFunction(eGroupFunc func, VARIANT targetNames,
72
72
  BSTR resultName, VARIANT iq,
73
73
  IGroupQuery** retVal)
74
74
  {
75
-
76
- CFieldNames* fn = dynamic_cast<CFieldNames*>(targetNames);
77
- if (!fn)
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
- fieldNames* fns;
82
- fns = fn->m_fnsPtr;
83
-
85
+
84
86
  if (func == fsum)
85
- f.reset(new sum(*fns, resultName));
87
+ f.reset(sum::create(*fns, resultName), boost::bind(&sum::release, _1));
86
88
  else if (func == fmin)
87
- f.reset(new min(*fns, resultName));
89
+ f.reset(min::create(*fns, resultName), boost::bind(&min::release, _1));
88
90
  else if (func == fmax)
89
- f.reset(new max(*fns, resultName));
91
+ f.reset(max::create(*fns, resultName), boost::bind(&max::release, _1));
90
92
  else if (func == favg)
91
- f.reset(new avg(*fns, resultName));
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(new count(resultName));
101
+ f.reset(count::create(resultName), boost::bind(&count::release, _1));
96
102
  else
97
- f.reset(new count(fns->getValue(0)));
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
- else
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, IFieldNames* targetNames,
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
- if (m_fieldObj)
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
- if (m_fieldObj)
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
- if (m_fieldDefsObj)
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(new recordset()), m_recObj(NULL), m_fieldDefsObj(NULL)
30
+ : m_rs(recordset::create()), m_recObj(NULL), m_fieldDefsObj(NULL)
31
31
  {
32
32
  }
33
33
 
34
- CARecordset::~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
- if (m_recObj)
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
- if (rsObj)
98
+ try
81
99
  {
82
- m_rs->top(*rsObj->m_rs, Num);
83
- IRecordset* rs;
84
- rsObj->QueryInterface(IID_IRecordset, (void**)&rs);
85
- _ASSERTE(rs);
86
- *retVal = rs;
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
- rsObj->m_rs.reset(m_rs->clone());
100
- IRecordset* rs;
101
- rsObj->QueryInterface(IID_IRecordset, (void**)&rs);
102
- _ASSERTE(rs);
103
- *retVal = rs;
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 S_OK;
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
- m_rs->erase(Index);
113
- return S_OK;
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
- m_rs->reverse();
251
- setResult(retVal);
252
- return S_OK;
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
- if (m_fieldDefsObj)
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
- m_rs->clear();
275
- return S_OK;
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
- m_rs->clearRecords();
281
- return S_OK;
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 boost::shared_ptr<bzs::db::protocol::tdap::client::recordset>
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.reset(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
- if (m_fieldObj)
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
+