19b5730f6SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 39b5730f6SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 49b5730f6SAndrew Rist * or more contributor license agreements. See the NOTICE file 59b5730f6SAndrew Rist * distributed with this work for additional information 69b5730f6SAndrew Rist * regarding copyright ownership. The ASF licenses this file 79b5730f6SAndrew Rist * to you under the Apache License, Version 2.0 (the 89b5730f6SAndrew Rist * "License"); you may not use this file except in compliance 99b5730f6SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 119b5730f6SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 139b5730f6SAndrew Rist * Unless required by applicable law or agreed to in writing, 149b5730f6SAndrew Rist * software distributed under the License is distributed on an 159b5730f6SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 169b5730f6SAndrew Rist * KIND, either express or implied. See the License for the 179b5730f6SAndrew Rist * specific language governing permissions and limitations 189b5730f6SAndrew Rist * under the License. 19cdf0e10cSrcweir * 209b5730f6SAndrew Rist *************************************************************/ 219b5730f6SAndrew Rist 229b5730f6SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_connectivity.hxx" 26cdf0e10cSrcweir #include "connectivity/dbtools.hxx" 27cdf0e10cSrcweir #include "connectivity/dbconversion.hxx" 28cdf0e10cSrcweir #include "connectivity/dbcharset.hxx" 29cdf0e10cSrcweir #include "connectivity/SQLStatementHelper.hxx" 30cdf0e10cSrcweir #include <unotools/confignode.hxx> 31cdf0e10cSrcweir #include "resource/sharedresources.hxx" 32cdf0e10cSrcweir #include "resource/common_res.hrc" 33cdf0e10cSrcweir #include <com/sun/star/sdbc/XConnection.hpp> 34cdf0e10cSrcweir #include <com/sun/star/sdbc/ColumnValue.hpp> 35cdf0e10cSrcweir #include <com/sun/star/sdbc/DataType.hpp> 36cdf0e10cSrcweir #include <com/sun/star/sdbc/XRow.hpp> 37cdf0e10cSrcweir #include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp> 38cdf0e10cSrcweir #include <com/sun/star/sdbcx/XKeysSupplier.hpp> 39cdf0e10cSrcweir #include <com/sun/star/sdbc/XDriverAccess.hpp> 40cdf0e10cSrcweir #include <com/sun/star/sdbcx/XDataDefinitionSupplier.hpp> 41cdf0e10cSrcweir #include <com/sun/star/sdbcx/Privilege.hpp> 42cdf0e10cSrcweir #include <com/sun/star/container/XIndexAccess.hpp> 43cdf0e10cSrcweir #include <com/sun/star/container/XEnumerationAccess.hpp> 44cdf0e10cSrcweir #include <com/sun/star/sdbc/KeyRule.hpp> 45cdf0e10cSrcweir #include <com/sun/star/sdbcx/KeyType.hpp> 46cdf0e10cSrcweir #include "TConnection.hxx" 47cdf0e10cSrcweir #include "connectivity/sdbcx/VColumn.hxx" 48cdf0e10cSrcweir #include <com/sun/star/frame/XModel.hpp> 49cdf0e10cSrcweir #include <com/sun/star/container/XChild.hpp> 50cdf0e10cSrcweir 51cdf0e10cSrcweir #include <tools/diagnose_ex.h> 52cdf0e10cSrcweir #include <unotools/sharedunocomponent.hxx> 53cdf0e10cSrcweir #include <comphelper/configurationhelper.hxx> 54cdf0e10cSrcweir 55cdf0e10cSrcweir //......................................................................... 56cdf0e10cSrcweir namespace dbtools 57cdf0e10cSrcweir { 58cdf0e10cSrcweir //......................................................................... 59cdf0e10cSrcweir using namespace ::com::sun::star::uno; 60cdf0e10cSrcweir using namespace ::com::sun::star::beans; 61cdf0e10cSrcweir using namespace ::com::sun::star::sdbc; 62cdf0e10cSrcweir using namespace ::com::sun::star::sdbcx; 63cdf0e10cSrcweir using namespace ::com::sun::star::lang; 64cdf0e10cSrcweir using namespace ::com::sun::star::container; 65cdf0e10cSrcweir using namespace ::com::sun::star::frame; 66cdf0e10cSrcweir using namespace connectivity; 67cdf0e10cSrcweir using namespace comphelper; 68cdf0e10cSrcweir 69cdf0e10cSrcweir ::rtl::OUString createStandardColumnPart(const Reference< XPropertySet >& xColProp,const Reference< XConnection>& _xConnection,ISQLStatementHelper* _pHelper,const ::rtl::OUString& _sCreatePattern) 70cdf0e10cSrcweir { 71cdf0e10cSrcweir 72cdf0e10cSrcweir Reference<XDatabaseMetaData> xMetaData = _xConnection->getMetaData(); 73cdf0e10cSrcweir 74cdf0e10cSrcweir ::dbtools::OPropertyMap& rPropMap = OMetaConnection::getPropMap(); 75cdf0e10cSrcweir 76cdf0e10cSrcweir ::rtl::OUString sTypeName; 77cdf0e10cSrcweir sal_Int32 nDataType = 0; 78cdf0e10cSrcweir sal_Int32 nPrecision = 0; 79cdf0e10cSrcweir sal_Int32 nScale = 0; 80cdf0e10cSrcweir 81cdf0e10cSrcweir const ::rtl::OUString sQuoteString = xMetaData->getIdentifierQuoteString(); 82cdf0e10cSrcweir ::rtl::OUStringBuffer aSql = ::dbtools::quoteName(sQuoteString,::comphelper::getString(xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_NAME)))); 83cdf0e10cSrcweir 84cdf0e10cSrcweir aSql.appendAscii(" "); 85cdf0e10cSrcweir 86cdf0e10cSrcweir nDataType = nPrecision = nScale = 0; 87cdf0e10cSrcweir sal_Bool bIsAutoIncrement = sal_False; 88cdf0e10cSrcweir xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_TYPENAME)) >>= sTypeName; 89cdf0e10cSrcweir xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_TYPE)) >>= nDataType; 90cdf0e10cSrcweir xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_PRECISION)) >>= nPrecision; 91cdf0e10cSrcweir xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_SCALE)) >>= nScale; 92cdf0e10cSrcweir xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_ISAUTOINCREMENT)) >>= bIsAutoIncrement; 93cdf0e10cSrcweir 94cdf0e10cSrcweir // check if the user enter a specific string to create autoincrement values 95cdf0e10cSrcweir ::rtl::OUString sAutoIncrementValue; 96cdf0e10cSrcweir Reference<XPropertySetInfo> xPropInfo = xColProp->getPropertySetInfo(); 97cdf0e10cSrcweir if ( xPropInfo.is() && xPropInfo->hasPropertyByName(rPropMap.getNameByIndex(PROPERTY_ID_AUTOINCREMENTCREATION)) ) 98cdf0e10cSrcweir xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_AUTOINCREMENTCREATION)) >>= sAutoIncrementValue; 99cdf0e10cSrcweir // look if we have to use precisions 100cdf0e10cSrcweir sal_Bool bUseLiteral = sal_False; 101cdf0e10cSrcweir ::rtl::OUString sPreFix,sPostFix,sCreateParams; 102cdf0e10cSrcweir { 103cdf0e10cSrcweir Reference<XResultSet> xRes = xMetaData->getTypeInfo(); 104cdf0e10cSrcweir if(xRes.is()) 105cdf0e10cSrcweir { 106cdf0e10cSrcweir Reference<XRow> xRow(xRes,UNO_QUERY); 107cdf0e10cSrcweir while(xRes->next()) 108cdf0e10cSrcweir { 109cdf0e10cSrcweir ::rtl::OUString sTypeName2Cmp = xRow->getString(1); 110cdf0e10cSrcweir sal_Int32 nType = xRow->getShort(2); 111cdf0e10cSrcweir sPreFix = xRow->getString (4); 112cdf0e10cSrcweir sPostFix = xRow->getString (5); 113cdf0e10cSrcweir sCreateParams = xRow->getString(6); 114cdf0e10cSrcweir // first identical type will be used if typename is empty 115cdf0e10cSrcweir if ( !sTypeName.getLength() && nType == nDataType ) 116cdf0e10cSrcweir sTypeName = sTypeName2Cmp; 117cdf0e10cSrcweir 118cdf0e10cSrcweir if( sTypeName.equalsIgnoreAsciiCase(sTypeName2Cmp) && nType == nDataType && sCreateParams.getLength() && !xRow->wasNull()) 119cdf0e10cSrcweir { 120cdf0e10cSrcweir bUseLiteral = sal_True; 121cdf0e10cSrcweir break; 122cdf0e10cSrcweir } 123cdf0e10cSrcweir } 124cdf0e10cSrcweir } 125cdf0e10cSrcweir } 126cdf0e10cSrcweir 127cdf0e10cSrcweir sal_Int32 nIndex = 0; 128cdf0e10cSrcweir if ( sAutoIncrementValue.getLength() && (nIndex = sTypeName.indexOf(sAutoIncrementValue)) != -1 ) 129cdf0e10cSrcweir { 130cdf0e10cSrcweir sTypeName = sTypeName.replaceAt(nIndex,sTypeName.getLength() - nIndex,::rtl::OUString()); 131cdf0e10cSrcweir } 132cdf0e10cSrcweir 133cdf0e10cSrcweir if ( (nPrecision > 0 || nScale > 0) && bUseLiteral ) 134cdf0e10cSrcweir { 135cdf0e10cSrcweir sal_Int32 nParenPos = sTypeName.indexOf('('); 136cdf0e10cSrcweir if ( nParenPos == -1 ) 137cdf0e10cSrcweir { 138cdf0e10cSrcweir aSql.append(sTypeName); 139cdf0e10cSrcweir aSql.appendAscii("("); 140cdf0e10cSrcweir } 141cdf0e10cSrcweir else 142cdf0e10cSrcweir { 143cdf0e10cSrcweir aSql.append(sTypeName.copy(0,++nParenPos)); 144cdf0e10cSrcweir } 145cdf0e10cSrcweir 146cdf0e10cSrcweir if ( nPrecision > 0 && nDataType != DataType::TIMESTAMP ) 147cdf0e10cSrcweir { 148cdf0e10cSrcweir aSql.append(nPrecision); 149cdf0e10cSrcweir if ( (nScale > 0) || (_sCreatePattern.getLength() && sCreateParams.indexOf(_sCreatePattern) != -1) ) 150cdf0e10cSrcweir aSql.appendAscii(","); 151cdf0e10cSrcweir } 152cdf0e10cSrcweir if ( (nScale > 0) || (_sCreatePattern.getLength() && sCreateParams.indexOf(_sCreatePattern) != -1 ) || nDataType == DataType::TIMESTAMP ) 153cdf0e10cSrcweir aSql.append(nScale); 154cdf0e10cSrcweir 155cdf0e10cSrcweir if ( nParenPos == -1 ) 156cdf0e10cSrcweir aSql.appendAscii(")"); 157cdf0e10cSrcweir else 158cdf0e10cSrcweir { 159cdf0e10cSrcweir nParenPos = sTypeName.indexOf(')',nParenPos); 160cdf0e10cSrcweir aSql.append(sTypeName.copy(nParenPos)); 161cdf0e10cSrcweir } 162cdf0e10cSrcweir } 163cdf0e10cSrcweir else 164cdf0e10cSrcweir aSql.append(sTypeName); // simply add the type name 165cdf0e10cSrcweir 166cdf0e10cSrcweir ::rtl::OUString aDefault = ::comphelper::getString(xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_DEFAULTVALUE))); 167cdf0e10cSrcweir if ( aDefault.getLength() ) 168cdf0e10cSrcweir { 169cdf0e10cSrcweir aSql.append(::rtl::OUString::createFromAscii(" DEFAULT ")); 170cdf0e10cSrcweir aSql.append(sPreFix); 171cdf0e10cSrcweir aSql.append(aDefault); 172cdf0e10cSrcweir aSql.append(sPostFix); 173cdf0e10cSrcweir } // if ( aDefault.getLength() ) 174cdf0e10cSrcweir 175cdf0e10cSrcweir if(::comphelper::getINT32(xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_ISNULLABLE))) == ColumnValue::NO_NULLS) 176cdf0e10cSrcweir aSql.append(::rtl::OUString::createFromAscii(" NOT NULL")); 177cdf0e10cSrcweir 178cdf0e10cSrcweir if ( bIsAutoIncrement && sAutoIncrementValue.getLength()) 179cdf0e10cSrcweir { 180cdf0e10cSrcweir aSql.appendAscii(" "); 181cdf0e10cSrcweir aSql.append(sAutoIncrementValue); 182cdf0e10cSrcweir } 183cdf0e10cSrcweir 184cdf0e10cSrcweir if ( _pHelper ) 185cdf0e10cSrcweir _pHelper->addComment(xColProp,aSql); 186cdf0e10cSrcweir 187cdf0e10cSrcweir return aSql.makeStringAndClear(); 188cdf0e10cSrcweir } 189cdf0e10cSrcweir // ----------------------------------------------------------------------------- 190cdf0e10cSrcweir 191cdf0e10cSrcweir ::rtl::OUString createStandardCreateStatement(const Reference< XPropertySet >& descriptor,const Reference< XConnection>& _xConnection,ISQLStatementHelper* _pHelper,const ::rtl::OUString& _sCreatePattern) 192cdf0e10cSrcweir { 193cdf0e10cSrcweir ::rtl::OUStringBuffer aSql = ::rtl::OUString::createFromAscii("CREATE TABLE "); 194cdf0e10cSrcweir ::rtl::OUString sCatalog,sSchema,sTable,sComposedName; 195cdf0e10cSrcweir 196cdf0e10cSrcweir Reference<XDatabaseMetaData> xMetaData = _xConnection->getMetaData(); 197cdf0e10cSrcweir ::dbtools::OPropertyMap& rPropMap = OMetaConnection::getPropMap(); 198cdf0e10cSrcweir 199cdf0e10cSrcweir descriptor->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_CATALOGNAME)) >>= sCatalog; 200cdf0e10cSrcweir descriptor->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_SCHEMANAME)) >>= sSchema; 201cdf0e10cSrcweir descriptor->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_NAME)) >>= sTable; 202cdf0e10cSrcweir 203cdf0e10cSrcweir sComposedName = ::dbtools::composeTableName( xMetaData, sCatalog, sSchema, sTable, sal_True, ::dbtools::eInTableDefinitions ); 204cdf0e10cSrcweir if ( !sComposedName.getLength() ) 205cdf0e10cSrcweir ::dbtools::throwFunctionSequenceException(_xConnection); 206cdf0e10cSrcweir 207cdf0e10cSrcweir aSql.append(sComposedName); 208cdf0e10cSrcweir aSql.append(::rtl::OUString::createFromAscii(" (")); 209cdf0e10cSrcweir 210cdf0e10cSrcweir // columns 211cdf0e10cSrcweir Reference<XColumnsSupplier> xColumnSup(descriptor,UNO_QUERY); 212cdf0e10cSrcweir Reference<XIndexAccess> xColumns(xColumnSup->getColumns(),UNO_QUERY); 213cdf0e10cSrcweir // check if there are columns 214cdf0e10cSrcweir if(!xColumns.is() || !xColumns->getCount()) 215cdf0e10cSrcweir ::dbtools::throwFunctionSequenceException(_xConnection); 216cdf0e10cSrcweir 217cdf0e10cSrcweir Reference< XPropertySet > xColProp; 218cdf0e10cSrcweir 219cdf0e10cSrcweir sal_Int32 nCount = xColumns->getCount(); 220cdf0e10cSrcweir for(sal_Int32 i=0;i<nCount;++i) 221cdf0e10cSrcweir { 222cdf0e10cSrcweir if ( (xColumns->getByIndex(i) >>= xColProp) && xColProp.is() ) 223cdf0e10cSrcweir { 224cdf0e10cSrcweir aSql.append(createStandardColumnPart(xColProp,_xConnection,_pHelper,_sCreatePattern)); 225cdf0e10cSrcweir aSql.appendAscii(","); 226cdf0e10cSrcweir } 227cdf0e10cSrcweir } 228cdf0e10cSrcweir return aSql.makeStringAndClear(); 229cdf0e10cSrcweir } 230cdf0e10cSrcweir namespace 231cdf0e10cSrcweir { 232cdf0e10cSrcweir ::rtl::OUString generateColumnNames(const Reference<XIndexAccess>& _xColumns,const Reference<XDatabaseMetaData>& _xMetaData) 233cdf0e10cSrcweir { 234cdf0e10cSrcweir ::dbtools::OPropertyMap& rPropMap = OMetaConnection::getPropMap(); 235cdf0e10cSrcweir static const ::rtl::OUString sComma(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(","))); 236cdf0e10cSrcweir 237cdf0e10cSrcweir const ::rtl::OUString sQuote(_xMetaData->getIdentifierQuoteString()); 238cdf0e10cSrcweir ::rtl::OUString sSql = ::rtl::OUString::createFromAscii(" ("); 239cdf0e10cSrcweir Reference< XPropertySet > xColProp; 240cdf0e10cSrcweir 241cdf0e10cSrcweir sal_Int32 nColCount = _xColumns->getCount(); 242cdf0e10cSrcweir for(sal_Int32 i=0;i<nColCount;++i) 243cdf0e10cSrcweir { 244cdf0e10cSrcweir if ( (_xColumns->getByIndex(i) >>= xColProp) && xColProp.is() ) 245cdf0e10cSrcweir sSql += ::dbtools::quoteName(sQuote,::comphelper::getString(xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_NAME)))) 246cdf0e10cSrcweir + sComma; 247cdf0e10cSrcweir } 248cdf0e10cSrcweir 249cdf0e10cSrcweir if ( nColCount ) 250cdf0e10cSrcweir sSql = sSql.replaceAt(sSql.getLength()-1,1,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(")"))); 251cdf0e10cSrcweir return sSql; 252cdf0e10cSrcweir } 253cdf0e10cSrcweir } 254cdf0e10cSrcweir // ----------------------------------------------------------------------------- 255cdf0e10cSrcweir ::rtl::OUString createStandardKeyStatement(const Reference< XPropertySet >& descriptor,const Reference< XConnection>& _xConnection) 256cdf0e10cSrcweir { 257cdf0e10cSrcweir Reference<XDatabaseMetaData> xMetaData = _xConnection->getMetaData(); 258cdf0e10cSrcweir ::dbtools::OPropertyMap& rPropMap = OMetaConnection::getPropMap(); 259cdf0e10cSrcweir 260cdf0e10cSrcweir ::rtl::OUStringBuffer aSql; 261cdf0e10cSrcweir // keys 262cdf0e10cSrcweir Reference<XKeysSupplier> xKeySup(descriptor,UNO_QUERY); 263cdf0e10cSrcweir Reference<XIndexAccess> xKeys = xKeySup->getKeys(); 264cdf0e10cSrcweir if ( xKeys.is() ) 265cdf0e10cSrcweir { 266cdf0e10cSrcweir Reference< XPropertySet > xColProp; 267cdf0e10cSrcweir Reference<XIndexAccess> xColumns; 268cdf0e10cSrcweir Reference<XColumnsSupplier> xColumnSup; 269cdf0e10cSrcweir ::rtl::OUString sCatalog,sSchema,sTable,sComposedName; 270cdf0e10cSrcweir sal_Bool bPKey = sal_False; 271cdf0e10cSrcweir for(sal_Int32 i=0;i<xKeys->getCount();++i) 272cdf0e10cSrcweir { 273cdf0e10cSrcweir if ( (xKeys->getByIndex(i) >>= xColProp) && xColProp.is() ) 274cdf0e10cSrcweir { 275cdf0e10cSrcweir 276cdf0e10cSrcweir sal_Int32 nKeyType = ::comphelper::getINT32(xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_TYPE))); 277cdf0e10cSrcweir 278cdf0e10cSrcweir if ( nKeyType == KeyType::PRIMARY ) 279cdf0e10cSrcweir { 280cdf0e10cSrcweir if(bPKey) 281cdf0e10cSrcweir ::dbtools::throwFunctionSequenceException(_xConnection); 282cdf0e10cSrcweir 283cdf0e10cSrcweir bPKey = sal_True; 284cdf0e10cSrcweir xColumnSup = Reference<XColumnsSupplier>(xColProp,UNO_QUERY); 285cdf0e10cSrcweir xColumns = Reference<XIndexAccess>(xColumnSup->getColumns(),UNO_QUERY); 286cdf0e10cSrcweir if(!xColumns.is() || !xColumns->getCount()) 287cdf0e10cSrcweir ::dbtools::throwFunctionSequenceException(_xConnection); 288cdf0e10cSrcweir 289cdf0e10cSrcweir const ::rtl::OUString sQuote = xMetaData->getIdentifierQuoteString(); 290cdf0e10cSrcweir aSql.append(::rtl::OUString::createFromAscii(" PRIMARY KEY ")); 291cdf0e10cSrcweir aSql.append(generateColumnNames(xColumns,xMetaData)); 292cdf0e10cSrcweir } 293cdf0e10cSrcweir else if(nKeyType == KeyType::UNIQUE) 294cdf0e10cSrcweir { 295cdf0e10cSrcweir xColumnSup = Reference<XColumnsSupplier>(xColProp,UNO_QUERY); 296cdf0e10cSrcweir xColumns = Reference<XIndexAccess>(xColumnSup->getColumns(),UNO_QUERY); 297cdf0e10cSrcweir if(!xColumns.is() || !xColumns->getCount()) 298cdf0e10cSrcweir ::dbtools::throwFunctionSequenceException(_xConnection); 299cdf0e10cSrcweir 300cdf0e10cSrcweir const ::rtl::OUString sQuote = xMetaData->getIdentifierQuoteString(); 301cdf0e10cSrcweir aSql.append(::rtl::OUString::createFromAscii(" UNIQUE ")); 302cdf0e10cSrcweir aSql.append(generateColumnNames(xColumns,xMetaData)); 303cdf0e10cSrcweir } 304cdf0e10cSrcweir else if(nKeyType == KeyType::FOREIGN) 305cdf0e10cSrcweir { 306cdf0e10cSrcweir sal_Int32 nDeleteRule = getINT32(xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_DELETERULE))); 307cdf0e10cSrcweir 308cdf0e10cSrcweir xColumnSup = Reference<XColumnsSupplier>(xColProp,UNO_QUERY); 309cdf0e10cSrcweir xColumns = Reference<XIndexAccess>(xColumnSup->getColumns(),UNO_QUERY); 310cdf0e10cSrcweir if(!xColumns.is() || !xColumns->getCount()) 311cdf0e10cSrcweir ::dbtools::throwFunctionSequenceException(_xConnection); 312cdf0e10cSrcweir 313cdf0e10cSrcweir aSql.append(::rtl::OUString::createFromAscii(" FOREIGN KEY ")); 314cdf0e10cSrcweir ::rtl::OUString sRefTable = getString(xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_REFERENCEDTABLE))); 315cdf0e10cSrcweir ::dbtools::qualifiedNameComponents(xMetaData, 316cdf0e10cSrcweir sRefTable, 317cdf0e10cSrcweir sCatalog, 318cdf0e10cSrcweir sSchema, 319cdf0e10cSrcweir sTable, 320cdf0e10cSrcweir ::dbtools::eInDataManipulation); 321cdf0e10cSrcweir sComposedName = ::dbtools::composeTableName( xMetaData, sCatalog, sSchema, sTable, sal_True, ::dbtools::eInTableDefinitions ); 322cdf0e10cSrcweir 323cdf0e10cSrcweir 324cdf0e10cSrcweir if ( !sComposedName.getLength() ) 325cdf0e10cSrcweir ::dbtools::throwFunctionSequenceException(_xConnection); 326cdf0e10cSrcweir 327cdf0e10cSrcweir aSql.append(generateColumnNames(xColumns,xMetaData)); 328cdf0e10cSrcweir 329cdf0e10cSrcweir switch(nDeleteRule) 330cdf0e10cSrcweir { 331cdf0e10cSrcweir case KeyRule::CASCADE: 332cdf0e10cSrcweir aSql.append(::rtl::OUString::createFromAscii(" ON DELETE CASCADE ")); 333cdf0e10cSrcweir break; 334cdf0e10cSrcweir case KeyRule::RESTRICT: 335cdf0e10cSrcweir aSql.append(::rtl::OUString::createFromAscii(" ON DELETE RESTRICT ")); 336cdf0e10cSrcweir break; 337cdf0e10cSrcweir case KeyRule::SET_NULL: 338cdf0e10cSrcweir aSql.append(::rtl::OUString::createFromAscii(" ON DELETE SET NULL ")); 339cdf0e10cSrcweir break; 340cdf0e10cSrcweir case KeyRule::SET_DEFAULT: 341cdf0e10cSrcweir aSql.append(::rtl::OUString::createFromAscii(" ON DELETE SET DEFAULT ")); 342cdf0e10cSrcweir break; 343cdf0e10cSrcweir default: 344cdf0e10cSrcweir ; 345cdf0e10cSrcweir } 346cdf0e10cSrcweir } 347cdf0e10cSrcweir } 348cdf0e10cSrcweir } 349cdf0e10cSrcweir } 350cdf0e10cSrcweir 351cdf0e10cSrcweir if ( aSql.getLength() ) 352cdf0e10cSrcweir { 353cdf0e10cSrcweir if ( aSql.charAt(aSql.getLength()-1) == ',' ) 354cdf0e10cSrcweir aSql.setCharAt(aSql.getLength()-1,')'); 355cdf0e10cSrcweir else 356cdf0e10cSrcweir aSql.appendAscii(")"); 357cdf0e10cSrcweir } 358cdf0e10cSrcweir 359cdf0e10cSrcweir return aSql.makeStringAndClear(); 360cdf0e10cSrcweir 361cdf0e10cSrcweir } 362cdf0e10cSrcweir // ----------------------------------------------------------------------------- 363cdf0e10cSrcweir ::rtl::OUString createSqlCreateTableStatement( const Reference< XPropertySet >& descriptor, 364cdf0e10cSrcweir const Reference< XConnection>& _xConnection, 365cdf0e10cSrcweir ISQLStatementHelper* _pHelper, 366cdf0e10cSrcweir const ::rtl::OUString& _sCreatePattern) 367cdf0e10cSrcweir { 368cdf0e10cSrcweir ::rtl::OUString aSql = ::dbtools::createStandardCreateStatement(descriptor,_xConnection,_pHelper,_sCreatePattern); 369cdf0e10cSrcweir const ::rtl::OUString sKeyStmt = ::dbtools::createStandardKeyStatement(descriptor,_xConnection); 370cdf0e10cSrcweir if ( sKeyStmt.getLength() ) 371cdf0e10cSrcweir aSql += sKeyStmt; 372cdf0e10cSrcweir else 373cdf0e10cSrcweir { 374cdf0e10cSrcweir if ( aSql.lastIndexOf(',') == (aSql.getLength()-1) ) 375cdf0e10cSrcweir aSql = aSql.replaceAt(aSql.getLength()-1,1,::rtl::OUString::createFromAscii(")")); 376cdf0e10cSrcweir else 377cdf0e10cSrcweir aSql += ::rtl::OUString::createFromAscii(")"); 378cdf0e10cSrcweir } 379cdf0e10cSrcweir return aSql; 380cdf0e10cSrcweir } 381cdf0e10cSrcweir namespace 382cdf0e10cSrcweir { 383cdf0e10cSrcweir Reference<XPropertySet> lcl_createSDBCXColumn(const Reference<XNameAccess>& _xPrimaryKeyColumns, 384cdf0e10cSrcweir const Reference<XConnection>& _xConnection, 385cdf0e10cSrcweir const Any& _aCatalog, 386cdf0e10cSrcweir const ::rtl::OUString& _aSchema, 387cdf0e10cSrcweir const ::rtl::OUString& _aTable, 388cdf0e10cSrcweir const ::rtl::OUString& _rQueryName, 389cdf0e10cSrcweir const ::rtl::OUString& _rName, 390cdf0e10cSrcweir sal_Bool _bCase, 391cdf0e10cSrcweir sal_Bool _bQueryForInfo, 392cdf0e10cSrcweir sal_Bool _bIsAutoIncrement, 393cdf0e10cSrcweir sal_Bool _bIsCurrency, 394cdf0e10cSrcweir sal_Int32 _nDataType) 395cdf0e10cSrcweir { 396cdf0e10cSrcweir Reference<XPropertySet> xProp; 397cdf0e10cSrcweir Reference<XDatabaseMetaData> xMetaData = _xConnection->getMetaData(); 398cdf0e10cSrcweir Reference< XResultSet > xResult = xMetaData->getColumns(_aCatalog, _aSchema, _aTable, _rQueryName); 399cdf0e10cSrcweir 400cdf0e10cSrcweir if ( xResult.is() ) 401cdf0e10cSrcweir { 402cdf0e10cSrcweir UStringMixEqual aMixCompare(_bCase); 403cdf0e10cSrcweir Reference< XRow > xRow(xResult,UNO_QUERY); 404cdf0e10cSrcweir while( xResult->next() ) 405cdf0e10cSrcweir { 406cdf0e10cSrcweir if ( aMixCompare(xRow->getString(4),_rName) ) 407cdf0e10cSrcweir { 408cdf0e10cSrcweir sal_Int32 nField5 = xRow->getInt(5); 409cdf0e10cSrcweir ::rtl::OUString aField6 = xRow->getString(6); 410cdf0e10cSrcweir sal_Int32 nField7 = xRow->getInt(7) 411cdf0e10cSrcweir , nField9 = xRow->getInt(9) 412cdf0e10cSrcweir , nField11= xRow->getInt(11); 413cdf0e10cSrcweir ::rtl::OUString sField12 = xRow->getString(12), 414cdf0e10cSrcweir sField13 = xRow->getString(13); 415cdf0e10cSrcweir ::comphelper::disposeComponent(xRow); 416cdf0e10cSrcweir 417cdf0e10cSrcweir sal_Bool bAutoIncrement = _bIsAutoIncrement 418cdf0e10cSrcweir ,bIsCurrency = _bIsCurrency; 419cdf0e10cSrcweir if ( _bQueryForInfo ) 420cdf0e10cSrcweir { 421cdf0e10cSrcweir const ::rtl::OUString sQuote = xMetaData->getIdentifierQuoteString(); 422cdf0e10cSrcweir ::rtl::OUString sQuotedName = ::dbtools::quoteName(sQuote,_rName); 423cdf0e10cSrcweir ::rtl::OUString sComposedName; 424cdf0e10cSrcweir sComposedName = composeTableNameForSelect(_xConnection, getString( _aCatalog ), _aSchema, _aTable ); 425cdf0e10cSrcweir 426cdf0e10cSrcweir ColumnInformationMap aInfo(_bCase); 427cdf0e10cSrcweir collectColumnInformation(_xConnection,sComposedName,sQuotedName,aInfo); 428cdf0e10cSrcweir ColumnInformationMap::iterator aIter = aInfo.begin(); 429cdf0e10cSrcweir if ( aIter != aInfo.end() ) 430cdf0e10cSrcweir { 431cdf0e10cSrcweir bAutoIncrement = aIter->second.first.first; 432cdf0e10cSrcweir bIsCurrency = aIter->second.first.second; 433cdf0e10cSrcweir if ( DataType::OTHER == nField5 ) 434cdf0e10cSrcweir nField5 = aIter->second.second; 435cdf0e10cSrcweir } 436cdf0e10cSrcweir } 437cdf0e10cSrcweir else if ( DataType::OTHER == nField5 ) 438cdf0e10cSrcweir nField5 = _nDataType; 439cdf0e10cSrcweir 440cdf0e10cSrcweir if ( nField11 != ColumnValue::NO_NULLS ) 441cdf0e10cSrcweir { 442cdf0e10cSrcweir try 443cdf0e10cSrcweir { 444cdf0e10cSrcweir if ( _xPrimaryKeyColumns.is() ) 445cdf0e10cSrcweir { 446cdf0e10cSrcweir if ( _xPrimaryKeyColumns->hasByName(_rName) ) 447cdf0e10cSrcweir nField11 = ColumnValue::NO_NULLS; 448cdf0e10cSrcweir 449cdf0e10cSrcweir } 450cdf0e10cSrcweir else 451cdf0e10cSrcweir { 452cdf0e10cSrcweir Reference< XResultSet > xPKeys = xMetaData->getPrimaryKeys( _aCatalog, _aSchema, _aTable ); 453cdf0e10cSrcweir Reference< XRow > xPKeyRow( xPKeys, UNO_QUERY_THROW ); 454cdf0e10cSrcweir while( xPKeys->next() ) // there can be only one primary key 455cdf0e10cSrcweir { 456cdf0e10cSrcweir ::rtl::OUString sKeyColumn = xPKeyRow->getString(4); 457cdf0e10cSrcweir if ( aMixCompare(_rName,sKeyColumn) ) 458cdf0e10cSrcweir { 459cdf0e10cSrcweir nField11 = ColumnValue::NO_NULLS; 460cdf0e10cSrcweir break; 461cdf0e10cSrcweir } 462cdf0e10cSrcweir } 463cdf0e10cSrcweir } 464cdf0e10cSrcweir } 465cdf0e10cSrcweir catch(SQLException&) 466cdf0e10cSrcweir { 467cdf0e10cSrcweir OSL_ENSURE( false, "lcl_createSDBCXColumn: caught an exception!" ); 468cdf0e10cSrcweir } 469cdf0e10cSrcweir } 470cdf0e10cSrcweir 471cdf0e10cSrcweir connectivity::sdbcx::OColumn* pRet = new connectivity::sdbcx::OColumn(_rName, 472cdf0e10cSrcweir aField6, 473cdf0e10cSrcweir sField13, 474cdf0e10cSrcweir sField12, 475cdf0e10cSrcweir nField11, 476cdf0e10cSrcweir nField7, 477cdf0e10cSrcweir nField9, 478cdf0e10cSrcweir nField5, 479cdf0e10cSrcweir bAutoIncrement, 480cdf0e10cSrcweir sal_False, 481cdf0e10cSrcweir bIsCurrency, 482cdf0e10cSrcweir _bCase); 483cdf0e10cSrcweir 484cdf0e10cSrcweir xProp = pRet; 485cdf0e10cSrcweir break; 486cdf0e10cSrcweir } 487cdf0e10cSrcweir } 488cdf0e10cSrcweir } 489cdf0e10cSrcweir 490cdf0e10cSrcweir return xProp; 491cdf0e10cSrcweir } 492cdf0e10cSrcweir //------------------------------------------------------------------ 493cdf0e10cSrcweir Reference< XModel> lcl_getXModel(const Reference< XInterface>& _xIface) 494cdf0e10cSrcweir { 495cdf0e10cSrcweir Reference< XInterface > xParent = _xIface; 496*a22fd41bSmseidel Reference< XModel > xModel(xParent,UNO_QUERY); 497cdf0e10cSrcweir while( xParent.is() && !xModel.is() ) 498cdf0e10cSrcweir { 499cdf0e10cSrcweir Reference<XChild> xChild(xParent,UNO_QUERY); 500cdf0e10cSrcweir xParent.set(xChild.is() ? xChild->getParent() : Reference< XInterface >(),UNO_QUERY); 501cdf0e10cSrcweir xModel.set(xParent,UNO_QUERY); 502cdf0e10cSrcweir } 503cdf0e10cSrcweir return xModel; 504cdf0e10cSrcweir } 505cdf0e10cSrcweir } 506cdf0e10cSrcweir // ----------------------------------------------------------------------------- 507cdf0e10cSrcweir Reference<XPropertySet> createSDBCXColumn(const Reference<XPropertySet>& _xTable, 508cdf0e10cSrcweir const Reference<XConnection>& _xConnection, 509cdf0e10cSrcweir const ::rtl::OUString& _rName, 510cdf0e10cSrcweir sal_Bool _bCase, 511cdf0e10cSrcweir sal_Bool _bQueryForInfo, 512cdf0e10cSrcweir sal_Bool _bIsAutoIncrement, 513cdf0e10cSrcweir sal_Bool _bIsCurrency, 514cdf0e10cSrcweir sal_Int32 _nDataType) 515cdf0e10cSrcweir { 516cdf0e10cSrcweir Reference<XPropertySet> xProp; 517cdf0e10cSrcweir OSL_ENSURE(_xTable.is(),"Table is NULL!"); 518cdf0e10cSrcweir if ( !_xTable.is() ) 519cdf0e10cSrcweir return xProp; 520cdf0e10cSrcweir 521cdf0e10cSrcweir ::dbtools::OPropertyMap& rPropMap = OMetaConnection::getPropMap(); 522cdf0e10cSrcweir Reference<XDatabaseMetaData> xMetaData = _xConnection->getMetaData(); 523cdf0e10cSrcweir Any aCatalog; 524cdf0e10cSrcweir aCatalog = _xTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_CATALOGNAME)); 525cdf0e10cSrcweir 526cdf0e10cSrcweir ::rtl::OUString aSchema, aTable; 527cdf0e10cSrcweir _xTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_SCHEMANAME)) >>= aSchema; 528cdf0e10cSrcweir _xTable->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_NAME)) >>= aTable; 529cdf0e10cSrcweir 530cdf0e10cSrcweir Reference<XNameAccess> xPrimaryKeyColumns = getPrimaryKeyColumns_throw(_xTable); 531cdf0e10cSrcweir 532cdf0e10cSrcweir xProp = lcl_createSDBCXColumn(xPrimaryKeyColumns,_xConnection,aCatalog, aSchema, aTable, _rName,_rName,_bCase,_bQueryForInfo,_bIsAutoIncrement,_bIsCurrency,_nDataType); 533cdf0e10cSrcweir if ( !xProp.is() ) 534cdf0e10cSrcweir { 535cdf0e10cSrcweir xProp = lcl_createSDBCXColumn(xPrimaryKeyColumns,_xConnection,aCatalog, aSchema, aTable, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%")),_rName,_bCase,_bQueryForInfo,_bIsAutoIncrement,_bIsCurrency,_nDataType); 536cdf0e10cSrcweir if ( !xProp.is() ) 537cdf0e10cSrcweir xProp = new connectivity::sdbcx::OColumn(_rName, 538cdf0e10cSrcweir ::rtl::OUString(),::rtl::OUString(),::rtl::OUString(), 539cdf0e10cSrcweir ColumnValue::NULLABLE_UNKNOWN, 540cdf0e10cSrcweir 0, 541cdf0e10cSrcweir 0, 542cdf0e10cSrcweir DataType::VARCHAR, 543cdf0e10cSrcweir _bIsAutoIncrement, 544cdf0e10cSrcweir sal_False, 545cdf0e10cSrcweir _bIsCurrency, 546cdf0e10cSrcweir _bCase); 547cdf0e10cSrcweir 548cdf0e10cSrcweir } 549cdf0e10cSrcweir 550cdf0e10cSrcweir return xProp; 551cdf0e10cSrcweir } 552cdf0e10cSrcweir 553cdf0e10cSrcweir // ----------------------------------------------------------------------------- 554cdf0e10cSrcweir bool getBooleanDataSourceSetting( const Reference< XConnection >& _rxConnection, const sal_Char* _pAsciiSettingName ) 555cdf0e10cSrcweir { 556cdf0e10cSrcweir bool bValue( false ); 557cdf0e10cSrcweir try 558cdf0e10cSrcweir { 559cdf0e10cSrcweir Reference< XPropertySet> xDataSourceProperties( findDataSource( _rxConnection ), UNO_QUERY ); 560cdf0e10cSrcweir OSL_ENSURE( xDataSourceProperties.is(), "::dbtools::getBooleanDataSourceSetting: somebody is using this with a non-SDB-level connection!" ); 561cdf0e10cSrcweir if ( xDataSourceProperties.is() ) 562cdf0e10cSrcweir { 563cdf0e10cSrcweir Reference< XPropertySet > xSettings( 564cdf0e10cSrcweir xDataSourceProperties->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Settings") ) ), 565cdf0e10cSrcweir UNO_QUERY_THROW 566cdf0e10cSrcweir ); 567cdf0e10cSrcweir OSL_VERIFY( xSettings->getPropertyValue( ::rtl::OUString::createFromAscii( _pAsciiSettingName ) ) >>= bValue ); 568cdf0e10cSrcweir } 569cdf0e10cSrcweir } 570cdf0e10cSrcweir catch( const Exception& ) 571cdf0e10cSrcweir { 572cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 573cdf0e10cSrcweir } 574cdf0e10cSrcweir return bValue; 575cdf0e10cSrcweir } 576cdf0e10cSrcweir // ------------------------------------------------------------------------- 577cdf0e10cSrcweir bool getDataSourceSetting( const Reference< XInterface >& _xChild, const ::rtl::OUString& _sAsciiSettingsName, 578cdf0e10cSrcweir Any& /* [out] */ _rSettingsValue ) 579cdf0e10cSrcweir { 580cdf0e10cSrcweir bool bIsPresent = false; 581cdf0e10cSrcweir try 582cdf0e10cSrcweir { 583cdf0e10cSrcweir const Reference< XPropertySet> xDataSourceProperties( findDataSource( _xChild ), UNO_QUERY ); 584cdf0e10cSrcweir if ( !xDataSourceProperties.is() ) 585cdf0e10cSrcweir return false; 586cdf0e10cSrcweir 587cdf0e10cSrcweir const Reference< XPropertySet > xSettings( 588cdf0e10cSrcweir xDataSourceProperties->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Settings") ) ), 589cdf0e10cSrcweir UNO_QUERY_THROW 590cdf0e10cSrcweir ); 591cdf0e10cSrcweir 592cdf0e10cSrcweir _rSettingsValue = xSettings->getPropertyValue( _sAsciiSettingsName ); 593cdf0e10cSrcweir bIsPresent = true; 594cdf0e10cSrcweir } 595cdf0e10cSrcweir catch( const Exception& ) 596cdf0e10cSrcweir { 597cdf0e10cSrcweir bIsPresent = false; 598cdf0e10cSrcweir } 599cdf0e10cSrcweir return bIsPresent; 600cdf0e10cSrcweir } 601cdf0e10cSrcweir // ------------------------------------------------------------------------- 602cdf0e10cSrcweir bool getDataSourceSetting( const Reference< XInterface >& _rxDataSource, const sal_Char* _pAsciiSettingsName, 603cdf0e10cSrcweir Any& /* [out] */ _rSettingsValue ) 604cdf0e10cSrcweir { 605cdf0e10cSrcweir ::rtl::OUString sAsciiSettingsName = ::rtl::OUString::createFromAscii(_pAsciiSettingsName); 606cdf0e10cSrcweir return getDataSourceSetting( _rxDataSource, sAsciiSettingsName,_rSettingsValue ); 607cdf0e10cSrcweir } 608cdf0e10cSrcweir // ----------------------------------------------------------------------------- 609cdf0e10cSrcweir sal_Bool isDataSourcePropertyEnabled(const Reference<XInterface>& _xProp,const ::rtl::OUString& _sProperty,sal_Bool _bDefault) 610cdf0e10cSrcweir { 611cdf0e10cSrcweir sal_Bool bEnabled = _bDefault; 612cdf0e10cSrcweir try 613cdf0e10cSrcweir { 614cdf0e10cSrcweir Reference< XPropertySet> xProp(findDataSource(_xProp),UNO_QUERY); 615cdf0e10cSrcweir if ( xProp.is() ) 616cdf0e10cSrcweir { 617cdf0e10cSrcweir Sequence< PropertyValue > aInfo; 618cdf0e10cSrcweir xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Info"))) >>= aInfo; 619cdf0e10cSrcweir const PropertyValue* pValue =::std::find_if(aInfo.getConstArray(), 620cdf0e10cSrcweir aInfo.getConstArray() + aInfo.getLength(), 621cdf0e10cSrcweir ::std::bind2nd(TPropertyValueEqualFunctor(),_sProperty)); 622cdf0e10cSrcweir if ( pValue && pValue != (aInfo.getConstArray() + aInfo.getLength()) ) 623cdf0e10cSrcweir pValue->Value >>= bEnabled; 624cdf0e10cSrcweir } 625cdf0e10cSrcweir } 626cdf0e10cSrcweir catch(SQLException&) 627cdf0e10cSrcweir { 628cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 629cdf0e10cSrcweir } 630cdf0e10cSrcweir return bEnabled; 631cdf0e10cSrcweir } 632cdf0e10cSrcweir // ----------------------------------------------------------------------------- 633cdf0e10cSrcweir Reference< XTablesSupplier> getDataDefinitionByURLAndConnection( 634cdf0e10cSrcweir const ::rtl::OUString& _rsUrl, 635cdf0e10cSrcweir const Reference< XConnection>& _xConnection, 636cdf0e10cSrcweir const Reference< XMultiServiceFactory>& _rxFactory) 637cdf0e10cSrcweir { 638cdf0e10cSrcweir Reference< XTablesSupplier> xTablesSup; 639cdf0e10cSrcweir try 640cdf0e10cSrcweir { 641cdf0e10cSrcweir Reference< XDriverAccess> xManager( 642cdf0e10cSrcweir _rxFactory->createInstance( ::rtl::OUString::createFromAscii("com.sun.star.sdbc.DriverManager") ), 643cdf0e10cSrcweir UNO_QUERY_THROW ); 644cdf0e10cSrcweir Reference< XDataDefinitionSupplier > xSupp( xManager->getDriverByURL( _rsUrl ), UNO_QUERY ); 645cdf0e10cSrcweir 646cdf0e10cSrcweir if ( xSupp.is() ) 647cdf0e10cSrcweir { 648cdf0e10cSrcweir xTablesSup = xSupp->getDataDefinitionByConnection( _xConnection ); 649cdf0e10cSrcweir OSL_ENSURE(xTablesSup.is(),"No table supplier!"); 650cdf0e10cSrcweir } 651cdf0e10cSrcweir } 652cdf0e10cSrcweir catch( const Exception& ) 653cdf0e10cSrcweir { 654cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 655cdf0e10cSrcweir } 656cdf0e10cSrcweir return xTablesSup; 657cdf0e10cSrcweir } 658cdf0e10cSrcweir 659cdf0e10cSrcweir // ----------------------------------------------------------------------------- 660cdf0e10cSrcweir sal_Int32 getTablePrivileges(const Reference< XDatabaseMetaData>& _xMetaData, 661cdf0e10cSrcweir const ::rtl::OUString& _sCatalog, 662cdf0e10cSrcweir const ::rtl::OUString& _sSchema, 663cdf0e10cSrcweir const ::rtl::OUString& _sTable) 664cdf0e10cSrcweir { 665cdf0e10cSrcweir OSL_ENSURE(_xMetaData.is(),"Invalid metadata!"); 666cdf0e10cSrcweir sal_Int32 nPrivileges = 0; 667cdf0e10cSrcweir try 668cdf0e10cSrcweir { 669cdf0e10cSrcweir Any aVal; 670cdf0e10cSrcweir if(_sCatalog.getLength()) 671cdf0e10cSrcweir aVal <<= _sCatalog; 672cdf0e10cSrcweir Reference< XResultSet > xPrivileges = _xMetaData->getTablePrivileges(aVal, _sSchema, _sTable); 673cdf0e10cSrcweir Reference< XRow > xCurrentRow(xPrivileges, UNO_QUERY); 674cdf0e10cSrcweir 675cdf0e10cSrcweir if ( xCurrentRow.is() ) 676cdf0e10cSrcweir { 677cdf0e10cSrcweir ::rtl::OUString sUserWorkingFor = _xMetaData->getUserName(); 678cdf0e10cSrcweir static const ::rtl::OUString sSELECT = ::rtl::OUString::createFromAscii("SELECT"); 679cdf0e10cSrcweir static const ::rtl::OUString sINSERT = ::rtl::OUString::createFromAscii("INSERT"); 680cdf0e10cSrcweir static const ::rtl::OUString sUPDATE = ::rtl::OUString::createFromAscii("UPDATE"); 681cdf0e10cSrcweir static const ::rtl::OUString sDELETE = ::rtl::OUString::createFromAscii("DELETE"); 682cdf0e10cSrcweir static const ::rtl::OUString sREAD = ::rtl::OUString::createFromAscii("READ"); 683cdf0e10cSrcweir static const ::rtl::OUString sCREATE = ::rtl::OUString::createFromAscii("CREATE"); 684cdf0e10cSrcweir static const ::rtl::OUString sALTER = ::rtl::OUString::createFromAscii("ALTER"); 685cdf0e10cSrcweir static const ::rtl::OUString sREFERENCE = ::rtl::OUString::createFromAscii("REFERENCE"); 686cdf0e10cSrcweir static const ::rtl::OUString sDROP = ::rtl::OUString::createFromAscii("DROP"); 687cdf0e10cSrcweir // after creation the set is positioned before the first record, per definitionem 688cdf0e10cSrcweir #ifdef DBG_UTIL 689cdf0e10cSrcweir Reference< XResultSetMetaDataSupplier > xSup(xPrivileges,UNO_QUERY); 690cdf0e10cSrcweir if ( xSup.is() ) 691cdf0e10cSrcweir { 692cdf0e10cSrcweir Reference< XResultSetMetaData > xRsMetaData = xSup->getMetaData(); 693cdf0e10cSrcweir if ( xRsMetaData.is() ) 694cdf0e10cSrcweir { 695cdf0e10cSrcweir sal_Int32 nCount = xRsMetaData->getColumnCount(); 696cdf0e10cSrcweir for (sal_Int32 i=1; i<=nCount; ++i) 697cdf0e10cSrcweir { 698cdf0e10cSrcweir ::rtl::OUString sColumnName = xRsMetaData->getColumnName(i); 699cdf0e10cSrcweir } 700cdf0e10cSrcweir } 701cdf0e10cSrcweir } 702cdf0e10cSrcweir #endif 703cdf0e10cSrcweir 704cdf0e10cSrcweir ::rtl::OUString sPrivilege, sGrantee; 705cdf0e10cSrcweir while ( xPrivileges->next() ) 706cdf0e10cSrcweir { 707cdf0e10cSrcweir #ifdef DBG_UTIL 708cdf0e10cSrcweir ::rtl::OUString sCat, sSchema, sName, sGrantor, sGrantable; 709cdf0e10cSrcweir sCat = xCurrentRow->getString(1); 710cdf0e10cSrcweir sSchema = xCurrentRow->getString(2); 711cdf0e10cSrcweir sName = xCurrentRow->getString(3); 712cdf0e10cSrcweir sGrantor = xCurrentRow->getString(4); 713cdf0e10cSrcweir #endif 714cdf0e10cSrcweir sGrantee = xCurrentRow->getString(5); 715cdf0e10cSrcweir sPrivilege = xCurrentRow->getString(6); 716cdf0e10cSrcweir #ifdef DBG_UTIL 717cdf0e10cSrcweir sGrantable = xCurrentRow->getString(7); 718cdf0e10cSrcweir #endif 719cdf0e10cSrcweir 720cdf0e10cSrcweir if (!sUserWorkingFor.equalsIgnoreAsciiCase(sGrantee)) 721cdf0e10cSrcweir continue; 722cdf0e10cSrcweir 723cdf0e10cSrcweir if (sPrivilege.equalsIgnoreAsciiCase(sSELECT)) 724cdf0e10cSrcweir nPrivileges |= Privilege::SELECT; 725cdf0e10cSrcweir else if (sPrivilege.equalsIgnoreAsciiCase(sINSERT)) 726cdf0e10cSrcweir nPrivileges |= Privilege::INSERT; 727cdf0e10cSrcweir else if (sPrivilege.equalsIgnoreAsciiCase(sUPDATE)) 728cdf0e10cSrcweir nPrivileges |= Privilege::UPDATE; 729cdf0e10cSrcweir else if (sPrivilege.equalsIgnoreAsciiCase(sDELETE)) 730cdf0e10cSrcweir nPrivileges |= Privilege::DELETE; 731cdf0e10cSrcweir else if (sPrivilege.equalsIgnoreAsciiCase(sREAD)) 732cdf0e10cSrcweir nPrivileges |= Privilege::READ; 733cdf0e10cSrcweir else if (sPrivilege.equalsIgnoreAsciiCase(sCREATE)) 734cdf0e10cSrcweir nPrivileges |= Privilege::CREATE; 735cdf0e10cSrcweir else if (sPrivilege.equalsIgnoreAsciiCase(sALTER)) 736cdf0e10cSrcweir nPrivileges |= Privilege::ALTER; 737cdf0e10cSrcweir else if (sPrivilege.equalsIgnoreAsciiCase(sREFERENCE)) 738cdf0e10cSrcweir nPrivileges |= Privilege::REFERENCE; 739cdf0e10cSrcweir else if (sPrivilege.equalsIgnoreAsciiCase(sDROP)) 740cdf0e10cSrcweir nPrivileges |= Privilege::DROP; 741cdf0e10cSrcweir } 742cdf0e10cSrcweir } 743cdf0e10cSrcweir disposeComponent(xPrivileges); 744cdf0e10cSrcweir } 745cdf0e10cSrcweir catch(const SQLException& e) 746cdf0e10cSrcweir { 747cdf0e10cSrcweir static ::rtl::OUString sNotSupportedState = ::rtl::OUString::createFromAscii("IM001"); 748cdf0e10cSrcweir // some drivers don't support any privileges so we assume that we are allowed to do all we want :-) 749cdf0e10cSrcweir if(e.SQLState == sNotSupportedState) 750cdf0e10cSrcweir nPrivileges |= Privilege::DROP | 751cdf0e10cSrcweir Privilege::REFERENCE | 752cdf0e10cSrcweir Privilege::ALTER | 753cdf0e10cSrcweir Privilege::CREATE | 754cdf0e10cSrcweir Privilege::READ | 755cdf0e10cSrcweir Privilege::DELETE | 756cdf0e10cSrcweir Privilege::UPDATE | 757cdf0e10cSrcweir Privilege::INSERT | 758cdf0e10cSrcweir Privilege::SELECT; 759cdf0e10cSrcweir else 760cdf0e10cSrcweir OSL_ENSURE(0,"Could not collect the privileges !"); 761cdf0e10cSrcweir } 762cdf0e10cSrcweir return nPrivileges; 763cdf0e10cSrcweir } 764cdf0e10cSrcweir // ----------------------------------------------------------------------------- 765cdf0e10cSrcweir // we need some more information about the column 766cdf0e10cSrcweir void collectColumnInformation(const Reference< XConnection>& _xConnection, 767cdf0e10cSrcweir const ::rtl::OUString& _sComposedName, 768cdf0e10cSrcweir const ::rtl::OUString& _rName, 769cdf0e10cSrcweir ColumnInformationMap& _rInfo) 770cdf0e10cSrcweir { 771cdf0e10cSrcweir static ::rtl::OUString STR_WHERE = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" WHERE ")); 772cdf0e10cSrcweir 773cdf0e10cSrcweir ::rtl::OUString sSelect = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SELECT ")); 774cdf0e10cSrcweir sSelect += _rName; 775cdf0e10cSrcweir sSelect += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" FROM ")); 776cdf0e10cSrcweir sSelect += _sComposedName; 777cdf0e10cSrcweir sSelect += STR_WHERE; 778cdf0e10cSrcweir sSelect += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("0 = 1")); 779cdf0e10cSrcweir 780cdf0e10cSrcweir try 781cdf0e10cSrcweir { 782cdf0e10cSrcweir ::utl::SharedUNOComponent< XStatement > xStmt( _xConnection->createStatement() ); 783cdf0e10cSrcweir Reference< XPropertySet > xStatementProps( xStmt, UNO_QUERY_THROW ); 784cdf0e10cSrcweir xStatementProps->setPropertyValue( OMetaConnection::getPropMap().getNameByIndex( PROPERTY_ID_ESCAPEPROCESSING ), makeAny( (sal_Bool)sal_False ) ); 785cdf0e10cSrcweir Reference< XResultSet > xResult( xStmt->executeQuery( sSelect ), UNO_QUERY_THROW ); 786cdf0e10cSrcweir Reference< XResultSetMetaDataSupplier > xSuppMeta( xResult, UNO_QUERY_THROW ); 787cdf0e10cSrcweir Reference< XResultSetMetaData > xMeta( xSuppMeta->getMetaData(), UNO_QUERY_THROW ); 788cdf0e10cSrcweir 789cdf0e10cSrcweir sal_Int32 nCount = xMeta->getColumnCount(); 790cdf0e10cSrcweir OSL_ENSURE( nCount != 0, "::dbtools::collectColumnInformation: result set has empty (column-less) meta data!" ); 791cdf0e10cSrcweir for (sal_Int32 i=1; i <= nCount ; ++i) 792cdf0e10cSrcweir { 793cdf0e10cSrcweir _rInfo.insert(ColumnInformationMap::value_type(xMeta->getColumnName(i), 794cdf0e10cSrcweir ColumnInformation(TBoolPair(xMeta->isAutoIncrement(i),xMeta->isCurrency(i)),xMeta->getColumnType(i)))); 795cdf0e10cSrcweir } 796cdf0e10cSrcweir } 797cdf0e10cSrcweir catch( const Exception& ) 798cdf0e10cSrcweir { 799cdf0e10cSrcweir DBG_UNHANDLED_EXCEPTION(); 800cdf0e10cSrcweir } 801cdf0e10cSrcweir } 802cdf0e10cSrcweir 803cdf0e10cSrcweir // ----------------------------------------------------------------------------- 804cdf0e10cSrcweir bool isEmbeddedInDatabase( const Reference< XInterface >& _rxComponent, Reference< XConnection >& _rxActualConnection ) 805cdf0e10cSrcweir { 806cdf0e10cSrcweir bool bIsEmbedded = false; 807cdf0e10cSrcweir try 808cdf0e10cSrcweir { 809cdf0e10cSrcweir Reference< XModel > xModel = lcl_getXModel( _rxComponent ); 810cdf0e10cSrcweir 811cdf0e10cSrcweir if ( xModel.is() ) 812cdf0e10cSrcweir { 813cdf0e10cSrcweir Sequence< PropertyValue > aArgs = xModel->getArgs(); 814cdf0e10cSrcweir const PropertyValue* pIter = aArgs.getConstArray(); 815cdf0e10cSrcweir const PropertyValue* pEnd = pIter + aArgs.getLength(); 816cdf0e10cSrcweir for(;pIter != pEnd;++pIter) 817cdf0e10cSrcweir { 818cdf0e10cSrcweir if ( pIter->Name.equalsAscii("ComponentData") ) 819cdf0e10cSrcweir { 820cdf0e10cSrcweir Sequence<PropertyValue> aDocumentContext; 821cdf0e10cSrcweir pIter->Value >>= aDocumentContext; 822cdf0e10cSrcweir const PropertyValue* pContextIter = aDocumentContext.getConstArray(); 823cdf0e10cSrcweir const PropertyValue* pContextEnd = pContextIter + aDocumentContext.getLength(); 824cdf0e10cSrcweir for(;pContextIter != pContextEnd;++pContextIter) 825cdf0e10cSrcweir { 826cdf0e10cSrcweir if ( pContextIter->Name.equalsAscii( "ActiveConnection" ) 827cdf0e10cSrcweir && ( pContextIter->Value >>= _rxActualConnection ) 828cdf0e10cSrcweir ) 829cdf0e10cSrcweir { 830cdf0e10cSrcweir bIsEmbedded = true; 831cdf0e10cSrcweir break; 832cdf0e10cSrcweir } 833cdf0e10cSrcweir } 834cdf0e10cSrcweir break; 835cdf0e10cSrcweir } 836cdf0e10cSrcweir } 837cdf0e10cSrcweir } 838cdf0e10cSrcweir } 839cdf0e10cSrcweir catch(Exception&) 840cdf0e10cSrcweir { 841cdf0e10cSrcweir // not intereseted in 842cdf0e10cSrcweir } 843cdf0e10cSrcweir return bIsEmbedded; 844cdf0e10cSrcweir } 845cdf0e10cSrcweir // ----------------------------------------------------------------------------- 846cdf0e10cSrcweir namespace 847cdf0e10cSrcweir { 848cdf0e10cSrcweir ::rtl::OUString lcl_getEncodingName( rtl_TextEncoding _eEncoding ) 849cdf0e10cSrcweir { 850cdf0e10cSrcweir ::rtl::OUString sEncodingName; 851cdf0e10cSrcweir 852cdf0e10cSrcweir OCharsetMap aCharsets; 853cdf0e10cSrcweir OCharsetMap::CharsetIterator aEncodingPos = aCharsets.find( _eEncoding ); 854cdf0e10cSrcweir OSL_ENSURE( aEncodingPos != aCharsets.end(), "lcl_getEncodingName: *which* encoding?" ); 855cdf0e10cSrcweir if ( aEncodingPos != aCharsets.end() ) 856cdf0e10cSrcweir sEncodingName = (*aEncodingPos).getIanaName(); 857cdf0e10cSrcweir 858cdf0e10cSrcweir return sEncodingName; 859cdf0e10cSrcweir } 860cdf0e10cSrcweir } 861cdf0e10cSrcweir 862cdf0e10cSrcweir // ----------------------------------------------------------------------------- 863cdf0e10cSrcweir sal_Int32 DBTypeConversion::convertUnicodeString( const ::rtl::OUString& _rSource, ::rtl::OString& _rDest, rtl_TextEncoding _eEncoding ) SAL_THROW((com::sun::star::sdbc::SQLException)) 864cdf0e10cSrcweir { 865cdf0e10cSrcweir if ( !rtl_convertUStringToString( &_rDest.pData, _rSource.getStr(), _rSource.getLength(), 866cdf0e10cSrcweir _eEncoding, 867cdf0e10cSrcweir RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR | 868cdf0e10cSrcweir RTL_UNICODETOTEXT_FLAGS_UNDEFINED_REPLACE | 869cdf0e10cSrcweir RTL_UNICODETOTEXT_FLAGS_PRIVATE_MAPTO0 | 870cdf0e10cSrcweir RTL_UNICODETOTEXT_FLAGS_NOCOMPOSITE ) 871cdf0e10cSrcweir ) 872cdf0e10cSrcweir { 873cdf0e10cSrcweir SharedResources aResources; 874cdf0e10cSrcweir ::rtl::OUString sMessage = aResources.getResourceStringWithSubstitution( STR_CANNOT_CONVERT_STRING, 875cdf0e10cSrcweir "$string$", _rSource, 876cdf0e10cSrcweir "$charset$", lcl_getEncodingName( _eEncoding ) 877cdf0e10cSrcweir ); 878cdf0e10cSrcweir 879cdf0e10cSrcweir throw SQLException( 880cdf0e10cSrcweir sMessage, 881cdf0e10cSrcweir NULL, 882cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "22018" ) ), 883cdf0e10cSrcweir 22018, 884cdf0e10cSrcweir Any() 885cdf0e10cSrcweir ); 886cdf0e10cSrcweir } 887cdf0e10cSrcweir 888cdf0e10cSrcweir return _rDest.getLength(); 889cdf0e10cSrcweir } 890cdf0e10cSrcweir 891cdf0e10cSrcweir // ----------------------------------------------------------------------------- 892cdf0e10cSrcweir sal_Int32 DBTypeConversion::convertUnicodeStringToLength( const ::rtl::OUString& _rSource, ::rtl::OString& _rDest, 893cdf0e10cSrcweir sal_Int32 _nMaxLen, rtl_TextEncoding _eEncoding ) SAL_THROW((SQLException)) 894cdf0e10cSrcweir { 895cdf0e10cSrcweir sal_Int32 nLen = convertUnicodeString( _rSource, _rDest, _eEncoding ); 896cdf0e10cSrcweir if ( nLen > _nMaxLen ) 897cdf0e10cSrcweir { 898cdf0e10cSrcweir SharedResources aResources; 899cdf0e10cSrcweir ::rtl::OUString sMessage = aResources.getResourceStringWithSubstitution( STR_STRING_LENGTH_EXCEEDED, 900cdf0e10cSrcweir "$string$", _rSource, 901cdf0e10cSrcweir "$maxlen$", ::rtl::OUString::valueOf( _nMaxLen ), 902cdf0e10cSrcweir "$charset$", lcl_getEncodingName( _eEncoding ) 903cdf0e10cSrcweir ); 904cdf0e10cSrcweir 905cdf0e10cSrcweir throw SQLException( 906cdf0e10cSrcweir sMessage, 907cdf0e10cSrcweir NULL, 908cdf0e10cSrcweir ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "22001" ) ), 909cdf0e10cSrcweir 22001, 910cdf0e10cSrcweir Any() 911cdf0e10cSrcweir ); 912cdf0e10cSrcweir } 913cdf0e10cSrcweir 914cdf0e10cSrcweir return nLen; 915cdf0e10cSrcweir } 916cdf0e10cSrcweir ::rtl::OUString lcl_getReportEngines() 917cdf0e10cSrcweir { 918cdf0e10cSrcweir static ::rtl::OUString s_sNodeName(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Office.DataAccess/ReportEngines")); 919cdf0e10cSrcweir return s_sNodeName; 920cdf0e10cSrcweir } 921cdf0e10cSrcweir // ----------------------------------------------------------------------------- 922cdf0e10cSrcweir ::rtl::OUString lcl_getDefaultReportEngine() 923cdf0e10cSrcweir { 924cdf0e10cSrcweir static ::rtl::OUString s_sNodeName(RTL_CONSTASCII_USTRINGPARAM("DefaultReportEngine")); 925cdf0e10cSrcweir return s_sNodeName; 926cdf0e10cSrcweir } 927cdf0e10cSrcweir // ----------------------------------------------------------------------------- 928cdf0e10cSrcweir ::rtl::OUString lcl_getReportEngineNames() 929cdf0e10cSrcweir { 930cdf0e10cSrcweir static ::rtl::OUString s_sNodeName(RTL_CONSTASCII_USTRINGPARAM("ReportEngineNames")); 931cdf0e10cSrcweir return s_sNodeName; 932cdf0e10cSrcweir } 933cdf0e10cSrcweir // ----------------------------------------------------------------------------- 934cdf0e10cSrcweir ::rtl::OUString getDefaultReportEngineServiceName(const Reference< XMultiServiceFactory >& _rxORB) 935cdf0e10cSrcweir { 936cdf0e10cSrcweir ::utl::OConfigurationTreeRoot aReportEngines = ::utl::OConfigurationTreeRoot::createWithServiceFactory( 937cdf0e10cSrcweir _rxORB, lcl_getReportEngines(), -1, ::utl::OConfigurationTreeRoot::CM_READONLY); 938cdf0e10cSrcweir 939cdf0e10cSrcweir if ( aReportEngines.isValid() ) 940cdf0e10cSrcweir { 941cdf0e10cSrcweir ::rtl::OUString sDefaultReportEngineName; 942cdf0e10cSrcweir aReportEngines.getNodeValue(lcl_getDefaultReportEngine()) >>= sDefaultReportEngineName; 943cdf0e10cSrcweir if ( sDefaultReportEngineName.getLength() ) 944cdf0e10cSrcweir { 945cdf0e10cSrcweir ::utl::OConfigurationNode aReportEngineNames = aReportEngines.openNode(lcl_getReportEngineNames()); 946cdf0e10cSrcweir if ( aReportEngineNames.isValid() ) 947cdf0e10cSrcweir { 948cdf0e10cSrcweir ::utl::OConfigurationNode aReportEngine = aReportEngineNames.openNode(sDefaultReportEngineName); 949cdf0e10cSrcweir if ( aReportEngine.isValid() ) 950cdf0e10cSrcweir { 951cdf0e10cSrcweir ::rtl::OUString sRet; 952cdf0e10cSrcweir const static ::rtl::OUString s_sService(RTL_CONSTASCII_USTRINGPARAM("ServiceName")); 953cdf0e10cSrcweir aReportEngine.getNodeValue(s_sService) >>= sRet; 954cdf0e10cSrcweir return sRet; 955cdf0e10cSrcweir } 956cdf0e10cSrcweir } 957cdf0e10cSrcweir } 958cdf0e10cSrcweir else 959cdf0e10cSrcweir return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.report.pentaho.SOReportJobFactory")); 960cdf0e10cSrcweir } 961cdf0e10cSrcweir else 962cdf0e10cSrcweir return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.report.pentaho.SOReportJobFactory")); 963cdf0e10cSrcweir return ::rtl::OUString(); 964cdf0e10cSrcweir } 965cdf0e10cSrcweir // ----------------------------------------------------------------------------- 966cdf0e10cSrcweir //......................................................................... 967cdf0e10cSrcweir } // namespace dbtools 968cdf0e10cSrcweir //......................................................................... 969