transactd 2.0.1 → 2.1.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.
- 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
|
+
}
|