transactd 2.3.0 → 2.4.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 (106) hide show
  1. checksums.yaml +4 -4
  2. data/{BUILD_UNIX-JA → BUILD_UNIX-JA.md} +6 -6
  3. data/CMakeLists.txt +20 -15
  4. data/{README-JA → README-JA.md} +23 -23
  5. data/{README → README.md} +22 -24
  6. data/RELEASE_NOTE +120 -0
  7. data/RELEASE_NOTE-JA +110 -0
  8. data/bin/common/tdclc_32_2_4.dll +0 -0
  9. data/bin/common/tdclc_64_2_4.dll +0 -0
  10. data/build/common/get_ruby_path.cmake +1 -1
  11. data/build/swig/ruby/tdclrb_wrap.cpp +1319 -830
  12. data/build/swig/tdcl.i +22 -2
  13. data/build/tdclc/tdclc.cbproj +1 -1
  14. data/build/tdclc/tdclc.rc +4 -4
  15. data/build/tdclcpp/tdclcpp.rc +4 -4
  16. data/build/tdclcpp/tdclcpp_bc.cbproj +2 -1
  17. data/build/tdclrb/CMakeLists.txt +6 -1
  18. data/build/tdclrb/bldgem/extconf.rb +5 -1
  19. data/build/tdclrb/tdclrb.rc +4 -4
  20. data/source/bzs/db/engine/mysql/database.cpp +44 -40
  21. data/source/bzs/db/engine/mysql/database.h +28 -8
  22. data/source/bzs/db/engine/mysql/dbManager.cpp +2 -0
  23. data/source/bzs/db/engine/mysql/dbManager.h +2 -7
  24. data/source/bzs/db/engine/mysql/mysqlInternal.h +79 -7
  25. data/source/bzs/db/protocol/hs/hsCommandExecuter.h +5 -1
  26. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +32 -8
  27. data/source/bzs/db/protocol/tdap/client/activeTable.h +17 -4
  28. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
  29. data/source/bzs/db/protocol/tdap/client/client.cpp +51 -6
  30. data/source/bzs/db/protocol/tdap/client/client.h +41 -11
  31. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +51 -15
  32. data/source/bzs/db/protocol/tdap/client/connMgr.h +6 -1
  33. data/source/bzs/db/protocol/tdap/client/database.cpp +26 -5
  34. data/source/bzs/db/protocol/tdap/client/database.h +3 -2
  35. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +38 -28
  36. data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -1
  37. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +2 -32
  38. data/source/bzs/db/protocol/tdap/client/field.cpp +0 -1
  39. data/source/bzs/db/protocol/tdap/client/filter.h +60 -33
  40. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +2 -5
  41. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +9 -0
  42. data/source/bzs/db/protocol/tdap/client/memRecord.h +1 -0
  43. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +99 -48
  44. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +5 -2
  45. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +76 -26
  46. data/source/bzs/db/protocol/tdap/client/nsTable.h +6 -4
  47. data/source/bzs/db/protocol/tdap/client/request.h +28 -11
  48. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +19 -11
  49. data/source/bzs/db/protocol/tdap/client/table.cpp +157 -70
  50. data/source/bzs/db/protocol/tdap/client/table.h +20 -5
  51. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +57 -4
  52. data/source/bzs/db/protocol/tdap/client/trdormapi.h +55 -20
  53. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +65 -31
  54. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +2 -0
  55. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +24 -36
  56. data/source/bzs/db/protocol/tdap/mysql/request.h +1 -1
  57. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +98 -18
  58. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +12 -7
  59. data/source/bzs/db/protocol/tdap/tdapRequest.h +3 -8
  60. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +1 -9
  61. data/source/bzs/db/protocol/tdap/tdapSchema.h +31 -1
  62. data/source/bzs/db/protocol/tdap/tdapcapi.h +49 -6
  63. data/source/bzs/db/protocol/tdap/uri.h +41 -6
  64. data/source/bzs/db/transactd/appModule.cpp +0 -1
  65. data/source/bzs/db/transactd/appModule.h +0 -2
  66. data/source/bzs/db/transactd/connManager.cpp +202 -33
  67. data/source/bzs/db/transactd/connManager.h +11 -4
  68. data/source/bzs/db/transactd/connectionRecord.h +19 -5
  69. data/source/bzs/db/transactd/transactd.cpp +39 -8
  70. data/source/bzs/env/crosscompile.cpp +1 -1
  71. data/source/bzs/example/queryData.cpp +1 -1
  72. data/source/bzs/netsvc/client/iconnection.h +2 -0
  73. data/source/bzs/netsvc/client/tcpClient.cpp +48 -26
  74. data/source/bzs/netsvc/client/tcpClient.h +171 -106
  75. data/source/bzs/netsvc/server/IAppModule.h +0 -1
  76. data/source/bzs/netsvc/server/serverPipe.cpp +5 -1
  77. data/source/bzs/netsvc/server/serverPipe.h +2 -1
  78. data/source/bzs/test/tdclatl/test_query_atl.js +105 -0
  79. data/source/bzs/test/tdclphp/transactd_Test.php +129 -11
  80. data/source/bzs/test/tdclrb/transactd_spec.rb +74 -2
  81. data/source/bzs/test/transactdBench/scaling_bench.cpp +1 -1
  82. data/source/bzs/test/trdclengn/test_trdclengn.cpp +45 -20
  83. data/source/global/tdclatl/Bookmark.cpp +28 -0
  84. data/source/global/tdclatl/Bookmark.h +65 -0
  85. data/source/global/tdclatl/Database.cpp +2 -2
  86. data/source/global/tdclatl/Database.h +1 -3
  87. data/source/global/tdclatl/DbDef.cpp +6 -0
  88. data/source/global/tdclatl/DbDef.h +1 -0
  89. data/source/global/tdclatl/QueryBase.cpp +29 -0
  90. data/source/global/tdclatl/QueryBase.h +4 -0
  91. data/source/global/tdclatl/Record.cpp +14 -2
  92. data/source/global/tdclatl/Record.h +1 -1
  93. data/source/global/tdclatl/Table.cpp +80 -16
  94. data/source/global/tdclatl/Table.h +23 -8
  95. data/source/global/tdclatl/_IDatabaseEvents_CP.h +39 -0
  96. data/source/global/tdclatl/activeTable.cpp +2 -2
  97. data/source/global/tdclatl/activeTable.h +1 -1
  98. data/source/global/tdclatl/tdclatl.idl +64 -14
  99. metadata +12 -12
  100. data/bin/common/tdclc_32_2_3.dll +0 -0
  101. data/bin/common/tdclc_64_2_3.dll +0 -0
  102. data/build/tdclcpp/BUILDNUMBER.txt +0 -1
  103. data/build/tdclrb/BUILDNUMBER.txt +0 -1
  104. /data/{BUILD_WIN-JA → BUILD_WIN-JA.md} +0 -0
  105. /data/{README_ORMSRCGEN-JA → README_ORMSRCGEN-JA.md} +0 -0
  106. /data/{README_ORMSRCGEN → README_ORMSRCGEN.md} +0 -0
