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