sync with master
[platform/framework/native/appfw.git] / src / io / FIo_DataControlResultSetEnumerator.cpp
index 5421f05..0d4b883 100644 (file)
@@ -435,7 +435,6 @@ _DataControlResultSetEnumerator::GetStringAt(int columnIndex, String& value) con
        int type = -1;
        int size = 0;
        int i = 0;
-       String retString;
        result r = E_SUCCESS;
        int ret = 0;
 
@@ -486,14 +485,17 @@ _DataControlResultSetEnumerator::GetStringAt(int columnIndex, String& value) con
        ret = pFile->Read(&size, sizeof(int));
        SysTryReturnResult(NID_IO, ret, E_SYSTEM, "Failed to read data from the result set of the data control provider.");
 
-       unique_ptr<char[]> pReadBuffer(new (std::nothrow) char[size + 1]);
-       SysTryReturnResult(NID_IO, pReadBuffer != null, E_OUT_OF_MEMORY, "Failed to allocate memory for the read buffer.");
+       if (size > 0)
+       {
+               unique_ptr<char[]> pReadBuffer(new (std::nothrow) char[size + 1]);
+               SysTryReturnResult(NID_IO, pReadBuffer != null, E_OUT_OF_MEMORY, "Failed to allocate memory for the read buffer.");
 
-       memset(pReadBuffer.get(), 0, size + 1);
-       ret = pFile->Read(pReadBuffer.get(), size);
-       SysTryReturnResult(NID_IO, ret, E_SYSTEM, "Failed to read data from the result set of the data control provider.");
+               memset(pReadBuffer.get(), 0, size + 1);
 
-       value = String(pReadBuffer.get());
+               ret = pFile->Read(pReadBuffer.get(), size);
+               SysTryReturnResult(NID_IO, ret, E_SYSTEM, "Failed to read data from the result set of the data control provider.");
+               value = String(pReadBuffer.get());
+       }
 
        return E_SUCCESS;
 }
@@ -504,7 +506,6 @@ _DataControlResultSetEnumerator::GetBlobAt(int columnIndex, ByteBuffer& value) c
        int type = -1;
        int size = 0;
        int i = 0;
-       String retString;
        result r = E_SUCCESS;
        int ret = 0;
 
@@ -554,15 +555,18 @@ _DataControlResultSetEnumerator::GetBlobAt(int columnIndex, ByteBuffer& value) c
        ret = pFile->Read(&size, sizeof(int));
        SysTryReturnResult(NID_IO, ret, E_SYSTEM, "Failed to read data from the result set of the data control provider.");
 
-       unique_ptr<byte[]> pReadBuffer(new (std::nothrow) byte[size + 1]);
-       SysTryReturnResult(NID_IO, pReadBuffer != null, E_OUT_OF_MEMORY, "Failed to allocate memory for the read buffer.");
+       if (size > 0)
+       {
+               unique_ptr<byte[]> pReadBuffer(new (std::nothrow) byte[size + 1]);
+               SysTryReturnResult(NID_IO, pReadBuffer != null, E_OUT_OF_MEMORY, "Failed to allocate memory for the read buffer.");
 
-       memset(pReadBuffer.get(), 0, size + 1);
-       ret = pFile->Read(pReadBuffer.get(), size);
-       SysTryReturnResult(NID_IO, ret, E_SYSTEM, "Failed to read data from the result set of the data control provider.");
+               memset(pReadBuffer.get(), 0, size + 1);
+               ret = pFile->Read(pReadBuffer.get(), size);
+               SysTryReturnResult(NID_IO, ret, E_SYSTEM, "Failed to read data from the result set of the data control provider.");
 
-       r = value.SetArray(pReadBuffer.get(), 0, size);
-       SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
+               r = value.SetArray(pReadBuffer.get(), 0, size);
+               SysTryReturn(NID_IO, !IsFailed(r), r, r, "[%s] Propagated.", GetErrorMessage(r));
+       }
 
        return E_SUCCESS;
 }
