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 #include <flat/EDatabaseMetaData.hxx>
21 #include <com/sun/star/sdbc/ColumnSearch.hpp>
22 #include <com/sun/star/sdbc/DataType.hpp>
23 #include <com/sun/star/sdbc/ColumnValue.hpp>
24 #include <com/sun/star/sdbc/SQLException.hpp>
25 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
26 #include <FDatabaseMetaDataResultSet.hxx>
27 #include <comphelper/types.hxx>
28 
29 using namespace ::comphelper;
30 
31 using namespace connectivity;
32 using namespace connectivity::flat;
33 using namespace ::com::sun::star::uno;
34 using namespace ::com::sun::star::beans;
35 using namespace ::com::sun::star::sdbcx;
36 using namespace ::com::sun::star::sdbc;
37 using namespace ::com::sun::star::container;
38 
39 
OFlatDatabaseMetaData(::connectivity::file::OConnection * _pCon)40 OFlatDatabaseMetaData::OFlatDatabaseMetaData(::connectivity::file::OConnection* _pCon)  :ODatabaseMetaData(_pCon)
41 {
42 }
43 
~OFlatDatabaseMetaData()44 OFlatDatabaseMetaData::~OFlatDatabaseMetaData()
45 {
46 }
47 
impl_getTypeInfo_throw()48 Reference< XResultSet > OFlatDatabaseMetaData::impl_getTypeInfo_throw(  )
49 {
50     ::osl::MutexGuard aGuard( m_aMutex );
51 
52     rtl::Reference<::connectivity::ODatabaseMetaDataResultSet> pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTypeInfo);
53 
54     static ODatabaseMetaDataResultSet::ORows aRows = [&]()
55     {
56         ODatabaseMetaDataResultSet::ORows tmp;
57         ODatabaseMetaDataResultSet::ORow aRow
58         {
59              ODatabaseMetaDataResultSet::getEmptyValue() ,
60              new ORowSetValueDecorator(OUString("CHAR")) ,
61              new ORowSetValueDecorator(DataType::CHAR) ,
62              new ORowSetValueDecorator(sal_Int32(254)) ,
63              ODatabaseMetaDataResultSet::getQuoteValue() ,
64              ODatabaseMetaDataResultSet::getQuoteValue() ,
65              ODatabaseMetaDataResultSet::getEmptyValue() ,
66              new ORowSetValueDecorator(sal_Int32(ColumnValue::NULLABLE)) ,
67              ODatabaseMetaDataResultSet::get1Value() ,
68              new ORowSetValueDecorator(sal_Int32(ColumnSearch::CHAR)) ,
69              ODatabaseMetaDataResultSet::get1Value() ,
70              ODatabaseMetaDataResultSet::get0Value() ,
71              ODatabaseMetaDataResultSet::get0Value() ,
72              ODatabaseMetaDataResultSet::getEmptyValue() ,
73              ODatabaseMetaDataResultSet::get0Value() ,
74              ODatabaseMetaDataResultSet::get0Value() ,
75              ODatabaseMetaDataResultSet::getEmptyValue() ,
76              ODatabaseMetaDataResultSet::getEmptyValue() ,
77              new ORowSetValueDecorator(sal_Int32(10))
78         };
79 
80         tmp.push_back(aRow);
81 
82         aRow[1] = new ORowSetValueDecorator(OUString("VARCHAR"));
83         aRow[2] = new ORowSetValueDecorator(DataType::VARCHAR);
84         aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue();
85         aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue();
86         tmp.push_back(aRow);
87 
88 
89         aRow[1] = new ORowSetValueDecorator(OUString("LONGVARCHAR"));
90         aRow[2] = new ORowSetValueDecorator(DataType::LONGVARCHAR);
91         aRow[3] = new ORowSetValueDecorator(sal_Int32(65535));
92         aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue();
93         aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue();
94         tmp.push_back(aRow);
95 
96         aRow[1] = new ORowSetValueDecorator(OUString("DATE"));
97         aRow[2] = new ORowSetValueDecorator(DataType::DATE);
98         aRow[3] = new ORowSetValueDecorator(sal_Int32(10));
99         aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue();
100         aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue();
101         tmp.push_back(aRow);
102 
103         aRow[1] = new ORowSetValueDecorator(OUString("TIME"));
104         aRow[2] = new ORowSetValueDecorator(DataType::TIME);
105         aRow[3] = new ORowSetValueDecorator(sal_Int32(8));
106         aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue();
107         aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue();
108         tmp.push_back(aRow);
109 
110         aRow[1] = new ORowSetValueDecorator(OUString("TIMESTAMP"));
111         aRow[2] = new ORowSetValueDecorator(DataType::TIMESTAMP);
112         aRow[3] = new ORowSetValueDecorator(sal_Int32(19));
113         aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue();
114         aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue();
115         tmp.push_back(aRow);
116 
117         aRow[1] = new ORowSetValueDecorator(OUString("BOOL"));
118         aRow[2] = new ORowSetValueDecorator(DataType::BIT);
119         aRow[3] = ODatabaseMetaDataResultSet::get1Value();
120         aRow[9] = ODatabaseMetaDataResultSet::getBasicValue();
121         tmp.push_back(aRow);
122 
123         aRow[1] = new ORowSetValueDecorator(OUString("DECIMAL"));
124         aRow[2] = new ORowSetValueDecorator(DataType::DECIMAL);
125         aRow[3] = new ORowSetValueDecorator(sal_Int32(20));
126         aRow[15] = new ORowSetValueDecorator(sal_Int32(15));
127         tmp.push_back(aRow);
128 
129         aRow[1] = new ORowSetValueDecorator(OUString("DOUBLE"));
130         aRow[2] = new ORowSetValueDecorator(DataType::DOUBLE);
131         aRow[3] = new ORowSetValueDecorator(sal_Int32(20));
132         aRow[15] = ODatabaseMetaDataResultSet::get0Value();
133         tmp.push_back(aRow);
134 
135         aRow[1] = new ORowSetValueDecorator(OUString("NUMERIC"));
136         aRow[2] = new ORowSetValueDecorator(DataType::NUMERIC);
137         aRow[3] = new ORowSetValueDecorator(sal_Int32(20));
138         aRow[15] = new ORowSetValueDecorator(sal_Int32(20));
139         tmp.push_back(aRow);
140 
141         return tmp;
142     }();
143 
144     pResult->setRows(aRows);
145     return pResult;
146 }
147 
getColumns(const Any &,const OUString &,const OUString & tableNamePattern,const OUString & columnNamePattern)148 Reference< XResultSet > SAL_CALL OFlatDatabaseMetaData::getColumns(
149     const Any& /*catalog*/, const OUString& /*schemaPattern*/, const OUString& tableNamePattern,
150         const OUString& columnNamePattern )
151 {
152     ::osl::MutexGuard aGuard( m_aMutex );
153 
154     Reference< XTablesSupplier > xTables = m_pConnection->createCatalog();
155     if(!xTables.is())
156         throw SQLException();
157 
158     Reference< XNameAccess> xNames = xTables->getTables();
159     if(!xNames.is())
160         throw SQLException();
161 
162     ODatabaseMetaDataResultSet::ORows aRows;
163     ODatabaseMetaDataResultSet::ORow aRow(19);
164     aRow[10] = new ORowSetValueDecorator(sal_Int32(10));
165     Sequence< OUString> aTabNames(xNames->getElementNames());
166     const OUString* pTabBegin    = aTabNames.getConstArray();
167     const OUString* pTabEnd      = pTabBegin + aTabNames.getLength();
168     for(;pTabBegin != pTabEnd;++pTabBegin)
169     {
170         if(match(tableNamePattern,*pTabBegin,'\0'))
171         {
172             Reference< XColumnsSupplier> xTable(
173                 xNames->getByName(*pTabBegin), css::uno::UNO_QUERY);
174             aRow[3] = new ORowSetValueDecorator(*pTabBegin);
175 
176             Reference< XNameAccess> xColumns = xTable->getColumns();
177             if(!xColumns.is())
178                 throw SQLException();
179 
180             Sequence< OUString> aColNames(xColumns->getElementNames());
181 
182             const OUString* pBegin = aColNames.getConstArray();
183             const OUString* pEnd = pBegin + aColNames.getLength();
184             Reference< XPropertySet> xColumn;
185             for(sal_Int32 i=1;pBegin != pEnd;++pBegin,++i)
186             {
187                 if(match(columnNamePattern,*pBegin,'\0'))
188                 {
189                     aRow[4] = new ORowSetValueDecorator(*pBegin);
190 
191                     xColumn.set(
192                         xColumns->getByName(*pBegin), css::uno::UNO_QUERY);
193                     OSL_ENSURE(xColumn.is(),"Columns contains a column who isn't a fastpropertyset!");
194                     aRow[5] = new ORowSetValueDecorator(getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE))));
195                     aRow[6] = new ORowSetValueDecorator(getString(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME))));
196                     aRow[7] = new ORowSetValueDecorator(getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION))));
197                     aRow[9] = new ORowSetValueDecorator(getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE))));
198                     aRow[11] = new ORowSetValueDecorator(getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE))));
199                     aRow[13] = new ORowSetValueDecorator(getString(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE))));
200 
201                     switch(static_cast<sal_Int32>(aRow[5]->getValue()))
202                     {
203                     case DataType::CHAR:
204                     case DataType::VARCHAR:
205                         aRow[16] = new ORowSetValueDecorator(sal_Int32(254));
206                         break;
207                     case DataType::LONGVARCHAR:
208                         aRow[16] = new ORowSetValueDecorator(sal_Int32(65535));
209                         break;
210                     default:
211                         aRow[16] = new ORowSetValueDecorator(sal_Int32(0));
212                     }
213                     aRow[17] = new ORowSetValueDecorator(i);
214                     switch(sal_Int32(aRow[11]->getValue()))
215                     {
216                     case ColumnValue::NO_NULLS:
217                         aRow[18]  = new ORowSetValueDecorator(OUString("NO"));
218                         break;
219                     case ColumnValue::NULLABLE:
220                         aRow[18]  = new ORowSetValueDecorator(OUString("YES"));
221                         break;
222                     default:
223                         aRow[18]  = new ORowSetValueDecorator(OUString());
224                     }
225                     aRows.push_back(aRow);
226                 }
227             }
228         }
229     }
230 
231     rtl::Reference<::connectivity::ODatabaseMetaDataResultSet> pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eColumns);
232     pResult->setRows(aRows);
233 
234     return pResult;
235 }
236 
getURL()237 OUString SAL_CALL OFlatDatabaseMetaData::getURL(  )
238 {
239     ::osl::MutexGuard aGuard( m_aMutex );
240     return "sdbc:flat:" + m_pConnection->getURL();
241 }
242 
243 
244 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
245