xref: /AOO41X/main/connectivity/source/commontools/TColumnsHelper.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_connectivity.hxx"
30*cdf0e10cSrcweir #include "connectivity/TColumnsHelper.hxx"
31*cdf0e10cSrcweir #include "connectivity/sdbcx/VColumn.hxx"
32*cdf0e10cSrcweir #include "connectivity/sdbcx/VColumn.hxx"
33*cdf0e10cSrcweir #include <com/sun/star/sdbc/XRow.hpp>
34*cdf0e10cSrcweir #include <com/sun/star/sdbc/XResultSet.hpp>
35*cdf0e10cSrcweir #include <com/sun/star/sdbc/DataType.hpp>
36*cdf0e10cSrcweir #include <com/sun/star/sdbc/ColumnValue.hpp>
37*cdf0e10cSrcweir #include <com/sun/star/sdbcx/KeyType.hpp>
38*cdf0e10cSrcweir #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
39*cdf0e10cSrcweir #include <com/sun/star/sdbcx/XKeysSupplier.hpp>
40*cdf0e10cSrcweir #include <comphelper/types.hxx>
41*cdf0e10cSrcweir #include "connectivity/dbtools.hxx"
42*cdf0e10cSrcweir #include "TConnection.hxx"
43*cdf0e10cSrcweir #include "connectivity/TTableHelper.hxx"
44*cdf0e10cSrcweir #include <comphelper/property.hxx>
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir using namespace ::comphelper;
47*cdf0e10cSrcweir 
48*cdf0e10cSrcweir 
49*cdf0e10cSrcweir using namespace connectivity::sdbcx;
50*cdf0e10cSrcweir using namespace connectivity;
51*cdf0e10cSrcweir using namespace dbtools;
52*cdf0e10cSrcweir using namespace ::com::sun::star::uno;
53*cdf0e10cSrcweir using namespace ::com::sun::star::beans;
54*cdf0e10cSrcweir using namespace ::com::sun::star::sdbcx;
55*cdf0e10cSrcweir using namespace ::com::sun::star::sdbc;
56*cdf0e10cSrcweir using namespace ::com::sun::star::container;
57*cdf0e10cSrcweir using namespace ::com::sun::star::lang;
58*cdf0e10cSrcweir typedef connectivity::sdbcx::OCollection OCollection_TYPE;
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir namespace connectivity
61*cdf0e10cSrcweir {
62*cdf0e10cSrcweir 	class OColumnsHelperImpl
63*cdf0e10cSrcweir 	{
64*cdf0e10cSrcweir 	public:
65*cdf0e10cSrcweir 		OColumnsHelperImpl(sal_Bool _bCase)
66*cdf0e10cSrcweir 			: m_aColumnInfo(_bCase)
67*cdf0e10cSrcweir 		{
68*cdf0e10cSrcweir 		}
69*cdf0e10cSrcweir 		ColumnInformationMap m_aColumnInfo;
70*cdf0e10cSrcweir 	};
71*cdf0e10cSrcweir }
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir OColumnsHelper::OColumnsHelper(	::cppu::OWeakObject& _rParent
74*cdf0e10cSrcweir 								,sal_Bool _bCase
75*cdf0e10cSrcweir 								,::osl::Mutex& _rMutex
76*cdf0e10cSrcweir 								,const TStringVector &_rVector
77*cdf0e10cSrcweir 								,sal_Bool _bUseHardRef
78*cdf0e10cSrcweir 			) : OCollection(_rParent,_bCase,_rMutex,_rVector,sal_False,_bUseHardRef)
79*cdf0e10cSrcweir 	,m_pImpl(NULL)
80*cdf0e10cSrcweir 	,m_pTable(NULL)
81*cdf0e10cSrcweir {
82*cdf0e10cSrcweir }
83*cdf0e10cSrcweir // -----------------------------------------------------------------------------
84*cdf0e10cSrcweir OColumnsHelper::~OColumnsHelper()
85*cdf0e10cSrcweir {
86*cdf0e10cSrcweir 	delete m_pImpl;
87*cdf0e10cSrcweir 	m_pImpl = NULL;
88*cdf0e10cSrcweir }
89*cdf0e10cSrcweir // -----------------------------------------------------------------------------
90*cdf0e10cSrcweir 
91*cdf0e10cSrcweir sdbcx::ObjectType OColumnsHelper::createObject(const ::rtl::OUString& _rName)
92*cdf0e10cSrcweir {
93*cdf0e10cSrcweir 	OSL_ENSURE(m_pTable,"NO Table set. Error!");
94*cdf0e10cSrcweir 	Reference<XConnection> xConnection = m_pTable->getConnection();
95*cdf0e10cSrcweir 
96*cdf0e10cSrcweir 	if ( !m_pImpl )
97*cdf0e10cSrcweir 		m_pImpl = new OColumnsHelperImpl(isCaseSensitive());
98*cdf0e10cSrcweir 
99*cdf0e10cSrcweir 	sal_Bool bQueryInfo		= sal_True;
100*cdf0e10cSrcweir 	sal_Bool bAutoIncrement = sal_False;
101*cdf0e10cSrcweir 	sal_Bool bIsCurrency	= sal_False;
102*cdf0e10cSrcweir 	sal_Int32 nDataType		= DataType::OTHER;
103*cdf0e10cSrcweir 
104*cdf0e10cSrcweir 	ColumnInformationMap::iterator aFind = m_pImpl->m_aColumnInfo.find(_rName);
105*cdf0e10cSrcweir 	if ( aFind == m_pImpl->m_aColumnInfo.end() ) // we have to fill it
106*cdf0e10cSrcweir 	{
107*cdf0e10cSrcweir         ::rtl::OUString sComposedName = ::dbtools::composeTableNameForSelect( xConnection, m_pTable );
108*cdf0e10cSrcweir 		collectColumnInformation(xConnection,sComposedName,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("*")) ,m_pImpl->m_aColumnInfo);
109*cdf0e10cSrcweir 		aFind = m_pImpl->m_aColumnInfo.find(_rName);
110*cdf0e10cSrcweir 	}
111*cdf0e10cSrcweir 	if ( aFind != m_pImpl->m_aColumnInfo.end() )
112*cdf0e10cSrcweir 	{
113*cdf0e10cSrcweir 		bQueryInfo		= sal_False;
114*cdf0e10cSrcweir 		bAutoIncrement	= aFind->second.first.first;
115*cdf0e10cSrcweir 		bIsCurrency		= aFind->second.first.second;
116*cdf0e10cSrcweir 		nDataType		= aFind->second.second;
117*cdf0e10cSrcweir 	} // if ( aFind != m_pImpl->m_aColumnInfo.end() )
118*cdf0e10cSrcweir 
119*cdf0e10cSrcweir     sdbcx::ObjectType xRet;
120*cdf0e10cSrcweir     const ColumnDesc* pColDesc = m_pTable->getColumnDescription(_rName);
121*cdf0e10cSrcweir     if ( pColDesc )
122*cdf0e10cSrcweir     {
123*cdf0e10cSrcweir         Reference<XPropertySet> xPr = m_pTable;
124*cdf0e10cSrcweir         const Reference<XNameAccess> xPrimaryKeyColumns = getPrimaryKeyColumns_throw(xPr);
125*cdf0e10cSrcweir         sal_Int32 nField11 = pColDesc->nField11;
126*cdf0e10cSrcweir         if ( nField11 != ColumnValue::NO_NULLS && xPrimaryKeyColumns.is() && xPrimaryKeyColumns->hasByName(_rName) )
127*cdf0e10cSrcweir         {
128*cdf0e10cSrcweir             nField11 = ColumnValue::NO_NULLS;
129*cdf0e10cSrcweir         } // if ( xKeys.is() )
130*cdf0e10cSrcweir         connectivity::sdbcx::OColumn* pRet = new connectivity::sdbcx::OColumn(_rName,
131*cdf0e10cSrcweir 												pColDesc->aField6,
132*cdf0e10cSrcweir 												pColDesc->sField13,
133*cdf0e10cSrcweir                                                 pColDesc->sField12,
134*cdf0e10cSrcweir 												nField11,
135*cdf0e10cSrcweir 												pColDesc->nField7,
136*cdf0e10cSrcweir 												pColDesc->nField9,
137*cdf0e10cSrcweir 												pColDesc->nField5,
138*cdf0e10cSrcweir 												bAutoIncrement,
139*cdf0e10cSrcweir 												sal_False,
140*cdf0e10cSrcweir 												bIsCurrency,
141*cdf0e10cSrcweir 												isCaseSensitive());
142*cdf0e10cSrcweir 
143*cdf0e10cSrcweir 		xRet = pRet;
144*cdf0e10cSrcweir     }
145*cdf0e10cSrcweir     else
146*cdf0e10cSrcweir     {
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir 	    xRet.set(::dbtools::createSDBCXColumn(	m_pTable,
149*cdf0e10cSrcweir 											    xConnection,
150*cdf0e10cSrcweir 											    _rName,
151*cdf0e10cSrcweir 											    isCaseSensitive(),
152*cdf0e10cSrcweir 											    bQueryInfo,
153*cdf0e10cSrcweir 											    bAutoIncrement,
154*cdf0e10cSrcweir 											    bIsCurrency,
155*cdf0e10cSrcweir 											    nDataType),UNO_QUERY);
156*cdf0e10cSrcweir     }
157*cdf0e10cSrcweir 	return xRet;
158*cdf0e10cSrcweir }
159*cdf0e10cSrcweir 
160*cdf0e10cSrcweir // -------------------------------------------------------------------------
161*cdf0e10cSrcweir void OColumnsHelper::impl_refresh() throw(RuntimeException)
162*cdf0e10cSrcweir {
163*cdf0e10cSrcweir 	if ( m_pTable )
164*cdf0e10cSrcweir 	{
165*cdf0e10cSrcweir 		m_pImpl->m_aColumnInfo.clear();
166*cdf0e10cSrcweir 		m_pTable->refreshColumns();
167*cdf0e10cSrcweir 	}
168*cdf0e10cSrcweir }
169*cdf0e10cSrcweir // -------------------------------------------------------------------------
170*cdf0e10cSrcweir Reference< XPropertySet > OColumnsHelper::createDescriptor()
171*cdf0e10cSrcweir {
172*cdf0e10cSrcweir 	return new OColumn(sal_True);
173*cdf0e10cSrcweir }
174*cdf0e10cSrcweir // -----------------------------------------------------------------------------
175*cdf0e10cSrcweir // XAppend
176*cdf0e10cSrcweir sdbcx::ObjectType OColumnsHelper::appendObject( const ::rtl::OUString& _rForName, const Reference< XPropertySet >& descriptor )
177*cdf0e10cSrcweir {
178*cdf0e10cSrcweir 	::osl::MutexGuard aGuard(m_rMutex);
179*cdf0e10cSrcweir 	OSL_ENSURE(m_pTable,"OColumnsHelper::appendByDescriptor: Table is null!");
180*cdf0e10cSrcweir 	if ( !m_pTable || m_pTable->isNew() )
181*cdf0e10cSrcweir         return cloneDescriptor( descriptor );
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir     Reference<XDatabaseMetaData> xMetaData = m_pTable->getConnection()->getMetaData();
184*cdf0e10cSrcweir 	::rtl::OUString aSql	= ::rtl::OUString::createFromAscii("ALTER TABLE ");
185*cdf0e10cSrcweir 	::rtl::OUString aQuote	= xMetaData->getIdentifierQuoteString(  );
186*cdf0e10cSrcweir 
187*cdf0e10cSrcweir 	aSql += ::dbtools::composeTableName( xMetaData, m_pTable, ::dbtools::eInTableDefinitions, false, false, true );
188*cdf0e10cSrcweir 	aSql += ::rtl::OUString::createFromAscii(" ADD ");
189*cdf0e10cSrcweir 	aSql += ::dbtools::createStandardColumnPart(descriptor,m_pTable->getConnection(),NULL,m_pTable->getTypeCreatePattern());
190*cdf0e10cSrcweir 
191*cdf0e10cSrcweir 	Reference< XStatement > xStmt = m_pTable->getConnection()->createStatement(  );
192*cdf0e10cSrcweir 	if ( xStmt.is() )
193*cdf0e10cSrcweir 	{
194*cdf0e10cSrcweir 		xStmt->execute(aSql);
195*cdf0e10cSrcweir 		::comphelper::disposeComponent(xStmt);
196*cdf0e10cSrcweir 	}
197*cdf0e10cSrcweir     return createObject( _rForName );
198*cdf0e10cSrcweir }
199*cdf0e10cSrcweir // -------------------------------------------------------------------------
200*cdf0e10cSrcweir // XDrop
201*cdf0e10cSrcweir void OColumnsHelper::dropObject(sal_Int32 /*_nPos*/,const ::rtl::OUString _sElementName)
202*cdf0e10cSrcweir {
203*cdf0e10cSrcweir 	OSL_ENSURE(m_pTable,"OColumnsHelper::dropByName: Table is null!");
204*cdf0e10cSrcweir 	if ( m_pTable && !m_pTable->isNew() )
205*cdf0e10cSrcweir 	{
206*cdf0e10cSrcweir 		::rtl::OUString aSql	= ::rtl::OUString::createFromAscii("ALTER TABLE ");
207*cdf0e10cSrcweir 		Reference<XDatabaseMetaData> xMetaData = m_pTable->getConnection()->getMetaData();
208*cdf0e10cSrcweir 		::rtl::OUString aQuote	= xMetaData->getIdentifierQuoteString(  );
209*cdf0e10cSrcweir 
210*cdf0e10cSrcweir 		aSql += ::dbtools::composeTableName( xMetaData, m_pTable, ::dbtools::eInTableDefinitions, false, false, true );
211*cdf0e10cSrcweir 		aSql += ::rtl::OUString::createFromAscii(" DROP ");
212*cdf0e10cSrcweir 		aSql += ::dbtools::quoteName( aQuote,_sElementName);
213*cdf0e10cSrcweir 
214*cdf0e10cSrcweir         Reference< XStatement > xStmt = m_pTable->getConnection()->createStatement(  );
215*cdf0e10cSrcweir 		if ( xStmt.is() )
216*cdf0e10cSrcweir 		{
217*cdf0e10cSrcweir 			xStmt->execute(aSql);
218*cdf0e10cSrcweir 			::comphelper::disposeComponent(xStmt);
219*cdf0e10cSrcweir 		}
220*cdf0e10cSrcweir 	}
221*cdf0e10cSrcweir }
222*cdf0e10cSrcweir // -----------------------------------------------------------------------------
223*cdf0e10cSrcweir 
224*cdf0e10cSrcweir 
225*cdf0e10cSrcweir 
226