transactd 2.0.1 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/BUILD_UNIX-JA +6 -6
- data/README +16 -16
- data/README-JA +16 -16
- data/bin/common/tdclc_32_2_1.dll +0 -0
- data/bin/common/tdclc_64_2_1.dll +0 -0
- data/build/common/transactd_cl_common.cmake +0 -1
- data/build/common/transactd_common.cmake +28 -38
- data/build/swig/ruby/ruby.swg +36 -30
- data/build/swig/ruby/tdclrb_wrap.cpp +35016 -0
- data/build/swig/tdcl.i +217 -62
- data/build/tdclc/CMakeLists.txt +14 -26
- data/build/tdclc/libtdclcm.map +4 -0
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +0 -0
- data/build/tdclcpp/CMakeLists.txt +7 -22
- data/build/tdclcpp/tdclcpp.rc +0 -0
- data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
- data/build/tdclrb/CMakeLists.txt +7 -49
- data/build/tdclrb/tdclrb.rc +62 -0
- data/source/bzs/db/blobBuffer.h +5 -0
- data/source/bzs/db/blobStructs.h +2 -0
- data/source/bzs/db/engine/mysql/IReadRecords.h +9 -0
- data/source/bzs/db/engine/mysql/database.cpp +391 -169
- data/source/bzs/db/engine/mysql/database.h +178 -40
- data/source/bzs/db/engine/mysql/dbManager.cpp +45 -3
- data/source/bzs/db/engine/mysql/dbManager.h +3 -39
- data/source/bzs/db/engine/mysql/errorMessage.cpp +11 -7
- data/source/bzs/db/engine/mysql/errorMessage.h +1 -1
- data/source/bzs/db/engine/mysql/mydebuglog.cpp +1 -2
- data/source/bzs/db/engine/mysql/mysqlInternal.h +8 -8
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +11 -0
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +41 -6
- data/source/bzs/db/protocol/tdap/client/activeTable.h +177 -8
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +141 -62
- data/source/bzs/db/protocol/tdap/client/client.cpp +39 -35
- data/source/bzs/db/protocol/tdap/client/client.h +52 -25
- data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +17 -0
- data/source/bzs/db/protocol/tdap/client/connectionPool.h +1 -0
- data/source/bzs/db/protocol/tdap/client/database.cpp +5 -1
- data/source/bzs/db/protocol/tdap/client/database.h +1 -1
- data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +49 -12
- data/source/bzs/db/protocol/tdap/client/databaseManager.h +42 -5
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +4 -2
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +71 -41
- data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +49 -49
- data/source/bzs/db/protocol/tdap/client/field.cpp +22 -13
- data/source/bzs/db/protocol/tdap/client/field.h +7 -3
- data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +0 -1
- data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +1 -0
- data/source/bzs/db/protocol/tdap/client/fields.h +111 -24
- data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/filter.h +687 -310
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +12 -4
- data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +190 -32
- data/source/bzs/db/protocol/tdap/client/memRecord.h +64 -22
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +4 -4
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +6 -3
- data/source/bzs/db/protocol/tdap/client/nsTable.h +1 -1
- data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +19 -8
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +194 -87
- data/source/bzs/db/protocol/tdap/client/request.h +84 -26
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +22 -12
- data/source/bzs/db/protocol/tdap/client/table.cpp +494 -286
- data/source/bzs/db/protocol/tdap/client/table.h +48 -5
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +133 -87
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +22 -22
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +43 -18
- data/source/bzs/db/protocol/tdap/client/trnsctcl.def +3 -3
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +1 -0
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +268 -74
- data/source/bzs/db/protocol/tdap/mysql/request.h +4 -4
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +179 -43
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +4 -4
- data/source/bzs/db/protocol/tdap/tdapRequest.h +15 -14
- data/source/bzs/db/protocol/tdap/tdapSchema.h +125 -90
- data/source/bzs/db/protocol/tdap/tdapcapi.h +46 -5
- data/source/bzs/db/transactd/appModule.h +1 -1
- data/source/bzs/db/transactd/connManager.cpp +2 -0
- data/source/bzs/db/transactd/transactd.cpp +1 -0
- data/source/bzs/env/compiler.h +10 -0
- data/source/bzs/env/mbcswchrLinux.cpp +42 -6
- data/source/bzs/env/mbcswchrLinux.h +40 -12
- data/source/bzs/example/queryData.cpp +33 -4
- data/source/bzs/netsvc/client/iconnection.h +107 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +15 -1
- data/source/bzs/netsvc/client/tcpClient.h +96 -87
- data/source/bzs/netsvc/server/serverCpt.cpp +5 -6
- data/source/bzs/rtl/benchmark.cpp +2 -2
- data/source/bzs/rtl/stringBuffers.cpp +3 -3
- data/source/bzs/rtl/stringBuffers.h +2 -2
- data/source/bzs/test/tdclatl/bench_query_atl.js +92 -99
- data/source/bzs/test/tdclatl/test_query_atl.js +224 -115
- data/source/bzs/test/tdclphp/bench.php +126 -101
- data/source/bzs/test/tdclphp/transactd_Test.php +1122 -158
- data/source/bzs/test/tdclrb/bench_tdclcpp.rb +12 -14
- data/source/bzs/test/tdclrb/transactd_spec.rb +1127 -142
- data/source/bzs/test/transactdBench/query_bench.cpp +32 -15
- data/source/bzs/test/transactdBench/scaling_bench.cpp +32 -7
- data/source/bzs/test/transactdBench/transactdBench.cpp +1 -1
- data/source/bzs/test/transactdBench/workerBase.h +46 -0
- data/source/bzs/test/transactdBench/workerMySQLImple.h +15 -7
- data/source/bzs/test/transactdBench/workerTransactdImple.h +10 -18
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +1487 -174
- data/source/global/ormsrcgen/main.cpp +2 -0
- data/source/global/tdclatl/Database.cpp +2 -2
- data/source/global/tdclatl/Database.h +1 -1
- data/source/global/tdclatl/FieldDefs.cpp +0 -3
- data/source/global/tdclatl/PooledDbManager.cpp +2 -2
- data/source/global/tdclatl/PooledDbManager.h +1 -1
- data/source/global/tdclatl/PreparedQuery.cpp +53 -0
- data/source/global/tdclatl/PreparedQuery.h +61 -0
- data/source/global/tdclatl/QueryBase.cpp +2 -1
- data/source/global/tdclatl/QueryBase.h +1 -1
- data/source/global/tdclatl/Record.cpp +3 -15
- data/source/global/tdclatl/Recordset.cpp +15 -10
- data/source/global/tdclatl/Recordset.h +3 -0
- data/source/global/tdclatl/Table.cpp +42 -7
- data/source/global/tdclatl/Table.h +3 -1
- data/source/global/tdclatl/activeTable.cpp +264 -76
- data/source/global/tdclatl/activeTable.h +12 -3
- data/source/global/tdclatl/tdclatl.idl +92 -10
- data/source/linux/charsetConvert.h +7 -7
- data/transactd.gemspec +14 -27
- metadata +18 -27
- data/bin/common/tdclc_32_2_0.dll +0 -0
- data/bin/common/tdclc_64_2_0.dll +0 -0
- data/build/swig/php/generate.cmake.in +0 -56
- data/build/swig/php/generate.cmd.in +0 -47
- data/build/swig/php/php.swg +0 -197
- data/build/swig/php/transactd.no_yield.php +0 -4494
- data/build/swig/php/transactd.no_yield.php.git.patch +0 -685
- data/build/swig/php/transactd.no_yield.php.patch +0 -685
- data/build/swig/php/transactd.yield.php +0 -4461
- data/build/swig/php/transactd.yield.php.git.patch +0 -652
- data/build/swig/php/transactd.yield.php.patch +0 -652
- data/build/swig/ruby/generate.cmake.in +0 -35
- data/build/swig/ruby/generate.cmd.in +0 -19
- data/build/tdclc/BUILDNUMBER.txt +0 -1
- data/build/tdclcpp/BUILDNUMBER.txt +0 -1
- data/build/tdclrb/BUILDNUMBER.txt +0 -1
- data/build/tdclrb/GEM_RELEASE_VERSION +0 -1
@@ -24,7 +24,9 @@
|
|
24
24
|
#include <boost/program_options.hpp>
|
25
25
|
#include <boost/filesystem.hpp>
|
26
26
|
#include <bzs/db/protocol/tdap/client/trdboostapi.h>
|
27
|
+
#ifndef TRDCL_AUTOLINK
|
27
28
|
#define TRDCL_AUTOLINK
|
29
|
+
#endif
|
28
30
|
#include <bzs/db/protocol/tdap/client/trdclcppautolink.h>
|
29
31
|
#include "confParam.h"
|
30
32
|
#include "srcgen.h"
|
@@ -162,9 +162,9 @@ STDMETHODIMP CDatabase::get_NativeDatabase(__int64** Value)
|
|
162
162
|
return S_OK;
|
163
163
|
}
|
164
164
|
|
165
|
-
STDMETHODIMP CDatabase::BeginSnapshot()
|
165
|
+
STDMETHODIMP CDatabase::BeginSnapshot(eStLockType bias)
|
166
166
|
{
|
167
|
-
m_db->beginSnapshot();
|
167
|
+
m_db->beginSnapshot(bias);
|
168
168
|
return S_OK;
|
169
169
|
}
|
170
170
|
|
@@ -22,8 +22,6 @@
|
|
22
22
|
|
23
23
|
void CFieldDefs::FinalRelease()
|
24
24
|
{
|
25
|
-
if (m_fieldDefObj)
|
26
|
-
m_fieldDefObj->AddRef();
|
27
25
|
}
|
28
26
|
|
29
27
|
short CFieldDefs::GetFieldNum(VARIANT* Index)
|
@@ -50,7 +48,6 @@ STDMETHODIMP CFieldDefs::get_FieldDef(VARIANT Name, IFieldDef** retVal)
|
|
50
48
|
if (m_fieldDefObj == NULL)
|
51
49
|
{
|
52
50
|
CComObject<CFieldDef>::CreateInstance(&m_fieldDefObj);
|
53
|
-
m_fieldDefObj->AddRef();
|
54
51
|
}
|
55
52
|
if (m_fieldDefObj)
|
56
53
|
{
|
@@ -88,9 +88,9 @@ STDMETHODIMP CPooledDbManager::AbortTrn(void)
|
|
88
88
|
return S_OK;
|
89
89
|
}
|
90
90
|
|
91
|
-
STDMETHODIMP CPooledDbManager::BeginSnapshot(
|
91
|
+
STDMETHODIMP CPooledDbManager::BeginSnapshot(eStLockType bias)
|
92
92
|
{
|
93
|
-
m_mgr.beginSnapshot();
|
93
|
+
m_mgr.beginSnapshot(bias);
|
94
94
|
return S_OK;
|
95
95
|
}
|
96
96
|
|
@@ -58,7 +58,7 @@ public:
|
|
58
58
|
STDMETHOD(BeginTrn)(eLockType Bias);
|
59
59
|
STDMETHOD(EndTrn)(void);
|
60
60
|
STDMETHOD(AbortTrn)(void);
|
61
|
-
STDMETHOD(BeginSnapshot)(
|
61
|
+
STDMETHOD(BeginSnapshot)(eStLockType bias);
|
62
62
|
STDMETHOD(EndSnapshot)(void);
|
63
63
|
STDMETHOD(Use)(VARIANT Uri);
|
64
64
|
STDMETHOD(Unuse)();
|
@@ -0,0 +1,53 @@
|
|
1
|
+
/*=================================================================
|
2
|
+
Copyright (C) 2014 BizStation Corp All rights reserved.
|
3
|
+
|
4
|
+
This program is free software; you can redistribute it and/or
|
5
|
+
modify it under the terms of the GNU General Public License
|
6
|
+
as published by the Free Software Foundation; either version 2
|
7
|
+
of the License, or (at your option) any later version.
|
8
|
+
|
9
|
+
This program is distributed in the hope that it will be useful,
|
10
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
11
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
12
|
+
GNU General Public License for more details.
|
13
|
+
|
14
|
+
You should have received a copy of the GNU General Public License
|
15
|
+
along with this program; if not, write to the Free Software
|
16
|
+
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
17
|
+
02111-1307, USA.
|
18
|
+
=================================================================*/
|
19
|
+
#include "stdafx.h"
|
20
|
+
#include "PreparedQuery.h"
|
21
|
+
|
22
|
+
STDMETHODIMP CPreparedQuery::SupplyValue(int Index, VARIANT Value, VARIANT_BOOL* retVal)
|
23
|
+
{
|
24
|
+
if (Value.vt != VT_BSTR)
|
25
|
+
VariantChangeType(&Value, &Value, 0, VT_BSTR);
|
26
|
+
|
27
|
+
if (Value.bstrVal && Value.bstrVal[0])
|
28
|
+
{
|
29
|
+
*retVal = m_pq->supplyValue(Index, Value.bstrVal);
|
30
|
+
return S_OK;
|
31
|
+
}
|
32
|
+
return Error(_T("Invalid PreparedQuery::SupplyValue param 2."), IID_IPreparedQuery);
|
33
|
+
}
|
34
|
+
|
35
|
+
STDMETHODIMP CPreparedQuery::AddValue(VARIANT Value, VARIANT_BOOL* retVal)
|
36
|
+
{
|
37
|
+
if (Value.vt != VT_BSTR)
|
38
|
+
VariantChangeType(&Value, &Value, 0, VT_BSTR);
|
39
|
+
|
40
|
+
if (Value.bstrVal && Value.bstrVal[0])
|
41
|
+
{
|
42
|
+
*retVal = m_pq->addValue(Value.bstrVal);
|
43
|
+
return S_OK;
|
44
|
+
}
|
45
|
+
return Error(_T("Invalid PreparedQuery::AddValue param 1."), IID_IPreparedQuery);
|
46
|
+
}
|
47
|
+
|
48
|
+
STDMETHODIMP CPreparedQuery::ResetAddIndex()
|
49
|
+
{
|
50
|
+
m_pq->resetAddIndex();
|
51
|
+
return S_OK;
|
52
|
+
}
|
53
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
#pragma once
|
2
|
+
/*=================================================================
|
3
|
+
Copyright (C) 2014 BizStation Corp All rights reserved.
|
4
|
+
|
5
|
+
This program is free software; you can redistribute it and/or
|
6
|
+
modify it under the terms of the GNU General Public License
|
7
|
+
as published by the Free Software Foundation; either version 2
|
8
|
+
of the License, or (at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU General Public License
|
16
|
+
along with this program; if not, write to the Free Software
|
17
|
+
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
18
|
+
02111-1307, USA.
|
19
|
+
=================================================================*/
|
20
|
+
#include "resource.h"
|
21
|
+
|
22
|
+
#include "tdclatl_i.h"
|
23
|
+
#include <bzs/db/protocol/tdap/client/activeTable.h>
|
24
|
+
|
25
|
+
using namespace ATL;
|
26
|
+
class ATL_NO_VTABLE CPreparedQuery
|
27
|
+
: public CComObjectRootEx<CComSingleThreadModel>,
|
28
|
+
public CComCoClass<CPreparedQuery, &CLSID_PreparedQuery>,
|
29
|
+
public IDispatchImpl<IPreparedQuery, &IID_IPreparedQuery, &LIBID_transactd,
|
30
|
+
/* wMajor = */ 1, /* wMinor = */ 0>
|
31
|
+
{
|
32
|
+
bzs::db::protocol::tdap::client::preparedQuery* m_pq;
|
33
|
+
public:
|
34
|
+
|
35
|
+
CPreparedQuery():m_pq(NULL){}
|
36
|
+
void setPqHandle(bzs::db::protocol::tdap::client::pq_handle& stmt)
|
37
|
+
{
|
38
|
+
if (m_pq)
|
39
|
+
delete m_pq;
|
40
|
+
m_pq = new bzs::db::protocol::tdap::client::preparedQuery(stmt);
|
41
|
+
}
|
42
|
+
bzs::db::protocol::tdap::client::pq_handle& getFilter() {return m_pq->getFilter();}
|
43
|
+
|
44
|
+
BEGIN_COM_MAP(CPreparedQuery)
|
45
|
+
COM_INTERFACE_ENTRY(IPreparedQuery)
|
46
|
+
COM_INTERFACE_ENTRY(IDispatch)
|
47
|
+
END_COM_MAP()
|
48
|
+
|
49
|
+
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
50
|
+
|
51
|
+
HRESULT FinalConstruct() { return S_OK; }
|
52
|
+
|
53
|
+
void FinalRelease(){delete m_pq;};
|
54
|
+
|
55
|
+
public:
|
56
|
+
STDMETHOD(SupplyValue)(int Index, VARIANT Value, VARIANT_BOOL* retVal);
|
57
|
+
STDMETHOD(AddValue)(VARIANT Value, VARIANT_BOOL* retVal);
|
58
|
+
STDMETHOD(ResetAddIndex)();
|
59
|
+
void addValue(BSTR v) {m_pq->addValue(v);}
|
60
|
+
};
|
61
|
+
|
@@ -53,7 +53,7 @@ public:
|
|
53
53
|
|
54
54
|
public:
|
55
55
|
bzs::db::protocol::tdap::client::queryBase& query() { return m_qb; };
|
56
|
-
STDMETHOD(Reset)(
|
56
|
+
STDMETHOD(Reset)(IQueryBase** retVal);
|
57
57
|
STDMETHOD(ClearSeekKeyValues)(void);
|
58
58
|
STDMETHOD(ClearSelectFields)(void);
|
59
59
|
STDMETHOD(Select)(BSTR Value, BSTR Value1, BSTR Value2, BSTR Value3,
|
@@ -23,8 +23,6 @@
|
|
23
23
|
|
24
24
|
void CRecord::FinalRelease()
|
25
25
|
{
|
26
|
-
if (m_fieldObj)
|
27
|
-
m_fieldObj->Release();
|
28
26
|
}
|
29
27
|
short CRecord::GetFieldNum(VARIANT* Index)
|
30
28
|
{
|
@@ -49,10 +47,8 @@ STDMETHODIMP CRecord::get_Field(VARIANT Index, IField** retVal)
|
|
49
47
|
return Error("Invalid index", IID_ITable);
|
50
48
|
|
51
49
|
if (m_fieldObj == NULL)
|
52
|
-
{
|
53
50
|
CComObject<CField>::CreateInstance(&m_fieldObj);
|
54
|
-
|
55
|
-
}
|
51
|
+
|
56
52
|
if (m_fieldObj)
|
57
53
|
{
|
58
54
|
m_fieldObj->m_fd = (*m_rec)[index];
|
@@ -72,10 +68,6 @@ STDMETHODIMP CRecord::get_IsInvalidRecord(VARIANT_BOOL* retVal)
|
|
72
68
|
|
73
69
|
void CWritableRecord::FinalRelease()
|
74
70
|
{
|
75
|
-
if (m_fieldObj)
|
76
|
-
m_fieldObj->Release();
|
77
|
-
if (m_fieldDefsObj)
|
78
|
-
m_fieldDefsObj->Release();
|
79
71
|
}
|
80
72
|
|
81
73
|
short CWritableRecord::GetFieldNum(VARIANT* Index)
|
@@ -107,10 +99,8 @@ STDMETHODIMP CWritableRecord::get_Field(VARIANT Index, IField** retVal)
|
|
107
99
|
return Error("Invalid index", IID_IWritableRecord);
|
108
100
|
|
109
101
|
if (m_fieldObj == NULL)
|
110
|
-
{
|
111
102
|
CComObject<CField>::CreateInstance(&m_fieldObj);
|
112
|
-
|
113
|
-
}
|
103
|
+
|
114
104
|
if (m_fieldObj)
|
115
105
|
{
|
116
106
|
m_fieldObj->m_fd = (*m_rec)[index];
|
@@ -191,10 +181,8 @@ STDMETHODIMP CWritableRecord::Read(VARIANT_BOOL KeysetAlrady,
|
|
191
181
|
STDMETHODIMP CWritableRecord::get_FieldDefs(IFieldDefs** retVal)
|
192
182
|
{
|
193
183
|
if (m_fieldDefsObj == NULL)
|
194
|
-
{
|
195
184
|
CComObject<CFieldDefs>::CreateInstance(&m_fieldDefsObj);
|
196
|
-
|
197
|
-
}
|
185
|
+
|
198
186
|
if (m_fieldDefsObj)
|
199
187
|
{
|
200
188
|
m_fieldDefsObj->m_fds = m_rec->fieldDefs();
|
@@ -34,10 +34,6 @@ CARecordset::CARecordset()
|
|
34
34
|
CARecordset::~CARecordset()
|
35
35
|
{
|
36
36
|
|
37
|
-
if (m_recObj)
|
38
|
-
m_recObj->Release();
|
39
|
-
if (m_fieldDefsObj)
|
40
|
-
m_fieldDefsObj->Release();
|
41
37
|
}
|
42
38
|
|
43
39
|
void CARecordset::setResult(IRecordset** retVal)
|
@@ -50,10 +46,8 @@ STDMETHODIMP CARecordset::Record(unsigned long Index, IRecord** retVal)
|
|
50
46
|
if (Index >= 0 && Index < m_rs->size())
|
51
47
|
{
|
52
48
|
if (m_recObj == NULL)
|
53
|
-
{
|
54
49
|
CComObject<CRecord>::CreateInstance(&m_recObj);
|
55
|
-
|
56
|
-
}
|
50
|
+
|
57
51
|
if (m_recObj)
|
58
52
|
{
|
59
53
|
m_recObj->m_rec = &((*m_rs)[Index]);
|
@@ -261,10 +255,7 @@ STDMETHODIMP CARecordset::Reverse(IRecordset** retVal)
|
|
261
255
|
STDMETHODIMP CARecordset::get_FieldDefs(IFieldDefs** retVal)
|
262
256
|
{
|
263
257
|
if (m_fieldDefsObj == NULL)
|
264
|
-
{
|
265
258
|
CComObject<CFieldDefs>::CreateInstance(&m_fieldDefsObj);
|
266
|
-
m_fieldDefsObj->AddRef();
|
267
|
-
}
|
268
259
|
if (m_fieldDefsObj)
|
269
260
|
{
|
270
261
|
m_fieldDefsObj->m_fds = m_rs->fieldDefs();
|
@@ -276,3 +267,17 @@ STDMETHODIMP CARecordset::get_FieldDefs(IFieldDefs** retVal)
|
|
276
267
|
}
|
277
268
|
return S_OK;
|
278
269
|
}
|
270
|
+
|
271
|
+
|
272
|
+
STDMETHODIMP CARecordset::Clear()
|
273
|
+
{
|
274
|
+
m_rs->clear();
|
275
|
+
return S_OK;
|
276
|
+
}
|
277
|
+
|
278
|
+
STDMETHODIMP CARecordset::ClearRecords()
|
279
|
+
{
|
280
|
+
m_rs->clearRecords();
|
281
|
+
return S_OK;
|
282
|
+
}
|
283
|
+
|
@@ -22,6 +22,7 @@
|
|
22
22
|
#include "DbDef.h"
|
23
23
|
#include "TableDef.h"
|
24
24
|
#include "QueryBase.h"
|
25
|
+
#include "PreparedQuery.h"
|
25
26
|
#include <bzs/db/protocol/tdap/client/fields.h>
|
26
27
|
|
27
28
|
using namespace bzs::db::protocol::tdap;
|
@@ -390,11 +391,8 @@ STDMETHODIMP CTableTd::Field(VARIANT Index, IField** retVal)
|
|
390
391
|
return Error("Invalid index", IID_ITable);
|
391
392
|
|
392
393
|
if (m_fieldObj == NULL)
|
393
|
-
{
|
394
394
|
CComObject<CField>::CreateInstance(&m_fieldObj);
|
395
|
-
|
396
|
-
m_fieldObj->AddRef();
|
397
|
-
}
|
395
|
+
|
398
396
|
if (m_fieldObj)
|
399
397
|
{
|
400
398
|
client::fields fds(*m_tb);
|
@@ -600,20 +598,57 @@ STDMETHODIMP CTableTd::KeyValueDescription(BSTR* Value)
|
|
600
598
|
return S_OK;
|
601
599
|
}
|
602
600
|
|
603
|
-
STDMETHODIMP CTableTd::SetQuery(IQueryBase* Value)
|
601
|
+
STDMETHODIMP CTableTd::SetQuery(IQueryBase* Value, VARIANT_BOOL ServerPrepare, IPreparedQuery** retVal)
|
604
602
|
{
|
605
603
|
if (Value)
|
606
604
|
{
|
607
605
|
CQueryBase* p = dynamic_cast<CQueryBase*>(Value);
|
608
606
|
if (p)
|
609
607
|
{
|
610
|
-
|
611
|
-
|
608
|
+
CComObject<CPreparedQuery>* rsObj;
|
609
|
+
CComObject<CPreparedQuery>::CreateInstance(&rsObj);
|
610
|
+
|
611
|
+
if (!rsObj)
|
612
|
+
return Error(_T("Can not create preparedQuery"), IID_ITable);
|
613
|
+
client::pq_handle pq = m_tb->setQuery(&p->query(), (bool)ServerPrepare);
|
614
|
+
if (pq)
|
615
|
+
{
|
616
|
+
rsObj->setPqHandle(pq);
|
617
|
+
IPreparedQuery* pd;
|
618
|
+
rsObj->QueryInterface(IID_IPreparedQuery, (void**)&pd);
|
619
|
+
_ASSERTE(pd);
|
620
|
+
*retVal = pd;
|
621
|
+
return S_OK;
|
622
|
+
}else
|
623
|
+
{
|
624
|
+
_TCHAR buf[1024];
|
625
|
+
client::table::tdapErr(NULL, m_tb->stat(), m_tb->tableDef()->tableName(), buf);
|
626
|
+
return Error(buf, IID_ITable);
|
627
|
+
}
|
612
628
|
}
|
613
629
|
}
|
614
630
|
return S_FALSE;
|
615
631
|
}
|
616
632
|
|
633
|
+
STDMETHODIMP CTableTd::Prepare(IQueryBase* Value, VARIANT_BOOL ServerPrepare, IPreparedQuery** retVal)
|
634
|
+
{
|
635
|
+
return SetQuery(Value, ServerPrepare, retVal);
|
636
|
+
}
|
637
|
+
|
638
|
+
STDMETHODIMP CTableTd::SetPrepare(IPreparedQuery* Value)
|
639
|
+
{
|
640
|
+
if (Value)
|
641
|
+
{
|
642
|
+
CPreparedQuery* p = dynamic_cast<CPreparedQuery*>(Value);
|
643
|
+
if (p)
|
644
|
+
{
|
645
|
+
m_tb->setPrepare(p->getFilter());
|
646
|
+
return S_OK;
|
647
|
+
}
|
648
|
+
}
|
649
|
+
return Error(_T("PreparedQuery is NULL"), IID_ITable);
|
650
|
+
}
|
651
|
+
|
617
652
|
STDMETHODIMP CTableTd::FieldNumByName(BSTR Name, short* Value)
|
618
653
|
{
|
619
654
|
*Value = m_tb->fieldNumByName(Name);
|
@@ -143,6 +143,8 @@ public:
|
|
143
143
|
STDMETHOD(get_ValiableFormatType)(VARIANT_BOOL* Value);
|
144
144
|
STDMETHOD(SmartUpdate)(void);
|
145
145
|
STDMETHOD(KeyValueDescription)(BSTR* Value);
|
146
|
-
STDMETHOD(SetQuery)(IQueryBase* Value);
|
146
|
+
STDMETHOD(SetQuery)(IQueryBase* Value, VARIANT_BOOL ServerPrepare, IPreparedQuery** retVal);
|
147
|
+
STDMETHOD(Prepare)(IQueryBase* Value, VARIANT_BOOL ServerPrepare, IPreparedQuery** retVal);
|
148
|
+
STDMETHOD(SetPrepare)(IPreparedQuery* Value);
|
147
149
|
STDMETHOD(FieldNumByName)(BSTR Name, short* Value);
|
148
150
|
};
|
@@ -24,6 +24,8 @@
|
|
24
24
|
#include "Record.h"
|
25
25
|
#include "TableDef.h"
|
26
26
|
#include "PooledDbManager.h"
|
27
|
+
#include "PreparedQuery.h"
|
28
|
+
#include "Table.h"
|
27
29
|
|
28
30
|
using namespace bzs::db::protocol::tdap::client;
|
29
31
|
using namespace bzs::db::protocol::tdap;
|
@@ -35,8 +37,6 @@ void CActiveTable::setResult(IActiveTable** retVal)
|
|
35
37
|
|
36
38
|
void CActiveTable::FinalRelease()
|
37
39
|
{
|
38
|
-
if (m_recObj)
|
39
|
-
m_recObj->Release();
|
40
40
|
delete m_at;
|
41
41
|
}
|
42
42
|
|
@@ -45,7 +45,11 @@ STDMETHODIMP CActiveTable::SetDatabase(VARIANT Value, BSTR tableName)
|
|
45
45
|
try
|
46
46
|
{
|
47
47
|
if (Value.vt != VT_DISPATCH)
|
48
|
-
|
48
|
+
{
|
49
|
+
_TCHAR tmp[256];
|
50
|
+
wsprintf(tmp, _T("SetDatabase Type error type = %d"), Value.vt);
|
51
|
+
return Error(tmp, IID_IActiveTable);
|
52
|
+
}
|
49
53
|
CPooledDbManager* pm = dynamic_cast<CPooledDbManager*>(Value.pdispVal);
|
50
54
|
if (pm)
|
51
55
|
{
|
@@ -164,41 +168,103 @@ STDMETHODIMP CActiveTable::Option(int Value, IActiveTable** retVal)
|
|
164
168
|
return S_OK;
|
165
169
|
}
|
166
170
|
|
167
|
-
STDMETHODIMP CActiveTable::Read(VARIANT
|
171
|
+
STDMETHODIMP CActiveTable::Read(VARIANT query,
|
172
|
+
VARIANT Value0, VARIANT Value1,
|
173
|
+
VARIANT Value2, VARIANT Value3,
|
174
|
+
VARIANT Value4, VARIANT Value5,
|
175
|
+
VARIANT Value6, VARIANT Value7,
|
168
176
|
IRecordset** retVal)
|
169
177
|
{
|
170
178
|
|
171
179
|
CComObject<CARecordset>* rsObj;
|
172
180
|
CComObject<CARecordset>::CreateInstance(&rsObj);
|
173
181
|
|
174
|
-
if (rsObj)
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
else
|
182
|
-
{
|
183
|
-
*retVal = 0;
|
184
|
-
return S_OK;
|
185
|
-
}
|
182
|
+
if (!rsObj)
|
183
|
+
return Error(_T("Can not create recordset"), IID_IActiveTable);
|
184
|
+
IRecordset* rs;
|
185
|
+
rsObj->QueryInterface(IID_IRecordset, (void**)&rs);
|
186
|
+
_ASSERTE(rs);
|
187
|
+
*retVal = rs;
|
188
|
+
|
186
189
|
try
|
187
190
|
{
|
188
|
-
if (query.vt
|
191
|
+
if (query.vt == VT_DISPATCH)
|
189
192
|
{
|
190
193
|
CQueryBase* p = dynamic_cast<CQueryBase*>(query.pdispVal);
|
191
194
|
if (p)
|
195
|
+
{
|
196
|
+
if (Value0.vt != VT_ERROR)
|
197
|
+
return Error(_T("Invalid ActiveTable::Read param 2"), IID_IActiveTable);
|
192
198
|
m_at->read(*rsObj->m_rs, p->query());
|
199
|
+
return S_OK;
|
200
|
+
}
|
201
|
+
else
|
202
|
+
{
|
203
|
+
CPreparedQuery* pq = dynamic_cast<CPreparedQuery*>(query.pdispVal);
|
204
|
+
if (pq)
|
205
|
+
{
|
206
|
+
pq->ResetAddIndex();
|
207
|
+
if (Value0.vt != VT_ERROR)
|
208
|
+
{
|
209
|
+
if (Value0.vt != VT_BSTR)
|
210
|
+
VariantChangeType(&Value0, &Value0, 0, VT_BSTR);
|
211
|
+
pq->addValue(Value0.bstrVal);
|
212
|
+
}
|
213
|
+
if (Value1.vt != VT_ERROR)
|
214
|
+
{
|
215
|
+
if (Value1.vt != VT_BSTR)
|
216
|
+
VariantChangeType(&Value1, &Value1, 0, VT_BSTR);
|
217
|
+
pq->addValue(Value1.bstrVal);
|
218
|
+
}
|
219
|
+
if (Value2.vt != VT_ERROR)
|
220
|
+
{
|
221
|
+
if (Value2.vt != VT_BSTR)
|
222
|
+
VariantChangeType(&Value2, &Value2, 0, VT_BSTR);
|
223
|
+
pq->addValue(Value2.bstrVal);
|
224
|
+
}
|
225
|
+
if (Value3.vt != VT_ERROR)
|
226
|
+
{
|
227
|
+
if (Value3.vt != VT_BSTR)
|
228
|
+
VariantChangeType(&Value3, &Value3, 0, VT_BSTR);
|
229
|
+
pq->addValue(Value3.bstrVal);
|
230
|
+
}
|
231
|
+
if (Value4.vt != VT_ERROR)
|
232
|
+
{
|
233
|
+
if (Value4.vt != VT_BSTR)
|
234
|
+
VariantChangeType(&Value4, &Value4, 0, VT_BSTR);
|
235
|
+
pq->addValue(Value4.bstrVal);
|
236
|
+
}
|
237
|
+
if (Value5.vt != VT_ERROR)
|
238
|
+
{
|
239
|
+
if (Value5.vt != VT_BSTR)
|
240
|
+
VariantChangeType(&Value5, &Value5, 0, VT_BSTR);
|
241
|
+
pq->addValue(Value5.bstrVal);
|
242
|
+
}
|
243
|
+
if (Value6.vt != VT_ERROR)
|
244
|
+
{
|
245
|
+
if (Value6.vt != VT_BSTR)
|
246
|
+
VariantChangeType(&Value6, &Value6, 0, VT_BSTR);
|
247
|
+
pq->addValue(Value6.bstrVal);
|
248
|
+
}
|
249
|
+
if (Value7.vt != VT_ERROR)
|
250
|
+
{
|
251
|
+
if (Value7.vt != VT_BSTR)
|
252
|
+
VariantChangeType(&Value7, &Value7, 0, VT_BSTR);
|
253
|
+
pq->addValue(Value7.bstrVal);
|
254
|
+
}
|
255
|
+
m_at->read(*rsObj->m_rs, pq->getFilter());
|
256
|
+
return S_OK;
|
257
|
+
}
|
258
|
+
}
|
193
259
|
}
|
194
260
|
else
|
195
261
|
{
|
196
262
|
queryBase q;
|
197
263
|
q.reject(1).limit(1);
|
198
264
|
m_at->read(*rsObj->m_rs, q);
|
265
|
+
return S_OK;
|
199
266
|
}
|
200
|
-
|
201
|
-
return S_OK;
|
267
|
+
return Error(_T("Invalid ActiveTable::Read param 1"), IID_IActiveTable);
|
202
268
|
}
|
203
269
|
catch (bzs::rtl::exception& e)
|
204
270
|
{
|
@@ -220,45 +286,80 @@ STDMETHODIMP CActiveTable::ResetAlias(IActiveTable** retVal)
|
|
220
286
|
return S_OK;
|
221
287
|
}
|
222
288
|
|
223
|
-
STDMETHODIMP CActiveTable::Join(IRecordset* rs,
|
289
|
+
STDMETHODIMP CActiveTable::Join(IRecordset* rs, VARIANT query, BSTR Name0,
|
224
290
|
BSTR Name1, BSTR Name2, BSTR Name3, BSTR Name4,
|
225
291
|
BSTR Name5, BSTR Name6, BSTR Name7,
|
226
292
|
IRecordset** retVal)
|
227
293
|
{
|
228
294
|
try
|
229
295
|
{
|
230
|
-
if (query)
|
296
|
+
if ((query.vt == VT_DISPATCH) && query.pdispVal)
|
231
297
|
{
|
232
298
|
CARecordset* p = dynamic_cast<CARecordset*>(rs);
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
queryBase* q = &qb->query();
|
237
|
-
if (p && q)
|
299
|
+
CQueryBase* qb = dynamic_cast<CQueryBase*>(query.pdispVal);
|
300
|
+
CPreparedQuery* pq = dynamic_cast<CPreparedQuery*>(query.pdispVal);
|
301
|
+
if (p)
|
238
302
|
{
|
239
|
-
if (
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
303
|
+
if (qb)
|
304
|
+
{
|
305
|
+
queryBase* q = &qb->query();
|
306
|
+
if (q)
|
307
|
+
{
|
308
|
+
if (!Name1 || !Name1[0])
|
309
|
+
m_at->join(*p->m_rs, *q, Name0);
|
310
|
+
else if (!Name2 || !Name2[0])
|
311
|
+
m_at->join(*p->m_rs, *q, Name0, Name1);
|
312
|
+
else if (!Name3 || !Name3[0])
|
313
|
+
m_at->join(*p->m_rs, *q, Name0, Name1, Name2);
|
314
|
+
else if (!Name4 || !Name4[0])
|
315
|
+
m_at->join(*p->m_rs, *q, Name0, Name1, Name2, Name3);
|
316
|
+
else if (!Name5 || !Name5[0])
|
317
|
+
m_at->join(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4);
|
318
|
+
else if (!Name6 || !Name6[0])
|
319
|
+
m_at->join(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4,
|
320
|
+
Name5);
|
321
|
+
else if (!Name7 || !Name7[0])
|
322
|
+
m_at->join(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4,
|
323
|
+
Name5, Name6);
|
324
|
+
else
|
325
|
+
m_at->join(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4,
|
326
|
+
Name5, Name6, Name7);
|
327
|
+
|
328
|
+
p->QueryInterface(IID_IRecordset, (void**)retVal);
|
329
|
+
return S_OK;
|
330
|
+
}
|
331
|
+
}
|
332
|
+
else if (pq)
|
333
|
+
{
|
334
|
+
bzs::db::protocol::tdap::client::pq_handle& stmt = pq->getFilter();
|
335
|
+
if (stmt)
|
336
|
+
{
|
337
|
+
if (!Name1 || !Name1[0])
|
338
|
+
m_at->join(*p->m_rs, stmt, Name0);
|
339
|
+
else if (!Name2 || !Name2[0])
|
340
|
+
m_at->join(*p->m_rs, stmt, Name0, Name1);
|
341
|
+
else if (!Name3 || !Name3[0])
|
342
|
+
m_at->join(*p->m_rs, stmt, Name0, Name1, Name2);
|
343
|
+
else if (!Name4 || !Name4[0])
|
344
|
+
m_at->join(*p->m_rs, stmt, Name0, Name1, Name2, Name3);
|
345
|
+
else if (!Name5 || !Name5[0])
|
346
|
+
m_at->join(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4);
|
347
|
+
else if (!Name6 || !Name6[0])
|
348
|
+
m_at->join(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4,
|
349
|
+
Name5);
|
350
|
+
else if (!Name7 || !Name7[0])
|
351
|
+
m_at->join(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4,
|
352
|
+
Name5, Name6);
|
353
|
+
else
|
354
|
+
m_at->join(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4,
|
355
|
+
Name5, Name6, Name7);
|
356
|
+
p->QueryInterface(IID_IRecordset, (void**)retVal);
|
357
|
+
return S_OK;
|
358
|
+
}
|
359
|
+
}
|
258
360
|
}
|
259
|
-
p->Release();
|
260
361
|
}
|
261
|
-
return
|
362
|
+
return Error(_T("Invalid ActiveTable::Join param 2"), IID_IActiveTable);
|
262
363
|
}
|
263
364
|
catch (bzs::rtl::exception& e)
|
264
365
|
{
|
@@ -266,7 +367,7 @@ STDMETHODIMP CActiveTable::Join(IRecordset* rs, IQueryBase* query, BSTR Name0,
|
|
266
367
|
}
|
267
368
|
}
|
268
369
|
|
269
|
-
STDMETHODIMP CActiveTable::OuterJoin(IRecordset* rs,
|
370
|
+
STDMETHODIMP CActiveTable::OuterJoin(IRecordset* rs, VARIANT query,
|
270
371
|
BSTR Name0, BSTR Name1, BSTR Name2,
|
271
372
|
BSTR Name3, BSTR Name4, BSTR Name5,
|
272
373
|
BSTR Name6, BSTR Name7,
|
@@ -274,52 +375,112 @@ STDMETHODIMP CActiveTable::OuterJoin(IRecordset* rs, IQueryBase* query,
|
|
274
375
|
{
|
275
376
|
try
|
276
377
|
{
|
277
|
-
if (query)
|
378
|
+
if ((query.vt == VT_DISPATCH) && query.pdispVal)
|
278
379
|
{
|
279
380
|
CARecordset* p = dynamic_cast<CARecordset*>(rs);
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
if (p && q)
|
381
|
+
CQueryBase* qb = dynamic_cast<CQueryBase*>(query.pdispVal);
|
382
|
+
CPreparedQuery* pq = dynamic_cast<CPreparedQuery*>(query.pdispVal);
|
383
|
+
if (p)
|
284
384
|
{
|
285
|
-
if (
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
385
|
+
if (qb)
|
386
|
+
{
|
387
|
+
queryBase* q = &qb->query();
|
388
|
+
if (q)
|
389
|
+
{
|
390
|
+
if (!Name1 || !Name1[0])
|
391
|
+
m_at->outerJoin(*p->m_rs, *q, Name0);
|
392
|
+
else if (!Name2 || !Name2[0])
|
393
|
+
m_at->outerJoin(*p->m_rs, *q, Name0, Name1);
|
394
|
+
else if (!Name3 || !Name3[0])
|
395
|
+
m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2);
|
396
|
+
else if (!Name4 || !Name4[0])
|
397
|
+
m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2, Name3);
|
398
|
+
else if (!Name5 || !Name5[0])
|
399
|
+
m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4);
|
400
|
+
else if (!Name6 || !Name6[0])
|
401
|
+
m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4,
|
402
|
+
Name5);
|
403
|
+
else if (!Name7 || !Name7[0])
|
404
|
+
m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4,
|
405
|
+
Name5, Name6);
|
406
|
+
else
|
407
|
+
m_at->outerJoin(*p->m_rs, *q, Name0, Name1, Name2, Name3, Name4,
|
408
|
+
Name5, Name6, Name7);
|
409
|
+
|
410
|
+
p->QueryInterface(IID_IRecordset, (void**)retVal);
|
411
|
+
return S_OK;
|
412
|
+
}
|
413
|
+
}
|
414
|
+
else if (pq)
|
415
|
+
{
|
416
|
+
bzs::db::protocol::tdap::client::pq_handle& stmt = pq->getFilter();
|
417
|
+
if (stmt)
|
418
|
+
{
|
419
|
+
if (!Name1 || !Name1[0])
|
420
|
+
m_at->outerJoin(*p->m_rs, stmt, Name0);
|
421
|
+
else if (!Name2 || !Name2[0])
|
422
|
+
m_at->outerJoin(*p->m_rs, stmt, Name0, Name1);
|
423
|
+
else if (!Name3 || !Name3[0])
|
424
|
+
m_at->outerJoin(*p->m_rs, stmt, Name0, Name1, Name2);
|
425
|
+
else if (!Name4 || !Name4[0])
|
426
|
+
m_at->outerJoin(*p->m_rs, stmt, Name0, Name1, Name2, Name3);
|
427
|
+
else if (!Name5 || !Name5[0])
|
428
|
+
m_at->outerJoin(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4);
|
429
|
+
else if (!Name6 || !Name6[0])
|
430
|
+
m_at->outerJoin(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4,
|
431
|
+
Name5);
|
432
|
+
else if (!Name7 || !Name7[0])
|
433
|
+
m_at->outerJoin(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4,
|
434
|
+
Name5, Name6);
|
435
|
+
else
|
436
|
+
m_at->outerJoin(*p->m_rs, stmt, Name0, Name1, Name2, Name3, Name4,
|
437
|
+
Name5, Name6, Name7);
|
438
|
+
p->QueryInterface(IID_IRecordset, (void**)retVal);
|
439
|
+
return S_OK;
|
440
|
+
}
|
441
|
+
}
|
305
442
|
}
|
306
443
|
}
|
307
|
-
|
308
|
-
return S_OK;
|
444
|
+
return Error(_T("Invalid ActiveTable::OuterJoin param 2"), IID_IActiveTable);
|
309
445
|
}
|
310
446
|
catch (bzs::rtl::exception& e)
|
311
447
|
{
|
312
448
|
return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IActiveTable);
|
313
449
|
}
|
450
|
+
|
451
|
+
}
|
452
|
+
|
453
|
+
STDMETHODIMP CActiveTable::Prepare(IQueryBase* Value, VARIANT_BOOL ServerPrepare, IPreparedQuery** retVal)
|
454
|
+
{
|
455
|
+
if (Value)
|
456
|
+
{
|
457
|
+
CQueryBase* p = dynamic_cast<CQueryBase*>(Value);
|
458
|
+
if (p)
|
459
|
+
{
|
460
|
+
CComObject<CPreparedQuery>* rsObj;
|
461
|
+
CComObject<CPreparedQuery>::CreateInstance(&rsObj);
|
462
|
+
|
463
|
+
if (!rsObj)
|
464
|
+
return Error(_T("Can not create preparedQuery"), IID_ITable);
|
465
|
+
|
466
|
+
rsObj->setPqHandle(m_at->prepare(p->query(), (bool)ServerPrepare));
|
467
|
+
IPreparedQuery* pd;
|
468
|
+
rsObj->QueryInterface(IID_IPreparedQuery, (void**)&pd);
|
469
|
+
_ASSERTE(pd);
|
470
|
+
*retVal = pd;
|
471
|
+
return S_OK;
|
472
|
+
}
|
473
|
+
}
|
474
|
+
return Error(_T("Invalid ActiveTable::Prepare param 1"), IID_IActiveTable);
|
314
475
|
}
|
315
476
|
|
477
|
+
|
316
478
|
STDMETHODIMP CActiveTable::GetWritableRecord(IWritableRecord** retVal)
|
317
479
|
{
|
318
480
|
|
319
481
|
if (m_recObj == NULL)
|
320
482
|
{
|
321
483
|
CComObject<CWritableRecord>::CreateInstance(&m_recObj);
|
322
|
-
m_recObj->AddRef();
|
323
484
|
m_recObj->m_rec = &m_at->getWritableRecord();
|
324
485
|
}
|
325
486
|
if (m_recObj)
|
@@ -353,3 +514,30 @@ STDMETHODIMP CActiveTable::get_TableDef(ITableDef** Value)
|
|
353
514
|
*Value = 0;
|
354
515
|
return S_OK;
|
355
516
|
}
|
517
|
+
|
518
|
+
STDMETHODIMP CActiveTable::Table(ITable** retVal)
|
519
|
+
{
|
520
|
+
try
|
521
|
+
{
|
522
|
+
CComObject<CTableTd>* ptb;
|
523
|
+
CComObject<CTableTd>::CreateInstance(&ptb);
|
524
|
+
|
525
|
+
if (ptb)
|
526
|
+
{
|
527
|
+
ptb->m_tb = m_at->table();
|
528
|
+
ptb->m_tb->setOptionalData((void*)NULL);
|
529
|
+
ITable* itb;
|
530
|
+
ptb->QueryInterface(IID_ITable, (void**)&itb);
|
531
|
+
_ASSERTE(itb);
|
532
|
+
*retVal = itb;
|
533
|
+
}
|
534
|
+
else
|
535
|
+
*retVal = NULL;
|
536
|
+
return S_OK;
|
537
|
+
}
|
538
|
+
|
539
|
+
catch (bzs::rtl::exception& e)
|
540
|
+
{
|
541
|
+
return Error((*bzs::rtl::getMsg(e)).c_str(), IID_IActiveTable);
|
542
|
+
}
|
543
|
+
}
|