diff options
Diffstat (limited to 'connectivity/source/drivers/adabas/BTable.cxx')
-rw-r--r-- | connectivity/source/drivers/adabas/BTable.cxx | 590 |
1 files changed, 590 insertions, 0 deletions
diff --git a/connectivity/source/drivers/adabas/BTable.cxx b/connectivity/source/drivers/adabas/BTable.cxx new file mode 100644 index 000000000000..3452ed9b80df --- /dev/null +++ b/connectivity/source/drivers/adabas/BTable.cxx @@ -0,0 +1,590 @@ +/************************************************************************* + * + * $RCSfile: BTable.cxx,v $ + * + * $Revision: 1.1.1.1 $ + * + * last change: $Author: hr $ $Date: 2000-09-18 16:14:20 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_ADABAS_TABLE_HXX_ +#include "adabas/BTable.hxx" +#endif +#ifndef _CONNECTIVITY_ADABAS_INDEXES_HXX_ +#include "adabas/BIndexes.hxx" +#endif +#ifndef _CONNECTIVITY_ADABAS_COLUMNS_HXX_ +#include "adabas/BColumns.hxx" +#endif +#ifndef _CONNECTIVITY_ADABAS_KEYS_HXX_ +#include "adabas/BKeys.hxx" +#endif +#ifndef _COM_SUN_STAR_SDBC_XROW_HPP_ +#include <com/sun/star/sdbc/XRow.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBC_XRESULTSET_HPP_ +#include <com/sun/star/sdbc/XResultSet.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBCX_KEYTYPE_HPP_ +#include <com/sun/star/sdbcx/KeyType.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBC_KEYRULE_HPP_ +#include <com/sun/star/sdbc/KeyRule.hpp> +#endif +#ifndef _CPPUHELPER_TYPEPROVIDER_HXX_ +#include <cppuhelper/typeprovider.hxx> +#endif +#ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_ +#include <com/sun/star/lang/DisposedException.hpp> +#endif +#ifndef _COM_SUN_STAR_SDBC_COLUMNVALUE_HPP_ +#include <com/sun/star/sdbc/ColumnValue.hpp> +#endif +#ifndef _UTL_SEQUENCE_HXX_ +#include <unotools/sequence.hxx> +#endif +#ifndef _CONNECTIVITY_PROPERTYIDS_HXX_ +#include "propertyids.hxx" +#endif +using namespace connectivity::adabas; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sdbcx; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::lang; + +OAdabasTable::OAdabasTable(OAdabasConnection* _pConnection) : OTable_TYPEDEF(sal_True) + ,m_pConnection(_pConnection) +{ + construct(); + ::std::vector< ::rtl::OUString> aVector; + m_pColumns = new OColumns(this,m_aMutex,aVector); + m_pKeys = new OKeys(this,m_aMutex,aVector); + m_pIndexes = new OIndexes(this,m_aMutex,aVector); +} +// ------------------------------------------------------------------------- +OAdabasTable::OAdabasTable( OAdabasConnection* _pConnection, + const ::rtl::OUString& _Name, + const ::rtl::OUString& _Type, + const ::rtl::OUString& _Description , + const ::rtl::OUString& _SchemaName, + const ::rtl::OUString& _CatalogName + ) : OTable_TYPEDEF(sal_True,_Name, + _Type, + _Description, + _SchemaName, + _CatalogName) + ,m_pConnection(_pConnection) +{ + construct(); + refreshColumns(); + refreshKeys(); + refreshIndexes(); +} +// ------------------------------------------------------------------------- +void OAdabasTable::refreshColumns() +{ + ::std::vector< ::rtl::OUString> aVector; + Reference< XResultSet > xResult = m_pConnection->getMetaData()->getColumns(Any(), + m_SchemaName,m_Name,::rtl::OUString::createFromAscii("%")); + + if(xResult.is()) + { + Reference< XRow > xRow(xResult,UNO_QUERY); + while(xResult->next()) + aVector.push_back(xRow->getString(4)); + } + + if(m_pColumns) + delete m_pColumns; + m_pColumns = new OColumns(this,m_aMutex,aVector); +} +// ------------------------------------------------------------------------- +void OAdabasTable::refreshPrimaryKeys(std::vector< ::rtl::OUString>& _rKeys) +{ + Reference< XResultSet > xResult = m_pConnection->getMetaData()->getPrimaryKeys(Any(),m_SchemaName,m_Name); + + if(xResult.is()) + { + Reference< XRow > xRow(xResult,UNO_QUERY); + if(xResult->next()) // there can be only one primary key + { + ::rtl::OUString aPkName = xRow->getString(6); + _rKeys.push_back(aPkName); + } + } +} +// ------------------------------------------------------------------------- +void OAdabasTable::refreshForgeinKeys(std::vector< ::rtl::OUString>& _rKeys) +{ + Reference< XResultSet > xResult = m_pConnection->getMetaData()->getExportedKeys(Any(),m_SchemaName,m_Name); + + if(xResult.is()) + { + Reference< XRow > xRow(xResult,UNO_QUERY); + while(xResult->next()) + _rKeys.push_back(xRow->getString(12)); + } +} +// ------------------------------------------------------------------------- +void OAdabasTable::refreshKeys() +{ + ::std::vector< ::rtl::OUString> aVector; + + refreshPrimaryKeys(aVector); + refreshForgeinKeys(aVector); + if(m_pKeys) + delete m_pKeys; + m_pKeys = new OKeys(this,m_aMutex,aVector); +} +// ------------------------------------------------------------------------- +void OAdabasTable::refreshIndexes() +{ + ::std::vector< ::rtl::OUString> aVector; + // fill indexes + Reference< XResultSet > xResult = m_pConnection->getMetaData()->getIndexInfo(Any(), + m_SchemaName,m_Name,sal_False,sal_False); + + if(xResult.is()) + { + Reference< XRow > xRow(xResult,UNO_QUERY); + ::rtl::OUString aName,aDot = ::rtl::OUString::createFromAscii("."); + while(xResult->next()) + { + aName = xRow->getString(5); + if(aName.getLength()) + aName += aDot; + aName += xRow->getString(6); + if(aName.getLength()) + aVector.push_back(aName); + } + } + + if(m_pIndexes) + delete m_pIndexes; + m_pIndexes = new OIndexes(this,m_aMutex,aVector); +} +// ------------------------------------------------------------------------- +Any SAL_CALL OAdabasTable::queryInterface( const Type & rType ) throw(RuntimeException) +{ + Any aRet = ::cppu::queryInterface(rType,static_cast< ::com::sun::star::lang::XUnoTunnel*> (this)); + if(aRet.hasValue()) + return aRet; + return OTable_TYPEDEF::queryInterface(rType); +} + +//-------------------------------------------------------------------------- +Sequence< sal_Int8 > OAdabasTable::getUnoTunnelImplementationId() +{ + static ::cppu::OImplementationId * pId = 0; + if (! pId) + { + ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); + if (! pId) + { + static ::cppu::OImplementationId aId; + pId = &aId; + } + } + return pId->getImplementationId(); +} + +// com::sun::star::lang::XUnoTunnel +//------------------------------------------------------------------ +sal_Int64 OAdabasTable::getSomething( const Sequence< sal_Int8 > & rId ) throw (RuntimeException) +{ + if (rId.getLength() == 16 && 0 == rtl_compareMemory(getUnoTunnelImplementationId().getConstArray(), rId.getConstArray(), 16 ) ) + return (sal_Int64)this; + + return 0; +} +// ------------------------------------------------------------------------- +sal_Bool OAdabasTable::create() throw(SQLException, RuntimeException) +{ + ::rtl::OUString aSql = ::rtl::OUString::createFromAscii("CREATE TABLE "); + ::rtl::OUString aQuote = m_pConnection->getMetaData()->getIdentifierQuoteString( ); + ::rtl::OUString aDot = ::rtl::OUString::createFromAscii("."); + ::rtl::OUString aComma = ::rtl::OUString::createFromAscii(", "); + + aSql += aQuote + m_SchemaName + aQuote + aDot + aQuote + m_Name + aQuote; + aSql += ::rtl::OUString::createFromAscii(" ( "); + + sal_Int32 nCount = m_pColumns->getCount(); + Reference< XPropertySet > xProp; + for(sal_Int32 i=0;i<nCount;++i) + { + m_pColumns->getByIndex(i) >>= xProp; + aSql += aQuote + getString(xProp->getPropertyValue(PROPERTY_NAME)) + aQuote + + getString(xProp->getPropertyValue(PROPERTY_TYPENAME)); + + // add type definition + switch(getINT32(xProp->getPropertyValue(PROPERTY_TYPE))) + { + case DataType::CHAR: + case DataType::VARCHAR: + aSql += ::rtl::OUString::createFromAscii("(") + + ::rtl::OUString::valueOf(getINT32(xProp->getPropertyValue(PROPERTY_TYPE))) + + ::rtl::OUString::createFromAscii(")"); + break; + + case DataType::DECIMAL: + case DataType::NUMERIC: + aSql += ::rtl::OUString::createFromAscii("(") + + ::rtl::OUString::valueOf(getINT32(xProp->getPropertyValue(PROPERTY_TYPE))) + + ::rtl::OUString::createFromAscii(",") + + ::rtl::OUString::valueOf(getINT32(xProp->getPropertyValue(PROPERTY_SCALE))) + + ::rtl::OUString::createFromAscii(")"); + break; + } + + ::rtl::OUString aDefault = getString(xProp->getPropertyValue(PROPERTY_DEFAULTVALUE)); + if(getINT32(xProp->getPropertyValue(PROPERTY_ISNULLABLE)) == ColumnValue::NO_NULLS) + { + aSql += ::rtl::OUString::createFromAscii(" NOT NULL"); + if(aDefault.getLength()) + aSql += ::rtl::OUString::createFromAscii(" WITH DEFAULT"); + } + else if(aDefault.getLength()) + aSql += ::rtl::OUString::createFromAscii(" DEFAULT ") + aDefault; + + aSql += aComma; + } + + // create the key columns ( only the string ) + nCount = m_pKeys->getCount(); + + for(i=0;i<nCount;++i) + { + m_pKeys->getByIndex(i) >>= xProp; + Reference< XColumnsSupplier > xKey(xProp,UNO_QUERY); + Reference< ::com::sun::star::container::XIndexAccess > xCols(xKey->getColumns(),UNO_QUERY); + switch(getINT32(xProp->getPropertyValue(PROPERTY_TYPE))) + { + case KeyType::PRIMARY: + { + sal_Int32 nCols = xCols->getCount(); + if(nCols) + aSql += ::rtl::OUString::createFromAscii(" PRIMARY KEY( "); + for(sal_Int32 i=0;i<nCols;++i) + { + xCols->getByIndex(i) >>= xProp; + aSql += aQuote + getString(xProp->getPropertyValue(PROPERTY_NAME)) + aQuote; + aSql += aComma; + } + if(nCols) + aSql = aSql.replaceAt(aSql.getLength()-1,1,::rtl::OUString::createFromAscii(")")); + } + case KeyType::UNIQUE: + { + sal_Int32 nCols = xCols->getCount(); + if(nCols) + aSql += ::rtl::OUString::createFromAscii(" UNIQUE( "); + for(sal_Int32 i=0;i<nCols;++i) + { + xCols->getByIndex(i) >>= xProp; + aSql += aQuote + getString(xProp->getPropertyValue(PROPERTY_NAME)) + aQuote; + aSql += aComma; + } + if(nCols) + aSql = aSql.replaceAt(aSql.getLength()-1,1,::rtl::OUString::createFromAscii(")")); + } + case KeyType::FOREIGN: + { + sal_Int32 nCols = xCols->getCount(); + if(nCols) + { + aSql += ::rtl::OUString::createFromAscii(" FOREIGN KEY( "); + ::rtl::OUString aKeyName = getString(xProp->getPropertyValue(PROPERTY_NAME)); + ::rtl::OUString aRefTableName = getString(xProp->getPropertyValue(PROPERTY_REFERENCEDTABLE)); + sal_Int32 nDeleteRule = getINT32(xProp->getPropertyValue(PROPERTY_DELETERULE)); + if(aKeyName.getLength()) + { + aSql += aQuote + aKeyName + aQuote; + aSql += ::rtl::OUString::createFromAscii(" "); + } + + for(sal_Int32 i=0;i<nCols;++i) + { + xCols->getByIndex(i) >>= xProp; + aSql += aQuote + getString(xProp->getPropertyValue(PROPERTY_NAME)) + aQuote; + aSql += aComma; + } + aSql = aSql.replaceAt(aSql.getLength()-1,1,::rtl::OUString::createFromAscii(")")); + aSql += ::rtl::OUString::createFromAscii(" REFERENCES ") + + aQuote + aRefTableName + aQuote; + switch(nDeleteRule) + { + case KeyRule::CASCADE: + aSql += ::rtl::OUString::createFromAscii(" ON DELETE CASCADE "); + break; + case KeyRule::RESTRICT: + aSql += ::rtl::OUString::createFromAscii(" ON DELETE RESTRICT "); + break; + case KeyRule::SET_NULL: + aSql += ::rtl::OUString::createFromAscii(" ON DELETE SET NULL "); + break; + case KeyRule::NO_ACTION: + break; + case KeyRule::SET_DEFAULT: + aSql += ::rtl::OUString::createFromAscii(" ON DELETE SET DEFAULT "); + break; + } + } + + } + } + } + Reference< XStatement > xStmt = m_pConnection->createStatement( ); + xStmt->execute(aSql); + return sal_True; +} +// ------------------------------------------------------------------------- +// XRename +void SAL_CALL OAdabasTable::rename( const ::rtl::OUString& newName ) throw(SQLException, ElementExistException, RuntimeException) +{ + ::osl::MutexGuard aGuard(m_aMutex); + if ( +#ifdef GCC + sdbcx::OTable_BASE::rBHelper.bDisposed +#else + rBHelper.bDisposed +#endif + ) + throw DisposedException(); + + if(!isNew()) + { + ::rtl::OUString aSql = ::rtl::OUString::createFromAscii("RENAME TABLE "); + ::rtl::OUString aQuote = m_pConnection->getMetaData()->getIdentifierQuoteString( ); + ::rtl::OUString aDot = ::rtl::OUString::createFromAscii("."); + + ::rtl::OUString aName,aSchema; + sal_Int32 nLen = newName.indexOf('.'); + aSchema = newName.copy(0,nLen); + aName = newName.copy(nLen+1); + + aSql += aQuote + m_SchemaName + aQuote + aDot + aQuote + m_Name + aQuote + + ::rtl::OUString::createFromAscii(" TO ") + + aQuote + aSchema + aQuote + aDot + aQuote + aName + aQuote; + + Reference< XStatement > xStmt = m_pConnection->createStatement( ); + xStmt->execute(aSql); + } + else + m_Name = newName; +} +// ------------------------------------------------------------------------- +// XAlterTable +void SAL_CALL OAdabasTable::alterColumnByName( const ::rtl::OUString& colName, const Reference< XPropertySet >& descriptor ) throw(SQLException, NoSuchElementException, RuntimeException) +{ + ::osl::MutexGuard aGuard(m_aMutex); + if ( +#ifdef GCC + sdbcx::OTable_BASE::rBHelper.bDisposed +#else + rBHelper.bDisposed +#endif + ) + throw DisposedException(); + + if(!isNew()) + { + ::rtl::OUString aSql = ::rtl::OUString::createFromAscii("ALTER TABLE "); + ::rtl::OUString aQuote = m_pConnection->getMetaData()->getIdentifierQuoteString( ); + ::rtl::OUString aDot = ::rtl::OUString::createFromAscii("."); + + aSql += aQuote + m_SchemaName + aQuote + aDot + aQuote + m_Name + aQuote + + ::rtl::OUString::createFromAscii(" COLUMN ") + + aQuote + colName + aQuote + + ::rtl::OUString::createFromAscii(" ALTER "); + + aSql += aQuote + getString(descriptor->getPropertyValue(PROPERTY_NAME)) + aQuote + + getString(descriptor->getPropertyValue(PROPERTY_TYPENAME)); + + switch(getINT32(descriptor->getPropertyValue(PROPERTY_TYPE))) + { + case DataType::CHAR: + case DataType::VARCHAR: + aSql += ::rtl::OUString::createFromAscii("(") + + ::rtl::OUString::valueOf(getINT32(descriptor->getPropertyValue(PROPERTY_TYPE))) + + ::rtl::OUString::createFromAscii(")"); + break; + + case DataType::DECIMAL: + case DataType::NUMERIC: + aSql += ::rtl::OUString::createFromAscii("(") + + ::rtl::OUString::valueOf(getINT32(descriptor->getPropertyValue(PROPERTY_TYPE))) + + ::rtl::OUString::createFromAscii(",") + + ::rtl::OUString::valueOf(getINT32(descriptor->getPropertyValue(PROPERTY_SCALE))) + + ::rtl::OUString::createFromAscii(")"); + break; + } + ::rtl::OUString aDefault = getString(descriptor->getPropertyValue(PROPERTY_DEFAULTVALUE)); + if(getINT32(descriptor->getPropertyValue(PROPERTY_ISNULLABLE)) == ColumnValue::NO_NULLS) + { + aSql += ::rtl::OUString::createFromAscii(" NOT NULL"); + if(aDefault.getLength()) + aSql += ::rtl::OUString::createFromAscii(" WITH DEFAULT"); + } + else if(aDefault.getLength()) + aSql += ::rtl::OUString::createFromAscii(" DEFAULT ") + aDefault; + + Reference< XStatement > xStmt = m_pConnection->createStatement( ); + xStmt->execute(aSql); + + refreshColumns(); + } + else + { + if(m_pColumns) + { + m_pColumns->dropByName(colName); + m_pColumns->appendByDescriptor(descriptor); + } + } + +} +// ------------------------------------------------------------------------- +void SAL_CALL OAdabasTable::alterColumnByIndex( sal_Int32 index, const Reference< XPropertySet >& descriptor ) throw(SQLException, ::com::sun::star::lang::IndexOutOfBoundsException, RuntimeException) +{ + ::osl::MutexGuard aGuard(m_aMutex); + if ( +#ifdef GCC + sdbcx::OTable_BASE::rBHelper.bDisposed +#else + rBHelper.bDisposed +#endif + ) + throw DisposedException(); + + Reference< XPropertySet > xOld; + if(m_pColumns->getByIndex(index) >>= xOld) + alterColumnByName(getString(xOld->getPropertyValue(PROPERTY_NAME)),descriptor); +} + +// ------------------------------------------------------------------------- +::rtl::OUString connectivity::adabas::getTypeString(const Reference< ::com::sun::star::beans::XPropertySet >& xColProp) +{ + ::rtl::OUString aValue; + switch(getINT32(xColProp->getPropertyValue(PROPERTY_TYPE))) + { + case DataType::BIT: + aValue = ::rtl::OUString::createFromAscii("BOOLEAN"); + break; + case DataType::TINYINT: + aValue = ::rtl::OUString::createFromAscii("SMALLINT"); + break; + case DataType::SMALLINT: + aValue = ::rtl::OUString::createFromAscii("SMALLINT"); + break; + case DataType::INTEGER: + aValue = ::rtl::OUString::createFromAscii("INT"); + break; + case DataType::FLOAT: + aValue = ::rtl::OUString::createFromAscii("FLOAT"); + break; + case DataType::REAL: + aValue = ::rtl::OUString::createFromAscii("REAL"); + break; + case DataType::DOUBLE: + aValue = ::rtl::OUString::createFromAscii("DOUBLE"); + break; + case DataType::NUMERIC: + aValue = ::rtl::OUString::createFromAscii("DECIMAL"); + break; + case DataType::DECIMAL: + aValue = ::rtl::OUString::createFromAscii("DECIMAL"); + break; + case DataType::CHAR: + aValue = ::rtl::OUString::createFromAscii("CHAR"); + break; + case DataType::VARCHAR: + aValue = ::rtl::OUString::createFromAscii("VARCHAR"); + break; + case DataType::LONGVARCHAR: + aValue = ::rtl::OUString::createFromAscii("LONG VARCHAR"); + break; + case DataType::DATE: + aValue = ::rtl::OUString::createFromAscii("DATE"); + break; + case DataType::TIME: + aValue = ::rtl::OUString::createFromAscii("TIME"); + break; + case DataType::TIMESTAMP: + aValue = ::rtl::OUString::createFromAscii("TIMESTAMP"); + break; + case DataType::BINARY: + aValue = ::rtl::OUString::createFromAscii("BOOLEAN"); + break; + case DataType::VARBINARY: + aValue = ::rtl::OUString::createFromAscii("VARCHAR BYTE"); + break; + case DataType::LONGVARBINARY: + aValue = ::rtl::OUString::createFromAscii("LONG BYTE"); + break; + } + return aValue; +} +// ------------------------------------------------------------------------- +::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL OAdabasTable::getTypes( ) throw(::com::sun::star::uno::RuntimeException) +{ + ::cppu::OTypeCollection aTypes( ::getCppuType( (const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XUnoTunnel > *)0 )); + + return ::utl::concatSequences(aTypes.getTypes(),OTable_TYPEDEF::getTypes()); +} + + + |