1*9b5730f6SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*9b5730f6SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*9b5730f6SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*9b5730f6SAndrew Rist  * distributed with this work for additional information
6*9b5730f6SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*9b5730f6SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*9b5730f6SAndrew Rist  * "License"); you may not use this file except in compliance
9*9b5730f6SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*9b5730f6SAndrew Rist  *
11*9b5730f6SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*9b5730f6SAndrew Rist  *
13*9b5730f6SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*9b5730f6SAndrew Rist  * software distributed under the License is distributed on an
15*9b5730f6SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*9b5730f6SAndrew Rist  * KIND, either express or implied.  See the License for the
17*9b5730f6SAndrew Rist  * specific language governing permissions and limitations
18*9b5730f6SAndrew Rist  * under the License.
19*9b5730f6SAndrew Rist  *
20*9b5730f6SAndrew Rist  *************************************************************/
21*9b5730f6SAndrew Rist 
22*9b5730f6SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_connectivity.hxx"
26cdf0e10cSrcweir #include "adabas/BUser.hxx"
27cdf0e10cSrcweir #include "adabas/BGroups.hxx"
28cdf0e10cSrcweir #include <com/sun/star/sdbc/XRow.hpp>
29cdf0e10cSrcweir #include <com/sun/star/sdbc/XResultSet.hpp>
30cdf0e10cSrcweir #include "adabas/BConnection.hxx"
31cdf0e10cSrcweir #include "connectivity/dbtools.hxx"
32cdf0e10cSrcweir #include "connectivity/dbexception.hxx"
33cdf0e10cSrcweir #include <com/sun/star/sdbcx/Privilege.hpp>
34cdf0e10cSrcweir #include <com/sun/star/sdbcx/PrivilegeObject.hpp>
35cdf0e10cSrcweir #include "resource/adabas_res.hrc"
36cdf0e10cSrcweir 
37cdf0e10cSrcweir using namespace connectivity::adabas;
38cdf0e10cSrcweir using namespace ::com::sun::star::uno;
39cdf0e10cSrcweir using namespace ::com::sun::star::beans;
40cdf0e10cSrcweir using namespace ::com::sun::star::sdbcx;
41cdf0e10cSrcweir using namespace ::com::sun::star::sdbc;
42cdf0e10cSrcweir using namespace ::com::sun::star::container;
43cdf0e10cSrcweir using namespace ::com::sun::star::lang;
44cdf0e10cSrcweir // -------------------------------------------------------------------------
OAdabasUser(OAdabasConnection * _pConnection)45cdf0e10cSrcweir OAdabasUser::OAdabasUser(	OAdabasConnection* _pConnection) : connectivity::sdbcx::OUser(sal_True)
46cdf0e10cSrcweir 				,m_pConnection(_pConnection)
47cdf0e10cSrcweir {
48cdf0e10cSrcweir 	construct();
49cdf0e10cSrcweir }
50cdf0e10cSrcweir // -------------------------------------------------------------------------
OAdabasUser(OAdabasConnection * _pConnection,const::rtl::OUString & _Name)51cdf0e10cSrcweir OAdabasUser::OAdabasUser(   OAdabasConnection* _pConnection,
52cdf0e10cSrcweir 				const ::rtl::OUString& _Name
53cdf0e10cSrcweir 			) : connectivity::sdbcx::OUser(_Name,sal_True)
54cdf0e10cSrcweir 				,m_pConnection(_pConnection)
55cdf0e10cSrcweir {
56cdf0e10cSrcweir 	construct();
57cdf0e10cSrcweir }
58cdf0e10cSrcweir // -------------------------------------------------------------------------
refreshGroups()59cdf0e10cSrcweir void OAdabasUser::refreshGroups()
60cdf0e10cSrcweir {
61cdf0e10cSrcweir 	if(!m_pConnection)
62cdf0e10cSrcweir 		return;
63cdf0e10cSrcweir 
64cdf0e10cSrcweir 	TStringVector aVector;
65cdf0e10cSrcweir 	aVector.reserve(7); // we don't know the excatly count of users but this should fit the normal need
66cdf0e10cSrcweir 	Reference< XStatement > xStmt = m_pConnection->createStatement(  );
67cdf0e10cSrcweir 	::rtl::OUString aSql = ::rtl::OUString::createFromAscii("SELECT DISTINCT GROUPNAME FROM DOMAIN.USERS WHERE GROUPNAME IS NOT NULL AND GROUPNAME <> ' ' AND USERNAME = '");
68cdf0e10cSrcweir 	aSql += getName( );
69cdf0e10cSrcweir 	aSql += ::rtl::OUString::createFromAscii("'");
70cdf0e10cSrcweir 
71cdf0e10cSrcweir     Reference< XResultSet > xResult = xStmt->executeQuery(aSql);
72cdf0e10cSrcweir 	if(xResult.is())
73cdf0e10cSrcweir 	{
74cdf0e10cSrcweir                 Reference< XRow > xRow(xResult,UNO_QUERY);
75cdf0e10cSrcweir 		while(xResult->next())
76cdf0e10cSrcweir 			aVector.push_back(xRow->getString(1));
77cdf0e10cSrcweir 		::comphelper::disposeComponent(xResult);
78cdf0e10cSrcweir 	}
79cdf0e10cSrcweir 	::comphelper::disposeComponent(xStmt);
80cdf0e10cSrcweir 
81cdf0e10cSrcweir 	if(m_pGroups)
82cdf0e10cSrcweir 		m_pGroups->reFill(aVector);
83cdf0e10cSrcweir 	else
84cdf0e10cSrcweir 		m_pGroups = new OGroups(*this,m_aMutex,aVector,m_pConnection,this);
85cdf0e10cSrcweir }
86cdf0e10cSrcweir // -------------------------------------------------------------------------
OUserExtend(OAdabasConnection * _pConnection)87cdf0e10cSrcweir OUserExtend::OUserExtend(	OAdabasConnection* _pConnection) : OAdabasUser(_pConnection)
88cdf0e10cSrcweir {
89cdf0e10cSrcweir 	construct();
90cdf0e10cSrcweir }
91cdf0e10cSrcweir // -------------------------------------------------------------------------
92cdf0e10cSrcweir typedef connectivity::sdbcx::OUser	OUser_TYPEDEF;
construct()93cdf0e10cSrcweir void OUserExtend::construct()
94cdf0e10cSrcweir {
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 	registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PASSWORD),	PROPERTY_ID_PASSWORD,0,&m_Password,::getCppuType(reinterpret_cast< ::rtl::OUString*>(NULL)));
97cdf0e10cSrcweir }
98cdf0e10cSrcweir // -----------------------------------------------------------------------------
createArrayHelper() const99cdf0e10cSrcweir cppu::IPropertyArrayHelper* OUserExtend::createArrayHelper() const
100cdf0e10cSrcweir {
101cdf0e10cSrcweir 	Sequence< Property > aProps;
102cdf0e10cSrcweir 	describeProperties(aProps);
103cdf0e10cSrcweir 	return new cppu::OPropertyArrayHelper(aProps);
104cdf0e10cSrcweir }
105cdf0e10cSrcweir // -------------------------------------------------------------------------
getInfoHelper()106cdf0e10cSrcweir cppu::IPropertyArrayHelper & OUserExtend::getInfoHelper()
107cdf0e10cSrcweir {
108cdf0e10cSrcweir 	return *OUserExtend_PROP::getArrayHelper();
109cdf0e10cSrcweir }
110cdf0e10cSrcweir typedef connectivity::sdbcx::OUser_BASE OUser_BASE_RBHELPER;
111cdf0e10cSrcweir // -----------------------------------------------------------------------------
getPrivileges(const::rtl::OUString & objName,sal_Int32 objType)112cdf0e10cSrcweir sal_Int32 SAL_CALL OAdabasUser::getPrivileges( const ::rtl::OUString& objName, sal_Int32 objType ) throw(SQLException, RuntimeException)
113cdf0e10cSrcweir {
114cdf0e10cSrcweir     if ( objType != PrivilegeObject::TABLE )
115cdf0e10cSrcweir         return 0;
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 	::osl::MutexGuard aGuard(m_aMutex);
118cdf0e10cSrcweir 	checkDisposed(OUser_BASE_RBHELPER::rBHelper.bDisposed);
119cdf0e10cSrcweir 
120cdf0e10cSrcweir 	sal_Int32 nRights,nRightsWithGrant;
121cdf0e10cSrcweir 	getAnyTablePrivileges(objName,nRights,nRightsWithGrant);
122cdf0e10cSrcweir 	return nRights;
123cdf0e10cSrcweir }
124cdf0e10cSrcweir // -----------------------------------------------------------------------------
getAnyTablePrivileges(const::rtl::OUString & objName,sal_Int32 & nRights,sal_Int32 & nRightsWithGrant)125cdf0e10cSrcweir void OAdabasUser::getAnyTablePrivileges(const ::rtl::OUString& objName, sal_Int32& nRights,sal_Int32& nRightsWithGrant) throw(SQLException, RuntimeException)
126cdf0e10cSrcweir {
127cdf0e10cSrcweir 	nRightsWithGrant = nRights = 0;
128cdf0e10cSrcweir 	// first we need to create the sql stmt to select the privs
129cdf0e10cSrcweir 	Reference<XDatabaseMetaData> xMeta = m_pConnection->getMetaData();
130cdf0e10cSrcweir 	::rtl::OUString sCatalog,sSchema,sTable;
131cdf0e10cSrcweir 	::dbtools::qualifiedNameComponents(xMeta,objName,sCatalog,sSchema,sTable,::dbtools::eInDataManipulation);
132cdf0e10cSrcweir 	Reference<XStatement> xStmt = m_pConnection->createStatement();
133cdf0e10cSrcweir 	::rtl::OUString sSql = ::rtl::OUString::createFromAscii("SELECT REFTABLENAME,PRIVILEGES FROM DOMAIN.USR_USES_TAB WHERE REFOBJTYPE <> 'SYSTEM' AND DEFUSERNAME = '");
134cdf0e10cSrcweir 	sSql += m_Name;
135cdf0e10cSrcweir 	sSql += ::rtl::OUString::createFromAscii("' AND REFTABLENAME = '");
136cdf0e10cSrcweir 	sSql += sTable;
137cdf0e10cSrcweir 	sSql += ::rtl::OUString::createFromAscii("'");
138cdf0e10cSrcweir 	if(xStmt.is())
139cdf0e10cSrcweir 	{
140cdf0e10cSrcweir 		Reference<XResultSet> xRes = xStmt->executeQuery(sSql);
141cdf0e10cSrcweir 		if(xRes.is())
142cdf0e10cSrcweir 		{
143cdf0e10cSrcweir 			Reference<XRow> xRow(xRes,UNO_QUERY);
144cdf0e10cSrcweir 			if(xRow.is() && xRes->next())
145cdf0e10cSrcweir 			{
146cdf0e10cSrcweir 				::rtl::OUString sPrivs = xRow->getString(2);
147cdf0e10cSrcweir 
148cdf0e10cSrcweir                 struct _priv_nam
149cdf0e10cSrcweir                 {
150cdf0e10cSrcweir                     const sal_Char* pAsciiName;
151cdf0e10cSrcweir                     sal_Int32       nNumericValue;
152cdf0e10cSrcweir                 } privileges[] =
153cdf0e10cSrcweir                 {
154cdf0e10cSrcweir                     { "INS", Privilege::INSERT },
155cdf0e10cSrcweir                     { "DEL", Privilege::DELETE },
156cdf0e10cSrcweir                     { "UPD", Privilege::UPDATE },
157cdf0e10cSrcweir                     { "ALT", Privilege::ALTER },
158cdf0e10cSrcweir                     { "SEL", Privilege::SELECT },
159cdf0e10cSrcweir                     { "REF", Privilege::REFERENCE }
160cdf0e10cSrcweir                 };
161cdf0e10cSrcweir                 for ( size_t i = 0; i < sizeof( privileges ) / sizeof( privileges[0] ); ++i )
162cdf0e10cSrcweir                 {
163cdf0e10cSrcweir                     sal_Int32 nIndex = sPrivs.indexOf( ::rtl::OUString::createFromAscii( privileges[i].pAsciiName ) );
164cdf0e10cSrcweir                     if ( nIndex == -1 )
165cdf0e10cSrcweir                         continue;
166cdf0e10cSrcweir 
167cdf0e10cSrcweir                     nRights |= privileges[i].nNumericValue;
168cdf0e10cSrcweir                     if ( sPrivs.copy( nIndex + 2, 1 ).equalsAscii( "+" ) )
169cdf0e10cSrcweir                         nRightsWithGrant |= privileges[i].nNumericValue;
170cdf0e10cSrcweir                 }
171cdf0e10cSrcweir 			}
172cdf0e10cSrcweir 			::comphelper::disposeComponent(xRes);
173cdf0e10cSrcweir 		}
174cdf0e10cSrcweir 		::comphelper::disposeComponent(xStmt);
175cdf0e10cSrcweir 	}
176cdf0e10cSrcweir }
177cdf0e10cSrcweir // -------------------------------------------------------------------------
getGrantablePrivileges(const::rtl::OUString & objName,sal_Int32 objType)178cdf0e10cSrcweir sal_Int32 SAL_CALL OAdabasUser::getGrantablePrivileges( const ::rtl::OUString& objName, sal_Int32 objType ) throw(SQLException, RuntimeException)
179cdf0e10cSrcweir {
180cdf0e10cSrcweir     if ( objType != PrivilegeObject::TABLE )
181cdf0e10cSrcweir         return 0;
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 	::osl::MutexGuard aGuard(m_aMutex);
184cdf0e10cSrcweir 	checkDisposed(OUser_BASE_RBHELPER::rBHelper.bDisposed);
185cdf0e10cSrcweir 
186cdf0e10cSrcweir 	sal_Int32 nRights,nRightsWithGrant;
187cdf0e10cSrcweir 	getAnyTablePrivileges(objName,nRights,nRightsWithGrant);
188cdf0e10cSrcweir 	return nRightsWithGrant;
189cdf0e10cSrcweir }
190cdf0e10cSrcweir // -------------------------------------------------------------------------
grantPrivileges(const::rtl::OUString & objName,sal_Int32 objType,sal_Int32 objPrivileges)191cdf0e10cSrcweir void SAL_CALL OAdabasUser::grantPrivileges( const ::rtl::OUString& objName, sal_Int32 objType, sal_Int32 objPrivileges ) throw(SQLException, RuntimeException)
192cdf0e10cSrcweir {
193cdf0e10cSrcweir     if ( objType != PrivilegeObject::TABLE )
194cdf0e10cSrcweir         m_pConnection->throwGenericSQLException(STR_PRIVILEGE_NOT_GRANTED,*this);
195cdf0e10cSrcweir 
196cdf0e10cSrcweir 	::osl::MutexGuard aGuard(m_aMutex);
197cdf0e10cSrcweir 	::rtl::OUString sPrivs = getPrivilegeString(objPrivileges);
198cdf0e10cSrcweir 	if(sPrivs.getLength())
199cdf0e10cSrcweir 	{
200cdf0e10cSrcweir 		::rtl::OUString sGrant;
201cdf0e10cSrcweir 		sGrant += ::rtl::OUString::createFromAscii("GRANT ");
202cdf0e10cSrcweir 		sGrant += sPrivs;
203cdf0e10cSrcweir 		sGrant += ::rtl::OUString::createFromAscii(" ON ");
204cdf0e10cSrcweir 		Reference<XDatabaseMetaData> xMeta = m_pConnection->getMetaData();
205cdf0e10cSrcweir 		sGrant += ::dbtools::quoteTableName(xMeta,objName,::dbtools::eInDataManipulation);
206cdf0e10cSrcweir 		sGrant += ::rtl::OUString::createFromAscii(" TO ");
207cdf0e10cSrcweir 		sGrant += m_Name;
208cdf0e10cSrcweir 
209cdf0e10cSrcweir 		Reference<XStatement> xStmt = m_pConnection->createStatement();
210cdf0e10cSrcweir 		if(xStmt.is())
211cdf0e10cSrcweir 			xStmt->execute(sGrant);
212cdf0e10cSrcweir 		::comphelper::disposeComponent(xStmt);
213cdf0e10cSrcweir 	}
214cdf0e10cSrcweir }
215cdf0e10cSrcweir // -------------------------------------------------------------------------
revokePrivileges(const::rtl::OUString & objName,sal_Int32 objType,sal_Int32 objPrivileges)216cdf0e10cSrcweir void SAL_CALL OAdabasUser::revokePrivileges( const ::rtl::OUString& objName, sal_Int32 objType, sal_Int32 objPrivileges ) throw(SQLException, RuntimeException)
217cdf0e10cSrcweir {
218cdf0e10cSrcweir     if ( objType != PrivilegeObject::TABLE )
219cdf0e10cSrcweir         m_pConnection->throwGenericSQLException(STR_PRIVILEGE_NOT_REVOKED,*this);
220cdf0e10cSrcweir 
221cdf0e10cSrcweir 	::osl::MutexGuard aGuard(m_aMutex);
222cdf0e10cSrcweir 	checkDisposed(OUser_BASE_RBHELPER::rBHelper.bDisposed);
223cdf0e10cSrcweir     ::rtl::OUString sPrivs = getPrivilegeString(objPrivileges);
224cdf0e10cSrcweir 	if(sPrivs.getLength())
225cdf0e10cSrcweir 	{
226cdf0e10cSrcweir 		::rtl::OUString sGrant;
227cdf0e10cSrcweir 		sGrant += ::rtl::OUString::createFromAscii("REVOKE ");
228cdf0e10cSrcweir 		sGrant += sPrivs;
229cdf0e10cSrcweir 		sGrant += ::rtl::OUString::createFromAscii(" ON ");
230cdf0e10cSrcweir 		Reference<XDatabaseMetaData> xMeta = m_pConnection->getMetaData();
231cdf0e10cSrcweir 		sGrant += ::dbtools::quoteTableName(xMeta,objName,::dbtools::eInDataManipulation);
232cdf0e10cSrcweir 		sGrant += ::rtl::OUString::createFromAscii(" FROM ");
233cdf0e10cSrcweir 		sGrant += m_Name;
234cdf0e10cSrcweir 
235cdf0e10cSrcweir 		Reference<XStatement> xStmt = m_pConnection->createStatement();
236cdf0e10cSrcweir 		if(xStmt.is())
237cdf0e10cSrcweir 			xStmt->execute(sGrant);
238cdf0e10cSrcweir 		::comphelper::disposeComponent(xStmt);
239cdf0e10cSrcweir 	}
240cdf0e10cSrcweir }
241cdf0e10cSrcweir // -----------------------------------------------------------------------------
242cdf0e10cSrcweir // XUser
changePassword(const::rtl::OUString & objPassword,const::rtl::OUString & newPassword)243cdf0e10cSrcweir void SAL_CALL OAdabasUser::changePassword( const ::rtl::OUString& objPassword, const ::rtl::OUString& newPassword ) throw(SQLException, RuntimeException)
244cdf0e10cSrcweir {
245cdf0e10cSrcweir 	::osl::MutexGuard aGuard(m_aMutex);
246cdf0e10cSrcweir 	checkDisposed(OUser_BASE_RBHELPER::rBHelper.bDisposed);
247cdf0e10cSrcweir 	::rtl::OUString sAlterPwd;
248cdf0e10cSrcweir 	sAlterPwd = ::rtl::OUString::createFromAscii("ALTER PASSWORD \"");
249cdf0e10cSrcweir 	sAlterPwd += objPassword.toAsciiUpperCase();
250cdf0e10cSrcweir 	sAlterPwd += ::rtl::OUString::createFromAscii("\" TO \"") ;
251cdf0e10cSrcweir 	sAlterPwd += newPassword.toAsciiUpperCase();
252cdf0e10cSrcweir 	sAlterPwd += ::rtl::OUString::createFromAscii("\"") ;
253cdf0e10cSrcweir 
254cdf0e10cSrcweir 	sal_Bool bDisposeConnection = sal_False;
255cdf0e10cSrcweir 	Reference<XConnection> xConnection = m_pConnection;
256cdf0e10cSrcweir 	if(m_pConnection->getMetaData()->getUserName() != m_Name)
257cdf0e10cSrcweir 	{
258cdf0e10cSrcweir 		OAdabasConnection* pNewConnection = new OAdabasConnection(m_pConnection->getDriverHandle(),m_pConnection->getDriver());
259cdf0e10cSrcweir 		xConnection = pNewConnection;
260cdf0e10cSrcweir 		if(pNewConnection)
261cdf0e10cSrcweir 		{
262cdf0e10cSrcweir 			Sequence< PropertyValue> aSeq(2);
263cdf0e10cSrcweir 			aSeq.getArray()[0].Name		= ::rtl::OUString::createFromAscii("user") ;
264cdf0e10cSrcweir 			aSeq.getArray()[0].Value	<<= m_Name;
265cdf0e10cSrcweir 			aSeq.getArray()[1].Name		= ::rtl::OUString::createFromAscii("password") ;
266cdf0e10cSrcweir 			aSeq.getArray()[1].Value	<<= objPassword;
267cdf0e10cSrcweir 			pNewConnection->Construct(m_pConnection->getMetaData()->getURL(),aSeq);
268cdf0e10cSrcweir 		}
269cdf0e10cSrcweir 		bDisposeConnection = sal_True;
270cdf0e10cSrcweir 	}
271cdf0e10cSrcweir 	if(xConnection.is())
272cdf0e10cSrcweir 	{
273cdf0e10cSrcweir 		Reference<XStatement> xStmt = xConnection->createStatement();
274cdf0e10cSrcweir 		if(xStmt.is())
275cdf0e10cSrcweir 			xStmt->execute(sAlterPwd);
276cdf0e10cSrcweir 		::comphelper::disposeComponent(xStmt);
277cdf0e10cSrcweir 		if(bDisposeConnection)
278cdf0e10cSrcweir 			::comphelper::disposeComponent(xConnection);
279cdf0e10cSrcweir 	}
280cdf0e10cSrcweir 	else
281cdf0e10cSrcweir 		::dbtools::throwFunctionSequenceException(*this);
282cdf0e10cSrcweir }
283cdf0e10cSrcweir // -----------------------------------------------------------------------------
getPrivilegeString(sal_Int32 nRights) const284cdf0e10cSrcweir ::rtl::OUString OAdabasUser::getPrivilegeString(sal_Int32 nRights) const
285cdf0e10cSrcweir {
286cdf0e10cSrcweir 	::rtl::OUString sPrivs;
287cdf0e10cSrcweir 	if((nRights & Privilege::INSERT) == Privilege::INSERT)
288cdf0e10cSrcweir 		sPrivs += ::rtl::OUString::createFromAscii("INSERT");
289cdf0e10cSrcweir 
290cdf0e10cSrcweir 	if((nRights & Privilege::DELETE) == Privilege::DELETE)
291cdf0e10cSrcweir 	{
292cdf0e10cSrcweir 		if(sPrivs.getLength())
293cdf0e10cSrcweir 			sPrivs += ::rtl::OUString::createFromAscii(",");
294cdf0e10cSrcweir 		sPrivs += ::rtl::OUString::createFromAscii("DELETE");
295cdf0e10cSrcweir 	}
296cdf0e10cSrcweir 
297cdf0e10cSrcweir 	if((nRights & Privilege::UPDATE) == Privilege::UPDATE)
298cdf0e10cSrcweir 	{
299cdf0e10cSrcweir 		if(sPrivs.getLength())
300cdf0e10cSrcweir 			sPrivs += ::rtl::OUString::createFromAscii(",");
301cdf0e10cSrcweir 		sPrivs += ::rtl::OUString::createFromAscii("UPDATE");
302cdf0e10cSrcweir 	}
303cdf0e10cSrcweir 
304cdf0e10cSrcweir 	if((nRights & Privilege::ALTER) == Privilege::ALTER)
305cdf0e10cSrcweir 	{
306cdf0e10cSrcweir 		if(sPrivs.getLength())
307cdf0e10cSrcweir 			sPrivs += ::rtl::OUString::createFromAscii(",");
308cdf0e10cSrcweir 		sPrivs += ::rtl::OUString::createFromAscii("ALTER");
309cdf0e10cSrcweir 	}
310cdf0e10cSrcweir 
311cdf0e10cSrcweir 	if((nRights & Privilege::SELECT) == Privilege::SELECT)
312cdf0e10cSrcweir 	{
313cdf0e10cSrcweir 		if(sPrivs.getLength())
314cdf0e10cSrcweir 			sPrivs += ::rtl::OUString::createFromAscii(",");
315cdf0e10cSrcweir 		sPrivs += ::rtl::OUString::createFromAscii("SELECT");
316cdf0e10cSrcweir 	}
317cdf0e10cSrcweir 
318cdf0e10cSrcweir 	if((nRights & Privilege::REFERENCE) == Privilege::REFERENCE)
319cdf0e10cSrcweir 	{
320cdf0e10cSrcweir 		if(sPrivs.getLength())
321cdf0e10cSrcweir 			sPrivs += ::rtl::OUString::createFromAscii(",");
322cdf0e10cSrcweir 		sPrivs += ::rtl::OUString::createFromAscii("REFERENCES");
323cdf0e10cSrcweir 	}
324cdf0e10cSrcweir 
325cdf0e10cSrcweir 	return sPrivs;
326cdf0e10cSrcweir }
327cdf0e10cSrcweir // -----------------------------------------------------------------------------
328cdf0e10cSrcweir 
329