@@ -0,0 +1,65 @@
1
+ #pragma once
2
+ /*=================================================================
3
+ Copyright (C) 2015 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
+ #include "tdclatl_i.h"
22
+ #include <bzs/db/protocol/tdap/tdapcapi.h>
23
+
24
+ using namespace ATL;
25
+
26
+ class ATL_NO_VTABLE CBookmark
27
+ : public CComObjectRootEx<CComSingleThreadModel>,
28
+ public CComCoClass<CBookmark, &CLSID_Bookmark>,
29
+ public IDispatchImpl<IBookmark, &IID_IBookmark,
30
+ &LIBID_transactd, /* wMajor = */ 1, /* wMinor = */ 0>
31
+ {
32
+
33
+ bookmark_td m_bm;
34
+ short m_len;
35
+ public:
36
+ CBookmark(){}
37
+
38
+ void set(bookmark_td& b, short len){ m_bm = b; m_len = len;}
39
+
40
+ bookmark_td& internalBookmark()
41
+ {
42
+ return m_bm;
43
+ }
44
+ short bookmarkLen()
45
+ {
46
+ return m_len;
47
+ }
48
+ //DECLARE_REGISTRY_RESOURCEID(IDR_CONNECTPARAM)
49
+
50
+ BEGIN_COM_MAP(CBookmark)
51
+ COM_INTERFACE_ENTRY(IBookmark)
52
+ COM_INTERFACE_ENTRY(IDispatch)
53
+ END_COM_MAP()
54
+
55
+ DECLARE_PROTECT_FINAL_CONSTRUCT()
56
+
57
+ HRESULT FinalConstruct(){ return S_OK;}
58
+
59
+ void FinalRelease(){};
60
+
61
+ public:
62
+ STDMETHOD(get_IsEmpty)(VARIANT_BOOL* retVal);
63
+ };
64
+
65
+ //OBJECT_ENTRY_AUTO(__uuidof(Bookmark), CBookmark)
@@ -193,9 +193,9 @@ STDMETHODIMP CDatabase::Create(BSTR URI, int type)
193
193
  return S_OK;
