transactd 2.3.0 → 2.4.0

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