Coverage Report

Created: 2026-08-14 10:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/connectivity/source/parse/PColumn.cxx
Line
Count
Source
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 <TConnection.hxx>
23
24
#include <comphelper/types.hxx>
25
26
#include <com/sun/star/sdbc/XResultSetMetaData.hpp>
27
#include <com/sun/star/beans/PropertyAttribute.hpp>
28
29
using namespace ::comphelper;
30
using namespace connectivity;
31
using namespace dbtools;
32
using namespace connectivity::parse;
33
using namespace ::com::sun::star::uno;
34
using namespace ::com::sun::star::sdbc;
35
using namespace ::com::sun::star::beans;
36
using namespace ::com::sun::star::container;
37
38
39
OParseColumn::OParseColumn(const Reference<XPropertySet>& _xColumn, bool _bCase)
40
0
    : connectivity::sdbcx::OColumn( getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)))
41
0
                                ,   getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME)))
42
0
                                ,   getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE)))
43
0
                                ,   getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION)))
44
0
                                ,   getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE)))
45
0
                                ,   getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION)))
46
0
                                ,   getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE)))
47
0
                                ,   getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)))
48
0
                                ,   getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT)))
49
0
                                ,   false
50
0
                                ,   getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY)))
51
0
                                ,   _bCase
52
0
                                ,   getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CATALOGNAME)))
53
0
                                ,   getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCHEMANAME)))
54
0
                                ,   getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TABLENAME)))
55
0
                                )
56
0
    , m_bFunction(false)
57
0
    , m_bDbasePrecisionChanged(false)
58
0
    , m_bAggregateFunction(false)
59
0
    , m_bIsSearchable( true )
60
0
{
61
0
    construct();
62
0
}
63
64
65
OParseColumn::OParseColumn( const OUString& Name,
66
                    const OUString& TypeName,
67
                    const OUString& DefaultValue,
68
                    const OUString& Description,
69
                    sal_Int32       IsNullable,
70
                    sal_Int32       Precision,
71
                    sal_Int32       Scale,
72
                    sal_Int32       Type,
73
                    bool            IsAutoIncrement,
74
                    bool            IsCurrency,
75
                    bool            _bCase,
76
                    const OUString& CatalogName,
77
                    const OUString& SchemaName,
78
                    const OUString& TableName
79
0
                ) : connectivity::sdbcx::OColumn(Name,
80
0
                                  TypeName,
81
0
                                  DefaultValue,
82
0
                                  Description,
83
0
                                  IsNullable,
84
0
                                  Precision,
85
0
                                  Scale,
86
0
                                  Type,
87
0
                                  IsAutoIncrement,
88
0
                                  false,
89
0
                                  IsCurrency,
90
0
                                  _bCase,
91
0
                                  CatalogName,
92
0
                                  SchemaName,
93
0
                                  TableName)
94
0
    , m_bFunction(false)
95
0
    , m_bDbasePrecisionChanged(false)
96
0
    , m_bAggregateFunction(false)
97
0
    , m_bIsSearchable( true )
98
0
{
99
0
    construct();
100
0
}
101
102
103
::rtl::Reference< OSQLColumns > OParseColumn::createColumnsForResultSet( const Reference< XResultSetMetaData >& _rxResMetaData,
104
    const Reference< XDatabaseMetaData >& _rxDBMetaData,const Reference< XNameAccess>& i_xQueryColumns )
105
0
{
106
0
    sal_Int32 nColumnCount = _rxResMetaData->getColumnCount();
107
0
    ::rtl::Reference aReturn( new OSQLColumns ); aReturn->reserve( nColumnCount );
108
109
0
    StringMap aColumnMap;
110
0
    for ( sal_Int32 i = 1; i <= nColumnCount; ++i )
111
0
    {
112
0
        rtl::Reference<OParseColumn> pColumn = createColumnForResultSet( _rxResMetaData, _rxDBMetaData, i,aColumnMap );
113
0
        aReturn->push_back( pColumn );
114
0
        if ( i_xQueryColumns.is() && i_xQueryColumns->hasByName(pColumn->getRealName()) )
115
0
        {
116
0
            Reference<XPropertySet> xColumn(i_xQueryColumns->getByName(pColumn->getRealName()),UNO_QUERY_THROW);
117
0
            OUString sLabel;
118
0
            xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_LABEL)) >>= sLabel;
119
0
            if ( !sLabel.isEmpty() )
120
0
                pColumn->setLabel(sLabel);
121
0
        }
122
0
    }
123
124
0
    return aReturn;
125
0
}
126
127
128
rtl::Reference<OParseColumn> OParseColumn::createColumnForResultSet( const Reference< XResultSetMetaData >& _rxResMetaData,
129
    const Reference< XDatabaseMetaData >& _rxDBMetaData, sal_Int32 _nColumnPos, StringMap& _rColumns )