194
194
  }
195
195
 
196
- STDMETHODIMP CDatabase::Close()
196
+ STDMETHODIMP CDatabase::Close(VARIANT_BOOL withDropDefaultSchema)
197
197
  {
198
- m_db->close();
198
+ m_db->close(withDropDefaultSchema == -1);
199
199
  return S_OK;
200
200
  }
201
201
 
@@ -101,7 +101,7 @@ public:
101
101
  STDMETHOD(Drop)();
102
102
  STDMETHOD(DropTable)(BSTR TableName);
103
103
  STDMETHOD(Create)(BSTR URI, int type);
104
- STDMETHOD(Close)();
104
+ STDMETHOD(Close)(VARIANT_BOOL withDropDefaultSchema = 0);
105
105
  STDMETHOD(Connect)(BSTR URI, VARIANT_BOOL newConnection,
106
106
  VARIANT_BOOL* Value);
107
107
  STDMETHOD(Disconnect)(BSTR URI, VARIANT_BOOL* Param2);
@@ -152,8 +152,6 @@ public:
152
152
  STDMETHOD(get_MaxTables)(int* Value);
153
153
  STDMETHOD(get_TrxIsolationServer)(eSrvIsorationType* Value);
154
154
  STDMETHOD(get_TrxLockWaitTimeoutServer)(int* Value);
155
-
156
-
157
155
  };
158
156
 
159
157
  OBJECT_ENTRY_AUTO(__uuidof(Database), CDatabase)
@@ -244,3 +244,9 @@ STDMETHODIMP CDbDef::TdapErr(OLE_HANDLE hWnd, BSTR* Value)
244
244
  m_dbDef->tdapErr((HWND)hWnd);
245
245
  return S_OK;
246
246
  }
247
+
248
+ STDMETHODIMP CDbDef::ValidateTableDef(short TableIndex, short* Value)
249
+ {
250
+ *Value = m_dbDef->validateTableDef(TableIndex);
251
+ return S_OK;
252
+ }
@@ -76,4 +76,5 @@ public:
76
76
  STDMETHOD(put_Version)(int Value);
77
77
  STDMETHOD(get_Stat)(eStatus* Value);
78
78
  STDMETHOD(TdapErr)(OLE_HANDLE hWnd, BSTR* Value);
79
+ STDMETHOD(ValidateTableDef)(short TableIndex, short* Value);
79
80
  };
@@ -19,6 +19,7 @@
19
19
  #include "stdafx.h"
20
20
  #include "QueryBase.h"
21
21
  #include "Table.h"
22
+ #include "Bookmark.h"
22
23
 
23
24
  STDMETHODIMP CQueryBase::Reset(IQueryBase** retVal)
