xref: /trunk/main/connectivity/source/commontools/TKeyColumns.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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 "connectivity/TKeyColumns.hxx"
31 #include "connectivity/sdbcx/VKeyColumn.hxx"
32 #include <com/sun/star/sdbc/XRow.hpp>
33 #include <com/sun/star/sdbc/XResultSet.hpp>
34 #include <com/sun/star/sdbc/DataType.hpp>
35 #include <com/sun/star/sdbc/ColumnValue.hpp>
36 #include <comphelper/extract.hxx>
37 #include <comphelper/property.hxx>
38 #include "TConnection.hxx"
39 #include "connectivity/TTableHelper.hxx"
40 
41 using namespace connectivity;
42 using namespace connectivity::sdbcx;
43 using namespace ::com::sun::star::uno;
44 using namespace ::com::sun::star::beans;
45 //  using namespace ::com::sun::star::sdbcx;
46 using namespace ::com::sun::star::sdbc;
47 using namespace ::com::sun::star::container;
48 using namespace ::com::sun::star::lang;
49 
50 // -------------------------------------------------------------------------
51 OKeyColumnsHelper::OKeyColumnsHelper(   OTableKeyHelper* _pKey,
52                 ::osl::Mutex& _rMutex,
53                 const ::std::vector< ::rtl::OUString> &_rVector)
54             : connectivity::sdbcx::OCollection(*_pKey,sal_True,_rMutex,_rVector)
55             ,m_pKey(_pKey)
56 {
57 }
58 // -------------------------------------------------------------------------
59 sdbcx::ObjectType OKeyColumnsHelper::createObject(const ::rtl::OUString& _rName)
60 {
61     ::dbtools::OPropertyMap& rPropMap = OMetaConnection::getPropMap();
62     ::rtl::OUString aSchema,aTable;
63     m_pKey->getTable()->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_SCHEMANAME))   >>= aSchema;
64     m_pKey->getTable()->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_NAME))         >>= aTable;
65 
66     // frist get the related column to _rName
67     Reference< XResultSet > xResult = m_pKey->getTable()->getMetaData()->getImportedKeys(
68             m_pKey->getTable()->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_CATALOGNAME)),aSchema,aTable);
69 
70     ::rtl::OUString aRefColumnName;
71     if ( xResult.is() )
72     {
73         Reference< XRow > xRow(xResult,UNO_QUERY);
74         ::rtl::OUString aTemp;
75         while(xResult->next())
76         {
77             aTemp = xRow->getString(4);
78             if(xRow->getString(8) == _rName && m_pKey->getName() == xRow->getString(12))
79             {
80                 aRefColumnName = aTemp;
81                 break;
82             }
83         }
84     }
85 
86     sdbcx::ObjectType xRet;
87 
88     // now describe the column _rName and set his related column
89     xResult = m_pKey->getTable()->getMetaData()->getColumns(
90                 m_pKey->getTable()->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_CATALOGNAME)),aSchema,aTable,_rName);
91 
92     if ( xResult.is() )
93     {
94         Reference< XRow > xRow(xResult,UNO_QUERY);
95         if ( xResult->next() )
96         {
97             if ( xRow->getString(4) == _rName )
98             {
99                 sal_Int32 nDataType = xRow->getInt(5);
100                 ::rtl::OUString aTypeName(xRow->getString(6));
101                 sal_Int32 nSize = xRow->getInt(7);
102                 sal_Int32 nDec  = xRow->getInt(9);
103                 sal_Int32 nNull = xRow->getInt(11);
104                 ::rtl::OUString sColumnDef;
105                 try
106                 {
107                     sColumnDef = xRow->getString(13);
108                 }
109                 catch(const SQLException&)
110                 {
111                     // somethimes we get an error when asking for this param
112                 }
113 
114                 OKeyColumn* pRet = new OKeyColumn(aRefColumnName,
115                                                     _rName,
116                                                     aTypeName,
117                                                     sColumnDef,
118                                                     nNull,
119                                                     nSize,
120                                                     nDec,
121                                                     nDataType,
122                                                     sal_False,
123                                                     sal_False,
124                                                     sal_False,
125                                                     isCaseSensitive());
126                 xRet = pRet;
127             }
128         }
129     }
130 
131     return xRet;
132 }
133 // -------------------------------------------------------------------------
134 Reference< XPropertySet > OKeyColumnsHelper::createDescriptor()
135 {
136     return new OKeyColumn(isCaseSensitive());
137 }
138 // -------------------------------------------------------------------------
139 void OKeyColumnsHelper::impl_refresh() throw(::com::sun::star::uno::RuntimeException)
140 {
141     m_pKey->refreshColumns();
142 }
143 // -----------------------------------------------------------------------------
144 
145 
146