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