21 #ifndef __MYSQL_FEATURE_MANAGER_H__
22 #define __MYSQL_FEATURE_MANAGER_H__
26 #include "data_management/data/numeric_table.h"
27 #include "data_management/features/shortcuts.h"
28 #include "data_management/data_source/data_source.h"
29 #include "data_management/data_source/internal/sql_feature_utils.h"
30 #include "data_management/data_source/modifiers/sql/shortcuts.h"
31 #include "data_management/data_source/modifiers/sql/internal/engine.h"
35 namespace data_management
48 class SQLFeatureManager
58 SQLFeatureManager &addModifier(
const features::FeatureIdCollectionIfacePtr &featureIds,
59 const modifiers::sql::FeatureModifierIfacePtr &modifier,
60 services::Status *status = NULL)
62 services::Status localStatus;
63 if (!_modifiersManager)
65 _modifiersManager = modifiers::sql::internal::ModifiersManager::create(&localStatus);
68 services::internal::tryAssignStatusAndThrow(status, localStatus);
73 localStatus |= _modifiersManager->addModifier(featureIds, modifier);
76 services::internal::tryAssignStatusAndThrow(status, localStatus);
89 DataSourceIface::DataSourceStatus statementResultsNumericTable(SQLHSTMT hdlStmt, NumericTable *nt,
size_t maxRows)
92 DAAL_ASSERT( hdlStmt );
96 nt->getBlockOfRows(0, maxRows, writeOnly, _currentRowBlock);
97 DAAL_DATA_TYPE *ntBuffer = _currentRowBlock.getBlockPtr();
98 const size_t nColumns = _currentRowBlock.getNumberOfColumns();
102 while (SQL_SUCCEEDED(ret = SQLFetchScroll(hdlStmt, SQL_FETCH_NEXT, 1)))
104 services::BufferView<DAAL_DATA_TYPE> rowBuffer(ntBuffer + read * nColumns, nColumns);
106 if (_modifiersManager)
108 _modifiersManager->applyModifiers(rowBuffer);
112 _fetchBuffer->copyTo(rowBuffer);
116 if (read >= maxRows) {
break; }
119 nt->releaseBlockOfRows(_currentRowBlock);
122 DataSourceIface::DataSourceStatus status = DataSourceIface::readyForLoad;
123 if (ret != SQL_NO_DATA)
125 if (!SQL_SUCCEEDED(ret))
127 status = DataSourceIface::notReady;
128 _errors->add(services::ErrorODBC);
135 status = DataSourceIface::endOfData;
146 services::Status createDictionary(SQLHSTMT hdlStmt, DataSourceDictionary *dictionary)
148 DAAL_ASSERT( dictionary );
149 DAAL_ASSERT( hdlStmt );
151 services::Status status;
153 const internal::SQLFeaturesInfo &featuresInfo = getFeaturesInfo(hdlStmt, &status);
154 DAAL_CHECK_STATUS_VAR( status );
156 DAAL_CHECK_STATUS( status, bindSQLColumns(hdlStmt, featuresInfo) );
157 DAAL_CHECK_STATUS( status, fillDictionary(*dictionary, featuresInfo) );
169 std::string setLimitQuery(std::string &query,
size_t idx_last_read,
size_t maxRows)
171 std::stringstream ss;
172 ss << query <<
" LIMIT " << idx_last_read <<
", " << maxRows <<
";";
176 services::ErrorCollectionPtr getErrors()
178 return services::ErrorCollectionPtr(
new services::ErrorCollection());
182 internal::SQLFeaturesInfo getFeaturesInfo(SQLHSTMT hdlStmt, services::Status *status = NULL)
184 SQLSMALLINT nFeatures = 0;
185 SQLRETURN ret = SQLNumResultCols(hdlStmt, &nFeatures);
186 if (!SQL_SUCCEEDED(ret))
188 services::internal::tryAssignStatusAndThrow(status, services::ErrorODBC);
189 return internal::SQLFeaturesInfo();
193 SQLLEN sqlIsUnsigned;
194 SQLLEN sqlTypeLength;
195 internal::SQLFeaturesInfo featuresInfo;
197 for (
int i = 0 ; i < nFeatures; i++)
199 const int bufferSize = 128;
200 char label[bufferSize];
203 SQLLEN sqlOctetLength;
204 SQLSMALLINT labelLenUsed;
206 SQLLEN sqlIsUnsigned;
207 ret = SQLColAttributes(hdlStmt, (SQLUSMALLINT)(i + 1), SQL_DESC_UNSIGNED, NULL, 0, NULL, &sqlIsUnsigned);
208 if (!SQL_SUCCEEDED(ret))
210 services::internal::tryAssignStatusAndThrow(status, services::ErrorODBC);
211 return internal::SQLFeaturesInfo();
214 ret = SQLColAttributes(hdlStmt, (SQLUSMALLINT)(i + 1), SQL_DESC_TYPE, NULL, 0, NULL, &sqlType);
215 if (!SQL_SUCCEEDED(ret))
217 services::internal::tryAssignStatusAndThrow(status, services::ErrorODBC);
218 return internal::SQLFeaturesInfo();
221 ret = SQLColAttributes(hdlStmt, (SQLUSMALLINT)(i + 1), SQL_DESC_OCTET_LENGTH, NULL, 0, NULL, &sqlOctetLength);
222 if (!SQL_SUCCEEDED(ret))
224 services::internal::tryAssignStatusAndThrow(status, services::ErrorODBC);
225 return internal::SQLFeaturesInfo();
228 ret = SQLColAttributes(hdlStmt, (SQLUSMALLINT)(i + 1), SQL_DESC_NAME, (SQLPOINTER)label,
229 (SQLSMALLINT)bufferSize, &labelLenUsed, NULL);
230 if (!SQL_SUCCEEDED(ret))
232 services::internal::tryAssignStatusAndThrow(status, services::ErrorODBC);
233 return internal::SQLFeaturesInfo();
236 const services::String labelStr(label, label + labelLenUsed);
237 const bool isSigned = sqlIsUnsigned == SQL_FALSE;
239 featuresInfo.add( internal::SQLFeatureInfo(labelStr,
248 services::Status bindSQLColumns(SQLHSTMT hdlStmt,
const internal::SQLFeaturesInfo &featuresInfo)
250 DAAL_ASSERT( hdlStmt );
252 services::Status status;
254 const internal::SQLFetchMode::Value fetchMode = _modifiersManager
255 ? internal::SQLFetchMode::useNativeSQLTypes
256 : internal::SQLFetchMode::castToFloatingPointType;
257 _fetchBuffer = internal::SQLFetchBuffer::create(featuresInfo, fetchMode, &status);
258 DAAL_CHECK_STATUS_VAR(status);
260 SQLRETURN ret = SQLFreeStmt(hdlStmt, SQL_UNBIND);
261 if (!SQL_SUCCEEDED(ret)) {
return services::throwIfPossible(services::ErrorODBC); }
263 const SQLSMALLINT targetSQLType = internal::SQLFetchMode::getTargetType(fetchMode);
264 for (
size_t i = 0; i < featuresInfo.getNumberOfFeatures(); i++)
266 char *
const buffer = _fetchBuffer->getBufferForFeature(i);
267 const SQLLEN bufferSize = _fetchBuffer->getBufferSizeForFeature(i);
268 SQLLEN *
const actualSizeBuffer = _fetchBuffer->getActualDataSizeBufferForFeature(i);
270 SQLLEN strLenOrIndPtr;
271 ret = SQLBindCol(hdlStmt, (SQLUSMALLINT)(i + 1), targetSQLType,
272 (SQLPOINTER)buffer, bufferSize, actualSizeBuffer);
273 if (!SQL_SUCCEEDED(ret)) {
return services::throwIfPossible(services::ErrorODBC); }
276 if (_modifiersManager)
278 DAAL_CHECK_STATUS( status, _modifiersManager->prepare(featuresInfo, *_fetchBuffer) );
284 services::Status fillDictionary(DataSourceDictionary &dictionary,
285 const internal::SQLFeaturesInfo &featuresInfo)
287 if (_modifiersManager)
289 return _modifiersManager->fillDictionary(dictionary);
292 const size_t nFeatures = featuresInfo.getNumberOfFeatures();
293 services::Status status = dictionary.setNumberOfFeatures(nFeatures);
294 if (!status) {
return services::throwIfPossible(status); }
296 for (
size_t i = 0; i < nFeatures; i++)
298 dictionary[i].ntFeature.setType<DAAL_DATA_TYPE>();
299 dictionary[i].ntFeature.featureType = features::DAAL_CONTINUOUS;
306 internal::SQLFetchBufferPtr _fetchBuffer;
307 BlockDescriptor<DAAL_DATA_TYPE> _currentRowBlock;
308 services::SharedPtr<services::ErrorCollection> _errors;
309 modifiers::sql::internal::ModifiersManagerPtr _modifiersManager;
312 typedef SQLFeatureManager MySQLFeatureManager;
317 using interface1::SQLFeatureManager;
318 using interface1::MySQLFeatureManager;
daal::data_management::interface1::SQLFeatureManager
Interprets the response of SQL data base and fill provided numeric table and dictionary.
Definition: mysql_feature_manager.h:48
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:58
daal::data_management::interface1::BlockDescriptor::getBlockPtr
DataType * getBlockPtr() const
Definition: numeric_table.h:69
daal
Definition: algorithm_base_common.h:31
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:169
daal::data_management::interface1::BlockDescriptor::getNumberOfColumns
size_t getNumberOfColumns() const
Definition: numeric_table.h:95
daal::data_management::interface1::SQLFeatureManager::statementResultsNumericTable
DataSourceIface::DataSourceStatus statementResultsNumericTable(SQLHSTMT hdlStmt, NumericTable *nt, size_t maxRows)
Definition: mysql_feature_manager.h:89
daal::data_management::interface1::NumericTable
Class for a data management component responsible for representation of data in the numeric format...
Definition: numeric_table.h:574
daal::data_management::interface1::NumericTable::resize
virtual services::Status resize(size_t nrows) DAAL_C11_OVERRIDE
Definition: numeric_table.h:636
daal::data_management::interface1::DataSourceIface::DataSourceStatus
DataSourceStatus
Specifies the status of the Data Source.
Definition: data_source.h:57
daal::data_management::interface1::DataSourceIface::readyForLoad
Definition: data_source.h:59
daal::data_management::interface1::DataSourceIface::endOfData
Definition: data_source.h:61
daal::data_management::interface1::DenseNumericTableIface::releaseBlockOfRows
virtual services::Status releaseBlockOfRows(BlockDescriptor< double > &block)=0
daal::services::ErrorODBC
Definition: error_indexes.h:377
daal::data_management::interface1::SQLFeatureManager::createDictionary
services::Status createDictionary(SQLHSTMT hdlStmt, DataSourceDictionary *dictionary)
Definition: mysql_feature_manager.h:146
daal::data_management::interface1::DataSourceIface::notReady
Definition: data_source.h:62
daal::data_management::internal::SQLFeaturesInfo
Class that holds auxiliary information about multiple SQL columns.
Definition: sql_feature_utils.h:70
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::Dictionary
Class that represents a dictionary of a data set and provides methods to work with the data dictionar...
Definition: data_dictionary.h:161