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 "adabas/BCatalog.hxx"
31 #include "adabas/BConnection.hxx"
32 #include "adabas/BGroups.hxx"
33 #include "adabas/BUsers.hxx"
34 #include "adabas/BTables.hxx"
35 #include "adabas/BViews.hxx"
36 #include <com/sun/star/sdbc/XRow.hpp>
37 #include <com/sun/star/sdbc/XResultSet.hpp>
38 #include <comphelper/types.hxx>
39 
40 
41 // -------------------------------------------------------------------------
42 using namespace connectivity;
43 using namespace connectivity::adabas;
44 using namespace ::com::sun::star::uno;
45 using namespace ::com::sun::star::beans;
46 using namespace ::com::sun::star::sdbcx;
47 using namespace ::com::sun::star::sdbc;
48 using namespace ::com::sun::star::container;
49 using namespace ::com::sun::star::lang;
50 // -----------------------------------------------------------------------------
51 OAdabasCatalog::OAdabasCatalog(SQLHANDLE _aConnectionHdl, OAdabasConnection* _pCon) : connectivity::sdbcx::OCatalog(_pCon)
52 				,m_pConnection(_pCon)
53 				,m_aConnectionHdl(_aConnectionHdl)
54 {
55 }
56 // -----------------------------------------------------------------------------
57 ::rtl::OUString OAdabasCatalog::buildName(const Reference< XRow >& _xRow)
58 {
59 	::rtl::OUString sName;
60 	sName = _xRow->getString(2);
61     if ( sName.getLength() )
62         sName += OAdabasCatalog::getDot();
63 	sName += _xRow->getString(3);
64 
65 
66 	return sName;
67 }
68 // -----------------------------------------------------------------------------
69 void OAdabasCatalog::fillVector(const ::rtl::OUString& _sQuery,TStringVector& _rVector)
70 {
71     Reference< XStatement > xStmt = m_pConnection->createStatement(  );
72     OSL_ENSURE(xStmt.is(),"OAdabasCatalog::fillVector: Could not create a statement!");
73 	Reference< XResultSet > xResult = xStmt->executeQuery(_sQuery);
74 
75 	fillNames(xResult,_rVector);
76 	::comphelper::disposeComponent(xStmt);
77 
78 }
79 // -------------------------------------------------------------------------
80 void OAdabasCatalog::refreshTables()
81 {
82 	TStringVector aVector;
83 	{
84 		Sequence< ::rtl::OUString > aTypes(1);
85 		aTypes[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%"));
86 		Reference< XResultSet > xResult = m_xMetaData->getTables(Any(),
87 																::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%")),
88 																::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("%")),
89 																aTypes);
90 		fillNames(xResult,aVector);
91 	}
92 
93 	if(m_pTables)
94 		m_pTables->reFill(aVector);
95 	else
96 		m_pTables = new OTables(m_xMetaData,*this,m_aMutex,aVector);
97 }
98 // -------------------------------------------------------------------------
99 void OAdabasCatalog::refreshViews()
100 {
101 	TStringVector aVector;
102     static const ::rtl::OUString s_sView(RTL_CONSTASCII_USTRINGPARAM("SELECT DISTINCT NULL,DOMAIN.VIEWDEFS.OWNER, DOMAIN.VIEWDEFS.VIEWNAME FROM DOMAIN.VIEWDEFS"));
103 	fillVector(s_sView,aVector);
104 
105 	if(m_pViews)
106 		m_pViews->reFill(aVector);
107 	else
108 		m_pViews = new OViews(m_xMetaData,*this,m_aMutex,aVector);
109 }
110 // -------------------------------------------------------------------------
111 void OAdabasCatalog::refreshGroups()
112 {
113 	TStringVector aVector;
114     static const ::rtl::OUString s_sGroup(RTL_CONSTASCII_USTRINGPARAM("SELECT DISTINCT NULL,NULL,GROUPNAME FROM DOMAIN.USERS WHERE GROUPNAME IS NOT NULL AND GROUPNAME <> ' '"));
115     fillVector(s_sGroup,aVector);
116 	if(m_pGroups)
117 		m_pGroups->reFill(aVector);
118 	else
119 		m_pGroups = new OGroups(*this,m_aMutex,aVector,m_pConnection,this);
120 }
121 // -------------------------------------------------------------------------
122 void OAdabasCatalog::refreshUsers()
123 {
124 	TStringVector aVector;
125     static const ::rtl::OUString s_sUsers(RTL_CONSTASCII_USTRINGPARAM("SELECT DISTINCT NULL,NULL,USERNAME FROM DOMAIN.USERS WHERE USERNAME IS NOT NULL AND USERNAME <> ' ' AND USERNAME <> 'CONTROL'"));
126     fillVector(s_sUsers,aVector);
127 
128 	if(m_pUsers)
129 		m_pUsers->reFill(aVector);
130 	else
131 		m_pUsers = new OUsers(*this,m_aMutex,aVector,m_pConnection,this);
132 }
133 // -------------------------------------------------------------------------
134 const ::rtl::OUString& OAdabasCatalog::getDot()
135 {
136 	static const ::rtl::OUString sDot(RTL_CONSTASCII_USTRINGPARAM("."));
137 	return sDot;
138 }
139 // -----------------------------------------------------------------------------
140 void OAdabasCatalog::correctColumnProperties(sal_Int32 /*_nPrec*/, sal_Int32& _rnType,::rtl::OUString& _rsTypeName)
141 {
142 	switch(_rnType)
143 	{
144 	case DataType::DECIMAL:
145 		{
146             static const ::rtl::OUString sDecimal(RTL_CONSTASCII_USTRINGPARAM("DECIMAL"));
147 			if(_rnType == DataType::DECIMAL && _rsTypeName == sDecimal)
148 				_rnType = DataType::NUMERIC;
149 		}
150 		break;
151 	case DataType::FLOAT:
152 		//	if(_nPrec >= 16)
153 		{
154 			static const ::rtl::OUString sDouble(RTL_CONSTASCII_USTRINGPARAM("DOUBLE PRECISION"));
155 			_rsTypeName = sDouble;
156 			_rnType = DataType::DOUBLE;
157 		}
158 //		else if(_nPrec > 15)
159 //		{
160 //			static const ::rtl::OUString sReal = ::rtl::OUString::createFromAscii("REAL");
161 //			_rsTypeName = sReal;
162 //			_rnType = DataType::REAL;
163 //		}
164 		break;
165 	}
166 }
167 // -----------------------------------------------------------------------------
168 
169