23 #ifndef __MYSQL_FEATURE_MANAGER_H__
24 #define __MYSQL_FEATURE_MANAGER_H__
28 #include "data_management/data/numeric_table.h"
29 #include "data_management/features/shortcuts.h"
30 #include "data_management/data_source/data_source.h"
31 #include "data_management/data_source/internal/sql_feature_utils.h"
32 #include "data_management/data_source/modifiers/sql/shortcuts.h"
33 #include "data_management/data_source/modifiers/sql/internal/engine.h"
37 namespace data_management
50 class SQLFeatureManager
53 SQLFeatureManager() : _errors(services::SharedPtr<services::ErrorCollection>(
new services::ErrorCollection))
63 SQLFeatureManager &addModifier(
const features::FeatureIdCollectionIfacePtr &featureIds,
64 const modifiers::sql::FeatureModifierIfacePtr &modifier,
65 services::Status *status = NULL)
67 services::Status localStatus;
68 if (!_modifiersManager)
70 _modifiersManager = modifiers::sql::internal::ModifiersManager::create(&localStatus);
73 services::internal::tryAssignStatusAndThrow(status, localStatus);
78 localStatus |= _modifiersManager->addModifier(featureIds, modifier);
81 services::internal::tryAssignStatusAndThrow(status, localStatus);
94 DataSourceIface::DataSourceStatus statementResultsNumericTable(SQLHSTMT hdlStmt, NumericTable *nt,
size_t maxRows)
97 DAAL_ASSERT( hdlStmt );
101 nt->getBlockOfRows(0, maxRows, writeOnly, _currentRowBlock);
102 DAAL_DATA_TYPE *ntBuffer = _currentRowBlock.getBlockPtr();
103 const size_t nColumns = _currentRowBlock.getNumberOfColumns();
107 while (SQL_SUCCEEDED(ret = SQLFetchScroll(hdlStmt, SQL_FETCH_NEXT, 1)))
109 services::BufferView<DAAL_DATA_TYPE> rowBuffer(ntBuffer + read * nColumns, nColumns);
111 if (_modifiersManager)
113 _modifiersManager->applyModifiers(rowBuffer);
117 _fetchBuffer->copyTo(rowBuffer);
121 if (read >= maxRows) {
break; }
124 nt->releaseBlockOfRows(_currentRowBlock);
127 DataSourceIface::DataSourceStatus status = DataSourceIface::readyForLoad;
128 if (ret != SQL_NO_DATA)
130 if (!SQL_SUCCEEDED(ret))
132 status = DataSourceIface::notReady;
133 _errors->add(services::ErrorODBC);
140 status = DataSourceIface::endOfData;
151 services::Status createDictionary(SQLHSTMT hdlStmt, DataSourceDictionary *dictionary)
153 DAAL_ASSERT( dictionary );
154 DAAL_ASSERT( hdlStmt );
156 services::Status status;
158 const internal::SQLFeaturesInfo &featuresInfo = getFeaturesInfo(hdlStmt, &status);
159 DAAL_CHECK_STATUS_VAR( status );
161 DAAL_CHECK_STATUS( status, bindSQLColumns(hdlStmt, featuresInfo) );
162 DAAL_CHECK_STATUS( status, fillDictionary(*dictionary, featuresInfo) );
174 std::string setLimitQuery(std::string &query,
size_t idx_last_read,
size_t maxRows)
176 if (query.find(
'\0') != std::string::npos)
178 this->_errors->add(services::ErrorNullByteInjection);
179 return std::string();
181 std::stringstream ss;
182 ss << query <<
" LIMIT " << idx_last_read <<
", " << maxRows <<
";";
186 services::ErrorCollectionPtr getErrors()
188 return services::ErrorCollectionPtr(
new services::ErrorCollection());
192 internal::SQLFeaturesInfo getFeaturesInfo(SQLHSTMT hdlStmt, services::Status *status = NULL)
194 SQLSMALLINT nFeatures = 0;
195 SQLRETURN ret = SQLNumResultCols(hdlStmt, &nFeatures);
196 if (!SQL_SUCCEEDED(ret))
198 services::internal::tryAssignStatusAndThrow(status, services::ErrorODBC);
199 return internal::SQLFeaturesInfo();
203 SQLLEN sqlIsUnsigned;
204 SQLLEN sqlTypeLength;
205 internal::SQLFeaturesInfo featuresInfo;
207 for (
int i = 0 ; i < nFeatures; i++)
209 const int bufferSize = 128;
210 char label[bufferSize];
213 SQLLEN sqlOctetLength;
214 SQLSMALLINT labelLenUsed;
216 SQLLEN sqlIsUnsigned;
217 ret = SQLColAttributes(hdlStmt, (SQLUSMALLINT)(i + 1), SQL_DESC_UNSIGNED, NULL, 0, NULL, &sqlIsUnsigned);
218 if (!SQL_SUCCEEDED(ret))
220 services::internal::tryAssignStatusAndThrow(status, services::ErrorODBC);
221 return internal::SQLFeaturesInfo();
224 ret = SQLColAttributes(hdlStmt, (SQLUSMALLINT)(i + 1), SQL_DESC_TYPE, NULL, 0, NULL, &sqlType);
225 if (!SQL_SUCCEEDED(ret))
227 services::internal::tryAssignStatusAndThrow(status, services::ErrorODBC);
228 return internal::SQLFeaturesInfo();
231 ret = SQLColAttributes(hdlStmt, (SQLUSMALLINT)(i + 1), SQL_DESC_OCTET_LENGTH, NULL, 0, NULL, &sqlOctetLength);
232 if (!SQL_SUCCEEDED(ret))
234 services::internal::tryAssignStatusAndThrow(status, services::ErrorODBC);
235 return internal::SQLFeaturesInfo();
238 ret = SQLColAttributes(hdlStmt, (SQLUSMALLINT)(i + 1), SQL_DESC_NAME, (SQLPOINTER)label,
239 (SQLSMALLINT)bufferSize, &labelLenUsed, NULL);
240 if (!SQL_SUCCEEDED(ret))
242 services::internal::tryAssignStatusAndThrow(status, services::ErrorODBC);
243 return internal::SQLFeaturesInfo();
245 services::Status internalStatus = services::internal::checkForNullByteInjection(label, label + labelLenUsed);
248 services::internal::tryAssignStatusAndThrow(status, internalStatus);
249 return internal::SQLFeaturesInfo();
251 const services::String labelStr(label);
252 const bool isSigned = sqlIsUnsigned == SQL_FALSE;
254 featuresInfo.add( internal::SQLFeatureInfo(labelStr,
263 services::Status bindSQLColumns(SQLHSTMT hdlStmt,
const internal::SQLFeaturesInfo &featuresInfo)
265 DAAL_ASSERT( hdlStmt );
267 services::Status status;
269 const internal::SQLFetchMode::Value fetchMode = _modifiersManager
270 ? internal::SQLFetchMode::useNativeSQLTypes
271 : internal::SQLFetchMode::castToFloatingPointType;
272 _fetchBuffer = internal::SQLFetchBuffer::create(featuresInfo, fetchMode, &status);
273 DAAL_CHECK_STATUS_VAR(status);
275 SQLRETURN ret = SQLFreeStmt(hdlStmt, SQL_UNBIND);
276 if (!SQL_SUCCEEDED(ret)) {
return services::throwIfPossible(services::ErrorODBC); }
278 const SQLSMALLINT targetSQLType = internal::SQLFetchMode::getTargetType(fetchMode);
279 for (
size_t i = 0; i < featuresInfo.getNumberOfFeatures(); i++)
281 char *
const buffer = _fetchBuffer->getBufferForFeature(i);
282 const SQLLEN bufferSize = _fetchBuffer->getBufferSizeForFeature(i);
283 SQLLEN *
const actualSizeBuffer = _fetchBuffer->getActualDataSizeBufferForFeature(i);
285 SQLLEN strLenOrIndPtr;
286 ret = SQLBindCol(hdlStmt, (SQLUSMALLINT)(i + 1), targetSQLType,
287 (SQLPOINTER)buffer, bufferSize, actualSizeBuffer);
288 if (!SQL_SUCCEEDED(ret)) {
return services::throwIfPossible(services::ErrorODBC); }
291 if (_modifiersManager)
293 DAAL_CHECK_STATUS( status, _modifiersManager->prepare(featuresInfo, *_fetchBuffer) );
299 services::Status fillDictionary(DataSourceDictionary &dictionary,
300 const internal::SQLFeaturesInfo &featuresInfo)
302 if (_modifiersManager)
304 return _modifiersManager->fillDictionary(dictionary);
307 const size_t nFeatures = featuresInfo.getNumberOfFeatures();
308 services::Status status = dictionary.setNumberOfFeatures(nFeatures);
309 if (!status) {
return services::throwIfPossible(status); }
311 for (
size_t i = 0; i < nFeatures; i++)
313 dictionary[i].ntFeature.setType<DAAL_DATA_TYPE>();
314 dictionary[i].ntFeature.featureType = features::DAAL_CONTINUOUS;
321 internal::SQLFetchBufferPtr _fetchBuffer;
322 BlockDescriptor<DAAL_DATA_TYPE> _currentRowBlock;
323 services::SharedPtr<services::ErrorCollection> _errors;
324 modifiers::sql::internal::ModifiersManagerPtr _modifiersManager;
327 typedef SQLFeatureManager MySQLFeatureManager;
332 using interface1::SQLFeatureManager;
333 using interface1::MySQLFeatureManager;
daal::services::ErrorODBC
Definition: error_indexes.h:390
daal::data_management::interface1::SQLFeatureManager::addModifier
SQLFeatureManager & addModifier(const features::FeatureIdCollectionIfacePtr &featureIds, const modifiers::sql::FeatureModifierIfacePtr &modifier, services::Status *status=NULL)
Definition: mysql_feature_manager.h:63
daal::data_management::interface1::SQLFeatureManager
Interprets the response of SQL data base and fill provided numeric table and dictionary.
Definition: mysql_feature_manager.h:50
daal::data_management::interface1::Dictionary
Class that represents a dictionary of a data set and provides methods to work with the data dictionar...
Definition: data_dictionary.h:163
daal::data_management::interface1::NumericTable
Class for a data management component responsible for representation of data in the numeric format...
Definition: numeric_table.h:577
daal::data_management::interface1::DataSourceIface::readyForLoad
Definition: data_source.h:60
daal::data_management::interface1::DataSourceIface::notReady
Definition: data_source.h:63
daal::services::ErrorNullByteInjection
Definition: error_indexes.h:394
daal::data_management::interface1::DataSourceIface::DataSourceStatus
DataSourceStatus
Specifies the status of the Data Source.
Definition: data_source.h:58
daal::data_management::interface1::SQLFeatureManager::createDictionary
services::Status createDictionary(SQLHSTMT hdlStmt, DataSourceDictionary *dictionary)
Definition: mysql_feature_manager.h:151
daal::data_management::interface1::DataSourceIface::endOfData
Definition: data_source.h:62
daal::data_management::interface1::NumericTable::resize
virtual services::Status resize(size_t nrows) DAAL_C11_OVERRIDE
Definition: numeric_table.h:639
daal::data_management::interface1::SQLFeatureManager::statementResultsNumericTable
DataSourceIface::DataSourceStatus statementResultsNumericTable(SQLHSTMT hdlStmt, NumericTable *nt, size_t maxRows)
Definition: mysql_feature_manager.h:94
daal::data_management::internal::SQLFeaturesInfo
Class that holds auxiliary information about multiple SQL columns.
Definition: sql_feature_utils.h:72
daal::data_management::interface1::DenseNumericTableIface::getBlockOfRows
virtual services::Status getBlockOfRows(size_t vector_idx, size_t vector_num, ReadWriteMode rwflag, BlockDescriptor< double > &block)=0
daal::data_management::interface1::DenseNumericTableIface::releaseBlockOfRows
virtual services::Status releaseBlockOfRows(BlockDescriptor< double > &block)=0
daal::data_management::interface1::BlockDescriptor::getNumberOfColumns
size_t getNumberOfColumns() const
Definition: numeric_table.h:97
daal::data_management::interface1::BlockDescriptor::getBlockPtr
DataType * getBlockPtr() const
Definition: numeric_table.h:71
daal::data_management::interface1::SQLFeatureManager::setLimitQuery
std::string setLimitQuery(std::string &query, size_t idx_last_read, size_t maxRows)
Definition: mysql_feature_manager.h:174