@@ -573,7 +577,6 @@ _DataControlResultSetEnumerator::GetBlobAt(int columnIndex, void* buffer, int bu
        int type = -1;
        int size = 0;
        int i = 0;
-       String retString;
        result r = E_SUCCESS;
        int ret = 0;
 
@@ -625,14 +628,17 @@ _DataControlResultSetEnumerator::GetBlobAt(int columnIndex, void* buffer, int bu
 
        SysTryReturnResult(NID_IO, size <= bufSize, E_OVERFLOW, "The output buffer is insufficient.");
 
-       unique_ptr<byte[]> pReadBuffer(new (std::nothrow) byte[size + 1]);
-       SysTryReturnResult(NID_IO, pReadBuffer != null, E_OUT_OF_MEMORY, "Failed to allocate memory for the read buffer.");
+       if (size > 0)
+       {
+               unique_ptr<byte[]> pReadBuffer(new (std::nothrow) byte[size + 1]);
+               SysTryReturnResult(NID_IO, pReadBuffer != null, E_OUT_OF_MEMORY, "Failed to allocate memory for the read buffer.");
 
-       memset(pReadBuffer.get(), 0, size + 1);
-       ret = pFile->Read(pReadBuffer.get(), size);
-       SysTryReturnResult(NID_IO, ret, E_SYSTEM, "Failed to read data from the result set of the data control provider.");
+               memset(pReadBuffer.get(), 0, size + 1);
+               ret = pFile->Read(pReadBuffer.get(), size);
+               SysTryReturnResult(NID_IO, ret, E_SYSTEM, "Failed to read data from the result set of the data control provider.");
 
-       memcpy(buffer, pReadBuffer.get(), size);
+               memcpy(buffer, pReadBuffer.get(), size);
+       }
 
        return E_SUCCESS;
 }
@@ -644,7 +650,6 @@ _DataControlResultSetEnumerator::GetDateTimeAt(int columnIndex, DateTime& value)
        int size = 0;
        char* pReadBuffer = null;
        int i = 0;
-       String retString;
        result r = E_SUCCESS;
        int ret = 0;
 
@@ -699,22 +704,25 @@ _DataControlResultSetEnumerator::GetDateTimeAt(int columnIndex, DateTime& value)
                SysTryReturn(NID_IO, false, E_SYSTEM, E_SYSTEM, "[%s] system error", GetErrorMessage(r));
        }
 
-       pReadBuffer = (char*) malloc(size + 1);
-       SysTryReturn(NID_IO, pReadBuffer != NULL, E_SYSTEM, E_SYSTEM, "[E_OUT_OF_MEMORY] system error occurred.");
-       memset(pReadBuffer, 0, size + 1);
-
-       ret = pFile->Read(pReadBuffer, size);
-       if (ret == 0)
+       if (size > 0)
        {
-               r = GetLastResult();
+               pReadBuffer = (char*) malloc(size + 1);
+               SysTryReturn(NID_IO, pReadBuffer != NULL, E_SYSTEM, E_SYSTEM, "[E_OUT_OF_MEMORY] system error occurred.");
+               memset(pReadBuffer, 0, size + 1);
+
+               ret = pFile->Read(pReadBuffer, size);
+               if (ret == 0)
+               {
+                       r = GetLastResult();
+                       free(pReadBuffer);
+                       SysTryReturnResult(NID_IO, !(r == E_END_OF_FILE), E_INVALID_ARG, "columnIndex is out of range");
+                       SysTryReturn(NID_IO, false, E_SYSTEM, E_SYSTEM, "[%s] system error", GetErrorMessage(r));
+               }
+
+               r = DateTime::Parse(pReadBuffer, value);
                free(pReadBuffer);
-               SysTryReturnResult(NID_IO, !(r == E_END_OF_FILE), E_INVALID_ARG, "columnIndex is out of range");
-               SysTryReturn(NID_IO, false, E_SYSTEM, E_SYSTEM, "[%s] system error", GetErrorMessage(r));
        }
 