24
25
  {
@@ -101,6 +102,11 @@ STDMETHODIMP CQueryBase::Or(BSTR Name, BSTR Logic, VARIANT Value,
101
102
  }
102
103
 
103
104
  STDMETHODIMP CQueryBase::AddInValue(VARIANT Value, VARIANT_BOOL Reset)
105
+ {
106
+ return AddSeekKeyValue(Value, Reset);
107
+ }
108
+
109
+ STDMETHODIMP CQueryBase::AddSeekKeyValue(VARIANT Value, VARIANT_BOOL Reset)
104
110
  {
105
111
  if (Value.vt != VT_BSTR)
106
112
  VariantChangeType(&Value, &Value, 0, VT_BSTR);
@@ -108,6 +114,24 @@ STDMETHODIMP CQueryBase::AddInValue(VARIANT Value, VARIANT_BOOL Reset)
108
114
  return S_OK;
109
115
  }
110
116
 
117
+ STDMETHODIMP CQueryBase::AddSeekBookmark(VARIANT Value, VARIANT_BOOL Reset)
118
+ {
119
+ if ((Value.vt == VT_DISPATCH) && Value.pdispVal)
120
+ {
121
+ CBookmark* bm = dynamic_cast<CBookmark*>(Value.pdispVal);
122
+ if (bm)
123
+ {
124
+ if(!bm->internalBookmark().empty)
125
+ m_qb.addSeekBookmark(bm->internalBookmark(), bm->bookmarkLen(), (Reset == -1));
126
+ else
127
+ return Error("Bookmark is empty", IID_IQueryBase);
128
+ }
129
+ else
130
+ return Error("Invalid param 1 not IBookmark", IID_IQueryBase);
131
+ }
132
+ return S_OK;
133
+ }
134
+
111
135
  STDMETHODIMP CQueryBase::In(VARIANT Value, VARIANT Value1, VARIANT Value2,
112
136
  VARIANT Value3, VARIANT Value4, VARIANT Value5,
113
137
  VARIANT Value6, VARIANT Value7, VARIANT Value8,
@@ -323,3 +347,8 @@ STDMETHODIMP CQueryBase::IsStopAtLimit(VARIANT_BOOL* retVal)
323
347
  return S_OK;
324
348
  }
325
349
 
350
+ STDMETHODIMP CQueryBase::IsSeekByBookmarks(VARIANT_BOOL* retVal)
351
+ {
352
+ *retVal = m_qb.isSeekByBookmarks();
353
+ return S_OK;
354
+ }
@@ -89,6 +89,10 @@ public:
89
89
  STDMETHOD(IsBookmarkAlso)(VARIANT_BOOL* retVal);
90
90
  STDMETHOD(StopAtLimit)(VARIANT_BOOL Value, IQueryBase** retVal);
91
91
  STDMETHOD(IsStopAtLimit)(VARIANT_BOOL* retVal);
92
+ STDMETHOD(IsSeekByBookmarks)(VARIANT_BOOL* retVal);
93
+ STDMETHOD(AddSeekKeyValue)(VARIANT Value, VARIANT_BOOL Reset);
94
+ STDMETHOD(AddSeekBookmark)(VARIANT Value, VARIANT_BOOL Reset);
95
+
92
96
  };
93
97
 
94
98
  OBJECT_ENTRY_AUTO(__uuidof(QueryBase), CQueryBase)
@@ -20,6 +20,7 @@
20
20
  #include "Record.h"
21
21
  #include "Field.h"
22
22
  #include "FieldDefs.h"
23
+ #include "Bookmark.h"
23
24
 
24
25
  void CRecord::FinalRelease()
25
26
  {
@@ -188,12 +189,23 @@ STDMETHODIMP CWritableRecord::Update()
188
189
  }
189
190
  }
190
191
 
