2 // Open Service Platform
3 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
19 * @file FIo_DataSetEnumeratorImpl.cpp
20 * @brief This is the implementation file for _DataSetEnumeratorImpl class.
24 #include <semaphore.h>
26 #include <unique_ptr.h>
28 #include <FBaseInteger.h>
29 #include <FBaseDouble.h>
30 #include <FBaseString.h>
31 #include <FBaseByteBuffer.h>
32 #include <FBaseDateTime.h>
33 #include <FBaseUtilStringUtil.h>
34 #include <FBaseColLinkedList.h>
35 #include <FBaseColArrayList.h>
36 #include <FBaseColIEnumerator.h>
37 #include <FBaseSysLog.h>
39 #include <FIoDbTypes.h>
40 #include <FIo_DataSetEnumeratorImpl.h>
41 #include <FIo_DataRowImpl.h>
44 using namespace Tizen::Base;
45 using namespace Tizen::Base::Utility;
46 using namespace Tizen::Base::Runtime;
47 using namespace Tizen::System;
48 using namespace Tizen::App;
49 using namespace Tizen::Base::Collection;
51 namespace Tizen { namespace Io
54 _DataSetEnumeratorImpl::_DataSetEnumeratorImpl(void)
60 , __currentRowIndex(-1)
61 , __dataSetDeleted(false)
66 _DataSetEnumeratorImpl::~_DataSetEnumeratorImpl(void)
68 if (!__dataSetDeleted)
70 __pEnumImplList->Remove(*this);
75 _DataSetEnumeratorImpl::MoveNext(void)
77 SysTryReturnResult(NID_IO, __pDataSet != null, E_INVALID_STATE,
78 "The Object is not constructed.");
79 SysTryReturnResult(NID_IO, __dataSetDeleted != true, E_INVALID_STATE,
80 "The dataset is already been deleted.");
82 if (__currentRowIndex +1 == __rowCount)
83 return E_OUT_OF_RANGE;
86 __pCurrentRow = static_cast<ArrayList*>(__pDataSet->GetAt(__currentRowIndex));
88 if (__pCurrentRow == null)
89 return E_INVALID_STATE;
95 _DataSetEnumeratorImpl::MovePrevious(void)
97 SysTryReturnResult(NID_IO, __pDataSet != null, E_INVALID_STATE,
98 "The Object is not constructed.");
99 SysTryReturnResult(NID_IO, __dataSetDeleted != true, E_INVALID_STATE,
100 "The dataset is already been deleted.");
102 if (__currentRowIndex == 0)
103 return E_OUT_OF_RANGE;
106 __pCurrentRow = static_cast<ArrayList*>(__pDataSet->GetAt(__currentRowIndex));
108 if (__pCurrentRow == null)
109 return E_INVALID_STATE;
115 _DataSetEnumeratorImpl::MoveFirst(void)
117 SysTryReturnResult(NID_IO, __pDataSet != null, E_INVALID_STATE,
118 "The Object is not constructed.");
119 SysTryReturnResult(NID_IO, __dataSetDeleted != true, E_INVALID_STATE,
120 "The dataset is already been deleted.");
122 __currentRowIndex = 0;
123 __pCurrentRow = static_cast<ArrayList*>(__pDataSet->GetAt(__currentRowIndex));
125 if (__pCurrentRow == null)
126 return E_INVALID_STATE;
132 _DataSetEnumeratorImpl::MoveLast(void)
134 SysTryReturnResult(NID_IO, __pDataSet != null, E_INVALID_STATE,
135 "The Object is not constructed.");
136 SysTryReturnResult(NID_IO, __dataSetDeleted != true, E_INVALID_STATE,
137 "The dataset is already been deleted.");
139 __currentRowIndex = __rowCount -1;
140 __pCurrentRow = static_cast<ArrayList*>(__pDataSet->GetAt(__currentRowIndex));
142 if (__pCurrentRow == null)
143 return E_INVALID_STATE;
149 _DataSetEnumeratorImpl::Reset(void)
151 SysTryReturnResult(NID_IO, __pDataSet != null, E_INVALID_STATE,
152 "The Object is not constructed.");
153 SysTryReturnResult(NID_IO, __dataSetDeleted != true, E_INVALID_STATE,
154 "The dataset is already been deleted.");
156 __currentRowIndex = -1;
157 __pCurrentRow = null;
163 _DataSetEnumeratorImpl::GetIntAt(int columnIndex, int& value) const
165 result r = E_SUCCESS;
167 SysTryReturnResult(NID_IO, __pDataSet != null, E_INVALID_STATE,
168 "The Object is not constructed.");
169 SysTryReturnResult(NID_IO, __dataSetDeleted != true, E_INVALID_STATE,
170 "The dataset is already been deleted.");
171 SysTryReturnResult(NID_IO, columnIndex >= 0 && columnIndex < __columnCount, E_INVALID_ARG,
172 "Given column index is out of range.");
173 SysTryReturnResult(NID_IO, __pCurrentRow != null, E_INVALID_STATE,
174 "The method has tried to fetch the column data of a result set that is not activated.");
176 _DataItem* pDataItem = dynamic_cast < _DataItem* >(__pCurrentRow->GetAt(columnIndex));
179 if (pDataItem->type != DB_COLUMNTYPE_INT)
182 SysLog(NID_IO, "[E_TYPE_MISMATCH] Trying to access column of different type.");
186 value = pDataItem->intValue;
195 _DataSetEnumeratorImpl::GetInt64At(int columnIndex, long long& value) const
197 result r = E_SUCCESS;
199 SysTryReturnResult(NID_IO, __pDataSet != null, E_INVALID_STATE,
200 "The Object is not constructed.");
201 SysTryReturnResult(NID_IO, __dataSetDeleted != true, E_INVALID_STATE,
202 "The dataset is already been deleted.");
203 SysTryReturnResult(NID_IO, columnIndex >= 0 && columnIndex < __columnCount, E_INVALID_ARG,
204 "Given column index is out of range.");
205 SysTryReturnResult(NID_IO, __pCurrentRow != null, E_INVALID_STATE,
206 "The method has tried to fetch the column data of a result set that is not activated.");
208 _DataItem* pDataItem = dynamic_cast < _DataItem* >(__pCurrentRow->GetAt(columnIndex));
211 if (pDataItem->type != DB_COLUMNTYPE_INT64)
214 SysLog(NID_IO, "[E_TYPE_MISMATCH] Trying to access column of different type.");
218 value = pDataItem->int64Value;
227 _DataSetEnumeratorImpl::GetDoubleAt(int columnIndex, double& value) const
229 result r = E_SUCCESS;
231 SysTryReturnResult(NID_IO, __pDataSet != null, E_INVALID_STATE,
232 "The Object is not constructed.");
233 SysTryReturnResult(NID_IO, __dataSetDeleted != true, E_INVALID_STATE,
234 "The dataset is already been deleted.");
235 SysTryReturnResult(NID_IO, columnIndex >= 0 && columnIndex < __columnCount, E_INVALID_ARG,
236 "Given column index is out of range.");
237 SysTryReturnResult(NID_IO, __pCurrentRow != null, E_INVALID_STATE,
238 "The method has tried to fetch the column data of a result set that is not activated.");
240 _DataItem* pDataItem = dynamic_cast < _DataItem* >(__pCurrentRow->GetAt(columnIndex));
243 if (pDataItem->type != DB_COLUMNTYPE_DOUBLE)
246 SysLog(NID_IO, "[E_TYPE_MISMATCH] Trying to access column of different type.");
250 value = pDataItem->doubleValue;
259 _DataSetEnumeratorImpl::GetStringAt(int columnIndex, String& value) const
261 result r = E_SUCCESS;
263 SysTryReturnResult(NID_IO, __pDataSet != null, E_INVALID_STATE,
264 "The Object is not constructed.");
265 SysTryReturnResult(NID_IO, __dataSetDeleted != true, E_INVALID_STATE,
266 "The dataset is already been deleted.");
267 SysTryReturnResult(NID_IO, columnIndex >= 0 && columnIndex < __columnCount, E_INVALID_ARG,
268 "Given column index is out of range.");
269 SysTryReturnResult(NID_IO, __pCurrentRow != null, E_INVALID_STATE,
270 "The method has tried to fetch the column data of a result set that is not activated.");
272 _DataItem* pDataItem = dynamic_cast < _DataItem* >(__pCurrentRow->GetAt(columnIndex));
275 if (pDataItem->type != DB_COLUMNTYPE_TEXT)
278 SysLog(NID_IO, "[E_TYPE_MISMATCH] Trying to access column of different type.");
282 value = *((String*)pDataItem->pObj);
290 _DataSetEnumeratorImpl::GetBlobAt(int columnIndex, ByteBuffer& value) const
292 result r = E_SUCCESS;
293 ByteBuffer* pBuffer = null;
295 SysTryReturnResult(NID_IO, __pDataSet != null, E_INVALID_STATE,
296 "The Object is not constructed.");
297 SysTryReturnResult(NID_IO, __dataSetDeleted != true, E_INVALID_STATE,
298 "The dataset is already been deleted.");
299 SysTryReturnResult(NID_IO, columnIndex >= 0 && columnIndex < __columnCount, E_INVALID_ARG,
300 "Given column index is out of range.");
301 SysTryReturnResult(NID_IO, __pCurrentRow != null, E_INVALID_STATE,
302 "The method has tried to fetch the column data of a result set that is not activated.");
304 _DataItem* pDataItem = dynamic_cast < _DataItem* >(__pCurrentRow->GetAt(columnIndex));
307 if (pDataItem->type != DB_COLUMNTYPE_BLOB)
310 SysLog(NID_IO, "[E_TYPE_MISMATCH] Trying to access column of different type.");
314 pBuffer = (ByteBuffer*)pDataItem->pObj;
315 pBuffer->SetPosition(0);
316 r = value.CopyFrom(*pBuffer);
325 _DataSetEnumeratorImpl::GetBlobAt(int columnIndex, void* buffer, int size) const
327 result r = E_SUCCESS;
329 ByteBuffer* pBuffer = null;
331 SysTryReturnResult(NID_IO, __pDataSet != null, E_INVALID_STATE,
332 "The Object is not constructed.");
333 SysTryReturnResult(NID_IO, __dataSetDeleted != true, E_INVALID_STATE,
334 "The dataset is already been deleted.");
335 SysTryReturnResult(NID_IO, columnIndex >= 0 && columnIndex < __columnCount, E_INVALID_ARG,
336 "Given column index is out of range.");
337 SysTryReturnResult(NID_IO, __pCurrentRow != null, E_INVALID_STATE,
338 "The method has tried to fetch the column data of a result set that is not activated.");
340 _DataItem* pDataItem = dynamic_cast < _DataItem* >(__pCurrentRow->GetAt(columnIndex));
343 if (pDataItem->type != DB_COLUMNTYPE_BLOB)
346 SysLog(NID_IO, "[E_TYPE_MISMATCH] Trying to access column of different type.");
350 pBuffer = (ByteBuffer*)pDataItem->pObj;
351 pBuffer->SetPosition(0);
352 blobLen = pBuffer->GetLimit();
353 memcpy(buffer, pBuffer->GetPointer(), (blobLen < size) ? blobLen : size);
367 _DataSetEnumeratorImpl::GetDateTimeAt(int columnIndex, DateTime& value) const
369 result r = E_SUCCESS;
372 SysTryReturnResult(NID_IO, __pDataSet != null, E_INVALID_STATE,
373 "The Object is not constructed.");
374 SysTryReturnResult(NID_IO, __dataSetDeleted != true, E_INVALID_STATE,
375 "The dataset is already been deleted.");
376 SysTryReturnResult(NID_IO, columnIndex >= 0 && columnIndex < __columnCount, E_INVALID_ARG,
377 "Given column index is out of range.");
378 SysTryReturnResult(NID_IO, __pCurrentRow != null, E_INVALID_STATE,
379 "The method has tried to fetch the column data of a result set that is not activated.");
381 _DataItem* pDataItem = dynamic_cast < _DataItem* >(__pCurrentRow->GetAt(columnIndex));
384 if (pDataItem->type != DB_COLUMNTYPE_TEXT)
387 SysLog(NID_IO, "[E_TYPE_MISMATCH] Trying to access column of different type.");
391 pStr = (String*)pDataItem->pObj;
392 r = DateTime::Parse(*pStr, value);
401 _DataSetEnumeratorImpl::GetColumnCount(void) const
403 SysTryReturn(NID_IO, __pDataSet != null, -1, E_INVALID_STATE,
404 "[E_INVALID_STATE] The Object is not constructed.");
405 SysTryReturn(NID_IO, __dataSetDeleted != true, -1, E_INVALID_STATE,
406 "[E_INVALID_STATE] The dataset is already been deleted.");
408 return __columnCount;
412 _DataSetEnumeratorImpl::GetColumnType(int columnIndex) const
414 DbColumnType type = DB_COLUMNTYPE_UNDEFINED;
416 SysTryReturn(NID_IO, __pDataSet != null, DB_COLUMNTYPE_UNDEFINED, E_INVALID_STATE,
417 "[E_INVALID_STATE] The instance is not constructed.");
418 SysTryReturn(NID_IO, __dataSetDeleted != true, DB_COLUMNTYPE_UNDEFINED, E_INVALID_STATE,
419 "[E_INVALID_STATE] The dataset is already been deleted.");
420 SysTryReturn(NID_IO, columnIndex >= 0 && columnIndex < __columnCount, DB_COLUMNTYPE_UNDEFINED, E_INVALID_ARG,
421 "[E_INVALID_ARG] Given column index is out of range.");
425 _DataItem* pDataItem = dynamic_cast < _DataItem* >(__pCurrentRow->GetAt(columnIndex));
428 SetLastResult(E_INVALID_STATE);
429 return DB_COLUMNTYPE_UNDEFINED;
432 switch (pDataItem->type)
434 case DB_COLUMNTYPE_INT:
435 case DB_COLUMNTYPE_INT64:
436 case DB_COLUMNTYPE_DOUBLE:
437 case DB_COLUMNTYPE_TEXT:
438 case DB_COLUMNTYPE_BLOB:
439 case DB_COLUMNTYPE_NULL:
440 type = pDataItem->type;
444 SetLastResult(E_INVALID_STATE);
453 _DataSetEnumeratorImpl::GetColumnName(int columnIndex) const
455 SysTryReturn(NID_IO, __pDataSet != null, null, E_INVALID_STATE,
456 "[E_INVALID_STATE] The instance is not constructed.");
457 SysTryReturn(NID_IO, __dataSetDeleted != true, null, E_INVALID_STATE,
458 "[E_INVALID_STATE] The dataset is already been deleted.");
459 SysTryReturn(NID_IO, columnIndex >= 0 && columnIndex < __columnCount, null, E_INVALID_ARG,
460 "[E_INVALID_ARG] Given column index is out of range.");
463 String* pString = dynamic_cast <String *> (__pColumnList->GetAt(columnIndex));
467 SetLastResult(E_INVALID_STATE);
471 return String(pString->GetPointer());
475 _DataSetEnumeratorImpl::GetColumnSize(int columnIndex) const
479 SysTryReturn(NID_IO, __pDataSet != null, -1, E_INVALID_STATE,
480 "[E_INVALID_STATE] The instance is not constructed.");
481 SysTryReturn(NID_IO, __dataSetDeleted != true, -1, E_INVALID_STATE,
482 "[E_INVALID_STATE] The dataset is already been deleted.");
483 SysTryReturn(NID_IO, columnIndex >= 0 && columnIndex < __columnCount, -1, E_INVALID_ARG,
484 "[E_INVALID_ARG] Given column index is out of range.");
485 SysTryReturn(NID_IO, __pCurrentRow != null, -1, E_INVALID_STATE,
486 "[E_INVALID_STATE] The method has tried to fetch the column data of a result set that is not activated.");
488 _DataItem* pDataItem = dynamic_cast < _DataItem* >(__pCurrentRow->GetAt(columnIndex));
491 SetLastResult(E_INVALID_STATE);
495 bytes = pDataItem->size;
496 //SysLog(NID_IO, "Size is %d", bytes);
501 _DataSetEnumeratorImpl*
502 _DataSetEnumeratorImpl::GetInstance(DataSetEnumerator& dataSetEnumerator)
504 return dataSetEnumerator.__pDataSetEnumeratorImpl;
507 const _DataSetEnumeratorImpl*
508 _DataSetEnumeratorImpl::GetInstance(const DataSetEnumerator& dataSetEnumerator)
510 return dataSetEnumerator.__pDataSetEnumeratorImpl;
514 _DataSetEnumeratorImpl::CreateDataSetEnumeratorInstanceN(void)
516 unique_ptr<DataSetEnumerator> pDataSetEnumerator(new (std::nothrow) DataSetEnumerator());
517 SysTryReturn(NID_IO, pDataSetEnumerator != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] The memory is insufficient.");
518 return pDataSetEnumerator.release();