xref: /AOO41X/main/connectivity/source/parse/PColumn.cxx (revision 9b5730f6ddef7eb82608ca4d31dc0d7678e652cf)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_connectivity.hxx"
26 
27 #include "connectivity/PColumn.hxx"
28 #include "connectivity/dbtools.hxx"
29 #include "TConnection.hxx"
30 
31 #include <comphelper/types.hxx>
32 #include <tools/diagnose_ex.h>
33 
34 using namespace ::comphelper;
35 using namespace connectivity;
36 using namespace dbtools;
37 using namespace connectivity::parse;
38 using namespace ::com::sun::star::uno;
39 using namespace ::com::sun::star::sdbc;
40 using namespace ::com::sun::star::beans;
41 using namespace ::com::sun::star::container;
42 
43 // -------------------------------------------------------------------------
OParseColumn(const Reference<XPropertySet> & _xColumn,sal_Bool _bCase)44 OParseColumn::OParseColumn(const Reference<XPropertySet>& _xColumn,sal_Bool     _bCase)
45     : connectivity::sdbcx::OColumn( getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)))
46                                 ,   getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME)))
47                                 ,   getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE)))
48                                 ,   getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION)))
49                                 ,   getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE)))
50                                 ,   getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION)))
51                                 ,   getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE)))
52                                 ,   getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)))
53                                 ,   getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT)))
54                                 ,   sal_False
55                                 ,   getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY)))
56                                 ,   _bCase
57                                 )
58     , m_bFunction(sal_False)
59     , m_bDbasePrecisionChanged(sal_False)
60     , m_bAggregateFunction(sal_False)
61     , m_bIsSearchable( sal_True )
62 {
63     construct();
64 }
65 
66 // -------------------------------------------------------------------------
OParseColumn(const::rtl::OUString & _Name,const::rtl::OUString & _TypeName,const::rtl::OUString & _DefaultValue,const::rtl::OUString & _Description,sal_Int32 _IsNullable,sal_Int32 _Precision,sal_Int32 _Scale,sal_Int32 _Type,sal_Bool _IsAutoIncrement,sal_Bool _IsCurrency,sal_Bool _bCase)67 OParseColumn::OParseColumn( const ::rtl::OUString& _Name,
68                     const ::rtl::OUString& _TypeName,
69                     const ::rtl::OUString& _DefaultValue,
70                     const ::rtl::OUString& _Description,
71                     sal_Int32       _IsNullable,
72                     sal_Int32       _Precision,
73                     sal_Int32       _Scale,
74                     sal_Int32       _Type,
75                     sal_Bool        _IsAutoIncrement,
76                     sal_Bool        _IsCurrency,
77                     sal_Bool        _bCase
78                 ) : connectivity::sdbcx::OColumn(_Name,
79                                   _TypeName,
80                                   _DefaultValue,
81                                   _Description,
82                                   _IsNullable,
83                                   _Precision,
84                                   _Scale,
85                                   _Type,
86                                   _IsAutoIncrement,
87                                   sal_False,
88                                   _IsCurrency,
89                                   _bCase)
90     , m_bFunction(sal_False)
91     , m_bDbasePrecisionChanged(sal_False)
92     , m_bAggregateFunction(sal_False)
93     , m_bIsSearchable( sal_True )
94 {
95     construct();
96 }
97 
98 // -------------------------------------------------------------------------
createColumnsForResultSet(const Reference<XResultSetMetaData> & _rxResMetaData,const Reference<XDatabaseMetaData> & _rxDBMetaData,const Reference<XNameAccess> & i_xQueryColumns)99 ::vos::ORef< OSQLColumns > OParseColumn::createColumnsForResultSet( const Reference< XResultSetMetaData >& _rxResMetaData,
100     const Reference< XDatabaseMetaData >& _rxDBMetaData,const Reference< XNameAccess>& i_xQueryColumns )
101 {
102     sal_Int32 nColumnCount = _rxResMetaData->getColumnCount();
103     ::vos::ORef< OSQLColumns > aReturn( new OSQLColumns ); aReturn->get().reserve( nColumnCount );
104 
105     StringMap aColumnMap;
106     for ( sal_Int32 i = 1; i <= nColumnCount; ++i )
107     {
108         OParseColumn* pColumn = createColumnForResultSet( _rxResMetaData, _rxDBMetaData, i,aColumnMap );
109         aReturn->get().push_back( pColumn );
110         if ( i_xQueryColumns.is() && i_xQueryColumns->hasByName(pColumn->getRealName()) )
111         {
112             Reference<XPropertySet> xColumn(i_xQueryColumns->getByName(pColumn->getRealName()),UNO_QUERY_THROW);
113             ::rtl::OUString sLabel;
114             xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_LABEL)) >>= sLabel;
115             if ( sLabel.getLength() )
116                 pColumn->setLabel(sLabel);
117         }
118     }
119 
120     return aReturn;
121 }
122 
123 // -------------------------------------------------------------------------
createColumnForResultSet(const Reference<XResultSetMetaData> & _rxResMetaData,const Reference<XDatabaseMetaData> & _rxDBMetaData,sal_Int32 _nColumnPos,StringMap & _rColumns)124 OParseColumn* OParseColumn::createColumnForResultSet( const Reference< XResultSetMetaData >& _rxResMetaData,
125     const Reference< XDatabaseMetaData >& _rxDBMetaData, sal_Int32 _nColumnPos,StringMap& _rColumns )
126 {
127     ::rtl::OUString sLabel = _rxResMetaData->getColumnLabel( _nColumnPos );
128     // retrieve the name of the column
129     // check for duplicate entries
130     if(_rColumns.find(sLabel) != _rColumns.end())
131     {
132         ::rtl::OUString sAlias(sLabel);
133         sal_Int32 searchIndex=1;
134         while(_rColumns.find(sAlias) != _rColumns.end())
135         {
136             (sAlias = sLabel) += ::rtl::OUString::valueOf(searchIndex++);
137         }
138         sLabel = sAlias;
139     }
140     _rColumns.insert(StringMap::value_type(sLabel,0));
141     OParseColumn* pColumn = new OParseColumn(
142         sLabel,
143         _rxResMetaData->getColumnTypeName( _nColumnPos ),
144         ::rtl::OUString(),
145         ::rtl::OUString(),
146         _rxResMetaData->isNullable( _nColumnPos ),
147         _rxResMetaData->getPrecision( _nColumnPos ),
148         _rxResMetaData->getScale( _nColumnPos ),
149         _rxResMetaData->getColumnType( _nColumnPos ),
150         _rxResMetaData->isAutoIncrement( _nColumnPos ),
151         _rxResMetaData->isCurrency( _nColumnPos ),
152         _rxDBMetaData->supportsMixedCaseQuotedIdentifiers()
153     );
154     const ::rtl::OUString sTableName = _rxResMetaData->getTableName( _nColumnPos );
155     if ( sTableName.getLength() )
156         pColumn->setTableName(  ::dbtools::composeTableName( _rxDBMetaData,
157             _rxResMetaData->getCatalogName( _nColumnPos ),
158             _rxResMetaData->getSchemaName( _nColumnPos ),
159             sTableName,
160             sal_False,
161             eComplete
162         ) );
163     pColumn->setIsSearchable( _rxResMetaData->isSearchable( _nColumnPos ) );
164     pColumn->setRealName(_rxResMetaData->getColumnName( _nColumnPos ));
165     pColumn->setLabel(sLabel);
166     return pColumn;
167 }
168 
169 // -------------------------------------------------------------------------
~OParseColumn()170 OParseColumn::~OParseColumn()
171 {
172 }
173 // -------------------------------------------------------------------------
construct()174 void OParseColumn::construct()
175 {
176     registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FUNCTION),                PROPERTY_ID_FUNCTION,               0,  &m_bFunction,               ::getCppuType(reinterpret_cast< sal_Bool*>(NULL)));
177     registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_AGGREGATEFUNCTION),       PROPERTY_ID_AGGREGATEFUNCTION,      0,  &m_bAggregateFunction,      ::getCppuType(reinterpret_cast< sal_Bool*>(NULL)));
178     registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TABLENAME),               PROPERTY_ID_TABLENAME,              0,  &m_aTableName,              ::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL)));
179     registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_REALNAME),                PROPERTY_ID_REALNAME,               0,  &m_aRealName,               ::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL)));
180     registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DBASEPRECISIONCHANGED),   PROPERTY_ID_DBASEPRECISIONCHANGED,  0,  &m_bDbasePrecisionChanged,  ::getCppuType(reinterpret_cast<sal_Bool*>(NULL)));
181     registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISSEARCHABLE),            PROPERTY_ID_ISSEARCHABLE,           0,  &m_bIsSearchable,           ::getCppuType(reinterpret_cast< sal_Bool*>(NULL)));
182     registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_LABEL),                   PROPERTY_ID_LABEL,                  0,  &m_sLabel,                  ::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL)));
183 }
184 // -----------------------------------------------------------------------------
createArrayHelper() const185 ::cppu::IPropertyArrayHelper* OParseColumn::createArrayHelper() const
186 {
187     return doCreateArrayHelper();
188 }
189 // -----------------------------------------------------------------------------
getInfoHelper()190 ::cppu::IPropertyArrayHelper & SAL_CALL OParseColumn::getInfoHelper()
191 {
192     OSL_ENSURE( !isNew(), "OParseColumn::getInfoHelper: a *new* ParseColumn?" );
193     return *OParseColumn_PROP::getArrayHelper();
194 }
195 
196 // -----------------------------------------------------------------------------
197 namespace
198 {
lcl_getColumnTableName(const Reference<XPropertySet> & i_parseColumn)199     ::rtl::OUString lcl_getColumnTableName( const Reference< XPropertySet >& i_parseColumn )
200     {
201         ::rtl::OUString sColumnTableName;
202         try
203         {
204             OSL_VERIFY( i_parseColumn->getPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_TABLENAME ) ) >>= sColumnTableName );
205         }
206         catch( const Exception& )
207         {
208             DBG_UNHANDLED_EXCEPTION();
209         }
210         return sColumnTableName;
211     }
212 }
213 
214 // -----------------------------------------------------------------------------
OOrderColumn(const Reference<XPropertySet> & _xColumn,const::rtl::OUString & i_rOriginatingTableName,sal_Bool _bCase,sal_Bool _bAscending)215 OOrderColumn::OOrderColumn( const Reference<XPropertySet>& _xColumn, const ::rtl::OUString& i_rOriginatingTableName,
216                             sal_Bool    _bCase, sal_Bool _bAscending )
217     : connectivity::sdbcx::OColumn(
218         getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME))),
219         getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME))),
220         getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE))),
221         getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION))),
222         getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE))),
223         getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION))),
224         getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE))),
225         getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE))),
226         getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT))),
227         sal_False,
228         getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY))),
229         _bCase
230     )
231     ,m_bAscending(_bAscending)
232     ,m_sTableName( i_rOriginatingTableName )
233 {
234     construct();
235 }
236 
237 // -----------------------------------------------------------------------------
OOrderColumn(const Reference<XPropertySet> & _xColumn,sal_Bool _bCase,sal_Bool _bAscending)238 OOrderColumn::OOrderColumn( const Reference<XPropertySet>& _xColumn, sal_Bool _bCase, sal_Bool _bAscending )
239     : connectivity::sdbcx::OColumn(
240         getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME))),
241         getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME))),
242         getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE))),
243         getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION))),
244         getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE))),
245         getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION))),
246         getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE))),
247         getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE))),
248         getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT))),
249         sal_False,
250         getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY))),
251         _bCase
252     )
253     ,m_bAscending(_bAscending)
254     ,m_sTableName( lcl_getColumnTableName( _xColumn ) )
255 {
256     construct();
257 }
258 
259 // -------------------------------------------------------------------------
~OOrderColumn()260 OOrderColumn::~OOrderColumn()
261 {
262 }
263 
264 // -------------------------------------------------------------------------
construct()265 void OOrderColumn::construct()
266 {
267     registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISASCENDING), PROPERTY_ID_ISASCENDING,
268         PropertyAttribute::READONLY,  const_cast< sal_Bool* >( &m_bAscending ),    ::getCppuType( reinterpret_cast< sal_Bool* >( NULL ) ) );
269     registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TABLENAME),   PROPERTY_ID_TABLENAME,
270         PropertyAttribute::READONLY,  const_cast< ::rtl::OUString* >( &m_sTableName ),  ::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL)));
271 }
272 // -----------------------------------------------------------------------------
createArrayHelper() const273 ::cppu::IPropertyArrayHelper* OOrderColumn::createArrayHelper() const
274 {
275     return doCreateArrayHelper();
276 }
277 // -----------------------------------------------------------------------------
getInfoHelper()278 ::cppu::IPropertyArrayHelper & SAL_CALL OOrderColumn::getInfoHelper()
279 {
280     OSL_ENSURE( !isNew(), "OOrderColumn::getInfoHelper: a *new* OrderColumn?" );
281     return *OOrderColumn_PROP::getArrayHelper();
282 }
283 // -----------------------------------------------------------------------------
getSupportedServiceNames()284 ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL OOrderColumn::getSupportedServiceNames(  ) throw(::com::sun::star::uno::RuntimeException)
285 {
286     ::com::sun::star::uno::Sequence< ::rtl::OUString > aSupported(1);
287     aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdb.OrderColumn");
288 
289     return aSupported;
290 }
291 // -----------------------------------------------------------------------------
292