16 #ifndef __DATA_MANAGEMENT_DATA_SOURCE_INTERNAL_SQL_FEATURE_UTILS_H__
17 #define __DATA_MANAGEMENT_DATA_SOURCE_INTERNAL_SQL_FEATURE_UTILS_H__
20 #include "services/collection.h"
21 #include "services/internal/buffer.h"
22 #include "services/internal/utilities.h"
24 #if defined(_WIN32) || defined(_WIN64)
34 namespace data_management
43 class SQLFeatureInfo :
public Base
47 SQLLEN sqlOctetLength;
48 services::String columnName;
52 sqlType(SQL_UNKNOWN_TYPE),
56 explicit SQLFeatureInfo(
const services::String &columnName,
58 SQLLEN sqlOctetLength,
60 columnName(columnName),
62 sqlOctetLength(sqlOctetLength),
63 isSigned(isSigned) { }
70 class SQLFeaturesInfo :
public Base
73 services::Status add(
const SQLFeatureInfo &featureInfo)
75 _featuresInfo.safe_push_back(featureInfo);
76 return services::Status();
79 const SQLFeatureInfo &
get(
size_t index)
const
81 DAAL_ASSERT( index < _featuresInfo.size() );
82 return _featuresInfo[index];
85 const SQLFeatureInfo &operator[](
size_t index)
const
90 size_t getNumberOfFeatures()
const
92 return _featuresInfo.size();
95 services::Collection<SQLFeatureInfo> _featuresInfo;
102 class SQLFetchBufferFragment :
public Base
105 SQLFetchBufferFragment() :
106 _rawFetchBuffer(NULL),
108 _actualDataSize(NULL) { }
110 explicit SQLFetchBufferFragment(
char *rawFetchBuffer,
112 SQLLEN *actualDataSize) :
113 _rawFetchBuffer(rawFetchBuffer),
114 _bufferSize(bufferSize),
115 _actualDataSize(actualDataSize) { }
117 char *getBuffer()
const
119 return _rawFetchBuffer;
122 SQLLEN getBufferSize()
const
127 SQLLEN getActualDataSize()
const
129 return *_actualDataSize;
132 services::BufferView<char> view()
const
134 return services::BufferView<char>(_rawFetchBuffer, *_actualDataSize);
138 char *_rawFetchBuffer;
140 SQLLEN *_actualDataSize;
143 template<
typename FloatingPo
intType>
144 inline SQLSMALLINT getSQLTypeForFloatingType();
147 inline SQLSMALLINT getSQLTypeForFloatingType<double>()
148 {
return SQL_C_DOUBLE; }
151 inline SQLSMALLINT getSQLTypeForFloatingType<float>()
152 {
return SQL_C_FLOAT; }
164 castToFloatingPointType
167 static SQLSMALLINT getTargetType(Value fetchMode)
171 case useNativeSQLTypes:
172 return SQL_C_DEFAULT;
174 case castToFloatingPointType:
175 return getSQLTypeForFloatingType<DAAL_DATA_TYPE>();
177 return SQL_C_DEFAULT;
189 class SQLFetchBuffer :
public Base
192 static services::SharedPtr<SQLFetchBuffer> create(
const SQLFeaturesInfo &featuresInfo,
193 const SQLFetchMode::Value &mode,
194 services::Status *status = NULL)
196 return services::internal::wrapSharedAndTryThrow(
197 new SQLFetchBuffer(featuresInfo, mode, status), status);
200 size_t getNumberOfFeatures()
const
202 DAAL_ASSERT( _bufferOffsets.size() > 0 );
203 return _bufferOffsets.size() - 1;
206 char *getBufferForFeature(
size_t featureIndex)
const
208 DAAL_ASSERT( _bufferOffsets.size() > 0 );
209 DAAL_ASSERT( featureIndex + 1 < _bufferOffsets.size() );
210 return _buffer.offset( _bufferOffsets[featureIndex] );
213 SQLLEN *getActualDataSizeBufferForFeature(
size_t featureIndex)
const
215 DAAL_ASSERT( featureIndex < _actualDataSizes.size() );
216 return _actualDataSizes.offset(featureIndex);
219 SQLLEN getBufferSizeForFeature(
size_t featureIndex)
const
221 DAAL_ASSERT( _bufferOffsets.size() > 0 );
222 DAAL_ASSERT( featureIndex + 1 < _bufferOffsets.size() );
223 const size_t begin = _bufferOffsets[featureIndex];
224 const size_t end = _bufferOffsets[featureIndex + 1];
225 return (SQLLEN)(end - begin);
228 SQLLEN getActualDataSizeForFeature(
size_t featureIndex)
const
230 DAAL_ASSERT( featureIndex < _actualDataSizes.size() );
231 return _actualDataSizes[featureIndex];
234 SQLFetchBufferFragment getFragment(
size_t featureIndex)
const
236 return SQLFetchBufferFragment( getBufferForFeature(featureIndex),
237 getBufferSizeForFeature(featureIndex),
238 getActualDataSizeBufferForFeature(featureIndex) );
241 void copyTo(
const services::BufferView<DAAL_DATA_TYPE> &buffer)
const
243 DAAL_ASSERT( _mode == SQLFetchMode::castToFloatingPointType );
245 char *rawFetchBuffer = _buffer.data();
246 DAAL_DATA_TYPE *targetBuffer = buffer.data();
248 const size_t elementsToCopy = services::internal::minValue( buffer.size(),
249 getNumberOfFeatures() );
250 for (
size_t i = 0; i < elementsToCopy; i++)
252 if (_actualDataSizes[i] == SQL_NULL_DATA)
254 targetBuffer[i] = DAAL_DATA_TYPE(0.0);
258 targetBuffer[i] = *( (DAAL_DATA_TYPE *)rawFetchBuffer );
261 rawFetchBuffer +=
sizeof(DAAL_DATA_TYPE);
266 SQLFetchBuffer(
const SQLFetchBuffer &);
267 SQLFetchBuffer &operator=(
const SQLFetchBuffer &);
269 explicit SQLFetchBuffer(
const SQLFeaturesInfo &featuresInfo,
270 const SQLFetchMode::Value &mode,
271 services::Status *status = NULL) : _mode(mode)
273 services::internal::tryAssignStatusAndThrow(status, prepare(featuresInfo, mode));
276 services::Status prepare(
const SQLFeaturesInfo &featuresInfo,
277 const SQLFetchMode::Value &mode)
279 services::Status status;
281 const size_t numberOfFeatures = featuresInfo.getNumberOfFeatures();
282 DAAL_CHECK_STATUS( status, _bufferOffsets.reallocate(numberOfFeatures + 1) );
283 DAAL_CHECK_STATUS( status, _actualDataSizes.reallocate(numberOfFeatures) );
285 _bufferOffsets[0] = 0;
286 for (
size_t i = 0; i < numberOfFeatures; i++)
288 const size_t bufferStride = (mode == SQLFetchMode::useNativeSQLTypes)
289 ? featuresInfo[i].sqlOctetLength
290 :
sizeof(DAAL_DATA_TYPE);
292 _bufferOffsets[i + 1] = _bufferOffsets[i] + bufferStride;
293 _actualDataSizes[i] = 0;
296 const size_t bufferSize = _bufferOffsets[numberOfFeatures];
297 DAAL_CHECK_STATUS( status, _buffer.reallocate(bufferSize) );
303 const SQLFetchMode::Value _mode;
304 services::internal::Buffer<char> _buffer;
305 services::internal::Buffer<SQLLEN> _bufferOffsets;
306 services::internal::Buffer<SQLLEN> _actualDataSizes;
308 typedef services::SharedPtr<SQLFetchBuffer> SQLFetchBufferPtr;
daal::services::internal::Buffer< char >
daal
Definition: algorithm_base_common.h:31
daal::data_management::internal::SQLFetchBuffer
Class hold buffer for fetching data from SQL table, simplifies binding of SQL table columns...
Definition: sql_feature_utils.h:189
daal::data_management::internal::SQLFeatureInfo
Class that holds auxiliary information about single SQL column.
Definition: sql_feature_utils.h:43
daal::Base
Base class for Intel(R) Data Analytics Acceleration Library objects
Definition: base.h:39
daal::data_management::internal::SQLFetchBufferFragment
Represents fragment of SQL fetch buffer.
Definition: sql_feature_utils.h:102
daal::data_management::internal::SQLFetchMode
Mode of fetching data from SQL table.
Definition: sql_feature_utils.h:158
daal::data_management::internal::SQLFeaturesInfo
Class that holds auxiliary information about multiple SQL columns.
Definition: sql_feature_utils.h:70