-       r = DateTime::Parse(pReadBuffer, value);
-       free(pReadBuffer);
-
        return r;
 }
 
@@ -736,6 +744,8 @@ _DataControlResultSetEnumerator::GetColumnType(int columnIndex) const
 {
        DbColumnType columnType = DB_COLUMNTYPE_UNDEFINED;
        int type = -1;
+       int i = 0;
+       int size = 0;
        result r = E_SUCCESS;
        int ret = 0;
 
@@ -753,17 +763,37 @@ _DataControlResultSetEnumerator::GetColumnType(int columnIndex) const
        SysTryReturn(NID_IO, pFile != null, columnType, E_INVALID_STATE,
                                "[E_INVALID_STATE] This instance has not been properly constructed yet or has already been finalized.");
 
-       r = pFile->Seek(FILESEEKPOSITION_BEGIN, __columnTypeOffset + columnIndex * sizeof(int));
-       SysTryReturn(NID_IO, !IsFailed(r), columnType, E_SYSTEM, "Failed to seek.");
+       r = pFile->Seek(FILESEEKPOSITION_BEGIN, __currentOffset);
+       SysTryReturn(NID_IO, !IsFailed(r), columnType, E_SYSTEM, "[E_SYSTEM] Failed to seek.");
+
+       for (i = 0; i < columnIndex; i++) // move to column index
+       {
+               ret = pFile->Read(&type, sizeof(int));
+               if (ret == 0)
+               {
+                       r = GetLastResult();
+                       SysTryReturn(NID_IO, !(r == E_END_OF_FILE), columnType, E_INVALID_ARG, "[E_INVALID_ARG] The columnIndex is out of range.");
+                       SysTryReturn(NID_IO, false, columnType, E_SYSTEM, "[%s] system error", GetErrorMessage(r));
+               }
+               ret = pFile->Read(&size, sizeof(int));
+               SysTryReturn(NID_IO, ret, columnType, E_SYSTEM, "[E_SYSTEM] Failed to read data from the result set of the data control provider.");
+
+               r = pFile->Seek(FILESEEKPOSITION_CURRENT, size);
+               SysTryReturn(NID_IO, !IsFailed(r), columnType, E_SYSTEM, "[E_SYSTEM] Failed to seek.");
+       }
+
        ret = pFile->Read(&type, sizeof(int));
        if (ret == 0)
        {
                r = GetLastResult();
                SysTryReturn(NID_IO, !(r == E_END_OF_FILE), DB_COLUMNTYPE_UNDEFINED, E_INVALID_ARG,
                                        "[E_INVALID_ARG] columnIndex is out of range");
-               SysTryReturn(NID_IO, false, DB_COLUMNTYPE_UNDEFINED, E_SYSTEM, "[%s] system error, errno: %d", GetErrorMessage(r), errno);
+               SysTryReturn(NID_IO, false, DB_COLUMNTYPE_UNDEFINED, E_SYSTEM,
+                                       "[%s] system error, errno: %d", GetErrorMessage(r), errno);
        }
 
+       SetLastResult(E_SUCCESS);
+
        switch (type)
        {
        case 1: // int64
@@ -782,12 +812,15 @@ _DataControlResultSetEnumerator::GetColumnType(int columnIndex) const
                columnType = DB_COLUMNTYPE_BLOB;
                break;
 
+       case 5: // null
+               columnType = DB_COLUMNTYPE_NULL;
+               break;
+
        default:
-               SetLastResult(E_INVALID_STATE);
+               SysLogException(NID_IO, E_SYSTEM, "Found undefined column type (%d).", type);
                break;
        }
 
-       SetLastResult(E_SUCCESS);
        return columnType;
 }