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 "ado/AIndex.hxx"
27 #include <com/sun/star/sdbc/XRow.hpp>
28 #include <com/sun/star/sdbc/XResultSet.hpp>
29 #include <cppuhelper/typeprovider.hxx>
30 #include <comphelper/sequence.hxx>
31 #include "ado/AColumns.hxx"
32 #include <comphelper/extract.hxx>
33 #include "TConnection.hxx"
34 #include <comphelper/types.hxx>
35 
36 using namespace ::comphelper;
37 
38 using namespace connectivity::ado;
39 using namespace com::sun::star::uno;
40 using namespace com::sun::star::lang;
41 using namespace com::sun::star::beans;
42 using namespace com::sun::star::sdbc;
43 
44 // -------------------------------------------------------------------------
OAdoIndex(sal_Bool _bCase,OConnection * _pConnection,ADOIndex * _pIndex)45 OAdoIndex::OAdoIndex(sal_Bool _bCase,OConnection* _pConnection,ADOIndex* _pIndex)
46 	: OIndex_ADO(::rtl::OUString(),::rtl::OUString(),sal_False,sal_False,sal_False,_bCase)
47 	,m_pConnection(_pConnection)
48 {
49 	construct();
50 	m_aIndex = WpADOIndex(_pIndex);
51 	fillPropertyValues();
52 }
53 // -------------------------------------------------------------------------
OAdoIndex(sal_Bool _bCase,OConnection * _pConnection)54 OAdoIndex::OAdoIndex(sal_Bool _bCase,OConnection* _pConnection)
55 	: OIndex_ADO(_bCase)
56 	,m_pConnection(_pConnection)
57 {
58 	construct();
59 	m_aIndex.Create();
60 }
61 
62 // -------------------------------------------------------------------------
63 
refreshColumns()64 void OAdoIndex::refreshColumns()
65 {
66 	TStringVector aVector;
67 
68 	WpADOColumns aColumns;
69 	if ( m_aIndex.IsValid() )
70 	{
71 		aColumns = m_aIndex.get_Columns();
72 		aColumns.fillElementNames(aVector);
73 	}
74 
75 	if ( m_pColumns )
76 		m_pColumns->reFill(aVector);
77 	else
78 		m_pColumns = new OColumns(*this,m_aMutex,aVector,aColumns,isCaseSensitive(),m_pConnection);
79 }
80 
81 // -------------------------------------------------------------------------
getUnoTunnelImplementationId()82 Sequence< sal_Int8 > OAdoIndex::getUnoTunnelImplementationId()
83 {
84 	static ::cppu::OImplementationId * pId = 0;
85 	if (! pId)
86 	{
87 		::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
88 		if (! pId)
89 		{
90 			static ::cppu::OImplementationId aId;
91 			pId = &aId;
92 		}
93 	}
94 	return pId->getImplementationId();
95 }
96 
97 // com::sun::star::lang::XUnoTunnel
98 //------------------------------------------------------------------
getSomething(const Sequence<sal_Int8> & rId)99 sal_Int64 OAdoIndex::getSomething( const Sequence< sal_Int8 > & rId ) throw (RuntimeException)
100 {
101 	return (rId.getLength() == 16 && 0 == rtl_compareMemory(getUnoTunnelImplementationId().getConstArray(),  rId.getConstArray(), 16 ) )
102 				? reinterpret_cast< sal_Int64 >( this )
103 				: OIndex_ADO::getSomething(rId);
104 }
105 // -------------------------------------------------------------------------
setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any & rValue)106 void SAL_CALL OAdoIndex::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& rValue)throw (Exception)
107 {
108 	if(m_aIndex.IsValid())
109 	{
110 		switch(nHandle)
111 		{
112 			case PROPERTY_ID_NAME:
113 				{
114 					::rtl::OUString aVal;
115 					rValue >>= aVal;
116 					m_aIndex.put_Name(aVal);
117 				}
118 				break;
119 			case PROPERTY_ID_CATALOG:
120 				{
121 					::rtl::OUString aVal;
122 					rValue >>= aVal;
123 					m_aIndex.put_Name(aVal);
124 				}
125 				break;
126 			case PROPERTY_ID_ISUNIQUE:
127 				m_aIndex.put_Unique(getBOOL(rValue));
128 				break;
129 			case PROPERTY_ID_ISPRIMARYKEYINDEX:
130 				m_aIndex.put_PrimaryKey(getBOOL(rValue));
131 				break;
132 			case PROPERTY_ID_ISCLUSTERED:
133 				m_aIndex.put_Clustered(getBOOL(rValue));
134 				break;
135 		}
136 	}
137 	OIndex_ADO::setFastPropertyValue_NoBroadcast(nHandle,rValue);
138 }
139 // -----------------------------------------------------------------------------
acquire()140 void SAL_CALL OAdoIndex::acquire() throw()
141 {
142 	OIndex_ADO::acquire();
143 }
144 // -----------------------------------------------------------------------------
release()145 void SAL_CALL OAdoIndex::release() throw()
146 {
147 	OIndex_ADO::release();
148 }
149 // -----------------------------------------------------------------------------
150 
151 
152 
153 
154