Modify DataSet::CloneN to deep copy
authorSeungYeup Kim <sy2004.kim@samsung.com>
Tue, 19 Mar 2013 00:22:07 +0000 (09:22 +0900)
committerSeungYeup Kim <sy2004.kim@samsung.com>
Tue, 19 Mar 2013 01:23:12 +0000 (10:23 +0900)
Change-Id: Iae8e2560b1b83819f244065b8d9888fcc13f02cf

src/io/FIo_DataRowImpl.cpp
src/io/FIo_DataSetImpl.cpp
src/io/inc/FIo_DataSetImpl.h

index 58a86ac..6e6f7be 100755 (executable)
@@ -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<String*>(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<ByteBuffer*>(pOthersItem->pObj)->GetCapacity());
+                       SysTryLog(NID_IO, r == E_SUCCESS, "ByteBuffer construct failed");
+                       r = static_cast<ByteBuffer*>(pOthersItem->pObj)->SetPosition(0);
+                       SysTryLog(NID_IO, r == E_SUCCESS, "ByteBuffer SetPosition failed");
+                       r = pBuffer->CopyFrom(*static_cast<ByteBuffer*>(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;
index e0d5d58..5f5c250 100755 (executable)
@@ -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<Integer*>(_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
 
 
index 44d828a..fa1a3a6 100755 (executable)
@@ -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);