1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_connectivity.hxx" 30 #include "connectivity/sdbcx/VCatalog.hxx" 31 #include "connectivity/sdbcx/VCollection.hxx" 32 #include <com/sun/star/lang/DisposedException.hpp> 33 #include "connectivity/sdbcx/VCollection.hxx" 34 #include "connectivity/sdbcx/VDescriptor.hxx" 35 #include "TConnection.hxx" 36 #include <comphelper/uno3.hxx> 37 #include "connectivity/dbtools.hxx" 38 39 using namespace connectivity; 40 using namespace connectivity::sdbcx; 41 using namespace ::com::sun::star::beans; 42 using namespace ::com::sun::star::uno; 43 using namespace ::com::sun::star::sdbc; 44 using namespace ::com::sun::star::sdbcx; 45 using namespace ::com::sun::star::container; 46 using namespace ::com::sun::star::lang; 47 //------------------------------------------------------------------------------ 48 IMPLEMENT_SERVICE_INFO(OCatalog,"com.sun.star.comp.connectivity.OCatalog","com.sun.star.sdbcx.DatabaseDefinition") 49 //------------------------------------------------------------------------------ 50 OCatalog::OCatalog(const Reference< XConnection> &_xConnection) : OCatalog_BASE(m_aMutex) 51 ,connectivity::OSubComponent<OCatalog, OCatalog_BASE>(_xConnection, this) 52 ,m_pTables(NULL) 53 ,m_pViews(NULL) 54 ,m_pGroups(NULL) 55 ,m_pUsers(NULL) 56 { 57 try 58 { 59 m_xMetaData = _xConnection->getMetaData(); 60 } 61 catch(const Exception&) 62 { 63 OSL_ENSURE(0,"No Metadata available!"); 64 } 65 } 66 //----------------------------------------------------------------------------- 67 OCatalog::~OCatalog() 68 { 69 delete m_pTables; 70 delete m_pViews; 71 delete m_pGroups; 72 delete m_pUsers; 73 } 74 //----------------------------------------------------------------------------- 75 void SAL_CALL OCatalog::acquire() throw() 76 { 77 OCatalog_BASE::acquire(); 78 } 79 //------------------------------------------------------------------------------ 80 void SAL_CALL OCatalog::release() throw() 81 { 82 relase_ChildImpl(); 83 } 84 85 //------------------------------------------------------------------------------ 86 void SAL_CALL OCatalog::disposing() 87 { 88 ::osl::MutexGuard aGuard(m_aMutex); 89 90 if(m_pTables) 91 m_pTables->disposing(); 92 if(m_pViews) 93 m_pViews->disposing(); 94 if(m_pGroups) 95 m_pGroups->disposing(); 96 if(m_pUsers) 97 m_pUsers->disposing(); 98 99 dispose_ChildImpl(); 100 OCatalog_BASE::disposing(); 101 } 102 //------------------------------------------------------------------------------ 103 // XTablesSupplier 104 Reference< XNameAccess > SAL_CALL OCatalog::getTables( ) throw(RuntimeException) 105 { 106 ::osl::MutexGuard aGuard(m_aMutex); 107 checkDisposed(OCatalog_BASE::rBHelper.bDisposed); 108 109 try 110 { 111 if(!m_pTables) 112 refreshTables(); 113 } 114 catch( const RuntimeException& ) 115 { 116 // allowed to leave this method 117 throw; 118 } 119 catch( const Exception& ) 120 { 121 // allowed 122 } 123 124 return const_cast<OCatalog*>(this)->m_pTables; 125 } 126 // ------------------------------------------------------------------------- 127 // XViewsSupplier 128 Reference< XNameAccess > SAL_CALL OCatalog::getViews( ) throw(RuntimeException) 129 { 130 ::osl::MutexGuard aGuard(m_aMutex); 131 checkDisposed(OCatalog_BASE::rBHelper.bDisposed); 132 133 try 134 { 135 if(!m_pViews) 136 refreshViews(); 137 } 138 catch( const RuntimeException& ) 139 { 140 // allowed to leave this method 141 throw; 142 } 143 catch( const Exception& ) 144 { 145 // allowed 146 } 147 148 return const_cast<OCatalog*>(this)->m_pViews; 149 } 150 // ------------------------------------------------------------------------- 151 // XUsersSupplier 152 Reference< XNameAccess > SAL_CALL OCatalog::getUsers( ) throw(RuntimeException) 153 { 154 ::osl::MutexGuard aGuard(m_aMutex); 155 checkDisposed(OCatalog_BASE::rBHelper.bDisposed); 156 157 try 158 { 159 if(!m_pUsers) 160 refreshUsers(); 161 } 162 catch( const RuntimeException& ) 163 { 164 // allowed to leave this method 165 throw; 166 } 167 catch( const Exception& ) 168 { 169 // allowed 170 } 171 172 return const_cast<OCatalog*>(this)->m_pUsers; 173 } 174 // ------------------------------------------------------------------------- 175 // XGroupsSupplier 176 Reference< XNameAccess > SAL_CALL OCatalog::getGroups( ) throw(RuntimeException) 177 { 178 ::osl::MutexGuard aGuard(m_aMutex); 179 checkDisposed(OCatalog_BASE::rBHelper.bDisposed); 180 181 try 182 { 183 if(!m_pGroups) 184 refreshGroups(); 185 } 186 catch( const RuntimeException& ) 187 { 188 // allowed to leave this method 189 throw; 190 } 191 catch( const Exception& ) 192 { 193 // allowed 194 } 195 196 return const_cast<OCatalog*>(this)->m_pGroups; 197 } 198 // ----------------------------------------------------------------------------- 199 ::rtl::OUString OCatalog::buildName(const Reference< XRow >& _xRow) 200 { 201 ::rtl::OUString sCatalog = _xRow->getString(1); 202 if ( _xRow->wasNull() ) 203 sCatalog = ::rtl::OUString(); 204 ::rtl::OUString sSchema = _xRow->getString(2); 205 if ( _xRow->wasNull() ) 206 sSchema = ::rtl::OUString(); 207 ::rtl::OUString sTable = _xRow->getString(3); 208 if ( _xRow->wasNull() ) 209 sTable = ::rtl::OUString(); 210 211 ::rtl::OUString sComposedName( 212 ::dbtools::composeTableName( m_xMetaData, sCatalog, sSchema, sTable, sal_False, ::dbtools::eInDataManipulation ) ); 213 return sComposedName; 214 } 215 // ----------------------------------------------------------------------------- 216 void OCatalog::fillNames(Reference< XResultSet >& _xResult,TStringVector& _rNames) 217 { 218 if ( _xResult.is() ) 219 { 220 _rNames.reserve(20); 221 Reference< XRow > xRow(_xResult,UNO_QUERY); 222 while ( _xResult->next() ) 223 { 224 _rNames.push_back( buildName(xRow) ); 225 } 226 xRow.clear(); 227 ::comphelper::disposeComponent(_xResult); 228 } 229 } 230 // ------------------------------------------------------------------------- 231 void ODescriptor::construct() 232 { 233 sal_Int32 nAttrib = isNew() ? 0 : ::com::sun::star::beans::PropertyAttribute::READONLY; 234 registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME), PROPERTY_ID_NAME ,nAttrib,&m_Name,::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL))); 235 } 236 // ------------------------------------------------------------------------- 237 ODescriptor::~ODescriptor() 238 { 239 } 240 // ----------------------------------------------------------------------------- 241 242