summaryrefslogtreecommitdiff
path: root/connectivity
diff options
context:
space:
mode:
authorOcke Janssen <oj@openoffice.org>2001-06-29 07:29:14 +0000
committerOcke Janssen <oj@openoffice.org>2001-06-29 07:29:14 +0000
commit63bb17180bb8601e07671069a68a463d6279ca3c (patch)
tree18d5aac1df956c5005c093d54a04b2873609ae7e /connectivity
parent336f068ab71fc104744e8757d1baeddf81447f29 (diff)
#88282# copydata corrected
Diffstat (limited to 'connectivity')
-rw-r--r--connectivity/source/drivers/dbase/DNoException.cxx5
-rw-r--r--connectivity/source/drivers/dbase/DTable.cxx456
-rw-r--r--connectivity/source/inc/dbase/DTable.hxx6
3 files changed, 256 insertions, 211 deletions
diff --git a/connectivity/source/drivers/dbase/DNoException.cxx b/connectivity/source/drivers/dbase/DNoException.cxx
index 89ea25f92048..5f416fa3b5d3 100644
--- a/connectivity/source/drivers/dbase/DNoException.cxx
+++ b/connectivity/source/drivers/dbase/DNoException.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: DNoException.cxx,v $
*
- * $Revision: 1.1 $
+ * $Revision: 1.2 $
*
- * last change: $Author: oj $ $Date: 2001-05-23 09:18:28 $
+ * last change: $Author: oj $ $Date: 2001-06-29 08:28:41 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -81,6 +81,7 @@ sal_Bool ODbaseTable::seekRow(FilePosition eCursorPosition, sal_Int32 nOffset, s
{
// ----------------------------------------------------------
// 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;
diff --git a/connectivity/source/drivers/dbase/DTable.cxx b/connectivity/source/drivers/dbase/DTable.cxx
index 7d4f1c09862c..2599fbbe0a3b 100644
--- a/connectivity/source/drivers/dbase/DTable.cxx
+++ b/connectivity/source/drivers/dbase/DTable.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: DTable.cxx,v $
*
- * $Revision: 1.51 $
+ * $Revision: 1.52 $
*
- * last change: $Author: nn $ $Date: 2001-06-14 15:16:41 $
+ * last change: $Author: oj $ $Date: 2001-06-29 08:28:41 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -586,10 +586,10 @@ Any SAL_CALL ODbaseTable::queryInterface( const Type & rType ) throw(RuntimeExce
return Any();
Any aRet = ::cppu::queryInterface(rType,static_cast< ::com::sun::star::lang::XUnoTunnel*> (this));
- if(aRet.hasValue())
- return aRet;
+ if(!aRet.hasValue())
+ aRet = OTable_TYPEDEF::queryInterface(rType);
- return OTable_TYPEDEF::queryInterface(rType);
+ return aRet;
}
//--------------------------------------------------------------------------
@@ -1114,47 +1114,46 @@ BOOL ODbaseTable::CreateMemoFile(const INetURLObject& aFile)
//------------------------------------------------------------------
BOOL ODbaseTable::DropImpl()
{
-// NAMESPACE_VOS(OGuard) aGuard(m_pLock);
-//
-// if (InUse())
-// {
-// aStatus.SetError(ERRCODE_IO_LOCKVIOLATION,TABLE,aName);
-// return sal_False;
-// }
-
FileClose();
INetURLObject aURL;
aURL.SetURL(getEntry());
- if(!::utl::UCBContentHelper::Kill(aURL.GetURLNoPass()))
- return sal_False;
+ BOOL bDropped = FALSE;
- if (HasMemoFields())
+ if(bDropped = ::utl::UCBContentHelper::Kill(aURL.GetURLNoPass()))
{
- aURL.setExtension(String::CreateFromAscii("dbt"));
- if(!::utl::UCBContentHelper::Kill(aURL.GetURLNoPass()))
- return sal_False;
- }
+ if (HasMemoFields())
+ { // delete the memo fields
+ aURL.setExtension(String::CreateFromAscii("dbt"));
+ bDropped = ::utl::UCBContentHelper::Kill(aURL.GetURLNoPass());
+ }
- // jetzt noch die Indices loeschen
- String aIndexName;
- // aFile.SetExtension(String::CreateFromAscii("ndx"));
- refreshIndexes(); // look for indexes which must be deleted as well
- if(m_pIndexes)
- {
- sal_Int32 nCount = m_pIndexes->getCount(),
- i = 0;
- while (i < nCount)
+ if(bDropped)
{
- m_pIndexes->dropByIndex(i);
+ // now delete all indices
+ refreshIndexes(); // look for indexes which must be deleted as well
+ if(m_pIndexes)
+ {
+ sal_Int32 nCount = m_pIndexes->getCount(),
+ i = 0;
+ while (i < nCount)
+ {
+ m_pIndexes->dropByIndex(i);
+ }
+ }
+ // aFile.SetBase(m_Name);
+ aURL.setExtension(String::CreateFromAscii("inf"));
+ bDropped = ::utl::UCBContentHelper::Kill(aURL.GetURLNoPass());
}
}
- // aFile.SetBase(m_Name);
- aURL.setExtension(String::CreateFromAscii("inf"));
- if(!::utl::UCBContentHelper::Kill(aURL.GetURLNoPass()))
- return sal_False;
- return TRUE;
+ if(!bDropped)
+ {// we couldn't drop the table so we have to reopen it
+ construct();
+ if(m_pColumns)
+ m_pColumns->refresh();
+ }
+ return bDropped;
}
//------------------------------------------------------------------
BOOL ODbaseTable::InsertRow(OValueVector& rRow, BOOL bFlush,const Reference<XIndexAccess>& _xCols)
@@ -1169,47 +1168,47 @@ BOOL ODbaseTable::InsertRow(OValueVector& rRow, BOOL bFlush,const Reference<XInd
nFileSize,
nMemoFileSize;
+ BOOL bInsertRow;
m_nFilePos = (ULONG)m_aHeader.db_anz + 1;
- if (!UpdateBuffer(rRow,NULL,_xCols))
+ if (bInsertRow = UpdateBuffer(rRow,NULL,_xCols))
{
- m_nFilePos = nTempPos;
- return sal_False;
- }
-
- m_pFileStream->Seek(STREAM_SEEK_TO_END);
- nFileSize = m_pFileStream->Tell();
+ m_pFileStream->Seek(STREAM_SEEK_TO_END);
+ nFileSize = m_pFileStream->Tell();
- if (HasMemoFields() && m_pMemoStream)
- {
- m_pMemoStream->Seek(STREAM_SEEK_TO_END);
- nMemoFileSize = m_pMemoStream->Tell();
- }
+ if (HasMemoFields() && m_pMemoStream)
+ {
+ m_pMemoStream->Seek(STREAM_SEEK_TO_END);
+ nMemoFileSize = m_pMemoStream->Tell();
+ }
- if (!WriteBuffer())
- {
- m_pFileStream->SetStreamSize(nFileSize); // alte Gre restaurieren
+ if (!WriteBuffer())
+ {
+ m_pFileStream->SetStreamSize(nFileSize); // alte Gre restaurieren
- if (HasMemoFields() && m_pMemoStream)
- m_pMemoStream->SetStreamSize(nMemoFileSize); // alte Gre restaurieren
- m_nFilePos = nTempPos; // Fileposition restaurieren
+ if (HasMemoFields() && m_pMemoStream)
+ m_pMemoStream->SetStreamSize(nMemoFileSize); // alte Gre restaurieren
+ m_nFilePos = nTempPos; // Fileposition restaurieren
+ }
+ else
+ {
+ // Anzahl Datensaetze im Header erhoehen:
+ m_pFileStream->Seek( 4L );
+ (*m_pFileStream) << (m_aHeader.db_anz + 1);
+
+ // beim AppendOnly kein Flush!
+ if (bFlush)
+ m_pFileStream->Flush();
+
+ // bei Erfolg # erhhen
+ m_aHeader.db_anz++;
+ rRow[0] = m_nFilePos; // BOOKmark setzen
+ m_nFilePos = nTempPos;
+ }
}
else
- {
- // Anzahl Datensaetze im Header erhoehen:
- m_pFileStream->Seek( 4L );
- (*m_pFileStream) << (m_aHeader.db_anz + 1);
-
- // beim AppendOnly kein Flush!
- if (bFlush)
- m_pFileStream->Flush();
-
- // bei Erfolg # erhhen
- m_aHeader.db_anz++;
- rRow[0] = m_nFilePos; // BOOKmark setzen
m_nFilePos = nTempPos;
- }
- return sal_True;;
+ return bInsertRow;;
}
//------------------------------------------------------------------
@@ -1261,35 +1260,35 @@ BOOL ODbaseTable::DeleteRow(const OSQLColumns& _rCols)
for (USHORT i = 0; i < m_pColumns->getCount(); i++)
{
::cppu::extractInterface(xCol,m_pColumns->getByIndex(i));
- // const SdbFILEColumn *pColumn = (const SdbFILEColumn *)(*aOriginalColumns)[i];
+ OSL_ENSURE(xCol.is(),"ODbaseTable::DeleteRow column is null!");
- xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= aColName;
- Reference<XPropertySet> xIndex = isUniqueByColumnName(aColName);
- if (xIndex.is())
+ if(xCol.is())
{
- Reference<XUnoTunnel> xTunnel(xIndex,UNO_QUERY);
- OSL_ENSURE(xTunnel.is(),"No TunnelImplementation!");
- ODbaseIndex* pIndex = (ODbaseIndex*)xTunnel->getSomething(ODbaseIndex::getUnoTunnelImplementationId());
- OSL_ENSURE(pIndex,"ODbaseTable::UpdateBuffer: No Index returned!");
-
- OSQLColumns::const_iterator aIter = _rCols.begin();
- // sal_Int32 nPos = 0;
- for(;aIter != _rCols.end();++aIter,++nPos)
+ xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= aColName;
+ Reference<XPropertySet> xIndex = isUniqueByColumnName(aColName);
+ if (xIndex.is())
{
-// Reference<XPropertySet> xFindCol;
-// _xCols->getByIndex(nPos) >>= xFindCol;
- if(aCase(getString((*aIter)->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_REALNAME))),aColName))
- break;
- }
- if (aIter == _rCols.end())
- continue;
+ Reference<XUnoTunnel> xTunnel(xIndex,UNO_QUERY);
+ OSL_ENSURE(xTunnel.is(),"No TunnelImplementation!");
+ ODbaseIndex* pIndex = (ODbaseIndex*)xTunnel->getSomething(ODbaseIndex::getUnoTunnelImplementationId());
+ OSL_ENSURE(pIndex,"ODbaseTable::DeleteRow: No Index returned!");
+
+ OSQLColumns::const_iterator aIter = _rCols.begin();
+ for(;aIter != _rCols.end();++aIter,++nPos)
+ {
+ if(aCase(getString((*aIter)->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_REALNAME))),aColName))
+ break;
+ }
+ if (aIter == _rCols.end())
+ continue;
- pIndex->Delete(m_nFilePos,(*aRow)[nPos]);
+ pIndex->Delete(m_nFilePos,(*aRow)[nPos]);
+ }
}
}
m_pFileStream->Seek(nPos);
- (*m_pFileStream) << (BYTE)'*';
+ (*m_pFileStream) << (BYTE)'*'; // mark the row in the table as deleted
m_pFileStream->Flush();
return sal_True;;
}
@@ -1348,14 +1347,15 @@ BOOL ODbaseTable::UpdateBuffer(OValueVector& rRow, OValueRow pOrgRow,const Refer
for (i = 0; i < m_pColumns->getCount(); i++)
{
m_pColumns->getByIndex(i) >>= xCol;
+ OSL_ENSURE(xCol.is(),"ODbaseTable::UpdateBuffer column is null!");
xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= aColName;
- // const SdbFILEColumn *pColumn = (const SdbFILEColumn *)(*aOriginalColumns)[i];
sal_Int32 nPos = 0;
for(;nPos<_xCols->getCount();++nPos)
{
Reference<XPropertySet> xFindCol;
::cppu::extractInterface(xFindCol,_xCols->getByIndex(nPos));
+ OSL_ENSURE(xFindCol.is(),"ODbaseTable::UpdateBuffer column is null!");
if(aCase(getString(xFindCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME))),aColName))
break;
}
@@ -1393,6 +1393,7 @@ BOOL ODbaseTable::UpdateBuffer(OValueVector& rRow, OValueRow pOrgRow,const Refer
for (i = 0; i < m_pColumns->getCount(); i++)
{
m_pColumns->getByIndex(i) >>= xCol;
+ OSL_ENSURE(xCol.is(),"ODbaseTable::UpdateBuffer column is null!");
xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= aColName;
// Laengen je nach Datentyp:
@@ -1405,8 +1406,8 @@ BOOL ODbaseTable::UpdateBuffer(OValueVector& rRow, OValueRow pOrgRow,const Refer
case DataType::DECIMAL:
nLen = SvDbaseConverter::ConvertPrecisionToDbase(nLen,getINT32(xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE))));
break; // das Vorzeichen und das Komma
- case DataType::BIT: nLen = 1; break;
- case DataType::LONGVARCHAR:nLen = 10; break;
+ case DataType::BIT: nLen = 1; break;
+ case DataType::LONGVARCHAR: nLen = 10; break;
default: break;
}
@@ -1444,10 +1445,7 @@ BOOL ODbaseTable::UpdateBuffer(OValueVector& rRow, OValueRow pOrgRow,const Refer
if (pOrgRow.isValid() && !rRow[nPos].isNull() )//&& pVal->isModified())
pIndex->Update(m_nFilePos,(*pOrgRow)[nPos],rRow[nPos]);
else
- {
- // ODbVariantRef xVar = (pVal == NULL) ? new ODbVariant() : pVal;
pIndex->Insert(m_nFilePos,rRow[nPos]);
- }
}
@@ -1593,109 +1591,104 @@ void ODbaseTable::alterColumn(sal_Int32 index,
if(index < 0 || index >= m_pColumns->getCount())
throw IndexOutOfBoundsException(::rtl::OUString::valueOf(index),*this);
- OSL_ENSURE(descriptor.is(),"descriptor can not be null!");
- // creates a copy of the the original column and copy all properties from descriptor in xCopyColumn
- Reference<XPropertySet> xCopyColumn;
- if(xOldColumn.is())
- xCopyColumn = xOldColumn->createDataDescriptor();
- else
- xCopyColumn = new OColumn(getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers());
-
- ::comphelper::copyProperties(descriptor,xCopyColumn);
-
-
-// // get the name
-// ::rtl::OUString sOldName,sNewName;
-// xOldColumn->getPropertyByName(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= sOldName;
-// descriptor->getPropertyByName(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME)) >>= sNewName;
-//
-// // get the type
-// sal_Int32 nOldType,nNewType;
-// xOldColumn->getPropertyByName(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)) >>= nOldType;
-// descriptor->getPropertyByName(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)) >>= nNewType;
-//
-// // get the precision
-// sal_Int32 nOldPrec,nNewPrec;
-// xOldColumn->getPropertyByName(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION)) >>= nOldPrec;
-// descriptor->getPropertyByName(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION)) >>= nNewPrec;
-//
-// // get the scale
-// sal_Int32 nOldScale,nNewScale;
-// xOldColumn->getPropertyByName(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE)) >>= nOldScale;
-// descriptor->getPropertyByName(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE)) >>= nNewScale;
-//
-// // check if currency changed
-// sal_Bool bOldCur,bNewCur;
-// bOldCur = ::cppu::any2bool(xOldColumn->getPropertyByName(PROPERTY_ISCURRENCY));
-// bNewCur = ::cppu::any2bool(descriptor->getPropertyByName(PROPERTY_ISCURRENCY));
-
- // creates a temp file
+ ODbaseTable* pNewTable = NULL;
+ try
+ {
+ OSL_ENSURE(descriptor.is(),"ODbaseTable::alterColumn: descriptor can not be null!");
+ // creates a copy of the the original column and copy all properties from descriptor in xCopyColumn
+ Reference<XPropertySet> xCopyColumn;
+ if(xOldColumn.is())
+ xCopyColumn = xOldColumn->createDataDescriptor();
+ else
+ xCopyColumn = new OColumn(getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers());
- String sTempName = createTempFile();
+ ::comphelper::copyProperties(descriptor,xCopyColumn);
- ODbaseTable* pNewTable = new ODbaseTable(static_cast<ODbaseConnection*>(m_pConnection));
- Reference<XPropertySet> xHoldTable = pNewTable;
- pNewTable->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME),makeAny(::rtl::OUString(sTempName)));
- Reference<XAppend> xAppend(pNewTable->getColumns(),UNO_QUERY);
+ // creates a temp file
- // copy the structure
- sal_Int32 i=0;
- for(;i < index;++i)
- {
- Reference<XPropertySet> xProp;
- m_pColumns->getByIndex(i) >>= xProp;
- Reference<XDataDescriptorFactory> xColumn(xProp,UNO_QUERY);
- Reference<XPropertySet> xCpy;
- if(xColumn.is())
- xCpy = xColumn->createDataDescriptor();
- else
+ String sTempName = createTempFile();
+
+ pNewTable = new ODbaseTable(static_cast<ODbaseConnection*>(m_pConnection));
+ Reference<XPropertySet> xHoldTable = pNewTable;
+ pNewTable->setPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_NAME),makeAny(::rtl::OUString(sTempName)));
+ Reference<XAppend> xAppend(pNewTable->getColumns(),UNO_QUERY);
+ OSL_ENSURE(xAppend.is(),"ODbaseTable::alterColumn: No XAppend interface!");
+
+ // copy the structure
+ sal_Int32 i=0;
+ for(;i < index;++i)
{
- xCpy = new OColumn(getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers());
- ::comphelper::copyProperties(xProp,xCpy);
+ Reference<XPropertySet> xProp;
+ m_pColumns->getByIndex(i) >>= xProp;
+ Reference<XDataDescriptorFactory> xColumn(xProp,UNO_QUERY);
+ Reference<XPropertySet> xCpy;
+ if(xColumn.is())
+ xCpy = xColumn->createDataDescriptor();
+ else
+ {
+ xCpy = new OColumn(getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers());
+ ::comphelper::copyProperties(xProp,xCpy);
+ }
+ xAppend->appendByDescriptor(xCpy);
}
- xAppend->appendByDescriptor(xCpy);
- }
- ++i; // now insert our new column
- xAppend->appendByDescriptor(xCopyColumn);
+ ++i; // now insert our new column
+ xAppend->appendByDescriptor(xCopyColumn);
- for(;i < m_pColumns->getCount();++i)
- {
- Reference<XPropertySet> xProp;
- m_pColumns->getByIndex(i) >>= xProp;
- Reference<XDataDescriptorFactory> xColumn(xProp,UNO_QUERY);
- Reference<XPropertySet> xCpy;
- if(xColumn.is())
- xCpy = xColumn->createDataDescriptor();
- else
+ for(;i < m_pColumns->getCount();++i)
{
- xCpy = new OColumn(getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers());
- ::comphelper::copyProperties(xProp,xCpy);
+ Reference<XPropertySet> xProp;
+ m_pColumns->getByIndex(i) >>= xProp;
+ Reference<XDataDescriptorFactory> xColumn(xProp,UNO_QUERY);
+ Reference<XPropertySet> xCpy;
+ if(xColumn.is())
+ xCpy = xColumn->createDataDescriptor();
+ else
+ {
+ xCpy = new OColumn(getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers());
+ ::comphelper::copyProperties(xProp,xCpy);
+ }
+ xAppend->appendByDescriptor(xCpy);
}
- xAppend->appendByDescriptor(xCpy);
- }
-
- // construct the new table
- if(!pNewTable->CreateImpl())
- {
- delete pNewTable;
- return;
- }
- pNewTable->construct();
- // copy the data
- copyData(pNewTable);
+ // construct the new table
+ if(!pNewTable->CreateImpl())
+ {
+ delete pNewTable;
+ return;
+ }
+ pNewTable->construct();
+ // copy the data
+ copyData(pNewTable,0);
- DropImpl();
- pNewTable->rename(m_Name);
- // release the temp file
- pNewTable = NULL;
- ::comphelper::disposeComponent(xHoldTable);
+ // now drop the old one
+ if(DropImpl())
+ {
+ // rename the new one to the old one
+ pNewTable->rename(m_Name);
+ // release the temp file
+ pNewTable = NULL;
+ ::comphelper::disposeComponent(xHoldTable);
+ }
+ else
+ delete pNewTable;
+ FileClose();
+ construct();
+ if(m_pColumns)
+ m_pColumns->refresh();
- FileClose();
- construct();
- if(m_pColumns)
- m_pColumns->refresh();
+ }
+ catch(const SQLException&)
+ {
+ delete pNewTable;
+ throw;
+ }
+ catch(const Exception&)
+ {
+ OSL_ENSURE(0,"ODbaseTable::alterColumn: Exception occured!");
+ delete pNewTable;
+ throw;
+ }
}
// -------------------------------------------------------------------------
void SAL_CALL ODbaseTable::rename( const ::rtl::OUString& newName ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::container::ElementExistException, ::com::sun::star::uno::RuntimeException)
@@ -1774,22 +1767,39 @@ void ODbaseTable::addColumn(const Reference< XPropertySet >& _xNewColumn)
// construct the new table
if(!pNewTable->CreateImpl())
{
- return;
+ delete pNewTable;
+ throw SQLException();
}
- pNewTable->construct();
- // copy the data
- copyData(pNewTable);
- // drop the old table
- DropImpl();
- pNewTable->rename(m_Name);
- // release the temp file
- pNewTable->release();
+ BOOL bAlreadyDroped = FALSE;
+ try
+ {
+ pNewTable->construct();
+ // copy the data
+ copyData(pNewTable,pNewTable->m_pColumns->getCount());
+ // drop the old table
+ if(DropImpl())
+ {
+ bAlreadyDroped = TRUE;
+ pNewTable->rename(m_Name);
+ // release the temp file
+ pNewTable->release();
+ }
+ else
+ delete pNewTable;
+ FileClose();
+ construct();
+ if(m_pColumns)
+ m_pColumns->refresh();
+ }
+ catch(const SQLException&)
+ {
+ // here we know that the old table wasn't droped before
+ if(!bAlreadyDroped)
+ delete pNewTable;
- FileClose();
- construct();
- if(m_pColumns)
- m_pColumns->refresh();
+ throw;
+ }
}
// -----------------------------------------------------------------------------
void ODbaseTable::dropColumn(sal_Int32 _nPos)
@@ -1826,16 +1836,21 @@ void ODbaseTable::dropColumn(sal_Int32 _nPos)
// construct the new table
if(!pNewTable->CreateImpl())
{
- return;
+ delete pNewTable;
+ throw SQLException();
}
pNewTable->construct();
// copy the data
- copyData(pNewTable);
+ copyData(pNewTable,_nPos);
// drop the old table
- DropImpl();
- pNewTable->rename(m_Name);
- // release the temp file
- pNewTable->release();
+ if(DropImpl())
+ {
+ pNewTable->rename(m_Name);
+ // release the temp file
+ pNewTable->release();
+ }
+ else
+ delete pNewTable;
FileClose();
@@ -1867,11 +1882,26 @@ String ODbaseTable::createTempFile()
return sNewName;
}
// -----------------------------------------------------------------------------
-void ODbaseTable::copyData(ODbaseTable* _pNewTable)
+void ODbaseTable::copyData(ODbaseTable* _pNewTable,sal_Int32 _nPos)
{
+ sal_Int32 nPos = _nPos + 1; // +1 because we always have the bookmark clumn as well
OValueRow aRow = new OValueVector(m_pColumns->getCount());
+ OValueRow aInsertRow;
+ if(nPos)
+ {
+ aInsertRow = new OValueVector(_pNewTable->m_pColumns->getCount());
+ for(OValueVector::iterator aInsertIter = aInsertRow->begin(); aInsertIter != aInsertRow->end();++aInsertIter)
+ aInsertIter->setBound(sal_True);
+ }
+ else
+ aInsertRow = aRow;
+
+ // we only have to bind the values which we need to copy into the new table
for(OValueVector::iterator aIter = aRow->begin(); aIter != aRow->end();++aIter)
aIter->setBound(sal_True);
+ if(nPos && nPos < aRow->size())
+ (*aRow)[nPos].setBound(sal_False);
+
sal_Bool bOk = sal_True;
sal_Int32 nCurPos;
@@ -1881,7 +1911,21 @@ void ODbaseTable::copyData(ODbaseTable* _pNewTable)
{
if(bOk = fetchRow(aRow,m_aColumns.getBody(),sal_True,sal_True))
{
- bOk = _pNewTable->InsertRow(*aRow,sal_True,_pNewTable->m_pColumns);
+ // special handling when pos == 0 then we don't have to distinguish between the two rows
+ if(nPos)
+ {
+ aIter = aRow->begin()+1;
+ sal_Int32 nCount = 1;
+ for(OValueVector::iterator aInsertIter = aInsertRow->begin()+1; aIter != aRow->end() && aInsertIter != aInsertRow->end();++aIter,++nCount)
+ {
+ if(nPos != nCount)
+ {
+ *aInsertIter = *aIter;
+ ++aInsertIter;
+ }
+ }
+ }
+ bOk = _pNewTable->InsertRow(*aInsertRow,sal_True,_pNewTable->m_pColumns);
OSL_ENSURE(bOk,"Row could not be inserted!");
}
else
diff --git a/connectivity/source/inc/dbase/DTable.hxx b/connectivity/source/inc/dbase/DTable.hxx
index 4e1b1f492d63..74c4f209d880 100644
--- a/connectivity/source/inc/dbase/DTable.hxx
+++ b/connectivity/source/inc/dbase/DTable.hxx
@@ -2,9 +2,9 @@
*
* $RCSfile: DTable.hxx,v $
*
- * $Revision: 1.23 $
+ * $Revision: 1.24 $
*
- * last change: $Author: oj $ $Date: 2001-05-30 10:44:16 $
+ * last change: $Author: oj $ $Date: 2001-06-29 08:29:14 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -144,7 +144,7 @@ namespace connectivity
void readHeader();
void fillColumns();
String createTempFile();
- void copyData(ODbaseTable* _pNewTable);
+ void copyData(ODbaseTable* _pNewTable,sal_Int32 _nPos);
BOOL CreateFile(const INetURLObject& aFile, BOOL& bCreateMemo);
BOOL CreateMemoFile(const INetURLObject& aFile);
BOOL HasMemoFields() const { return m_aHeader.db_typ > dBaseIV;}