191
- STDMETHODIMP CWritableRecord::Read(VARIANT_BOOL KeysetAlrady,
192
+ STDMETHODIMP CWritableRecord::Read(VARIANT param,
192
193
  VARIANT_BOOL* retVal)
193
194
  {
194
195
  try
195
196
  {
196
- *retVal = m_rec->read(KeysetAlrady);
197
+ if ((param.vt == VT_DISPATCH) && param.pdispVal)
198
+ {
199
+ CBookmark* bm = dynamic_cast<CBookmark*>(param.pdispVal);
200
+ if (bm)
201
+ m_rec->read(bm->internalBookmark());
202
+ else
203
+ return Error("Invalid param 1 not IBookmark", IID_IWritableRecord);
204
+ }
205
+ else if (param.vt == VT_BOOL)
206
+ *retVal = m_rec->read(param.boolVal);
207
+ else
208
+ *retVal = m_rec->read();
197
209
  return S_OK;
198
210
  }
199
211
  catch (bzs::rtl::exception& e)
@@ -90,7 +90,7 @@ public:
90
90
  STDMETHOD(Insert)();
91
91
  STDMETHOD(Del)(VARIANT_BOOL KeysetAlrady);
92
92
  STDMETHOD(Update)();
93
- STDMETHOD(Read)(VARIANT_BOOL KeysetAlrady, VARIANT_BOOL* retVal);
93
+ STDMETHOD(Read)(VARIANT KeysetAlradyOrBookmark, VARIANT_BOOL* retVal);
94
94
  STDMETHOD(get_FieldDefs)(IFieldDefs** retVal);
95
95
  STDMETHOD(get_IsInvalidRecord)(VARIANT_BOOL* retVal);
96
96
  };
@@ -24,6 +24,7 @@
24
24
  #include "QueryBase.h"
25
25
  #include "PreparedQuery.h"
26
26
  #include <bzs/db/protocol/tdap/client/fields.h>
27
+ #include "Bookmark.h"
27
28
 
28
29
  using namespace bzs::db::protocol::tdap;
29
30
 
@@ -220,21 +221,42 @@ STDMETHODIMP CTableTd::SeekLessThan(VARIANT_BOOL orEqual, eLockType lockBias)
220
221
  return S_OK;
221
222
  }
222
223
 
223
- STDMETHODIMP CTableTd::get_BookMark(long* Value)
224
+ STDMETHODIMP CTableTd::get_Bookmark(IBookmark** retVal)
224
225
  {
225
- *Value = m_tb->bookmark();
226
+ CComObject<CBookmark>* bm;
227
+ CComObject<CBookmark>::CreateInstance(&bm);
228
+ if (!bm)
229
+ return Error("CreateInstance Bookmark", IID_ITable);
230
+ bm->set(m_tb->bookmark(), m_tb->bookmarkLen());
231
+ IBookmark* b;
232
+ bm->QueryInterface(IID_IBookmark, (void**)&b);
233
+ _ASSERTE(b);
234
+ *retVal = b;
226
235
  return S_OK;
227
236
  }
228
237
 
229
- STDMETHODIMP CTableTd::SeekByBookMark(long Value, eLockType lockBias)
238
+ STDMETHODIMP CTableTd::SeekByBookmark(IBookmark* bm, eLockType lockBias)
230
239
  {
231
- m_tb->seekByBookmark(Value, (ushort_td)lockBias);
232
- return S_OK;
240
+ CBookmark* cb = dynamic_cast<CBookmark*>(bm);
241
+ if (cb)
242
+ {
243
+ m_tb->seekByBookmark(cb->internalBookmark(), (ushort_td)lockBias);
244
+ return S_OK;
245
+ }
246
+ return Error("Invalid param bookmark", IID_ITable);
233
247
  }
234
248
 
235
- STDMETHODIMP CTableTd::get_Percentage(long* Value)
249
+ STDMETHODIMP CTableTd::get_Percentage(VARIANT param, long* Value)
236
250
  {
237
- *Value = m_tb->getPercentage();
251
+ if ((param.vt == VT_DISPATCH) && param.pdispVal)
252
+ {
253
+ CBookmark* bm = dynamic_cast<CBookmark*>(param.pdispVal);
254
+ if (bm)
255
+ *Value = m_tb->getPercentage(bm->internalBookmark());
256
+ else
257
+ return Error("Invalid param 1 not IBookmark", IID_ITable);
258
+ }else
259
+ *Value = m_tb->getPercentage();
238
260
  return S_OK;
239
261
  }
240
262
 
@@ -247,6 +269,9 @@ STDMETHODIMP CTableTd::get_RecordLength(long* Value)
247
269
  STDMETHODIMP CTableTd::RecordCount(VARIANT_BOOL estimate,
248
270
  VARIANT_BOOL fromCurrent, long* Value)
249
271
  {
272
+ m_tb->setOnRecordCount(onRecordCount);
273
+ m_tb->setOptionalData(this);
274
+
250
275
  *Value = m_tb->recordCount((estimate == -1), (fromCurrent == -1));
251
276
  return S_OK;
252
277
  }
