User: hr Date: 06/06/19 18:21:14 Modified: /dba/connectivity/source/drivers/dbase/ DTable.cxx
Log: INTEGRATION: CWS warnings01 (1.89.16); FILE MERGED 2006/05/29 09:24:38 fs 1.89.16.9: #i65538# 2006/05/23 23:32:16 sb 1.89.16.8: RESYNC: (1.92-1.93); FILE MERGED 2006/04/07 20:17:10 sb 1.89.16.7: RESYNC: (1.91-1.92); FILE MERGED 2006/01/30 14:18:51 sb 1.89.16.6: #i53898# Made code warning-free. 2006/01/25 20:48:51 sb 1.89.16.5: RESYNC: (1.90-1.91); FILE MERGED 2005/12/22 11:44:41 fs 1.89.16.4: #i57457# warning-free code 2005/11/16 12:58:55 fs 1.89.16.3: #i57457# warning free code 2005/11/07 19:06:41 pl 1.89.16.2: RESYNC: (1.89-1.90); FILE MERGED 2005/11/07 14:43:15 fs 1.89.16.1: #i57457# warning-free code File Changes: Directory: /dba/connectivity/source/drivers/dbase/ ================================================== File [changed]: DTable.cxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/drivers/dbase/DTable.cxx?r1=1.93&r2=1.94 Delta lines: +257 -39 ---------------------- --- DTable.cxx 7 Apr 2006 13:09:23 -0000 1.93 +++ DTable.cxx 20 Jun 2006 01:21:12 -0000 1.94 @@ -144,7 +144,6 @@ OSL_ENSURE(m_pFileStream,"No Stream available!"); if(!m_pFileStream) return; - sal_Bool bError = sal_False; m_pFileStream->RefreshBuffer(); // sicherstellen, dass die Kopfinformationen tatsaechlich neu gelesen werden m_pFileStream->Seek(STREAM_SEEK_TO_BEGIN); @@ -169,10 +168,7 @@ if(ERRCODE_NONE != m_pFileStream->GetErrorCode()) throwInvalidDbaseFormat(); - if (m_aHeader.db_anz < 0 || - m_aHeader.db_kopf <= 0 || - m_aHeader.db_slng <= 0 || - ((m_aHeader.db_kopf - 1) / 32 - 1) <= 0) // anzahl felder + if ( ( ( m_aHeader.db_kopf - 1 ) / 32 - 1 ) <= 0 ) // anzahl felder { // no dbase file throwInvalidDbaseFormat(); @@ -227,7 +223,6 @@ String aStrFieldName; aStrFieldName.AssignAscii("Column"); - sal_Int32 nFieldCnt = 0; ::rtl::OUString aTypeName; static const ::rtl::OUString sVARCHAR = ::rtl::OUString::createFromAscii("VARCHAR"); sal_Bool bCase = getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers(); @@ -358,9 +353,13 @@ // getEntry is expected to ensure the corect file name m_pFileStream = createStream_simpleError( sFileName, STREAM_READWRITE | STREAM_NOCREATE | STREAM_SHARE_DENYWRITE); + m_bWriteable = ( m_pFileStream != NULL ); - if (!(m_bWriteable = (NULL != m_pFileStream))) + if ( !m_pFileStream ) + { + m_bWriteable = sal_False; m_pFileStream = createStream_simpleError( sFileName, STREAM_READ | STREAM_NOCREATE | STREAM_SHARE_DENYNONE); + } if(m_pFileStream) { @@ -379,8 +378,11 @@ // allerdings koennen keine Updates durchgefuehrt werden // jedoch die Operation wird ausgefuehrt m_pMemoStream = createStream_simpleError( aURL.GetMainURL(INetURLObject::NO_DECODE), STREAM_READWRITE | STREAM_NOCREATE | STREAM_SHARE_DENYWRITE); - if (!(m_bWriteableMemo = (NULL != m_pMemoStream))) + if ( !m_pMemoStream ) + { + m_bWriteableMemo = sal_False; m_pMemoStream = createStream_simpleError( aURL.GetMainURL(INetURLObject::NO_DECODE), STREAM_READ | STREAM_NOCREATE | STREAM_SHARE_DENYNONE); + } if (m_pMemoStream) ReadMemoHeader(); } @@ -454,6 +456,9 @@ m_pMemoStream->Seek(6L); m_pMemoStream->SetNumberFormatInt(NUMBERFORMAT_INT_BIGENDIAN); (*m_pMemoStream) >> m_aMemoHeader.db_size; + default: + OSL_ENSURE( false, "ODbaseTable::ReadMemoHeader: unsupported memo type!" ); + break; } return TRUE; } @@ -532,7 +537,7 @@ ByteString aKeyName; ByteString aIndexName; - for (USHORT nKey = 0,nPos=0; nKey < nKeyCnt; nKey++) + for (USHORT nKey = 0; nKey < nKeyCnt; nKey++) { // Verweist der Key auf ein Indexfile?... aKeyName = aInfFile.GetKeyName( nKey ); @@ -623,10 +628,8 @@ sal_Int64 ODbaseTable::getSomething( const Sequence< sal_Int8 > & rId ) throw (RuntimeException) { return (rId.getLength() == 16 && 0 == rtl_compareMemory(getUnoTunnelImplementationId().getConstArray(), rId.getConstArray(), 16 ) ) - ? - (sal_Int64)this - : - ODbaseTable_BASE::getSomething(rId); + ? reinterpret_cast< sal_Int64 >( this ) + : ODbaseTable_BASE::getSomething(rId); } //------------------------------------------------------------------ sal_Bool ODbaseTable::fetchRow(OValueRefRow& _rRow,const OSQLColumns & _rCols, sal_Bool _bUseTableDefs,sal_Bool bRetrieveData) @@ -644,10 +647,10 @@ if (!bRetrieveData) return TRUE; - sal_Int32 nByteOffset = 1; + sal_Size nByteOffset = 1; // Felder: OSQLColumns::const_iterator aIter = _rCols.begin(); - for (sal_Int32 i = 1; aIter != _rCols.end() && nByteOffset <= m_nBufferSize && i < _rRow->size();++aIter, i++) + for (sal_Size i = 1; aIter != _rCols.end() && nByteOffset <= m_nBufferSize && i < _rRow->size();++aIter, i++) { // Laengen je nach Datentyp: sal_Int32 nLen; @@ -977,7 +980,7 @@ ::cppu::extractInterface(xCol,xColumns->getByIndex(i)); OSL_ENSURE(xCol.is(),"This should be a column!"); - char cTyp; + char cTyp( 'C' ); xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= aName; @@ -1042,7 +1045,7 @@ 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); + nRecLength = nRecLength + (USHORT)::std::min((USHORT)nPrecision, (USHORT)255UL); (*m_pFileStream) << (BYTE)0; //Nachkommastellen break; case 'F': @@ -1065,7 +1068,7 @@ (*m_pFileStream) << (BYTE)( nPrec); (*m_pFileStream) << (BYTE)nScale; - nRecLength += (USHORT)nPrec; + nRecLength = nRecLength + (USHORT)nPrec; } break; case 'L': @@ -1226,12 +1229,12 @@ // Gesamte neue Row uebernehmen: // ... und am Ende als neuen Record hinzufuegen: UINT32 nTempPos = m_nFilePos, - nFileSize, - nMemoFileSize; + nFileSize = 0, + nMemoFileSize = 0; - BOOL bInsertRow; m_nFilePos = (ULONG)m_aHeader.db_anz + 1; - if (bInsertRow = UpdateBuffer(rRow,NULL,_xCols)) + BOOL bInsertRow = UpdateBuffer( rRow, NULL, _xCols ); + if ( bInsertRow ) { m_pFileStream->Seek(STREAM_SEEK_TO_END); nFileSize = m_pFileStream->Tell(); @@ -1283,7 +1286,7 @@ m_pFileStream->Seek(nPos); m_pFileStream->Read((char*)m_pBuffer, m_aHeader.db_slng); - UINT32 nMemoFileSize; + UINT32 nMemoFileSize( 0 ); if (HasMemoFields() && m_pMemoStream) { m_pMemoStream->Seek(STREAM_SEEK_TO_END); @@ -1331,7 +1334,7 @@ Reference<XUnoTunnel> xTunnel(xIndex,UNO_QUERY); OSL_ENSURE(xTunnel.is(),"No TunnelImplementation!"); - ODbaseIndex* pIndex = (ODbaseIndex*)xTunnel->getSomething(ODbaseIndex::getUnoTunnelImplementationId()); + ODbaseIndex* pIndex = reinterpret_cast< ODbaseIndex* >( xTunnel->getSomething(ODbaseIndex::getUnoTunnelImplementationId()) ); OSL_ENSURE(pIndex,"ODbaseTable::DeleteRow: No Index returned!"); OSQLColumns::const_iterator aIter = _rCols.begin(); @@ -1442,7 +1445,7 @@ // ODbVariantRef xVar = (pVal == NULL) ? new ODbVariant() : pVal; Reference<XUnoTunnel> xTunnel(xIndex,UNO_QUERY); OSL_ENSURE(xTunnel.is(),"No TunnelImplementation!"); - ODbaseIndex* pIndex = (ODbaseIndex*)xTunnel->getSomething(ODbaseIndex::getUnoTunnelImplementationId()); + ODbaseIndex* pIndex = reinterpret_cast< ODbaseIndex* >( xTunnel->getSomething(ODbaseIndex::getUnoTunnelImplementationId()) ); OSL_ENSURE(pIndex,"ODbaseTable::UpdateBuffer: No Index returned!"); if (pIndex->Find(0,*rRow[nPos])) @@ -1536,7 +1539,7 @@ { Reference<XUnoTunnel> xTunnel(aIndexedCols[i],UNO_QUERY); OSL_ENSURE(xTunnel.is(),"No TunnelImplementation!"); - ODbaseIndex* pIndex = (ODbaseIndex*)xTunnel->getSomething(ODbaseIndex::getUnoTunnelImplementationId()); + ODbaseIndex* pIndex = reinterpret_cast< ODbaseIndex* >( xTunnel->getSomething(ODbaseIndex::getUnoTunnelImplementationId()) ); OSL_ENSURE(pIndex,"ODbaseTable::UpdateBuffer: No Index returned!"); // Update !! if (pOrgRow.isValid() && !rRow[nPos]->getValue().isNull() )//&& pVal->isModified()) @@ -1687,11 +1690,7 @@ BOOL ODbaseTable::WriteMemo(ORowSetValue& aVariable, ULONG& rBlockNr) { // wird die BlockNr 0 vorgegeben, wird der block ans Ende gehaengt - char cChar = 0; - BOOL bIsText = TRUE; - // SdbConnection* pConnection = GetConnection(); - ULONG nStreamSize; BYTE nHeader[4]; ::rtl::OUString sStringToWrite( aVariable.getString() ); @@ -1738,8 +1737,7 @@ if (bAppend) { - ULONG nStreamSize; - nStreamSize = m_pMemoStream->Seek(STREAM_SEEK_TO_END); + ULONG nStreamSize = m_pMemoStream->Seek(STREAM_SEEK_TO_END); // letzten block auffuellen rBlockNr = (nStreamSize / m_aMemoHeader.db_size) + ((nStreamSize % m_aMemoHeader.db_size) > 0 ? 1 : 0); @@ -1808,7 +1806,7 @@ // Schreiben der neuen Blocknummer if (bAppend) { - nStreamSize = m_pMemoStream->Seek(STREAM_SEEK_TO_END); + ULONG nStreamSize = m_pMemoStream->Seek(STREAM_SEEK_TO_END); m_aMemoHeader.db_next = (nStreamSize / m_aMemoHeader.db_size) + ((nStreamSize % m_aMemoHeader.db_size) > 0 ? 1 : 0); // Schreiben der neuen Blocknummer @@ -2203,9 +2201,11 @@ OValueRefVector::iterator aIter; for(sal_uInt32 nRowPos = 0; nRowPos < m_aHeader.db_anz;++nRowPos) { - if(bOk = seekRow(IResultSetHelper::BOOKMARK,nRowPos+1,nCurPos)) + bOk = seekRow( IResultSetHelper::BOOKMARK, nRowPos+1, nCurPos ); + if ( bOk ) { - if(bOk = fetchRow(aRow,m_aColumns.getBody(),sal_True,sal_True)) + bOk = fetchRow( aRow, m_aColumns.getBody(), sal_True, sal_True); + if ( bOk ) { // special handling when pos == 0 then we don't have to distinguish between the two rows if(_nPos) @@ -2226,8 +2226,8 @@ // now adjust the delete state if ( aRow->isDeleted() ) { - sal_Int32 nCurPos = 0; - _pNewTable->seekRow( IResultSetHelper::LAST ,0,nCurPos); + sal_Int32 nNewTablePos = 0; + _pNewTable->seekRow( IResultSetHelper::LAST , 0, nNewTablePos ); _pNewTable->DeleteRow(*_pNewTable->m_aColumns); } } @@ -2255,4 +2255,222 @@ { readHeader(); } +//------------------------------------------------------------------ +sal_Bool ODbaseTable::seekRow(IResultSetHelper::Movement eCursorPosition, sal_Int32 nOffset, sal_Int32& nCurPos) +{ + // ---------------------------------------------------------- + // Positionierung vorbereiten: + OSL_ENSURE(m_pFileStream,"ODbaseTable::seekRow: FileStream is NULL!"); + + sal_uInt32 nNumberOfRecords = (sal_uInt32)m_aHeader.db_anz; + sal_uInt32 nTempPos = m_nFilePos; + m_nFilePos = nCurPos; + + switch(eCursorPosition) + { + case IResultSetHelper::NEXT: + ++m_nFilePos; + break; + case IResultSetHelper::PRIOR: + if (m_nFilePos > 0) + --m_nFilePos; + break; + case IResultSetHelper::FIRST: + m_nFilePos = 1; + break; + case IResultSetHelper::LAST: + m_nFilePos = nNumberOfRecords; + break; + case IResultSetHelper::RELATIVE: + m_nFilePos = (((sal_Int32)m_nFilePos) + nOffset < 0) ? 0L + : (sal_uInt32)(((sal_Int32)m_nFilePos) + nOffset); + break; + case IResultSetHelper::ABSOLUTE: + case IResultSetHelper::BOOKMARK: + m_nFilePos = (sal_uInt32)nOffset; + break; + } + + if (m_nFilePos > (sal_Int32)nNumberOfRecords) + m_nFilePos = (sal_Int32)nNumberOfRecords + 1; + + if (m_nFilePos == 0 || m_nFilePos == (sal_Int32)nNumberOfRecords + 1) + goto Error; + else + { + sal_uInt16 nEntryLen = m_aHeader.db_slng; + + OSL_ENSURE(m_nFilePos >= 1,"SdbDBFCursor::FileFetchRow: ungueltige Record-Position"); + sal_Int32 nPos = m_aHeader.db_kopf + (sal_Int32)(m_nFilePos-1) * nEntryLen; + + ULONG nLen = m_pFileStream->Seek(nPos); + if (m_pFileStream->GetError() != ERRCODE_NONE) + goto Error; + + nLen = m_pFileStream->Read((char*)m_pBuffer, nEntryLen); + if (m_pFileStream->GetError() != ERRCODE_NONE) + goto Error; + } + goto End; + +Error: + switch(eCursorPosition) + { + case IResultSetHelper::PRIOR: + case IResultSetHelper::FIRST: + m_nFilePos = 0; + break; + case IResultSetHelper::LAST: + case IResultSetHelper::NEXT: + case IResultSetHelper::ABSOLUTE: + case IResultSetHelper::RELATIVE: + if (nOffset > 0) + m_nFilePos = nNumberOfRecords + 1; + else if (nOffset < 0) + m_nFilePos = 0; + break; + case IResultSetHelper::BOOKMARK: + m_nFilePos = nTempPos; // vorherige Position + } + // aStatus.Set(SDB_STAT_NO_DATA_FOUND); + return sal_False; + +End: + nCurPos = m_nFilePos; + return sal_True; +} // ----------------------------------------------------------------------------- +BOOL ODbaseTable::ReadMemo(ULONG nBlockNo, ORowSetValue& aVariable) +{ + BOOL bIsText = TRUE; + // SdbConnection* pConnection = GetConnection(); + + m_pMemoStream->Seek(nBlockNo * m_aMemoHeader.db_size); + switch (m_aMemoHeader.db_typ) + { + case MemodBaseIII: // dBase III-Memofeld, endet mit Ctrl-Z + { + const char cEOF = (char) 0x1a; + ByteString aBStr; + static char aBuf[514]; + aBuf[512] = 0; // sonst kann der Zufall uebel mitspielen + BOOL bReady = sal_False; + + do + { + m_pMemoStream->Read(&aBuf,512); + + USHORT i = 0; + while (aBuf[i] != cEOF && ++i < 512) + ; + bReady = aBuf[i] == cEOF; + + aBuf[i] = 0; + aBStr += aBuf; + + } while (!bReady && !m_pMemoStream->IsEof() && aBStr.Len() < STRING_MAXLEN); + + ::rtl::OUString aStr(aBStr.GetBuffer(), aBStr.Len(),getConnection()->getTextEncoding()); + aVariable = aStr; + + } break; + case MemoFoxPro: + case MemodBaseIV: // dBase IV-Memofeld mit Laengenangabe + { + char sHeader[4]; + m_pMemoStream->Read(sHeader,4); + // Foxpro stores text and binary data + if (m_aMemoHeader.db_typ == MemoFoxPro) + { + if (((BYTE)sHeader[0]) != 0 || ((BYTE)sHeader[1]) != 0 || ((BYTE)sHeader[2]) != 0) + { +// String aText = String(SdbResId(STR_STAT_IResultSetHelper::INVALID)); +// aText.SearchAndReplace(String::CreateFromAscii("%%d"),m_pMemoStream->GetFileName()); +// aText.SearchAndReplace(String::CreateFromAscii("%%t"),aStatus.TypeToString(MEMO)); +// aStatus.Set(SDB_STAT_ERROR, +// String::CreateFromAscii("01000"), +// aStatus.CreateErrorMessage(aText), +// 0, String() ); + return sal_False; + } + + bIsText = sHeader[3] != 0; + } + else if (((BYTE)sHeader[0]) != 0xFF || ((BYTE)sHeader[1]) != 0xFF || ((BYTE)sHeader[2]) != 0x08) + { +// String aText = String(SdbResId(STR_STAT_IResultSetHelper::INVALID)); +// aText.SearchAndReplace(String::CreateFromAscii("%%d"),m_pMemoStream->GetFileName()); +// aText.SearchAndReplace(String::CreateFromAscii("%%t"),aStatus.TypeToString(MEMO)); +// aStatus.Set(SDB_STAT_ERROR, +// String::CreateFromAscii("01000"), +// aStatus.CreateErrorMessage(aText), +// 0, String() ); + return sal_False; + } + + ULONG nLength; + (*m_pMemoStream) >> nLength; + + if (m_aMemoHeader.db_typ == MemodBaseIV) + nLength -= 8; + + // char cChar; + ::rtl::OUString aStr; + while ( nLength > STRING_MAXLEN ) + { + ByteString aBStr; + aBStr.Expand(STRING_MAXLEN); + m_pMemoStream->Read(aBStr.AllocBuffer(STRING_MAXLEN),STRING_MAXLEN); + aStr += ::rtl::OUString(aBStr.GetBuffer(),aBStr.Len(), getConnection()->getTextEncoding()); + nLength -= STRING_MAXLEN; + } + if ( nLength > 0 ) + { + ByteString aBStr; + aBStr.Expand(static_cast<xub_StrLen>(nLength)); + m_pMemoStream->Read(aBStr.AllocBuffer(static_cast<xub_StrLen>(nLength)),nLength); + // aBStr.ReleaseBufferAccess(); + + aStr += ::rtl::OUString(aBStr.GetBuffer(),aBStr.Len(), getConnection()->getTextEncoding()); + + } + if ( aStr.getLength() ) + aVariable = aStr; + } + } + return sal_True; +} +// ----------------------------------------------------------------------------- +void ODbaseTable::AllocBuffer() +{ + UINT16 nSize = m_aHeader.db_slng; + OSL_ENSURE(nSize > 0, "Size too small"); + + if (m_nBufferSize != nSize) + { + delete m_pBuffer; + m_pBuffer = NULL; + } + + // Falls noch kein Puffer vorhanden: allozieren: + if (m_pBuffer == NULL && nSize) + { + m_nBufferSize = nSize; + m_pBuffer = new BYTE[m_nBufferSize+1]; + } +} +// ----------------------------------------------------------------------------- +BOOL ODbaseTable::WriteBuffer() +{ + OSL_ENSURE(m_nFilePos >= 1,"SdbDBFCursor::FileFetchRow: ungueltige Record-Position"); + + // Auf gewuenschten Record positionieren: + long nPos = m_aHeader.db_kopf + (long)(m_nFilePos-1) * m_aHeader.db_slng; + m_pFileStream->Seek(nPos); + return m_pFileStream->Write((char*) m_pBuffer, m_aHeader.db_slng) > 0; +} +// ----------------------------------------------------------------------------- +sal_Int32 ODbaseTable::getCurrentLastPos() const +{ + return m_aHeader.db_anz; +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
