1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_connectivity.hxx"
30*cdf0e10cSrcweir #include "mysql/YCatalog.hxx"
31*cdf0e10cSrcweir #include "mysql/YUsers.hxx"
32*cdf0e10cSrcweir #include "mysql/YTables.hxx"
33*cdf0e10cSrcweir #include "mysql/YViews.hxx"
34*cdf0e10cSrcweir #include <com/sun/star/sdbc/XRow.hpp>
35*cdf0e10cSrcweir #include <com/sun/star/sdbc/XResultSet.hpp>
36*cdf0e10cSrcweir #include <comphelper/types.hxx>
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir 
39*cdf0e10cSrcweir // -------------------------------------------------------------------------
40*cdf0e10cSrcweir using namespace connectivity;
41*cdf0e10cSrcweir using namespace connectivity::mysql;
42*cdf0e10cSrcweir using namespace connectivity::sdbcx;
43*cdf0e10cSrcweir using namespace ::com::sun::star::uno;
44*cdf0e10cSrcweir using namespace ::com::sun::star::beans;
45*cdf0e10cSrcweir using namespace ::com::sun::star::sdbcx;
46*cdf0e10cSrcweir using namespace ::com::sun::star::sdbc;
47*cdf0e10cSrcweir using namespace ::com::sun::star::container;
48*cdf0e10cSrcweir using namespace ::com::sun::star::lang;
49*cdf0e10cSrcweir // -------------------------------------------------------------------------
50*cdf0e10cSrcweir OMySQLCatalog::OMySQLCatalog(const Reference< XConnection >& _xConnection) : OCatalog(_xConnection)
51*cdf0e10cSrcweir 				,m_xConnection(_xConnection)
52*cdf0e10cSrcweir {
53*cdf0e10cSrcweir }
54*cdf0e10cSrcweir // -----------------------------------------------------------------------------
55*cdf0e10cSrcweir void OMySQLCatalog::refreshObjects(const Sequence< ::rtl::OUString >& _sKindOfObject,TStringVector& _rNames)
56*cdf0e10cSrcweir {
57*cdf0e10cSrcweir 	Reference< XResultSet > xResult = m_xMetaData->getTables(Any(),
58*cdf0e10cSrcweir 															::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%")),
59*cdf0e10cSrcweir 															::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%")),
60*cdf0e10cSrcweir 															_sKindOfObject);
61*cdf0e10cSrcweir 	fillNames(xResult,_rNames);
62*cdf0e10cSrcweir }
63*cdf0e10cSrcweir // -------------------------------------------------------------------------
64*cdf0e10cSrcweir void OMySQLCatalog::refreshTables()
65*cdf0e10cSrcweir {
66*cdf0e10cSrcweir 	TStringVector aVector;
67*cdf0e10cSrcweir 	static const ::rtl::OUString s_sTableTypeView(RTL_CONSTASCII_USTRINGPARAM("VIEW"));
68*cdf0e10cSrcweir 	static const ::rtl::OUString s_sTableTypeTable(RTL_CONSTASCII_USTRINGPARAM("TABLE"));
69*cdf0e10cSrcweir 	static const ::rtl::OUString s_sAll(RTL_CONSTASCII_USTRINGPARAM("%"));
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir 	Sequence< ::rtl::OUString > sTableTypes(3);
72*cdf0e10cSrcweir 	sTableTypes[0] = s_sTableTypeView;
73*cdf0e10cSrcweir 	sTableTypes[1] = s_sTableTypeTable;
74*cdf0e10cSrcweir 	sTableTypes[2] = s_sAll;	// just to be sure to include anything else ....
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir 	refreshObjects(sTableTypes,aVector);
77*cdf0e10cSrcweir 
78*cdf0e10cSrcweir 	if ( m_pTables )
79*cdf0e10cSrcweir 		m_pTables->reFill(aVector);
80*cdf0e10cSrcweir 	else
81*cdf0e10cSrcweir 		m_pTables = new OTables(m_xMetaData,*this,m_aMutex,aVector);
82*cdf0e10cSrcweir }
83*cdf0e10cSrcweir // -------------------------------------------------------------------------
84*cdf0e10cSrcweir void OMySQLCatalog::refreshViews()
85*cdf0e10cSrcweir {
86*cdf0e10cSrcweir 	Sequence< ::rtl::OUString > aTypes(1);
87*cdf0e10cSrcweir 	aTypes[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VIEW"));
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir /*
90*cdf0e10cSrcweir 	sal_Bool bSupportsViews = sal_False;
91*cdf0e10cSrcweir 	try
92*cdf0e10cSrcweir 	{
93*cdf0e10cSrcweir 		Reference<XResultSet> xRes = m_xMetaData->getTableTypes();
94*cdf0e10cSrcweir 		Reference<XRow> xRow(xRes,UNO_QUERY);
95*cdf0e10cSrcweir 		while ( !bSupportsViews && xRow.is() && xRes->next() )
96*cdf0e10cSrcweir 		{
97*cdf0e10cSrcweir             ::rtl::OUString sTableType( xRow->getString( 1 ) );
98*cdf0e10cSrcweir             bSupportsViews = sTableType.equalsIgnoreAsciiCase( aTypes[0] );
99*cdf0e10cSrcweir 		}
100*cdf0e10cSrcweir 	}
101*cdf0e10cSrcweir 	catch(const SQLException&)
102*cdf0e10cSrcweir 	{
103*cdf0e10cSrcweir 	}
104*cdf0e10cSrcweir */
105*cdf0e10cSrcweir     // let's simply assume the server is new enough to support views. Current drivers
106*cdf0e10cSrcweir     // as of this writing might not return the proper information in getTableTypes, so
107*cdf0e10cSrcweir     // don't rely on it.
108*cdf0e10cSrcweir     // during #73245# / 2007-10-26 / frank.schoenheit@sun.com
109*cdf0e10cSrcweir     bool bSupportsViews = sal_True;
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir 	TStringVector aVector;
112*cdf0e10cSrcweir 	if ( bSupportsViews )
113*cdf0e10cSrcweir 		refreshObjects(aTypes,aVector);
114*cdf0e10cSrcweir 
115*cdf0e10cSrcweir 	if ( m_pViews )
116*cdf0e10cSrcweir 		m_pViews->reFill(aVector);
117*cdf0e10cSrcweir 	else
118*cdf0e10cSrcweir 		m_pViews = new OViews(m_xMetaData,*this,m_aMutex,aVector);
119*cdf0e10cSrcweir }
120*cdf0e10cSrcweir // -------------------------------------------------------------------------
121*cdf0e10cSrcweir void OMySQLCatalog::refreshGroups()
122*cdf0e10cSrcweir {
123*cdf0e10cSrcweir }
124*cdf0e10cSrcweir // -------------------------------------------------------------------------
125*cdf0e10cSrcweir void OMySQLCatalog::refreshUsers()
126*cdf0e10cSrcweir {
127*cdf0e10cSrcweir 	TStringVector aVector;
128*cdf0e10cSrcweir 	Reference< XStatement > xStmt = m_xConnection->createStatement(  );
129*cdf0e10cSrcweir 	Reference< XResultSet >  xResult = xStmt->executeQuery(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("select User from mysql.user group by User")));
130*cdf0e10cSrcweir 	if ( xResult.is() )
131*cdf0e10cSrcweir 	{
132*cdf0e10cSrcweir 		Reference< XRow > xRow(xResult,UNO_QUERY);
133*cdf0e10cSrcweir 		TString2IntMap aMap;
134*cdf0e10cSrcweir 		while( xResult->next() )
135*cdf0e10cSrcweir 			aVector.push_back(xRow->getString(1));
136*cdf0e10cSrcweir 		::comphelper::disposeComponent(xResult);
137*cdf0e10cSrcweir 	}
138*cdf0e10cSrcweir 	::comphelper::disposeComponent(xStmt);
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir 	if(m_pUsers)
141*cdf0e10cSrcweir 		m_pUsers->reFill(aVector);
142*cdf0e10cSrcweir 	else
143*cdf0e10cSrcweir 		m_pUsers = new OUsers(*this,m_aMutex,aVector,m_xConnection,this);
144*cdf0e10cSrcweir }
145*cdf0e10cSrcweir // -----------------------------------------------------------------------------
146*cdf0e10cSrcweir Any SAL_CALL OMySQLCatalog::queryInterface( const Type & rType ) throw(RuntimeException)
147*cdf0e10cSrcweir {
148*cdf0e10cSrcweir 	if ( rType == ::getCppuType((const Reference<XGroupsSupplier>*)0) )
149*cdf0e10cSrcweir 		return Any();
150*cdf0e10cSrcweir 
151*cdf0e10cSrcweir 
152*cdf0e10cSrcweir 	return OCatalog::queryInterface(rType);
153*cdf0e10cSrcweir }
154*cdf0e10cSrcweir // -----------------------------------------------------------------------------
155*cdf0e10cSrcweir Sequence< Type > SAL_CALL OMySQLCatalog::getTypes(  ) throw(RuntimeException)
156*cdf0e10cSrcweir {
157*cdf0e10cSrcweir 	Sequence< Type > aTypes = OCatalog::getTypes();
158*cdf0e10cSrcweir 	::std::vector<Type> aOwnTypes;
159*cdf0e10cSrcweir 	aOwnTypes.reserve(aTypes.getLength());
160*cdf0e10cSrcweir 	const Type* pBegin = aTypes.getConstArray();
161*cdf0e10cSrcweir 	const Type* pEnd = pBegin + aTypes.getLength();
162*cdf0e10cSrcweir 	for(;pBegin != pEnd;++pBegin)
163*cdf0e10cSrcweir 	{
164*cdf0e10cSrcweir 		if ( !(*pBegin == ::getCppuType((const Reference<XGroupsSupplier>*)0)))
165*cdf0e10cSrcweir 		{
166*cdf0e10cSrcweir 			aOwnTypes.push_back(*pBegin);
167*cdf0e10cSrcweir 		}
168*cdf0e10cSrcweir 	}
169*cdf0e10cSrcweir 	const Type* pTypes = aOwnTypes.empty() ? 0 : &aOwnTypes[0];
170*cdf0e10cSrcweir 	return Sequence< Type >(pTypes, aOwnTypes.size());
171*cdf0e10cSrcweir }
172*cdf0e10cSrcweir // -----------------------------------------------------------------------------
173*cdf0e10cSrcweir 
174*cdf0e10cSrcweir 
175