@@ -497,9 +522,9 @@ STDMETHODIMP CTableTd::TdapErr(OLE_HANDLE hWnd, BSTR* Value)
497
522
  return S_OK;
498
523
  }
499
524
 
500
- STDMETHODIMP CTableTd::Unlock_(unsigned int bm)
525
+ STDMETHODIMP CTableTd::Unlock_()
501
526
  {
502
- m_tb->unlock(bm);
527
+ m_tb->unlock();
503
528
  return S_OK;
504
529
  }
505
530
 
@@ -509,17 +534,24 @@ STDMETHODIMP CTableTd::get_BlobFieldUsed(VARIANT_BOOL* Value)
509
534
  return S_OK;
510
535
  }
511
536
 
512
- STDMETHODIMP CTableTd::get_BookmarkFindCurrent(unsigned int* Value)
537
+ STDMETHODIMP CTableTd::get_BookmarkFindCurrent(IBookmark** retVal)
513
538
  {
514
-
515
- *Value = m_tb->bookmarkFindCurrent();
539
+ CComObject<CBookmark>* bm;
540
+ CComObject<CBookmark>::CreateInstance(&bm);
541
+ if (!bm)
542
+ return Error("CreateInstance Bookmark", IID_ITable);
543
+ bm->set(m_tb->bookmarkFindCurrent(), m_tb->bookmarkLen());
544
+ IBookmark* b;
545
+ bm->QueryInterface(IID_IBookmark, (void**)&b);
546
+ _ASSERTE(b);
547
+ *retVal = b;
516
548
  return S_OK;
517
549
  }
518
550
 
519
- STDMETHODIMP CTableTd::get_BookMarksCount(int* Value)
551
+ STDMETHODIMP CTableTd::get_BookmarksCount(int* Value)
520
552
  {
521
553
 
522
- *Value = m_tb->bookMarksCount();
554
+ *Value = m_tb->bookmarksCount();
523
555
  return S_OK;
524
556
  }
525
557
 
@@ -549,9 +581,9 @@ STDMETHODIMP CTableTd::put_LogicalToString(VARIANT_BOOL Value)
549
581
  return S_OK;
550
582
  }
551
583
 
552
- STDMETHODIMP CTableTd::MoveBookmarksId(long Value)
584
+ STDMETHODIMP CTableTd::MoveBookmarks(long Value)
553
585
  {
554
- m_tb->moveBookmarksId(Value);
586
+ m_tb->moveBookmarks(Value);
555
587
  return S_OK;
556
588
  }
557
589
 
@@ -650,3 +682,35 @@ STDMETHODIMP CTableTd::get_LastFindDirection(short* Value)
650
682
  return S_FALSE;
651
683
  }
652
684
 
685
+ STDMETHODIMP CTableTd::get_BookmarkLen(unsigned short* Value)
686
+ {
687
+ *Value = m_tb->bookmarkLen();
688
+ return S_FALSE;
689
+ }
690
+
691
+ STDMETHODIMP CTableTd::get_Bookmarks(long index, IBookmark** retVal)
692
+ {
693
+ CComObject<CBookmark>* bm;
694
+ CComObject<CBookmark>::CreateInstance(&bm);
695
+ if (!bm)
696
+ return Error("CreateInstance Bookmark", IID_ITable);
697
+ bm->set(m_tb->bookmarks((unsigned int)index), m_tb->bookmarkLen());
698
+ IBookmark* b;
699
+ bm->QueryInterface(IID_IBookmark, (void**)&b);
700
+ _ASSERTE(b);
701
+ *retVal = b;
702
+ return S_OK;
703
+ }
704
+
705
+ void __stdcall onRecordCount(bzs::db::protocol::tdap::client::table* tb,
706
+ int count, bool& cancel)
707
+ {
708
+ CTableTd* ctb = reinterpret_cast<CTableTd*>(tb->optionalData());
709
+ ITable* tbPtr = dynamic_cast<ITable*>(ctb);
710
+ _ASSERTE(tbPtr);
711
+ VARIANT_BOOL tmp = 0;
712
+ ctb->Fire_OnRecordCount(tbPtr, count, &tmp);
713
+ if (tmp)
714
+ cancel = true;
715
+ }
716
+
@@ -22,13 +22,20 @@
22
22
  #include "tdclatl_i.h"
