From 9552e400c3149e859440a0afa4e3d3285189a25f Mon Sep 17 00:00:00 2001 From: SeungYeup Kim Date: Tue, 19 Mar 2013 09:22:07 +0900 Subject: [PATCH] Modify DataSet::CloneN to deep copy Change-Id: Iae8e2560b1b83819f244065b8d9888fcc13f02cf --- src/io/FIo_DataRowImpl.cpp | 25 ++++++++++++++++++++++++- src/io/FIo_DataSetImpl.cpp | 38 ++++++++++++++++++++++++++++++++------ src/io/inc/FIo_DataSetImpl.h | 3 +++ 3 files changed, 59 insertions(+), 7 deletions(-) diff --git a/src/io/FIo_DataRowImpl.cpp b/src/io/FIo_DataRowImpl.cpp index 58a86ac..6e6f7be 100755 --- a/src/io/FIo_DataRowImpl.cpp +++ b/src/io/FIo_DataRowImpl.cpp @@ -341,11 +341,34 @@ _DataRowImpl::Clone(const ArrayList* pOthersRowArrayList) const pItem->type = pOthersItem->type; pItem->size = pOthersItem->size; - pItem->pObj = pOthersItem->pObj; pItem->intValue = pOthersItem->intValue; pItem->int64Value = pOthersItem->int64Value; pItem->doubleValue = pOthersItem->doubleValue; + if ( pItem->type == DB_COLUMNTYPE_TEXT) + { + pItem->pObj = new (std::nothrow) String(*static_cast(pOthersItem->pObj)); + SysTryReturnResult(NID_IO, pItem->pObj != null, E_OUT_OF_MEMORY, + "The memory is insufficient."); + } + else if (pItem->type == DB_COLUMNTYPE_BLOB) + { + ByteBuffer* pBuffer; + pBuffer = new (std::nothrow) ByteBuffer(); + SysTryReturnResult(NID_IO, pBuffer != null, E_OUT_OF_MEMORY, + "The memory is insufficient."); + + r = pBuffer->Construct(static_cast(pOthersItem->pObj)->GetCapacity()); + SysTryLog(NID_IO, r == E_SUCCESS, "ByteBuffer construct failed"); + r = static_cast(pOthersItem->pObj)->SetPosition(0); + SysTryLog(NID_IO, r == E_SUCCESS, "ByteBuffer SetPosition failed"); + r = pBuffer->CopyFrom(*static_cast(pOthersItem->pObj)); + SysTryReturnResult(NID_IO, r == E_SUCCESS, E_OUT_OF_MEMORY, + "ByteBuffer copy failed."); + + pItem->pObj = pBuffer; + } + _DataItem* pOldItem = static_cast<_DataItem*>(__pDataRow->GetAt(i)); r = __pDataRow->SetAt(pItem.release(), i); delete pOldItem; diff --git a/src/io/FIo_DataSetImpl.cpp b/src/io/FIo_DataSetImpl.cpp index e0d5d58..5f5c250 100755 --- a/src/io/FIo_DataSetImpl.cpp +++ b/src/io/FIo_DataSetImpl.cpp @@ -52,17 +52,20 @@ _DataSetImpl::Construct(const IList& columnNames) { result r = E_SUCCESS; - r = __columnList.Construct(columnNames); - SysTryReturn(NID_IO, r == E_SUCCESS, E_INVALID_ARG, r, "[E_INVALID_ARG] columnNames is invalid."); - - __columnCount = __columnList.GetCount(); + __columnCount = columnNames.GetCount(); SysTryReturn(NID_IO, __columnCount > 0, E_INVALID_ARG, r, "[E_INVALID_ARG] column count is 0."); - __columnTypeList.Construct(__columnCount); + r = __columnList.Construct(__columnCount); + SysTryReturn(NID_IO, r == E_SUCCESS, E_OUT_OF_MEMORY, r, "[E_OUT_OF_MEMORY] column list construct failed"); + r = __columnTypeList.Construct(__columnCount); + SysTryReturn(NID_IO, r == E_SUCCESS, E_OUT_OF_MEMORY, r, "[E_OUT_OF_MEMORY] column type list construct failed"); for (int i = 0 ; i < __columnCount ; i++) { - result r = __columnTypeList.Add(new (std::nothrow) Integer(DB_COLUMNTYPE_NULL)); + r = __columnList.Add(new (std::nothrow) String(*(String*)(columnNames.GetAt(i)))); + SysTryReturn(NID_IO, r == E_SUCCESS, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient."); + + r = __columnTypeList.Add(new (std::nothrow) Integer(DB_COLUMNTYPE_NULL)); SysTryReturn(NID_IO, r == E_SUCCESS, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient."); } //SysLog(NID_IO, "column count is %d", __columnCount); @@ -111,11 +114,22 @@ DataSet* _DataSetImpl::CloneN(void) const { result r; + Integer* pColumnType = null; + unique_ptr< DataSet > pDataSet(new (std::nothrow) DataSet()); SysTryReturn(NID_IO, pDataSet != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient."); pDataSet->Construct(__columnList); + for (int i = 0; i < __columnCount; i++) + { + pColumnType = static_cast(_DataSetImpl::GetInstance(*pDataSet)->__columnTypeList.GetAt(i)); + r = _DataSetImpl::GetInstance(*pDataSet)->__columnTypeList.SetAt(new Integer(*(Integer*)__columnTypeList.GetAt(i)), i); + delete pColumnType; + + SysTryReturn(NID_IO, r == E_SUCCESS, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] ColumnTypeList Copy Falied"); + } + for (int i = 0; i < __rowCount; i++) { DataRow* pNewRow = pDataSet->CreateDataRowN(); @@ -154,6 +168,18 @@ _DataSetImpl::GetHashCode(void) const return hash; } +_DataSetImpl* +_DataSetImpl::GetInstance(DataSet& dataSet) +{ + return dataSet.__pDataSetImpl; +} + +const _DataSetImpl* +_DataSetImpl::GetInstance(const DataSet& dataSet) +{ + return dataSet.__pDataSetImpl; +} + }} // Tizen::Io diff --git a/src/io/inc/FIo_DataSetImpl.h b/src/io/inc/FIo_DataSetImpl.h index 44d828a..fa1a3a6 100755 --- a/src/io/inc/FIo_DataSetImpl.h +++ b/src/io/inc/FIo_DataSetImpl.h @@ -58,6 +58,9 @@ public: virtual int GetHashCode(void) const; + static _DataSetImpl* GetInstance(DataSet& dataSet); + + static const _DataSetImpl* GetInstance(const DataSet& dataSet); private: _DataSetImpl(_DataSetImpl& dataSetImpl); -- 2.7.4