diff options
Diffstat (limited to 'connectivity/source/drivers/evoab/LTable.cxx')
-rw-r--r-- | connectivity/source/drivers/evoab/LTable.cxx | 867 |
1 files changed, 0 insertions, 867 deletions
diff --git a/connectivity/source/drivers/evoab/LTable.cxx b/connectivity/source/drivers/evoab/LTable.cxx deleted file mode 100644 index a8cd887bc26b..000000000000 --- a/connectivity/source/drivers/evoab/LTable.cxx +++ /dev/null @@ -1,867 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org 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 version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_connectivity.hxx" - -#include <ctype.h> -#include "LTable.hxx" -#include <com/sun/star/sdbc/ColumnValue.hpp> -#include <com/sun/star/sdbc/DataType.hpp> -#include <com/sun/star/ucb/XContentAccess.hpp> -#include <svl/converter.hxx> -#include "LConnection.hxx" -#include "LColumns.hxx" -#include <osl/thread.h> -#include <tools/config.hxx> -#include <comphelper/sequence.hxx> -#include <svl/zforlist.hxx> -#include <rtl/math.hxx> -#include <stdio.h> //sprintf -#include <comphelper/extract.hxx> -#include <comphelper/numbers.hxx> -#include "LDriver.hxx" -#include <com/sun/star/util/NumberFormat.hpp> -#include <unotools/configmgr.hxx> -#include <i18npool/mslangid.hxx> -#include "connectivity/dbconversion.hxx" -#include <comphelper/types.hxx> -#include <unotools/syslocale.hxx> -#include "LDebug.hxx" -#include <map> - -using namespace ::comphelper; -using namespace connectivity; -using namespace connectivity::evoab; -using namespace connectivity::file; -using namespace ::cppu; -using namespace utl; -using namespace ::com::sun::star::uno; -using namespace ::com::sun::star::ucb; -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; - -// ------------------------------------------------------------------------- -void OEvoabTable::fillColumns(const ::com::sun::star::lang::Locale& _aLocale) -{ - sal_Bool bRead = sal_True; - - QuotedTokenizedString aHeaderLine; - OEvoabConnection* pConnection = (OEvoabConnection*)m_pConnection; - if (pConnection->isHeaderLine()) - { - while(bRead && !aHeaderLine.Len()) - { - bRead = m_pFileStream->ReadByteStringLine(aHeaderLine,pConnection->getTextEncoding()); - } - } - - // read first row - QuotedTokenizedString aFirstLine; - bRead = m_pFileStream->ReadByteStringLine(aFirstLine,pConnection->getTextEncoding()); - - if (!pConnection->isHeaderLine() || !aHeaderLine.Len()) - { - while(bRead && !aFirstLine.Len()) - { - bRead = m_pFileStream->ReadByteStringLine(aFirstLine,pConnection->getTextEncoding()); - } - // use first row as headerline because we need the number of columns - aHeaderLine = aFirstLine; - } - // column count - xub_StrLen nFieldCount = aHeaderLine.GetTokenCount(pConnection->getFieldDelimiter(),pConnection->getStringDelimiter()); - - if(!m_aColumns.is()) - m_aColumns = new OSQLColumns(); - else - m_aColumns->get().clear(); - - m_aTypes.clear(); - m_aPrecisions.clear(); - m_aScales.clear(); - // reserve some space - m_aColumnRawNames.reserve(nFieldCount); - m_aColumns->get().reserve(nFieldCount); - m_aTypes.reserve(nFieldCount); - m_aPrecisions.reserve(nFieldCount); - m_aScales.reserve(nFieldCount); - - sal_Bool bCase = getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(); - CharClass aCharClass(pConnection->getDriver()->getFactory(),_aLocale); - // read description - sal_Unicode cDecimalDelimiter = pConnection->getDecimalDelimiter(); - sal_Unicode cThousandDelimiter = pConnection->getThousandDelimiter(); - String aColumnName; - ::rtl::OUString aTypeName; - ::comphelper::UStringMixEqual aCase(bCase); - xub_StrLen nStartPosHeaderLine = 0; // use for eficient way to get the tokens - xub_StrLen nStartPosFirstLine = 0; // use for eficient way to get the tokens - xub_StrLen nStartPosFirstLine2 = 0; - for (xub_StrLen i = 0; i < nFieldCount; i++) - { - if (pConnection->isHeaderLine()) - { - aHeaderLine.GetTokenSpecial(aColumnName,nStartPosHeaderLine,pConnection->getFieldDelimiter(),pConnection->getStringDelimiter()); - } - else - { - // no column name so ... - aColumnName = 'C'; - aColumnName += String::CreateFromInt32(i+1); - } - //OSL_TRACE("OEvoabTable::aColumnName = %s\n", ((OUtoCStr(::rtl::OUString(aColumnName))) ? (OUtoCStr(::rtl::OUString(aColumnName))):("NULL")) ); - - sal_Int32 eType; - sal_uInt16 nPrecision = 0; - sal_uInt16 nScale = 0; - - sal_Bool bNumeric = sal_False; - sal_uIntPtr nIndex = 0; - - // first without fielddelimiter - String aField; - aFirstLine.GetTokenSpecial(aField,nStartPosFirstLine,pConnection->getFieldDelimiter(),'\0'); - //OSL_TRACE("OEvoabTable::aField = %s\n", ((OUtoCStr(::rtl::OUString(aField))) ? (OUtoCStr(::rtl::OUString(aField))):("NULL")) ); - - if (aField.Len() == 0 || - (pConnection->getStringDelimiter() && pConnection->getStringDelimiter() == aField.GetChar(0))) - { - bNumeric = sal_False; - } - else - { - String aField2; - if ( pConnection->getStringDelimiter() != '\0' ) - aFirstLine.GetTokenSpecial(aField2,nStartPosFirstLine2,pConnection->getFieldDelimiter(),pConnection->getStringDelimiter()); - else - aField2 = aField; - - //OSL_TRACE("OEvoabTable::aField2 = %s\n", ((OUtoCStr(::rtl::OUString(aField2))) ? (OUtoCStr(::rtl::OUString(aField2))):("NULL")) ); - - if (aField2.Len() == 0) - { - bNumeric = sal_False; - } - else - { - bNumeric = sal_True; - xub_StrLen nDot = 0; - for (xub_StrLen j = 0; j < aField2.Len(); j++) - { - sal_Unicode c = aField2.GetChar(j); - // only digits, decimalpoint and thousands-delimiter - if ((!cDecimalDelimiter || c != cDecimalDelimiter) && - (!cThousandDelimiter || c != cThousandDelimiter) && - !aCharClass.isDigit(aField2,j)) - { - bNumeric = sal_False; - break; - } - if (cDecimalDelimiter && c == cDecimalDelimiter) - { - nPrecision = 15; // we have an decimal value - nScale = 2; - nDot++; - } - } - - if (nDot > 1) // if there is more than one dot it isn't a number - bNumeric = sal_False; - if (bNumeric && cThousandDelimiter) - { - // is the delimiter given correctly - String aValue = aField2.GetToken(0,cDecimalDelimiter); - for (sal_Int32 j = aValue.Len() - 4; j >= 0; j -= 4) - { - sal_Unicode c = aValue.GetChar(j); - // only digits, decimalpoint and thousands-delimiter? - if (c == cThousandDelimiter && j) - continue; - else - { - bNumeric = sal_False; - break; - } - } - } - - // Now it might still be a Date-field - if (!bNumeric) - { - try - { - nIndex = m_xNumberFormatter->detectNumberFormat(::com::sun::star::util::NumberFormat::ALL,aField2); - } - catch(Exception&) - { - } - } - } - } - - sal_Int32 nFlags = 0; - if (bNumeric) - { - if (cDecimalDelimiter) - { - if(nPrecision) - { - eType = DataType::DECIMAL; - aTypeName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DECIMAL")); - } - else - { - eType = DataType::DOUBLE; - aTypeName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DOUBLE")); - } - } - else - eType = DataType::INTEGER; - nFlags = ColumnSearch::BASIC; - } - else - { - - switch (comphelper::getNumberFormatType(m_xNumberFormatter,nIndex)) - { - case NUMBERFORMAT_DATE: - eType = DataType::DATE; - aTypeName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DATE")); - break; - case NUMBERFORMAT_DATETIME: - eType = DataType::TIMESTAMP; - aTypeName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TIMESTAMP")); - break; - case NUMBERFORMAT_TIME: - eType = DataType::TIME; - aTypeName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TIME")); - break; - default: - eType = DataType::VARCHAR; - nPrecision = 0; // nyi: Data can be longer - nScale = 0; - aTypeName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VARCHAR")); - }; - nFlags |= ColumnSearch::CHAR; - } - - // check if the columname already exists - String aAlias(aColumnName); - OSQLColumns::Vector::const_iterator aFind = connectivity::find(m_aColumns->get().begin(),m_aColumns->get().end(),aAlias,aCase); - sal_Int32 nExprCnt = 0; - while(aFind != m_aColumns->get().end()) - { - (aAlias = aColumnName) += String::CreateFromInt32(++nExprCnt); - aFind = connectivity::find(m_aColumns->get().begin(),m_aColumns->get().end(),aAlias,aCase); - } - - m_aColumnRawNames.push_back(::rtl::OUString(aAlias)); - - //~ sdbcx::OColumn* pColumn = new sdbcx::OColumn(aAlias,aTypeName,::rtl::OUString(), - //~ ColumnValue::NULLABLE, - //~ nPrecision, - //~ nScale, - //~ eType, - //~ sal_False, - //~ sal_False, - //~ sal_False, - //~ bCase); - //~ Reference< XPropertySet> xCol = pColumn; - //~ m_aColumns->push_back(xCol); - m_aTypes.push_back(eType); - m_aPrecisions.push_back(nPrecision); - m_aScales.push_back(nScale); - } - setColumnAliases(); - m_pFileStream->Seek(STREAM_SEEK_TO_BEGIN); -} -// ------------------------------------------------------------------------- -OEvoabTable::OEvoabTable(sdbcx::OCollection* _pTables,OEvoabConnection* _pConnection) : OEvoabTable_BASE(_pTables,_pConnection) -{ - -} -// ------------------------------------------------------------------------- -OEvoabTable::OEvoabTable(sdbcx::OCollection* _pTables,OEvoabConnection* _pConnection, - const ::rtl::OUString& _Name, - const ::rtl::OUString& _Type, - const ::rtl::OUString& _Description , - const ::rtl::OUString& _SchemaName, - const ::rtl::OUString& _CatalogName - ) : OEvoabTable_BASE(_pTables,_pConnection,_Name, - _Type, - _Description, - _SchemaName, - _CatalogName) - ,m_nRowPos(0) - ,m_nMaxRowCount(0) -{ - //~ OSL_TRACE("OEvoabTable::(in constructor)_Name = %s\n", ((OUtoCStr(_Name)) ? (OUtoCStr(_Name)):("NULL")) ); - //~ OSL_TRACE("OEvoabTable::(in constructor)_Type = %s\n", ((OUtoCStr(_Type)) ? (OUtoCStr(_Type)):("NULL")) ); - //~ OSL_TRACE("OEvoabTable::(in constructor)_Description = %s\n", ((OUtoCStr(_Description)) ? (OUtoCStr(_Description)):("NULL")) ); - //~ OSL_TRACE("OEvoabTable::(in constructor)_SchemaName = %s\n", ((OUtoCStr(_SchemaName)) ? (OUtoCStr(_SchemaName)):("NULL")) ); - //~ OSL_TRACE("OEvoabTable::(in constructor)_CatalogName = %s\n", ((OUtoCStr(_CatalogName)) ? (OUtoCStr(_CatalogName)):("NULL")) ); -} -// ----------------------------------------------------------------------------- -void OEvoabTable::construct() -{ - SvtSysLocale aLocale; - ::com::sun::star::lang::Locale aAppLocale(aLocale.GetLocaleDataPtr()->getLocale()); - Sequence< ::com::sun::star::uno::Any > aArg(1); - aArg[0] <<= aAppLocale; - - Reference< ::com::sun::star::util::XNumberFormatsSupplier > xSupplier(m_pConnection->getDriver()->getFactory()->createInstanceWithArguments(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.util.NumberFormatsSupplier")),aArg),UNO_QUERY); - m_xNumberFormatter = Reference< ::com::sun::star::util::XNumberFormatter >(m_pConnection->getDriver()->getFactory()->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.util.NumberFormatter"))),UNO_QUERY); - m_xNumberFormatter->attachNumberFormatsSupplier(xSupplier); - - INetURLObject aURL; - aURL.SetURL(getEntry()); - - if(aURL.getExtension() != rtl::OUString(m_pConnection->getExtension())) - aURL.setExtension(m_pConnection->getExtension()); - - String aFileName = aURL.GetMainURL(INetURLObject::NO_DECODE); - - m_pFileStream = createStream_simpleError( aFileName,STREAM_READWRITE | STREAM_NOCREATE | STREAM_SHARE_DENYWRITE); - - if(!m_pFileStream) - m_pFileStream = createStream_simpleError( aFileName,STREAM_READ | STREAM_NOCREATE | STREAM_SHARE_DENYNONE); - - if(m_pFileStream) - { - OSL_TRACE("OEvoabTable::construct()::m_pFileStream created\n" ); - m_pFileStream->Seek(STREAM_SEEK_TO_END); - sal_Int32 nSize = m_pFileStream->Tell(); - m_pFileStream->Seek(STREAM_SEEK_TO_BEGIN); - - // Buffer size is dependent on the file-size - m_pFileStream->SetBufferSize(nSize > 1000000 ? 32768 : - nSize > 100000 ? 16384 : - nSize > 10000 ? 4096 : 1024); - OSL_TRACE("OEvoabTable::construct()::m_pFileStream->Tell() = %d\n", nSize ); - - fillColumns(aAppLocale); - - refreshColumns(); - } -} -// ------------------------------------------------------------------------- -String OEvoabTable::getEntry() -{ - ::rtl::OUString sURL; - try - { - Reference< XResultSet > xDir = m_pConnection->getDir()->getStaticResultSet(); - Reference< XRow> xRow(xDir,UNO_QUERY); - ::rtl::OUString sName; - ::rtl::OUString sExt; - - INetURLObject aURL; - xDir->beforeFirst(); - static const ::rtl::OUString s_sSeparator(RTL_CONSTASCII_USTRINGPARAM("/")); - while(xDir->next()) - { - sName = xRow->getString(1); - aURL.SetSmartProtocol(INET_PROT_FILE); - String sUrl = m_pConnection->getURL() + s_sSeparator + sName; - aURL.SetSmartURL( sUrl ); - - // cut the extension - sExt = aURL.getExtension(); - - // name and extension have to coincide - if ( m_pConnection->matchesExtension( sExt ) ) - { - sName = sName.replaceAt(sName.getLength()-(sExt.getLength()+1),sExt.getLength()+1,::rtl::OUString()); - if ( sName == m_Name ) - { - Reference< XContentAccess > xContentAccess( xDir, UNO_QUERY ); - sURL = xContentAccess->queryContentIdentifierString(); - break; - } - } - } - xDir->beforeFirst(); // move back to before first record - } - catch(Exception&) - { - OSL_ASSERT(0); - } - return sURL.getStr(); -} -// ------------------------------------------------------------------------- -void OEvoabTable::refreshColumns() -{ - ::osl::MutexGuard aGuard( m_aMutex ); - - TStringVector aVector; - aVector.reserve(m_aColumns->get().size()); - - for(OSQLColumns::Vector::const_iterator aIter = m_aColumns->get().begin();aIter != m_aColumns->get().end();++aIter) - aVector.push_back(Reference< XNamed>(*aIter,UNO_QUERY)->getName()); - - if(m_pColumns) - m_pColumns->reFill(aVector); - else - m_pColumns = new OEvoabColumns(this,m_aMutex,aVector); - - OSL_TRACE("OEvoabTable::refreshColumns()::end\n" ); -} - -// ------------------------------------------------------------------------- -void SAL_CALL OEvoabTable::disposing(void) -{ - OFileTable::disposing(); - ::osl::MutexGuard aGuard(m_aMutex); - m_aColumns = NULL; -} -// ------------------------------------------------------------------------- -Sequence< Type > SAL_CALL OEvoabTable::getTypes( ) throw(RuntimeException) -{ - Sequence< Type > aTypes = OTable_TYPEDEF::getTypes(); - ::std::vector<Type> aOwnTypes; - aOwnTypes.reserve(aTypes.getLength()); - const Type* pBegin = aTypes.getConstArray(); - const Type* pEnd = pBegin + aTypes.getLength(); - for(;pBegin != pEnd;++pBegin) - { - if(!(*pBegin == ::getCppuType((const Reference<XKeysSupplier>*)0) || - *pBegin == ::getCppuType((const Reference<XRename>*)0) || - *pBegin == ::getCppuType((const Reference<XIndexesSupplier>*)0) || - *pBegin == ::getCppuType((const Reference<XAlterTable>*)0) || - *pBegin == ::getCppuType((const Reference<XDataDescriptorFactory>*)0))) - { - aOwnTypes.push_back(*pBegin); - } - } - Type *pTypes = aOwnTypes.empty() ? 0 : &aOwnTypes[0]; - return Sequence< Type >(pTypes, aOwnTypes.size()); -} - -// ------------------------------------------------------------------------- -Any SAL_CALL OEvoabTable::queryInterface( const Type & rType ) throw(RuntimeException) -{ - if( rType == ::getCppuType((const Reference<XKeysSupplier>*)0) || - rType == ::getCppuType((const Reference<XIndexesSupplier>*)0) || - rType == ::getCppuType((const Reference<XRename>*)0) || - rType == ::getCppuType((const Reference<XAlterTable>*)0) || - rType == ::getCppuType((const Reference<XDataDescriptorFactory>*)0)) - return Any(); - - Any aRet = OTable_TYPEDEF::queryInterface(rType); - return aRet.hasValue() ? aRet : ::cppu::queryInterface(rType,static_cast< ::com::sun::star::lang::XUnoTunnel*> (this)); -} - -//-------------------------------------------------------------------------- -Sequence< sal_Int8 > OEvoabTable::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 OEvoabTable::getSomething( const Sequence< sal_Int8 > & rId ) throw (RuntimeException) -{ - return (rId.getLength() == 16 && 0 == rtl_compareMemory(getUnoTunnelImplementationId().getConstArray(), rId.getConstArray(), 16 ) ) - ? reinterpret_cast< sal_Int64 >( this ) - : OEvoabTable_BASE::getSomething(rId); -} -//------------------------------------------------------------------ -sal_Bool OEvoabTable::fetchRow(OValueRefRow& _rRow,const OSQLColumns & _rCols,sal_Bool bIsTable,sal_Bool bRetrieveData) -{ - *(_rRow->get())[0] = m_nFilePos; - - if (!bRetrieveData) - return sal_True; - - OEvoabConnection* pConnection = (OEvoabConnection*)m_pConnection; - // Fields: - xub_StrLen nStartPos = 0; - String aStr; - OSQLColumns::Vector::const_iterator aIter = _rCols.get().begin(); - for (sal_Int32 i = 0; aIter != _rCols.get().end();++aIter, ++i) - { - m_aCurrentLine.GetTokenSpecial(aStr,nStartPos,pConnection->getFieldDelimiter(),pConnection->getStringDelimiter()); - //OSL_TRACE("OEvoabTable::fetchRow()::aStr = %s\n", ((OUtoCStr(::rtl::OUString(aStr))) ? (OUtoCStr(::rtl::OUString(aStr))):("NULL")) ); - - if (aStr.Len() == 0) - (_rRow->get())[i+1]->setNull(); - else - { - // Lengths for each data-type: - sal_Int32 nLen, - nType = 0; - if(bIsTable) - { - nLen = m_aPrecisions[i]; - nType = m_aTypes[i]; - } - else - { - Reference< XPropertySet> xColumn = *aIter; - xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION)) >>= nLen; - xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)) >>= nType; - } - switch(nType) - { - case DataType::TIMESTAMP: - case DataType::DATE: - case DataType::TIME: - { - double nRes = 0.0; - try - { - nRes = m_xNumberFormatter->convertStringToNumber(::com::sun::star::util::NumberFormat::ALL,aStr); - Reference<XPropertySet> xProp(m_xNumberFormatter->getNumberFormatsSupplier()->getNumberFormatSettings(),UNO_QUERY); - com::sun::star::util::Date aDate; - xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NullDate"))) >>= aDate; - - switch(nType) - { - case DataType::DATE: - *(_rRow->get())[i+1] = ::dbtools::DBTypeConversion::toDouble(::dbtools::DBTypeConversion::toDate(nRes,aDate)); - break; - case DataType::TIMESTAMP: - *(_rRow->get())[i+1] = ::dbtools::DBTypeConversion::toDouble(::dbtools::DBTypeConversion::toDateTime(nRes,aDate)); - break; - default: - *(_rRow->get())[i+1] = ::dbtools::DBTypeConversion::toDouble(::dbtools::DBTypeConversion::toTime(nRes)); - } - } - catch(Exception&) - { - (_rRow->get())[i+1]->setNull(); - } - } break; - case DataType::DOUBLE: - case DataType::INTEGER: - case DataType::DECIMAL: - case DataType::NUMERIC: - { - sal_Unicode cDecimalDelimiter = pConnection->getDecimalDelimiter(); - sal_Unicode cThousandDelimiter = pConnection->getThousandDelimiter(); - String aStrConverted; - - OSL_ENSURE(cDecimalDelimiter && nType != DataType::INTEGER || - !cDecimalDelimiter && nType == DataType::INTEGER, - "FalscherTyp"); - - // Convert to standard-notation (DecimalPOINT without Thousands-comma): - for (xub_StrLen j = 0; j < aStr.Len(); ++j) - { - if (cDecimalDelimiter && aStr.GetChar(j) == cDecimalDelimiter) - aStrConverted += '.'; - else if ( aStr.GetChar(j) == '.' ) // special case, if decimal seperator isn't '.' we have to vut the string after it - break; - else if (cThousandDelimiter && aStr.GetChar(j) == cThousandDelimiter) - { - // leave out - } - else - aStrConverted += aStr.GetChar(j) ; - } - double nVal = ::rtl::math::stringToDouble(aStrConverted.GetBuffer(),',','.',NULL,NULL); - - if ( DataType::DECIMAL == nType || DataType::NUMERIC == nType ) - *(_rRow->get())[i+1] = ORowSetValue(String::CreateFromDouble(nVal)); - else - *(_rRow->get())[i+1] = nVal; - } break; - - default: - { - // Copy Value as String in Row-variable - *(_rRow->get())[i+1] = ORowSetValue(aStr); - } - break; - } - } - } - return sal_True; -} -// ----------------------------------------------------------------------------- -sal_Bool OEvoabTable::setColumnAliases() -{ - - size_t nSize = m_aColumnRawNames.size(); - if(nSize == 0 || m_aPrecisions.size() != nSize || m_aScales.size() != nSize || m_aTypes.size() != nSize) - return sal_False; - m_aColumns->get().clear(); - m_aColumns->get().reserve(nSize); - ::rtl::OUString aColumnReadName; - ::rtl::OUString aColumnHeadlineName; - ::rtl::OUString aColumnDisplayName; - ::rtl::OUString aColumnFinalName; - String sColumnFinalName; - - const TStringVector& colAliasNames = ((OEvoabConnection*)m_pConnection)->getColumnAlias().getAlias(); - const ::std::map< ::rtl::OUString, ::rtl::OUString > & colMap = ((OEvoabConnection*)m_pConnection)->getColumnAlias().getAliasMap(); - ::osl::MutexGuard aGuard( m_aMutex ); - - for(size_t i = 0;i < nSize; ++i) - { - aColumnReadName = m_aColumnRawNames[i]; - //OSL_TRACE("OEvoabTable::getColumnRows()::aColumnReadName = %s\n", ((OUtoCStr(aColumnReadName)) ? (OUtoCStr(aColumnReadName)):("NULL")) ); - sal_Bool bFound = sal_False; - for ( size_t j = 0; j < colAliasNames.size(); ++j ) - { - aColumnDisplayName = colAliasNames[j]; - - ::std::map< ::rtl::OUString, ::rtl::OUString >::const_iterator aPos = colMap.find( aColumnDisplayName ); - if ( colMap.end() != aPos ) - { - aColumnHeadlineName = aPos->second; - EVO_TRACE_STRING( "OEvoabTable::getColumnRows()::aColumnDisplayName = %s\n", aColumnDisplayName ); - EVO_TRACE_STRING( "OEvoabTable::getColumnRows()::aColumnHeadlineName= %s\n", aColumnHeadlineName ); - if(aColumnReadName == aColumnHeadlineName) - { - //OSL_TRACE("OEvoabTable::getColumnRows()::aColumnHeadlineName = %s\n", ((OUtoCStr(aColumnHeadlineName)) ? (OUtoCStr(aColumnHeadlineName)):("NULL")) ); - //OSL_TRACE("OEvoabTable::getColumnRows()::aColumnDisplayName = %s\n", ((OUtoCStr(aColumnDisplayName)) ? (OUtoCStr(aColumnDisplayName)):("NULL")) ); - aColumnFinalName = aColumnDisplayName; - bFound = sal_True; - //OSL_TRACE("OEvoabTable::getColumnRows()::j = %d\n", j ); - - break; - } - } - else - OSL_FAIL( "OEvoabTable::setColumnAliases: did not find one of the aliases!" ); - } - if(!bFound) - aColumnFinalName = aColumnReadName; - sColumnFinalName = aColumnFinalName; - - sal_Bool bCase = getConnection()->getMetaData()->supportsMixedCaseQuotedIdentifiers(); - ::rtl::OUString aTypeName; - aTypeName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VARCHAR")); - sdbcx::OColumn* pColumn = new sdbcx::OColumn(sColumnFinalName,aTypeName,::rtl::OUString(), - ColumnValue::NULLABLE, - m_aPrecisions[i], - m_aScales[i], - m_aTypes[i], - sal_False, - sal_False, - sal_False, - bCase); - Reference< XPropertySet> xCol = pColumn; - m_aColumns->get().push_back(xCol); - } - return sal_True; -} -// ----------------------------------------------------------------------------- -void OEvoabTable::refreshIndexes() -{ -} -// ----------------------------------------------------------------------------- -sal_Bool OEvoabTable::checkHeaderLine() -{ - if (m_nFilePos == 0 && ((OEvoabConnection*)m_pConnection)->isHeaderLine()) - { - sal_Bool bRead2; - do - { - bRead2 = m_pFileStream->ReadByteStringLine(m_aCurrentLine,m_pConnection->getTextEncoding()); - } - while(bRead2 && !m_aCurrentLine.Len()); - - m_nFilePos = m_pFileStream->Tell(); - if (m_pFileStream->IsEof()) - return sal_False; - } - return sal_True; -} -//------------------------------------------------------------------ -sal_Bool OEvoabTable::seekRow(IResultSetHelper::Movement eCursorPosition, sal_Int32 nOffset, sal_Int32& nCurPos) -{ - //OSL_TRACE("OEvoabTable::(before SeekRow)m_aCurrentLine = %d\n", ((OUtoCStr(::rtl::OUString(m_aCurrentLine))) ? (OUtoCStr(::rtl::OUString(m_aCurrentLine))):("NULL")) ); - - if ( !m_pFileStream ) - return sal_False; - OEvoabConnection* pConnection = (OEvoabConnection*)m_pConnection; - // ---------------------------------------------------------- - // prepare positioning: - //OSL_TRACE("OEvoabTable::(before SeekRow,m_pFileStriam Exist)m_aCurrentLine = %d\n", ((OUtoCStr(::rtl::OUString(m_aCurrentLine))) ? (OUtoCStr(::rtl::OUString(m_aCurrentLine))):("NULL")) ); - - m_nFilePos = nCurPos; - - switch(eCursorPosition) - { - case IResultSetHelper::FIRST: - m_nFilePos = 0; - m_nRowPos = 1; - // run through - case IResultSetHelper::NEXT: - if(eCursorPosition != IResultSetHelper::FIRST) - ++m_nRowPos; - m_pFileStream->Seek(m_nFilePos); - if (m_pFileStream->IsEof() || !checkHeaderLine()) - { - m_nMaxRowCount = m_nRowPos; - return sal_False; - } - - m_aRowToFilePos.insert(::std::map<sal_Int32,sal_Int32>::value_type(m_nRowPos,m_nFilePos)); - - m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); - if (m_pFileStream->IsEof()) - { - m_nMaxRowCount = m_nRowPos; - return sal_False; - } - nCurPos = m_pFileStream->Tell(); - break; - case IResultSetHelper::PRIOR: - --m_nRowPos; - if(m_nRowPos > 0) - { - m_nFilePos = m_aRowToFilePos.find(m_nRowPos)->second; - m_pFileStream->Seek(m_nFilePos); - if (m_pFileStream->IsEof() || !checkHeaderLine()) - return sal_False; - m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); - if (m_pFileStream->IsEof()) - return sal_False; - nCurPos = m_pFileStream->Tell(); - } - else - m_nRowPos = 0; - - break; - case IResultSetHelper::LAST: - if(m_nMaxRowCount) - { - m_nFilePos = m_aRowToFilePos.rbegin()->second; - m_nRowPos = m_aRowToFilePos.rbegin()->first; - m_pFileStream->Seek(m_nFilePos); - if (m_pFileStream->IsEof() || !checkHeaderLine()) - return sal_False; - m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); - if (m_pFileStream->IsEof()) - return sal_False; - nCurPos = m_pFileStream->Tell(); - } - else - { - while(seekRow(IResultSetHelper::NEXT,1,nCurPos)) ; // run through after last row - // now I know all - seekRow(IResultSetHelper::PRIOR,1,nCurPos); - } - break; - case IResultSetHelper::RELATIVE: - if(nOffset > 0) - { - for(sal_Int32 i = 0;i<nOffset;++i) - seekRow(IResultSetHelper::NEXT,1,nCurPos); - } - else if(nOffset < 0) - { - for(sal_Int32 i = nOffset;i;++i) - seekRow(IResultSetHelper::PRIOR,1,nCurPos); - } - break; - case IResultSetHelper::ABSOLUTE: - { - if(nOffset < 0) - nOffset = m_nRowPos + nOffset; - ::std::map<sal_Int32,sal_Int32>::const_iterator aIter = m_aRowToFilePos.find(nOffset); - if(aIter != m_aRowToFilePos.end()) - { - m_nFilePos = aIter->second; - m_pFileStream->Seek(m_nFilePos); - if (m_pFileStream->IsEof() || !checkHeaderLine()) - return sal_False; - m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); - if (m_pFileStream->IsEof()) - return sal_False; - nCurPos = m_pFileStream->Tell(); - } - else if(m_nMaxRowCount && nOffset > m_nMaxRowCount) // offset is outside the table - { - m_nRowPos = m_nMaxRowCount; - return sal_False; - } - else - { - aIter = m_aRowToFilePos.upper_bound(nOffset); - if(aIter == m_aRowToFilePos.end()) - { - m_nRowPos = m_aRowToFilePos.rbegin()->first; - nCurPos = m_nFilePos = m_aRowToFilePos.rbegin()->second; - while(m_nRowPos != nOffset) - seekRow(IResultSetHelper::NEXT,1,nCurPos); - } - else - { - --aIter; - m_nRowPos = aIter->first; - m_nFilePos = aIter->second; - m_pFileStream->Seek(m_nFilePos); - if (m_pFileStream->IsEof() || !checkHeaderLine()) - return sal_False; - m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); - if (m_pFileStream->IsEof()) - return sal_False; - nCurPos = m_pFileStream->Tell(); - } - } - } - - break; - case IResultSetHelper::BOOKMARK: - m_pFileStream->Seek(nOffset); - if (m_pFileStream->IsEof()) - return sal_False; - - m_nFilePos = m_pFileStream->Tell(); // save Byte-Position in the file (at start of line) - m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); - if (m_pFileStream->IsEof()) - return sal_False; - nCurPos = m_pFileStream->Tell(); - break; - } - - //OSL_TRACE("OEvoabTable::(after SeekRow)m_aCurrentLine = %d\n", ((OUtoCStr(::rtl::OUString(m_aCurrentLine))) ? (OUtoCStr(::rtl::OUString(m_aCurrentLine))):("NULL")) ); - - return sal_True; -} -// ----------------------------------------------------------------------------- - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |