xref: /AOO41X/main/connectivity/source/sdbcx/VCatalog.cxx (revision 9b5730f6ddef7eb82608ca4d31dc0d7678e652cf)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_connectivity.hxx"
26 #include "connectivity/sdbcx/VCatalog.hxx"
27 #include "connectivity/sdbcx/VCollection.hxx"
28 #include <com/sun/star/lang/DisposedException.hpp>
29 #include "connectivity/sdbcx/VCollection.hxx"
30 #include "connectivity/sdbcx/VDescriptor.hxx"
31 #include "TConnection.hxx"
32 #include <comphelper/uno3.hxx>
33 #include "connectivity/dbtools.hxx"
34 
35 using namespace connectivity;
36 using namespace connectivity::sdbcx;
37 using namespace ::com::sun::star::beans;
38 using namespace ::com::sun::star::uno;
39 using namespace ::com::sun::star::sdbc;
40 using namespace ::com::sun::star::sdbcx;
41 using namespace ::com::sun::star::container;
42 using namespace ::com::sun::star::lang;
43 //------------------------------------------------------------------------------
44 IMPLEMENT_SERVICE_INFO(OCatalog,"com.sun.star.comp.connectivity.OCatalog","com.sun.star.sdbcx.DatabaseDefinition")
45 //------------------------------------------------------------------------------
OCatalog(const Reference<XConnection> & _xConnection)46 OCatalog::OCatalog(const Reference< XConnection> &_xConnection) : OCatalog_BASE(m_aMutex)
47             ,connectivity::OSubComponent<OCatalog, OCatalog_BASE>(_xConnection, this)
48             ,m_pTables(NULL)
49             ,m_pViews(NULL)
50             ,m_pGroups(NULL)
51             ,m_pUsers(NULL)
52 {
53     try
54     {
55         m_xMetaData = _xConnection->getMetaData();
56     }
57     catch(const Exception&)
58     {
59         OSL_ENSURE(0,"No Metadata available!");
60     }
61 }
62 //-----------------------------------------------------------------------------
~OCatalog()63 OCatalog::~OCatalog()
64 {
65     delete m_pTables;
66     delete m_pViews;
67     delete m_pGroups;
68     delete m_pUsers;
69 }
70 //-----------------------------------------------------------------------------
acquire()71 void SAL_CALL OCatalog::acquire() throw()
72 {
73     OCatalog_BASE::acquire();
74 }
75 //------------------------------------------------------------------------------
release()76 void SAL_CALL OCatalog::release() throw()
77 {
78     relase_ChildImpl();
79 }
80 
81 //------------------------------------------------------------------------------
disposing()82 void SAL_CALL OCatalog::disposing()
83 {
84     ::osl::MutexGuard aGuard(m_aMutex);
85 
86     if(m_pTables)
87         m_pTables->disposing();
88     if(m_pViews)
89         m_pViews->disposing();
90     if(m_pGroups)
91         m_pGroups->disposing();
92     if(m_pUsers)
93         m_pUsers->disposing();
94 
95     dispose_ChildImpl();
96     OCatalog_BASE::disposing();
97 }
98 //------------------------------------------------------------------------------
99 // XTablesSupplier
getTables()100 Reference< XNameAccess > SAL_CALL OCatalog::getTables(  ) throw(RuntimeException)
101 {
102     ::osl::MutexGuard aGuard(m_aMutex);
103     checkDisposed(OCatalog_BASE::rBHelper.bDisposed);
104 
105     try
106     {
107         if(!m_pTables)
108             refreshTables();
109     }
110     catch( const RuntimeException& )
111     {
112         // allowed to leave this method
113         throw;
114     }
115     catch( const Exception& )
116     {
117         // allowed
118     }
119 
120     return const_cast<OCatalog*>(this)->m_pTables;
121 }
122 // -------------------------------------------------------------------------
123 // XViewsSupplier
getViews()124 Reference< XNameAccess > SAL_CALL OCatalog::getViews(  ) throw(RuntimeException)
125 {
126     ::osl::MutexGuard aGuard(m_aMutex);
127     checkDisposed(OCatalog_BASE::rBHelper.bDisposed);
128 
129     try
130     {
131         if(!m_pViews)
132             refreshViews();
133     }
134     catch( const RuntimeException& )
135     {
136         // allowed to leave this method
137         throw;
138     }
139     catch( const Exception& )
140     {
141         // allowed
142     }
143 
144     return const_cast<OCatalog*>(this)->m_pViews;
145 }
146 // -------------------------------------------------------------------------
147 // XUsersSupplier
getUsers()148 Reference< XNameAccess > SAL_CALL OCatalog::getUsers(  ) throw(RuntimeException)
149 {
150     ::osl::MutexGuard aGuard(m_aMutex);
151     checkDisposed(OCatalog_BASE::rBHelper.bDisposed);
152 
153     try
154     {
155         if(!m_pUsers)
156             refreshUsers();
157     }
158     catch( const RuntimeException& )
159     {
160         // allowed to leave this method
161         throw;
162     }
163     catch( const Exception& )
164     {
165         // allowed
166     }
167 
168     return const_cast<OCatalog*>(this)->m_pUsers;
169 }
170 // -------------------------------------------------------------------------
171 // XGroupsSupplier
getGroups()172 Reference< XNameAccess > SAL_CALL OCatalog::getGroups(  ) throw(RuntimeException)
173 {
174     ::osl::MutexGuard aGuard(m_aMutex);
175     checkDisposed(OCatalog_BASE::rBHelper.bDisposed);
176 
177     try
178     {
179         if(!m_pGroups)
180             refreshGroups();
181     }
182     catch( const RuntimeException& )
183     {
184         // allowed to leave this method
185         throw;
186     }
187     catch( const Exception& )
188     {
189         // allowed
190     }
191 
192     return const_cast<OCatalog*>(this)->m_pGroups;
193 }
194 // -----------------------------------------------------------------------------
buildName(const Reference<XRow> & _xRow)195 ::rtl::OUString OCatalog::buildName(const Reference< XRow >& _xRow)
196 {
197     ::rtl::OUString sCatalog = _xRow->getString(1);
198     if ( _xRow->wasNull() )
199         sCatalog = ::rtl::OUString();
200     ::rtl::OUString sSchema  = _xRow->getString(2);
201     if ( _xRow->wasNull() )
202         sSchema = ::rtl::OUString();
203     ::rtl::OUString sTable   = _xRow->getString(3);
204     if ( _xRow->wasNull() )
205         sTable = ::rtl::OUString();
206 
207     ::rtl::OUString sComposedName(
208         ::dbtools::composeTableName( m_xMetaData, sCatalog, sSchema, sTable, sal_False, ::dbtools::eInDataManipulation ) );
209     return sComposedName;
210 }
211 // -----------------------------------------------------------------------------
fillNames(Reference<XResultSet> & _xResult,TStringVector & _rNames)212 void OCatalog::fillNames(Reference< XResultSet >& _xResult,TStringVector& _rNames)
213 {
214     if ( _xResult.is() )
215     {
216         _rNames.reserve(20);
217         Reference< XRow > xRow(_xResult,UNO_QUERY);
218         while ( _xResult->next() )
219         {
220             _rNames.push_back( buildName(xRow) );
221         }
222         xRow.clear();
223         ::comphelper::disposeComponent(_xResult);
224     }
225 }
226 // -------------------------------------------------------------------------
construct()227 void ODescriptor::construct()
228 {
229     sal_Int32 nAttrib = isNew() ? 0 : ::com::sun::star::beans::PropertyAttribute::READONLY;
230     registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME), PROPERTY_ID_NAME ,nAttrib,&m_Name,::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL)));
231 }
232 // -------------------------------------------------------------------------
~ODescriptor()233 ODescriptor::~ODescriptor()
234 {
235 }
236 // -----------------------------------------------------------------------------
237 
238