18 #ifndef __DATA_MANAGEMENT_DATA_SOURCE_INTERNAL_SQL_FEATURE_UTILS_H__
19 #define __DATA_MANAGEMENT_DATA_SOURCE_INTERNAL_SQL_FEATURE_UTILS_H__
22 #include "services/collection.h"
23 #include "services/internal/buffer.h"
24 #include "services/internal/utilities.h"
26 #if defined(_WIN32) || defined(_WIN64)
36 namespace data_management
45 class SQLFeatureInfo :
public Base
49 SQLLEN sqlOctetLength;
50 services::String columnName;
54 sqlType(SQL_UNKNOWN_TYPE),
58 explicit SQLFeatureInfo(
const services::String &columnName,
60 SQLLEN sqlOctetLength,
62 columnName(columnName),
64 sqlOctetLength(sqlOctetLength),
65 isSigned(isSigned) { }
72 class SQLFeaturesInfo :
public Base
75 services::Status add(
const SQLFeatureInfo &featureInfo)
77 _featuresInfo.safe_push_back(featureInfo);
78 return services::Status();
81 const SQLFeatureInfo &
get(
size_t index)
const
83 DAAL_ASSERT( index < _featuresInfo.size() );
84 return _featuresInfo[index];
87 const SQLFeatureInfo &operator[](
size_t index)
const
92 size_t getNumberOfFeatures()
const
94 return _featuresInfo.size();
97 services::Collection<SQLFeatureInfo> _featuresInfo;
104 class SQLFetchBufferFragment :
public Base
107 SQLFetchBufferFragment() :
108 _rawFetchBuffer(NULL),
110 _actualDataSize(NULL) { }
112 explicit SQLFetchBufferFragment(
char *rawFetchBuffer,
114 SQLLEN *actualDataSize) :
115 _rawFetchBuffer(rawFetchBuffer),
116 _bufferSize(bufferSize),
117 _actualDataSize(actualDataSize) { }
119 char *getBuffer()
const
121 return _rawFetchBuffer;
124 SQLLEN getBufferSize()
const
129 SQLLEN getActualDataSize()
const
131 return *_actualDataSize;
134 services::BufferView<char> view()
const
136 return services::BufferView<char>(_rawFetchBuffer, *_actualDataSize);
140 char *_rawFetchBuffer;
142 SQLLEN *_actualDataSize;
145 template<
typename FloatingPo
intType>
146 inline SQLSMALLINT getSQLTypeForFloatingType();
149 inline SQLSMALLINT getSQLTypeForFloatingType<double>()
150 {
return SQL_C_DOUBLE; }
153 inline SQLSMALLINT getSQLTypeForFloatingType<float>()
154 {
return SQL_C_FLOAT; }
166 castToFloatingPointType
169 static SQLSMALLINT getTargetType(Value fetchMode)
173 case useNativeSQLTypes:
174 return SQL_C_DEFAULT;
176 case castToFloatingPointType:
177 return getSQLTypeForFloatingType<DAAL_DATA_TYPE>();
179 return SQL_C_DEFAULT;
191 class SQLFetchBuffer :
public Base
194 static services::SharedPtr<SQLFetchBuffer> create(
const SQLFeaturesInfo &featuresInfo,
195 const SQLFetchMode::Value &mode,
196 services::Status *status = NULL)
198 return services::internal::wrapSharedAndTryThrow(
199 new SQLFetchBuffer(featuresInfo, mode, status), status);
202 size_t getNumberOfFeatures()
const
204 DAAL_ASSERT( _bufferOffsets.size() > 0 );
205 return _bufferOffsets.size() - 1;
208 char *getBufferForFeature(
size_t featureIndex)
const
210 DAAL_ASSERT( _bufferOffsets.size() > 0 );
211 DAAL_ASSERT( featureIndex + 1 < _bufferOffsets.size() );
212 return _buffer.offset( _bufferOffsets[featureIndex] );
215 SQLLEN *getActualDataSizeBufferForFeature(
size_t featureIndex)
const
217 DAAL_ASSERT( featureIndex < _actualDataSizes.size() );
218 return _actualDataSizes.offset(featureIndex);
221 SQLLEN getBufferSizeForFeature(
size_t featureIndex)
const
223 DAAL_ASSERT( _bufferOffsets.size() > 0 );
224 DAAL_ASSERT( featureIndex + 1 < _bufferOffsets.size() );
225 const size_t begin = _bufferOffsets[featureIndex];
226 const size_t end = _bufferOffsets[featureIndex + 1];
227 return (SQLLEN)(end - begin);
230 SQLLEN getActualDataSizeForFeature(
size_t featureIndex)
const
232 DAAL_ASSERT( featureIndex < _actualDataSizes.size() );
233 return _actualDataSizes[featureIndex];
236 SQLFetchBufferFragment getFragment(
size_t featureIndex)
const
238 return SQLFetchBufferFragment( getBufferForFeature(featureIndex),
239 getBufferSizeForFeature(featureIndex),
240 getActualDataSizeBufferForFeature(featureIndex) );
243 void copyTo(
const services::BufferView<DAAL_DATA_TYPE> &buffer)
const
245 DAAL_ASSERT( _mode == SQLFetchMode::castToFloatingPointType );
247 char *rawFetchBuffer = _buffer.data();
248 DAAL_DATA_TYPE *targetBuffer = buffer.data();
250 const size_t elementsToCopy = services::internal::minValue( buffer.size(),
251 getNumberOfFeatures() );
252 for (
size_t i = 0; i < elementsToCopy; i++)
254 if (_actualDataSizes[i] == SQL_NULL_DATA)
256 targetBuffer[i] = DAAL_DATA_TYPE(0.0);
260 targetBuffer[i] = *( (DAAL_DATA_TYPE *)rawFetchBuffer );
263 rawFetchBuffer +=
sizeof(DAAL_DATA_TYPE);
268 SQLFetchBuffer(
const SQLFetchBuffer &);
269 SQLFetchBuffer &operator=(
const SQLFetchBuffer &);
271 explicit SQLFetchBuffer(
const SQLFeaturesInfo &featuresInfo,
272 const SQLFetchMode::Value &mode,
273 services::Status *status = NULL) : _mode(mode)
275 services::internal::tryAssignStatusAndThrow(status, prepare(featuresInfo, mode));
278 services::Status prepare(
const SQLFeaturesInfo &featuresInfo,
279 const SQLFetchMode::Value &mode)
281 services::Status status;
283 const size_t numberOfFeatures = featuresInfo.getNumberOfFeatures();
284 DAAL_CHECK_STATUS( status, _bufferOffsets.reallocate(numberOfFeatures + 1) );
285 DAAL_CHECK_STATUS( status, _actualDataSizes.reallocate(numberOfFeatures) );
287 _bufferOffsets[0] = 0;
288 for (
size_t i = 0; i < numberOfFeatures; i++)
290 const size_t bufferStride = (mode == SQLFetchMode::useNativeSQLTypes)
291 ? featuresInfo[i].sqlOctetLength
292 :
sizeof(DAAL_DATA_TYPE);
294 _bufferOffsets[i + 1] = _bufferOffsets[i] + bufferStride;
295 _actualDataSizes[i] = 0;
298 const size_t bufferSize = _bufferOffsets[numberOfFeatures];
299 DAAL_CHECK_STATUS( status, _buffer.reallocate(bufferSize) );
305 const SQLFetchMode::Value _mode;
306 services::internal::Buffer<char> _buffer;
307 services::internal::Buffer<SQLLEN> _bufferOffsets;
308 services::internal::Buffer<SQLLEN> _actualDataSizes;
310 typedef services::SharedPtr<SQLFetchBuffer> SQLFetchBufferPtr;
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:191
daal::services::internal::Buffer< char >
daal::Base
Base class for Intel(R) Data Analytics Acceleration Library objects
Definition: base.h:41
daal::data_management::internal::SQLFetchBufferFragment
Represents fragment of SQL fetch buffer.
Definition: sql_feature_utils.h:104
daal::data_management::internal::SQLFeaturesInfo
Class that holds auxiliary information about multiple SQL columns.
Definition: sql_feature_utils.h:72
daal::data_management::internal::SQLFeatureInfo
Class that holds auxiliary information about single SQL column.
Definition: sql_feature_utils.h:45
daal::data_management::internal::SQLFetchMode
Mode of fetching data from SQL table.
Definition: sql_feature_utils.h:160