diff options
Diffstat (limited to 'connectivity/source/drivers/dbase')
-rw-r--r-- | connectivity/source/drivers/dbase/DIndex.cxx | 76 | ||||
-rw-r--r-- | connectivity/source/drivers/dbase/DIndexes.cxx | 4 | ||||
-rw-r--r-- | connectivity/source/drivers/dbase/DTable.cxx | 36 | ||||
-rw-r--r-- | connectivity/source/drivers/dbase/dindexnode.cxx | 21 |
4 files changed, 76 insertions, 61 deletions
diff --git a/connectivity/source/drivers/dbase/DIndex.cxx b/connectivity/source/drivers/dbase/DIndex.cxx index 8e4ef568aa62..96c33037524b 100644 --- a/connectivity/source/drivers/dbase/DIndex.cxx +++ b/connectivity/source/drivers/dbase/DIndex.cxx @@ -52,6 +52,7 @@ #include "diagnose_ex.h" #include <comphelper/types.hxx> #include "resource/dbase_res.hrc" +#include <unotools/sharedunocomponent.hxx> using namespace ::comphelper; // ------------------------------------------------------------------------- @@ -69,7 +70,7 @@ using namespace com::sun::star::lang; IMPLEMENT_SERVICE_INFO(ODbaseIndex,"com.sun.star.sdbcx.driver.dbase.Index","com.sun.star.sdbcx.Index"); // ------------------------------------------------------------------------- -ODbaseIndex::ODbaseIndex(ODbaseTable* _pTable) : OIndex(_pTable->getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers()) +ODbaseIndex::ODbaseIndex(ODbaseTable* _pTable) : OIndex(sal_True/*_pTable->getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers()*/) ,m_pFileStream(NULL) ,m_nCurNode(NODE_NOTFOUND) ,m_pTable(_pTable) @@ -82,7 +83,7 @@ ODbaseIndex::ODbaseIndex(ODbaseTable* _pTable) : OIndex(_pTable->getConnection() ODbaseIndex::ODbaseIndex( ODbaseTable* _pTable, const NDXHeader& _rHeader, const ::rtl::OUString& _rName) - :OIndex(_rName,::rtl::OUString(),_rHeader.db_unique,sal_False,sal_False,_pTable->getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers()) + :OIndex(_rName,::rtl::OUString(),_rHeader.db_unique,sal_False,sal_False,sal_True) // _pTable->getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers() ,m_pFileStream(NULL) ,m_aHeader(_rHeader) ,m_nCurNode(NODE_NOTFOUND) @@ -163,7 +164,7 @@ sal_Bool ODbaseIndex::openIndexFile() if(m_pFileStream) { m_pFileStream->SetNumberFormatInt(NUMBERFORMAT_INT_LITTLEENDIAN); - m_pFileStream->SetBufferSize(512); + m_pFileStream->SetBufferSize(PAGE_SIZE); (*m_pFileStream) >> *this; } } @@ -342,9 +343,9 @@ ONDXPage* ODbaseIndex::CreatePage(sal_uInt32 nPagePos, ONDXPage* pParent, BOOL b OSL_ENSURE(m_pFileStream,"FileStream is not opened!"); ONDXPage* pPage; - if (m_aCollector.size()) + if ( !m_aCollector.empty() ) { - pPage = *(m_aCollector.end() - 1); + pPage = *(m_aCollector.rbegin()); m_aCollector.pop_back(); pPage->SetPagePos(nPagePos); pPage->SetParent(pParent); @@ -362,7 +363,7 @@ ONDXPage* ODbaseIndex::CreatePage(sal_uInt32 nPagePos, ONDXPage* pParent, BOOL b SvStream& connectivity::dbase::operator >> (SvStream &rStream, ODbaseIndex& rIndex) { rStream.Seek(0); - rStream.Read(&rIndex.m_aHeader,512); + rStream.Read(&rIndex.m_aHeader,PAGE_SIZE); /* OJ: no longer needed // Text convertierung @@ -384,7 +385,7 @@ SvStream& connectivity::dbase::operator << (SvStream &rStream, ODbaseIndex& rInd // aText.Convert(m_pTable->getConnection()->getTextEncoding(), rIndex.m_pTable->getConnection()->GetCharacterSet()); strcpy(rIndex.m_aHeader.db_name,aText.GetBuffer()); */ - OSL_VERIFY_EQUALS( rStream.Write(&rIndex.m_aHeader,512), 512, "Write not successful: Wrong header size for dbase index!"); + OSL_VERIFY_EQUALS( rStream.Write(&rIndex.m_aHeader,PAGE_SIZE), PAGE_SIZE, "Write not successful: Wrong header size for dbase index!"); return rStream; } // ------------------------------------------------------------------------- @@ -480,11 +481,18 @@ BOOL ODbaseIndex::DropImpl() return TRUE; } // ------------------------------------------------------------------------- +void ODbaseIndex::impl_killFileAndthrowError_throw(sal_uInt16 _nErrorId,const ::rtl::OUString& _sFile) +{ + closeImpl(); + if(UCBContentHelper::Exists(_sFile)) + UCBContentHelper::Kill(_sFile); + m_pTable->getConnection()->throwGenericSQLException(_nErrorId,*this); +} //------------------------------------------------------------------ BOOL ODbaseIndex::CreateImpl() { // Anlegen des Index - ::rtl::OUString sFile = getCompletePath(); + const ::rtl::OUString sFile = getCompletePath(); if(UCBContentHelper::Exists(sFile)) { const ::rtl::OUString sError( m_pTable->getConnection()->getResources().getResourceStringWithSubstitution( @@ -525,20 +533,20 @@ BOOL ODbaseIndex::CreateImpl() } m_pFileStream->SetNumberFormatInt(NUMBERFORMAT_INT_LITTLEENDIAN); - m_pFileStream->SetBufferSize(512); + m_pFileStream->SetBufferSize(PAGE_SIZE); m_pFileStream->SetFiller('\0'); // Zunaechst muss das Ergebnis sortiert sein - Reference<XStatement> xStmt; - Reference<XResultSet> xSet; + utl::SharedUNOComponent<XStatement> xStmt; + utl::SharedUNOComponent<XResultSet> xSet; String aName; try { - xStmt = m_pTable->getConnection()->createStatement(); + xStmt.set( m_pTable->getConnection()->createStatement(), UNO_SET_THROW); aName = getString(xCol->getFastPropertyValue(PROPERTY_ID_NAME)); - String aQuote(m_pTable->getConnection()->getMetaData()->getIdentifierQuoteString()); + const String aQuote(m_pTable->getConnection()->getMetaData()->getIdentifierQuoteString()); String aStatement; aStatement.AssignAscii("SELECT "); aStatement += aQuote; @@ -561,38 +569,35 @@ BOOL ODbaseIndex::CreateImpl() // aStatement += aQuote; // } - xSet = xStmt->executeQuery(aStatement); + xSet.set( xStmt->executeQuery(aStatement),UNO_SET_THROW ); } catch(const Exception& ) { - closeImpl(); - if(UCBContentHelper::Exists(sFile)) - UCBContentHelper::Kill(sFile); - m_pTable->getConnection()->throwGenericSQLException(STR_COULD_NOT_CREATE_INDEX,*this); + impl_killFileAndthrowError_throw(STR_COULD_NOT_CREATE_INDEX,sFile); } if (!xSet.is()) { - - closeImpl(); - if(UCBContentHelper::Exists(sFile)) - UCBContentHelper::Kill(sFile); - m_pTable->getConnection()->throwGenericSQLException(STR_COULD_NOT_CREATE_INDEX,*this); + impl_killFileAndthrowError_throw(STR_COULD_NOT_CREATE_INDEX,sFile); } // Setzen der Headerinfo memset(&m_aHeader,0,sizeof(m_aHeader)); - m_pFileStream->SetStreamSize(512); - sal_Int32 nType = 0; ::vos::ORef<OSQLColumns> aCols = m_pTable->getTableColumns(); - - Reference< XPropertySet > xTableCol(*find(aCols->get().begin(),aCols->get().end(),aName,::comphelper::UStringMixEqual(isCaseSensitive()))); + const Reference< XPropertySet > xTableCol(*find(aCols->get().begin(),aCols->get().end(),aName,::comphelper::UStringMixEqual(isCaseSensitive()))); xTableCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)) >>= nType; m_aHeader.db_keytype = (nType == DataType::VARCHAR || nType == DataType::CHAR) ? 0 : 1; m_aHeader.db_keylen = (m_aHeader.db_keytype) ? 8 : (USHORT)getINT32(xTableCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION))); - m_aHeader.db_maxkeys = (512 - 8) / (8 + m_aHeader.db_keylen); + m_aHeader.db_keylen = (( m_aHeader.db_keylen - 1) / 4 + 1) * 4; + m_aHeader.db_maxkeys = (PAGE_SIZE - 4) / (8 + m_aHeader.db_keylen); + if ( m_aHeader.db_maxkeys < 3 ) + { + impl_killFileAndthrowError_throw(STR_COULD_NOT_CREATE_INDEX_KEYSIZE,sFile); + } + + m_pFileStream->SetStreamSize(PAGE_SIZE); ByteString aCol(aName,m_pTable->getConnection()->getTextEncoding()); strncpy(m_aHeader.db_name,aCol.GetBuffer(),std::min((USHORT)sizeof(m_aHeader.db_name), aCol.Len())); @@ -640,12 +645,7 @@ BOOL ODbaseIndex::CreateImpl() aKey.setValue(aValue); if (aKey == (*m_aCurLeaf)[m_nCurNode].GetKey()) { - ::comphelper::disposeComponent(xSet); - ::comphelper::disposeComponent(xStmt); - closeImpl(); - if(UCBContentHelper::Exists(sFile)) - UCBContentHelper::Kill(sFile); - m_pTable->getConnection()->throwGenericSQLException(STR_COULD_NOT_CREATE_INDEX_NOT_UNIQUE,*this); + impl_killFileAndthrowError_throw(STR_COULD_NOT_CREATE_INDEX_NOT_UNIQUE,sFile); } } aInsertKey.setValue(aValue); @@ -656,16 +656,10 @@ BOOL ODbaseIndex::CreateImpl() break; } } - xRow = NULL; - ::comphelper::disposeComponent(xSet); - ::comphelper::disposeComponent(xStmt); if(nRowsLeft) { - closeImpl(); - if(UCBContentHelper::Exists(sFile)) - UCBContentHelper::Kill(sFile); - m_pTable->getConnection()->throwGenericSQLException(STR_COULD_NOT_CREATE_INDEX,*this); + impl_killFileAndthrowError_throw(STR_COULD_NOT_CREATE_INDEX,sFile); } Release(); createINFEntry(); diff --git a/connectivity/source/drivers/dbase/DIndexes.cxx b/connectivity/source/drivers/dbase/DIndexes.cxx index a3f8003ac8fc..b9c41725ff4e 100644 --- a/connectivity/source/drivers/dbase/DIndexes.cxx +++ b/connectivity/source/drivers/dbase/DIndexes.cxx @@ -75,11 +75,11 @@ sdbcx::ObjectType ODbaseIndexes::createObject(const ::rtl::OUString& _rName) if(pFileStream) { pFileStream->SetNumberFormatInt(NUMBERFORMAT_INT_LITTLEENDIAN); - pFileStream->SetBufferSize(512); + pFileStream->SetBufferSize(PAGE_SIZE); ODbaseIndex::NDXHeader aHeader; pFileStream->Seek(0); - pFileStream->Read(&aHeader,512); + pFileStream->Read(&aHeader,PAGE_SIZE); delete pFileStream; ODbaseIndex* pIndex = new ODbaseIndex(m_pTable,aHeader,_rName); diff --git a/connectivity/source/drivers/dbase/DTable.cxx b/connectivity/source/drivers/dbase/DTable.cxx index e29581f820d1..78c818a46eb0 100644 --- a/connectivity/source/drivers/dbase/DTable.cxx +++ b/connectivity/source/drivers/dbase/DTable.cxx @@ -83,6 +83,27 @@ using namespace ::com::sun::star::lang; // stored as the Field Descriptor terminator #define FIELD_DESCRIPTOR_TERMINATOR 0x0D +#define DBF_EOL 0x1A + +//================================================================== +namespace +{ +//================================================================== +sal_Int32 lcl_getFileSize(SvStream& _rStream) +{ + sal_Int32 nFileSize = 0; + _rStream.Seek(STREAM_SEEK_TO_END); + _rStream.SeekRel(-1); + char cEOL; + _rStream >> cEOL; + nFileSize = _rStream.Tell(); + if ( cEOL == DBF_EOL ) + nFileSize -= 1; + return nFileSize; +} +//================================================================== +} +//================================================================== // ------------------------------------------------------------------------- void ODbaseTable::readHeader() @@ -373,8 +394,7 @@ void ODbaseTable::construct() // if(!m_pColumns && (!m_aColumns.isValid() || !m_aColumns->size())) fillColumns(); - m_pFileStream->Seek(STREAM_SEEK_TO_END); - UINT32 nFileSize = m_pFileStream->Tell(); + UINT32 nFileSize = lcl_getFileSize(*m_pFileStream); m_pFileStream->Seek(STREAM_SEEK_TO_BEGIN); if ( m_aHeader.db_anz == 0 && ((nFileSize-m_aHeader.db_kopf)/m_aHeader.db_slng) > 0) // seems to be empty or someone wrote bullshit into the dbase file m_aHeader.db_anz = ((nFileSize-m_aHeader.db_kopf)/m_aHeader.db_slng); @@ -1077,7 +1097,8 @@ BOOL ODbaseTable::CreateFile(const INetURLObject& aFile, BOOL& bCreateMemo) m_pFileStream->Write(aBuffer, 14); } - (*m_pFileStream) << (BYTE)0x0d; // kopf ende + (*m_pFileStream) << (BYTE)FIELD_DESCRIPTOR_TERMINATOR; // kopf ende + (*m_pFileStream) << (char)DBF_EOL; m_pFileStream->Seek(10L); (*m_pFileStream) << nRecLength; // Satzlaenge nachtraeglich eintragen @@ -1201,6 +1222,7 @@ BOOL ODbaseTable::DropImpl() } return bDropped; } + //------------------------------------------------------------------ BOOL ODbaseTable::InsertRow(OValueRefVector& rRow, BOOL bFlush,const Reference<XIndexAccess>& _xCols) { @@ -1218,8 +1240,7 @@ BOOL ODbaseTable::InsertRow(OValueRefVector& rRow, BOOL bFlush,const Reference<X BOOL bInsertRow = UpdateBuffer( rRow, NULL, _xCols ); if ( bInsertRow ) { - m_pFileStream->Seek(STREAM_SEEK_TO_END); - nFileSize = m_pFileStream->Tell(); + nFileSize = lcl_getFileSize(*m_pFileStream); if (HasMemoFields() && m_pMemoStream) { @@ -1237,6 +1258,7 @@ BOOL ODbaseTable::InsertRow(OValueRefVector& rRow, BOOL bFlush,const Reference<X } else { + (*m_pFileStream) << (char)DBF_EOL; // write EOL // Anzahl Datensaetze im Header erhoehen: m_pFileStream->Seek( 4L ); (*m_pFileStream) << (m_aHeader.db_anz + 1); @@ -1726,7 +1748,7 @@ BOOL ODbaseTable::WriteMemo(ORowSetValue& aVariable, ULONG& rBlockNr) { case MemodBaseIII: // dBase III-Memofeld, endet mit Ctrl-Z { - const char cEOF = (char) 0x1a; + const char cEOF = (char) DBF_EOL; nSize++; // if (pData) @@ -2322,7 +2344,7 @@ BOOL ODbaseTable::ReadMemo(ULONG nBlockNo, ORowSetValue& aVariable) { case MemodBaseIII: // dBase III-Memofeld, endet mit Ctrl-Z { - const char cEOF = (char) 0x1a; + const char cEOF = (char) DBF_EOL; ByteString aBStr; static char aBuf[514]; aBuf[512] = 0; // sonst kann der Zufall uebel mitspielen diff --git a/connectivity/source/drivers/dbase/dindexnode.cxx b/connectivity/source/drivers/dbase/dindexnode.cxx index 7f751ac0103e..68804753b9d0 100644 --- a/connectivity/source/drivers/dbase/dindexnode.cxx +++ b/connectivity/source/drivers/dbase/dindexnode.cxx @@ -889,7 +889,7 @@ static UINT32 nValue; //------------------------------------------------------------------ SvStream& connectivity::dbase::operator >> (SvStream &rStream, ONDXPage& rPage) { - rStream.Seek(rPage.GetPagePos() * 512); + rStream.Seek(rPage.GetPagePos() * PAGE_SIZE); rStream >> nValue >> rPage.aChild; rPage.nCount = USHORT(nValue); @@ -903,17 +903,17 @@ SvStream& connectivity::dbase::operator >> (SvStream &rStream, ONDXPage& rPage) SvStream& connectivity::dbase::operator << (SvStream &rStream, const ONDXPage& rPage) { // Seite existiert noch nicht - ULONG nSize = (rPage.GetPagePos() + 1) * 512; + ULONG nSize = (rPage.GetPagePos() + 1) * PAGE_SIZE; if (nSize > rStream.Seek(STREAM_SEEK_TO_END)) { rStream.SetStreamSize(nSize); - rStream.Seek(rPage.GetPagePos() * 512); + rStream.Seek(rPage.GetPagePos() * PAGE_SIZE); - char aEmptyData[512]; - memset(aEmptyData,0x00,512); - rStream.Write((BYTE*)aEmptyData,512); + char aEmptyData[PAGE_SIZE]; + memset(aEmptyData,0x00,PAGE_SIZE); + rStream.Write((BYTE*)aEmptyData,PAGE_SIZE); } - ULONG nCurrentPos = rStream.Seek(rPage.GetPagePos() * 512); + ULONG nCurrentPos = rStream.Seek(rPage.GetPagePos() * PAGE_SIZE); OSL_UNUSED( nCurrentPos ); nValue = rPage.nCount; @@ -926,7 +926,7 @@ SvStream& connectivity::dbase::operator << (SvStream &rStream, const ONDXPage& r // check if we have to fill the stream with '\0' if(i < rPage.rIndex.getHeader().db_maxkeys) { - ULONG nTell = rStream.Tell() % 512; + ULONG nTell = rStream.Tell() % PAGE_SIZE; USHORT nBufferSize = rStream.GetBufferSize(); ULONG nRemainSize = nBufferSize - nTell; char* pEmptyData = new char[nRemainSize]; @@ -990,7 +990,7 @@ BOOL ONDXPage::IsFull() const USHORT ONDXPage::Search(const ONDXKey& rSearch) { // binare Suche spaeter - USHORT i = 0xFFFF; + USHORT i = NODE_NOTFOUND; while (++i < Count()) if ((*this)[i].GetKey() == rSearch) break; @@ -1001,7 +1001,7 @@ USHORT ONDXPage::Search(const ONDXKey& rSearch) //------------------------------------------------------------------ USHORT ONDXPage::Search(const ONDXPage* pPage) { - USHORT i = 0xFFFF; + USHORT i = NODE_NOTFOUND; while (++i < Count()) if (((*this)[i]).GetChild() == pPage) break; @@ -1057,4 +1057,3 @@ void ONDXPage::Remove(USHORT nPos) } // ----------------------------------------------------------------------------- - |