summaryrefslogtreecommitdiff
path: root/connectivity/source/drivers/dbase
diff options
context:
space:
mode:
Diffstat (limited to 'connectivity/source/drivers/dbase')
-rw-r--r--connectivity/source/drivers/dbase/DIndex.cxx76
-rw-r--r--connectivity/source/drivers/dbase/DIndexes.cxx4
-rw-r--r--connectivity/source/drivers/dbase/DTable.cxx36
-rw-r--r--connectivity/source/drivers/dbase/dindexnode.cxx21
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)
}
// -----------------------------------------------------------------------------
-