diff options
author | Rüdiger Timm <rt@openoffice.org> | 2005-10-24 07:20:50 +0000 |
---|---|---|
committer | Rüdiger Timm <rt@openoffice.org> | 2005-10-24 07:20:50 +0000 |
commit | bc695a139afdcc0507d8c404b33129340db52fd1 (patch) | |
tree | a13a6918fbbb4c26442af3d3273832e7faadd5f0 /connectivity | |
parent | 0b63596e84396457d27b8ed38c5de6405c2e268b (diff) |
INTEGRATION: CWS dba201d (1.89.12); FILE MERGED
2005/10/12 07:40:58 oj 1.89.12.1: #i35859# correct textencoding handling
Diffstat (limited to 'connectivity')
-rw-r--r-- | connectivity/source/drivers/dbase/DTable.cxx | 251 |
1 files changed, 129 insertions, 122 deletions
diff --git a/connectivity/source/drivers/dbase/DTable.cxx b/connectivity/source/drivers/dbase/DTable.cxx index 0da8edc21fcf..c1ca01171289 100644 --- a/connectivity/source/drivers/dbase/DTable.cxx +++ b/connectivity/source/drivers/dbase/DTable.cxx @@ -4,9 +4,9 @@ * * $RCSfile: DTable.cxx,v $ * - * $Revision: 1.89 $ + * $Revision: 1.90 $ * - * last change: $Author: rt $ $Date: 2005-09-08 05:40:14 $ + * last change: $Author: rt $ $Date: 2005-10-24 08:20:50 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -971,142 +971,149 @@ BOOL ODbaseTable::CreateFile(const INetURLObject& aFile, BOOL& bCreateMemo) ::rtl::OUString aName; Reference<XPropertySet> xCol; - for(sal_Int32 i=0;i<xColumns->getCount();++i) + try { - ::cppu::extractInterface(xCol,xColumns->getByIndex(i)); - OSL_ENSURE(xCol.is(),"This should be a column!"); + for(sal_Int32 i=0;i<xColumns->getCount();++i) + { + ::cppu::extractInterface(xCol,xColumns->getByIndex(i)); + OSL_ENSURE(xCol.is(),"This should be a column!"); - char cTyp; + char cTyp; - xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= aName; + xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= aName; - if (aName.getLength() > nMaxFieldLength) - { - try + ::rtl::OString aCol; + if ( DBTypeConversion::convertUnicodeString( aName, aCol, getConnection()->getTextEncoding() ) > nMaxFieldLength) { - // we have to drop the file because it is corrupted now - DropImpl(); + ::rtl::OUString sMsg = ::rtl::OUString::createFromAscii("Invalid column name length for column: "); + sMsg += aName; + sMsg += ::rtl::OUString::createFromAscii("!"); + throw SQLException(sMsg,*this,OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_HY0000),1000,Any()); } - catch(const Exception&) + + (*m_pFileStream) << aCol.getStr(); + m_pFileStream->Write(aBuffer, 11 - aCol.getLength()); + + switch (getINT32(xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)))) { + case DataType::CHAR: + case DataType::VARCHAR: + cTyp = 'C'; + break; + case DataType::TINYINT: + case DataType::SMALLINT: + case DataType::INTEGER: + case DataType::BIGINT: + case DataType::DECIMAL: + case DataType::NUMERIC: + case DataType::REAL: + case DataType::DOUBLE: + cTyp = 'N'; // nur dBase 3 format + break; + case DataType::DATE: + cTyp = 'D'; + break; + case DataType::BIT: + cTyp = 'L'; + break; + case DataType::LONGVARBINARY: + case DataType::LONGVARCHAR: + cTyp = 'M'; + break; + default: + { + throwInvalidColumnType(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Invalid column type for column: ")), aName); + } } - ::rtl::OUString sMsg = ::rtl::OUString::createFromAscii("Invalid column name length for column: "); - sMsg += aName; - sMsg += ::rtl::OUString::createFromAscii("!"); - throw SQLException(sMsg,*this,OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_HY0000),1000,Any()); - } - ByteString aCol(aName.getStr(), getConnection()->getTextEncoding()); - (*m_pFileStream) << aCol.GetBuffer(); - m_pFileStream->Write(aBuffer, 11 - aCol.Len()); + (*m_pFileStream) << cTyp; + m_pFileStream->Write(aBuffer, 4); - switch (getINT32(xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)))) - { - case DataType::CHAR: - case DataType::VARCHAR: - cTyp = 'C'; - break; - case DataType::TINYINT: - case DataType::SMALLINT: - case DataType::INTEGER: - case DataType::BIGINT: - case DataType::DECIMAL: - case DataType::NUMERIC: - case DataType::REAL: - case DataType::DOUBLE: - cTyp = 'N'; // nur dBase 3 format - break; - case DataType::DATE: - cTyp = 'D'; - break; - case DataType::BIT: - cTyp = 'L'; - break; - case DataType::LONGVARBINARY: - case DataType::LONGVARCHAR: - cTyp = 'M'; - break; - default: - { - throwInvalidColumnType(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Invalid column type for column: ")), aName); - } - } + sal_Int32 nPrecision = 0; + xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION)) >>= nPrecision; + sal_Int32 nScale = 0; + xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE)) >>= nScale; - (*m_pFileStream) << cTyp; - m_pFileStream->Write(aBuffer, 4); - - sal_Int32 nPrecision = 0; - xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION)) >>= nPrecision; - sal_Int32 nScale = 0; - xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE)) >>= nScale; + switch(cTyp) + { + case 'C': + OSL_ENSURE(nPrecision < 255, "ODbaseTable::Create: Column zu lang!"); + if (nPrecision > 254) + { + throwInvalidColumnType(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Invalid precision for column: ")), aName); + } + (*m_pFileStream) << (BYTE) Min((ULONG)nPrecision, 255UL); //Feldlaenge + nRecLength += (USHORT)Min((ULONG)nPrecision, 255UL); + (*m_pFileStream) << (BYTE)0; //Nachkommastellen + break; + case 'F': + case 'N': + OSL_ENSURE(nPrecision >= nScale, + "ODbaseTable::Create: Feldlaenge muss groesser Nachkommastellen sein!"); + if (nPrecision < nScale) + { + throwInvalidColumnType(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Precision is less than scale for column: ")), aName); + } + if (getBOOL(xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY)))) // Currency wird gesondert behandelt + { + (*m_pFileStream) << (BYTE)10; // Standard Laenge + (*m_pFileStream) << (BYTE)4; + nRecLength += 10; + } + else + { + sal_Int32 nPrec = SvDbaseConverter::ConvertPrecisionToDbase(nPrecision,nScale); - switch(cTyp) - { - case 'C': - OSL_ENSURE(nPrecision < 255, "ODbaseTable::Create: Column zu lang!"); - if (nPrecision > 254) - { - throwInvalidColumnType(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Invalid precision for column: ")), aName); - } - (*m_pFileStream) << (BYTE) Min((ULONG)nPrecision, 255UL); //Feldlaenge - nRecLength += (USHORT)Min((ULONG)nPrecision, 255UL); - (*m_pFileStream) << (BYTE)0; //Nachkommastellen - break; - case 'F': - case 'N': - OSL_ENSURE(nPrecision >= nScale, - "ODbaseTable::Create: Feldlaenge muss groesser Nachkommastellen sein!"); - if (nPrecision < nScale) - { - throwInvalidColumnType(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Precision is less than scale for column: ")), aName); - } - if (getBOOL(xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISCURRENCY)))) // Currency wird gesondert behandelt - { - (*m_pFileStream) << (BYTE)10; // Standard Laenge - (*m_pFileStream) << (BYTE)4; + (*m_pFileStream) << (BYTE)( nPrec); + (*m_pFileStream) << (BYTE)nScale; + nRecLength += (USHORT)nPrec; + } + break; + case 'L': + (*m_pFileStream) << (BYTE)1; + (*m_pFileStream) << (BYTE)0; + nRecLength++; + break; + case 'D': + (*m_pFileStream) << (BYTE)8; + (*m_pFileStream) << (BYTE)0; + nRecLength += 8; + break; + case 'M': + bCreateMemo = TRUE; + (*m_pFileStream) << (BYTE)10; + (*m_pFileStream) << (BYTE)0; nRecLength += 10; - } - else - { - sal_Int32 nPrec = SvDbaseConverter::ConvertPrecisionToDbase(nPrecision,nScale); - - (*m_pFileStream) << (BYTE)( nPrec); - (*m_pFileStream) << (BYTE)nScale; - nRecLength += (USHORT)nPrec; - } - break; - case 'L': - (*m_pFileStream) << (BYTE)1; - (*m_pFileStream) << (BYTE)0; - nRecLength++; - break; - case 'D': - (*m_pFileStream) << (BYTE)8; - (*m_pFileStream) << (BYTE)0; - nRecLength += 8; - break; - case 'M': - bCreateMemo = TRUE; - (*m_pFileStream) << (BYTE)10; - (*m_pFileStream) << (BYTE)0; - nRecLength += 10; - break; - default: - { - throwInvalidColumnType(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Invalid column type for column: ")), aName); - } + break; + default: + { + throwInvalidColumnType(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Invalid column type for column: ")), aName); + } + } + m_pFileStream->Write(aBuffer, 14); } - m_pFileStream->Write(aBuffer, 14); - } - (*m_pFileStream) << (BYTE)0x0d; // kopf ende - m_pFileStream->Seek(10L); - (*m_pFileStream) << nRecLength; // Satzlaenge nachtraeglich eintragen + (*m_pFileStream) << (BYTE)0x0d; // kopf ende + m_pFileStream->Seek(10L); + (*m_pFileStream) << nRecLength; // Satzlaenge nachtraeglich eintragen - if (bCreateMemo) + if (bCreateMemo) + { + m_pFileStream->Seek(0L); + (*m_pFileStream) << (BYTE) dBaseIIIMemo; + } // if (bCreateMemo) + } + catch(const Exception& e) { - m_pFileStream->Seek(0L); - (*m_pFileStream) << (BYTE) dBaseIIIMemo; + try + { + // we have to drop the file because it is corrupted now + DropImpl(); + } + catch(const Exception&) + { + } + throw e; } return TRUE; } @@ -2227,7 +2234,7 @@ void ODbaseTable::copyData(ODbaseTable* _pNewTable,sal_Int32 _nPos) { OSL_ASSERT(0); } - } + } // for(sal_uInt32 nRowPos = 0; nRowPos < m_aHeader.db_anz;++nRowPos) } // ----------------------------------------------------------------------------- void ODbaseTable::throwInvalidDbaseFormat() |