23
23
  #include "Field.h"
24
24
  #include <bzs/db/protocol/tdap/client/trdboostapi.h>
25
+ #include "_IDatabaseEvents_CP.H"
26
+
25
27
  using namespace ATL;
28
+ void __stdcall onRecordCount(bzs::db::protocol::tdap::client::table* tb,
29
+ int count, bool& cancel);
26
30
 
27
31
  class ATL_NO_VTABLE CTableTd
28
32
  : public CComObjectRootEx<CComSingleThreadModel>,
29
33
  public CComCoClass<CTableTd, &CLSID_Table>,
30
34
  public IDispatchImpl<ITable, &IID_ITable, &LIBID_transactd,
31
- /* wMajor = */ 1, /* wMinor = */ 0>
35
+ /* wMajor = */ 1, /* wMinor = */ 0>,
36
+ public IConnectionPointContainerImpl<CTableTd>,
37
+ public CProxy_ITableEvents<CTableTd>
38
+
32
39
  {
33
40
 
34
41
  int m_filterRejectCount;
@@ -48,8 +55,14 @@ public:
48
55
  BEGIN_COM_MAP(CTableTd)
49
56
  COM_INTERFACE_ENTRY(ITable)
50
57
  COM_INTERFACE_ENTRY(IDispatch)
58
+ COM_INTERFACE_ENTRY(IConnectionPointContainer)
51
59
  END_COM_MAP()
52
60
 
61
+ BEGIN_CONNECTION_POINT_MAP(CTableTd)
62
+ CONNECTION_POINT_ENTRY(__uuidof(_ITableEvents))
63
+ END_CONNECTION_POINT_MAP()
64
+
65
+
53
66
  DECLARE_PROTECT_FINAL_CONSTRUCT()
54
67
 
55
68
  HRESULT FinalConstruct() { return S_OK; }
@@ -77,9 +90,9 @@ public:
77
90
  STDMETHOD(Seek)(eLockType lockBias);
78
91
  STDMETHOD(SeekGreater)(VARIANT_BOOL orEqual, eLockType lockBias);
79
92
  STDMETHOD(SeekLessThan)(VARIANT_BOOL orEqual, eLockType lockBias);
80
- STDMETHOD(get_BookMark)(long* Value);
81
- STDMETHOD(SeekByBookMark)(long Value, eLockType lockBias);
82
- STDMETHOD(get_Percentage)(long* Value);
93
+ STDMETHOD(get_Bookmark)(IBookmark** Value);
94
+ STDMETHOD(SeekByBookmark)(IBookmark* bm, eLockType lockBias);
95
+ STDMETHOD(get_Percentage)(VARIANT param, long* Value);
83
96
  STDMETHOD(get_RecordLength)(long* Value);
84
97
  STDMETHOD(RecordCount)(VARIANT_BOOL estimate, VARIANT_BOOL fromCurrent,
85
98
  long* Value);
@@ -126,15 +139,15 @@ public:
126
139
  STDMETHOD(SetAccessRights)(unsigned char curd);
127
140
  STDMETHOD(SetOwnerName)(BSTR* name, short enctype);
128
141
  STDMETHOD(TdapErr)(OLE_HANDLE hWnd, BSTR* Value);
129
- STDMETHOD(Unlock_)(unsigned int bm);
142
+ STDMETHOD(Unlock_)();
130
143
  STDMETHOD(get_BlobFieldUsed)(VARIANT_BOOL* Value);
131
- STDMETHOD(get_BookmarkFindCurrent)(unsigned int* Value);
132
- STDMETHOD(get_BookMarksCount)(int* Value);
144
+ STDMETHOD(get_BookmarkFindCurrent)(IBookmark** Value);
145
+ STDMETHOD(get_BookmarksCount)(int* Value);
133
146
  STDMETHOD(Find)(eFindType FindType);
134
147
  STDMETHOD(get_RecordHash)(unsigned int* Value);
135
148
  STDMETHOD(get_LogicalToString)(VARIANT_BOOL* Value);
136
149
  STDMETHOD(put_LogicalToString)(VARIANT_BOOL Value);
137
- STDMETHOD(MoveBookmarksId)(long Value);
150
+ STDMETHOD(MoveBookmarks)(long Value);
138
151
  STDMETHOD(get_MyDateTimeValueByBtrv)(VARIANT_BOOL* Value);
139
152
  STDMETHOD(get_ValiableFormatType)(VARIANT_BOOL* Value);
140
153
  STDMETHOD(SmartUpdate)(void);
@@ -145,5 +158,7 @@ public:
145
158
  STDMETHOD(FieldNumByName)(BSTR Name, short* Value);
146
159
  STDMETHOD(get_StatReasonOfFind)(short* Value);
147
160
  STDMETHOD(get_LastFindDirection)(short* Value);
161
+ STDMETHOD(get_BookmarkLen)(unsigned short* Value);
162
+ STDMETHOD(get_Bookmarks)(long index, IBookmark** Value);
148
163
 
149
164
  };
@@ -118,3 +118,42 @@ public:
118
118
  return hr;
119
119
  }
120
120
  };
121
+
122
+
123
+ template <class T>
124
+ class CProxy_ITableEvents
125
+ : public ATL::IConnectionPointImpl<T, &__uuidof(_ITableEvents)>
126
+ {
127
+ public:
128
+ HRESULT Fire_OnRecordCount(ITable* tb, int count, VARIANT_BOOL* cancel)
129
+ {
130
+ HRESULT hr = S_OK;
131
+ T* pThis = static_cast<T*>(this);
132
+ int cConnections = m_vec.GetSize();
133
+
134
+ for (int iConnection = 0; iConnection < cConnections; iConnection++)
135
+ {
136
+ pThis->Lock();
137
+ CComPtr<IUnknown> punkConnection = m_vec.GetAt(iConnection);
138
+ pThis->Unlock();
139
+
140
+ IDispatch* pConnection = static_cast<IDispatch*>(punkConnection.p);
141
+
142
+ if (pConnection)
143
+ {
144
+ CComVariant avarParams[3];
145
+ avarParams[2] = tb;
146
+ avarParams[1] = count;
147
+ avarParams[0].byref = cancel;
148
+ avarParams[0].vt = VT_BOOL | VT_BYREF;
149
+ CComVariant varResult;
150
+
151
+ DISPPARAMS params = { avarParams, NULL, 3, 0 };
152
+ hr = pConnection->Invoke(1, IID_NULL, LOCALE_USER_DEFAULT,
153
+ DISPATCH_METHOD, &params, &varResult,
154
+ NULL, NULL);
155
+ }
156
+ }
157
+ return hr;
158
+ }
159
+ };
@@ -43,7 +43,7 @@ void CActiveTable::FinalRelease()
43
43
  m_at->release();
44
44
  }
45
45
 
46
- STDMETHODIMP CActiveTable::SetDatabase(VARIANT Value, BSTR tableName)
46
+ STDMETHODIMP CActiveTable::SetDatabase(VARIANT Value, BSTR tableName, short mode)
47
47
  {
48
48
  try
49
49
  {
@@ -64,7 +64,7 @@ STDMETHODIMP CActiveTable::SetDatabase(VARIANT Value, BSTR tableName)
64
64
  CDatabase* p = dynamic_cast<CDatabase*>(Value.pdispVal);
65
65
  if (p)
66
66
  {
67
- m_at = activeTable::create(p->database(), tableName);
67
+ m_at = activeTable::create(p->database(), tableName, mode);
68
68
  m_at->table()->setOptionalData((void*)p->database());
69
69
  return S_OK;
70
70
  }
@@ -54,7 +54,7 @@ public:
54
54
  void FinalRelease();
55
55
 
56
56
  public:
57
- STDMETHOD(SetDatabase)(VARIANT Value, BSTR tableName);
57
+ STDMETHOD(SetDatabase)(VARIANT Value, BSTR tableName, short mode);
58
58
 
59
59
  STDMETHOD(Index)(short Value, IActiveTable** retVal);
60
60
  STDMETHOD(KeyValue)(VARIANT Value0, VARIANT Value1, VARIANT Value2,