130
0
{
131
0
    OUString sLabel = _rxResMetaData->getColumnLabel( _nColumnPos );
132
    // retrieve the name of the column
133
    // check for duplicate entries
134
0
    if(_rColumns.contains(sLabel))
135
0
    {
136
0
        OUString sAlias(sLabel);
137
0
        sal_Int32 searchIndex=1;
138
0
        while(_rColumns.contains(sAlias))
139
0
        {
140
0
            sAlias = sLabel + OUString::number(searchIndex++);
141
0
        }
142
0
        sLabel = sAlias;
143
0
    }
144
0
    _rColumns.emplace(sLabel,0);
145
0
    rtl::Reference<OParseColumn> pColumn = new OParseColumn(
146
0
        sLabel,
147
0
        _rxResMetaData->getColumnTypeName( _nColumnPos ),
148
0
        OUString(),
149
0
        OUString(),
150
0
        _rxResMetaData->isNullable( _nColumnPos ),
151
0
        _rxResMetaData->getPrecision( _nColumnPos ),
152
0
        _rxResMetaData->getScale( _nColumnPos ),
153
0
        _rxResMetaData->getColumnType( _nColumnPos ),
154
0
        _rxResMetaData->isAutoIncrement( _nColumnPos ),
155
0
        _rxResMetaData->isCurrency( _nColumnPos ),
156
0
        _rxDBMetaData->supportsMixedCaseQuotedIdentifiers(),
157
0
        _rxResMetaData->getCatalogName( _nColumnPos ),
158
0
        _rxResMetaData->getSchemaName( _nColumnPos ),
159
0
        _rxResMetaData->getTableName( _nColumnPos )
160
0
    );
161
0
    pColumn->setIsSearchable( _rxResMetaData->isSearchable( _nColumnPos ) );
162
0
    pColumn->setRealName(_rxResMetaData->getColumnName( _nColumnPos ));
163
0
    pColumn->setLabel(sLabel);
164
0
    return pColumn;
165
0
}
166
167
168
OParseColumn::~OParseColumn()
169
0
{
170
0
}
171
172
void OParseColumn::construct()
173
0
{
174
0
    registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_FUNCTION),                PROPERTY_ID_FUNCTION,               0,  &m_bFunction,               cppu::UnoType<decltype(m_bFunction)>::get());
175
0
    registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_AGGREGATEFUNCTION),       PROPERTY_ID_AGGREGATEFUNCTION,      0,  &m_bAggregateFunction,      cppu::UnoType<decltype(m_bAggregateFunction)>::get());
176
0
    registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_REALNAME),                PROPERTY_ID_REALNAME,               0,  &m_aRealName,               cppu::UnoType<decltype(m_aRealName)>::get());
177
0
    registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DBASEPRECISIONCHANGED),   PROPERTY_ID_DBASEPRECISIONCHANGED,  0,  &m_bDbasePrecisionChanged,  cppu::UnoType<decltype(m_bDbasePrecisionChanged)>::get());
178
0
    registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISSEARCHABLE),            PROPERTY_ID_ISSEARCHABLE,           0,  &m_bIsSearchable,           cppu::UnoType<decltype(m_bIsSearchable)>::get());
179
0
    registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_LABEL),                   PROPERTY_ID_LABEL,                  0,  &m_sLabel,                  cppu::UnoType<decltype(m_sLabel)>::get());
180
0
}
181
182
::cppu::IPropertyArrayHelper* OParseColumn::createArrayHelper() const
183
0
{
184
0
    return doCreateArrayHelper();
185
0
}
186
187
::cppu::IPropertyArrayHelper & SAL_CALL OParseColumn::getInfoHelper()
188
0
{
189
0
    OSL_ENSURE( !isNew(), "OParseColumn::getInfoHelper: a *new* ParseColumn?" );
190
0
    return *OParseColumn_PROP::getArrayHelper();
191
0
}
192
193
194
OOrderColumn::OOrderColumn( const Reference<XPropertySet>& _xColumn, const OUString& i_rOriginatingTableName,
195
                            bool _bCase, bool _bAscending )
196
0
    : connectivity::sdbcx::OColumn(
197
0
        getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME))),
198
0
        getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME))),
199
0
        getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE))),
200
0
        getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION))),
201
0
        getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE))),
202
0
        getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION))),
203
0
        getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE))),
204
0
        getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE))),
205
0
        getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT))),
206
0
        false,
207
0
        getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY))),
208
0
        _bCase,
209
0
        getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CATALOGNAME))),
210
0
        getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCHEMANAME))),
211
0
        i_rOriginatingTableName
212
0
    )
213
0
    ,m_bAscending(_bAscending)
214
0
{
215
0
    construct();
216
0
}
217
218
219
OOrderColumn::OOrderColumn( const Reference<XPropertySet>& _xColumn, bool _bCase, bool _bAscending )
220
0
    : connectivity::sdbcx::OColumn(
221
0
        getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME))),
222
0
        getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME))),
223
0
        getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE))),
224
0
        getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DESCRIPTION))),
225
0
        getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE))),
226
0
        getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION))),
227
0
        getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE))),
228
0
        getINT32(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE))),
229
0
        getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT))),
230
0
        false,
231
0
        getBOOL(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY))),
232
0
        _bCase,
233
0
        getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_CATALOGNAME))),
234
0
        getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCHEMANAME))),
235
0
        getString(_xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TABLENAME)))
236
0
    )
237
0
    ,m_bAscending(_bAscending)
238
0
{
239
0
    construct();
240
0
}
241
242
243
OOrderColumn::~OOrderColumn()
244
0
{
245
0
}
246
247
248
void OOrderColumn::construct()
249
0
{
250
0
    registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISASCENDING), PROPERTY_ID_ISASCENDING,
251
0
        PropertyAttribute::READONLY,  const_cast< bool* >( &m_bAscending ),    cppu::UnoType<decltype(m_bAscending)>::get() );
252
0
}
253
254
::cppu::IPropertyArrayHelper* OOrderColumn::createArrayHelper() const
255
0
{
256
0
    return doCreateArrayHelper();
257
0
}
258
259
::cppu::IPropertyArrayHelper & SAL_CALL OOrderColumn::getInfoHelper()
260
0
{
261
0
    OSL_ENSURE( !isNew(), "OOrderColumn::getInfoHelper: a *new* OrderColumn?" );
262
0
    return *OOrderColumn_PROP::getArrayHelper();
263
0
}
264
265
css::uno::Sequence< OUString > SAL_CALL OOrderColumn::getSupportedServiceNames(  )
266
0
{
267
0
    return { u"com.sun.star.sdb.OrderColumn"_ustr };
268
0
}
269
270
271
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */