transactd 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
+