47 #ifndef __MYSQL_FEATURE_MANAGER_H__ 48 #define __MYSQL_FEATURE_MANAGER_H__ 51 #include "services/daal_memory.h" 52 #include "data_management/data_source/data_source.h" 53 #include "data_management/data/data_dictionary.h" 54 #include "data_management/data/numeric_table.h" 55 #include "data_management/data/homogen_numeric_table.h" 67 namespace data_management
80 class MySQLFeatureManager
83 MySQLFeatureManager() : _errors(
new services::ErrorCollection()) {}
92 DataSourceIface::DataSourceStatus statementResultsNumericTable(SQLHSTMT hdlStmt, NumericTable *nt,
size_t maxRows);
100 void createDictionary(SQLHSTMT hdlStmt, DataSourceDictionary *dict)
102 SQLSMALLINT nFeatures = 0;
103 SQLRETURN ret = SQLNumResultCols(hdlStmt, &nFeatures);
105 dict->setNumberOfFeatures( nFeatures );
108 SQLLEN sqlIsUnsigned;
109 SQLLEN sqlTypeLength;
110 for (
int i = 0 ; i < nFeatures; i++)
112 SQLSMALLINT bufferLenUsed;
115 ret = SQLColAttributes(hdlStmt, (SQLUSMALLINT)i + 1, SQL_DESC_UNSIGNED, NULL, 0, NULL, &sqlIsUnsigned);
116 if (!SQL_SUCCEEDED(ret)) { _errors->add(services::ErrorODBC);
return; }
118 ret = SQLColAttributes(hdlStmt, (SQLUSMALLINT)i + 1, SQL_DESC_TYPE, NULL, 0, NULL, &sqlType);
119 if (!SQL_SUCCEEDED(ret)) { _errors->add(services::ErrorODBC);
return; }
121 ret = SQLColAttributes(hdlStmt, (SQLUSMALLINT)i + 1, SQL_DESC_OCTET_LENGTH, NULL, 0, NULL, &sqlTypeLength);
122 if (!SQL_SUCCEEDED(ret)) { _errors->add(services::ErrorODBC);
return; }
124 ret = SQLColAttributes(hdlStmt, (SQLUSMALLINT)i + 1, SQL_DESC_NAME , (SQLPOINTER)label, (SQLSMALLINT)bufferSize, &bufferLenUsed, NULL);
125 if (!SQL_SUCCEEDED(ret)) { _errors->add(services::ErrorODBC);
return; }
129 DataSourceFeature &feature = (*dict)[i];
131 feature.setFeatureName(label);
133 if (isToDouble(sqlType))
135 feature.setType<
double>();
137 else if (isToFloat(sqlType))
139 feature.setType<
float>();
141 else if (isToInt(sqlType))
143 if (sqlTypeLength <= 8)
145 (sqlIsUnsigned == SQL_TRUE) ? feature.setType<
unsigned char>() : feature.setType<
char>();
147 else if (sqlTypeLength <= 16)
149 (sqlIsUnsigned == SQL_TRUE) ? feature.setType<
unsigned short>() : feature.setType<
short>();
151 else if (sqlTypeLength <= 32)
153 (sqlIsUnsigned == SQL_TRUE) ? feature.setType<
unsigned int>() : feature.setType<
int>();
155 else if (sqlTypeLength <= 64)
157 (sqlIsUnsigned == SQL_TRUE) ? feature.setType<DAAL_UINT64>() : feature.setType<DAAL_INT64>();
159 else if (sqlType == SQL_BIGINT)
161 (sqlIsUnsigned == SQL_TRUE) ? feature.setType<DAAL_UINT64>() : feature.setType<DAAL_INT64>();
176 std::string setLimitQuery(std::string &query,
size_t idx_last_read,
size_t maxRows)
178 std::stringstream ss;
179 ss << query <<
" LIMIT " << idx_last_read <<
", " << maxRows <<
";";
183 services::SharedPtr<services::ErrorCollection> getErrors()
189 services::SharedPtr<services::ErrorCollection> _errors;
191 size_t getStrictureSize(NumericTableDictionary *dict);
192 size_t typeSize(data_feature_utils::IndexNumType indexNumType);
193 SQLSMALLINT getTargetType(data_feature_utils::IndexNumType indexNumType);
195 bool isToDouble(
int identifier)
197 const int arraySize = 4;
198 int SQLTypesToDouble[arraySize] = {SQL_NUMERIC, SQL_DECIMAL, SQL_DOUBLE, SQL_FLOAT};
199 return isContain(identifier, SQLTypesToDouble, arraySize);
201 bool isToFloat(
int identifier)
203 const int arraySize = 1;
204 int SQLTypesToFloat[arraySize] = {SQL_REAL};
205 return isContain(identifier, SQLTypesToFloat, arraySize);
207 bool isToInt(
int identifier)
209 const int arraySize = 6;
210 int SQLTypesToInt[arraySize] = {SQL_INTEGER, SQL_SMALLINT, SQL_TINYINT, SQL_BIGINT, SQL_BIT, SQL_BINARY};
211 return isContain(identifier, SQLTypesToInt, arraySize);
213 bool isContain(
int identifier,
int array[],
int arraySize)
215 for (
int i = 0; i < arraySize; i++)
217 if (array[i] == identifier)
226 DataSourceIface::DataSourceStatus MySQLFeatureManager::statementResultsNumericTable(SQLHSTMT hdlStmt, NumericTable *nt,
size_t maxRows)
229 size_t nFeatures = nt->getNumberOfColumns();
231 NumericTableDictionaryPtr dict = nt->getDictionarySharedPtr();
232 data_feature_utils::IndexNumType indexNumType = data_feature_utils::getIndexNumType<DAAL_DATA_TYPE>();
234 SQLLEN *bindInd = (SQLLEN *)daal::services::daal_malloc(
sizeof(SQLLEN) * nFeatures);
235 DAAL_DATA_TYPE *fetchBuffer = (DAAL_DATA_TYPE *)daal::services::daal_malloc(
sizeof(DAAL_DATA_TYPE) * nFeatures);
236 for (
int j = 0; j < nFeatures; j++)
238 if (indexNumType != data_feature_utils::DAAL_OTHER_T)
240 ret = SQLBindCol(hdlStmt, j + 1, getTargetType(indexNumType), (SQLPOINTER)&fetchBuffer[j], 0, &bindInd[j]);
241 if (!SQL_SUCCEEDED(ret)) { _errors->add(services::ErrorODBC);
return DataSource::notReady; }
250 BlockDescriptor<DAAL_DATA_TYPE> block;
251 nt->getBlockOfRows(0, maxRows, writeOnly, block);
252 DAAL_DATA_TYPE *ntBuffer = block.getBlockPtr();
254 while (SQL_SUCCEEDED(ret = SQLFetchScroll(hdlStmt, SQL_FETCH_NEXT, 1)))
256 for (
int j = 0; j < nFeatures; j++)
258 if (bindInd[j] == SQL_NULL_DATA)
260 ntBuffer[read * nFeatures + j] = 0.0;
263 indexNumType = (*dict)[j].indexType;
264 if (indexNumType != data_feature_utils::DAAL_OTHER_T)
266 ntBuffer[read * nFeatures + j] = *((DAAL_DATA_TYPE *) & (fetchBuffer[j]));
270 ntBuffer[read * nFeatures + j] = 0.0;
276 nt->releaseBlockOfRows(block);
278 DataSourceIface::DataSourceStatus status = DataSourceIface::readyForLoad;
279 if (ret != SQL_NO_DATA)
281 if (!SQL_SUCCEEDED(ret))
283 status = DataSourceIface::notReady;
284 _errors->add(services::ErrorODBC);
291 status = DataSourceIface::endOfData;
294 daal::services::daal_free(fetchBuffer);
295 daal::services::daal_free(bindInd);
299 size_t MySQLFeatureManager::getStrictureSize(NumericTableDictionary *dict)
301 size_t structureSize = 0;
302 size_t nFeatures = dict->getNumberOfFeatures();
303 for (
int i = 0; i < nFeatures; i++)
305 data_feature_utils::IndexNumType indexNumType = (*dict)[i].indexType;
306 structureSize += typeSize(indexNumType);
308 return structureSize;
311 size_t MySQLFeatureManager::typeSize(data_feature_utils::IndexNumType indexNumType)
313 if (indexNumType == data_feature_utils::DAAL_FLOAT32) {
return 4; }
314 else if (indexNumType == data_feature_utils::DAAL_FLOAT64) {
return 8; }
315 else if (indexNumType == data_feature_utils::DAAL_INT32_S) {
return 4; }
316 else if (indexNumType == data_feature_utils::DAAL_INT32_U) {
return 4; }
317 else if (indexNumType == data_feature_utils::DAAL_INT64_S) {
return 8; }
318 else if (indexNumType == data_feature_utils::DAAL_INT64_U) {
return 8; }
319 else if (indexNumType == data_feature_utils::DAAL_INT8_S) {
return 1; }
320 else if (indexNumType == data_feature_utils::DAAL_INT8_U) {
return 1; }
321 else if (indexNumType == data_feature_utils::DAAL_INT16_S) {
return 2; }
322 else if (indexNumType == data_feature_utils::DAAL_INT16_U) {
return 2; }
326 SQLSMALLINT MySQLFeatureManager::getTargetType(data_feature_utils::IndexNumType indexNumType)
328 if (indexNumType == data_feature_utils::DAAL_FLOAT32) {
return SQL_C_FLOAT; }
329 else if (indexNumType == data_feature_utils::DAAL_FLOAT64) {
return SQL_C_DOUBLE; }
330 else if (indexNumType == data_feature_utils::DAAL_INT32_S) {
return SQL_C_SLONG; }
331 else if (indexNumType == data_feature_utils::DAAL_INT32_U) {
return SQL_C_ULONG; }
332 else if (indexNumType == data_feature_utils::DAAL_INT64_S) {
return SQL_C_SBIGINT; }
333 else if (indexNumType == data_feature_utils::DAAL_INT64_U) {
return SQL_C_UBIGINT; }
334 else if (indexNumType == data_feature_utils::DAAL_INT8_S) {
return SQL_C_STINYINT; }
335 else if (indexNumType == data_feature_utils::DAAL_INT8_U) {
return SQL_C_UTINYINT; }
336 else if (indexNumType == data_feature_utils::DAAL_INT16_S) {
return SQL_C_SSHORT; }
337 else if (indexNumType == data_feature_utils::DAAL_INT16_U) {
return SQL_C_USHORT; }
338 else {
return SQL_C_SLONG; }
342 using interface1::MySQLFeatureManager;
daal::data_management::interface1::Dictionary::getNumberOfFeatures
size_t getNumberOfFeatures() const
Definition: data_dictionary.h:308
daal::data_management::interface1::DataSourceIface::readyForLoad
Definition: data_source.h:85
daal::data_management::interface1::DataSourceIface::endOfData
Definition: data_source.h:87
daal
Definition: algorithm_base_common.h:57
daal::data_management::interface1::MySQLFeatureManager::statementResultsNumericTable
DataSourceIface::DataSourceStatus statementResultsNumericTable(SQLHSTMT hdlStmt, NumericTable *nt, size_t maxRows)
Definition: mysql_feature_manager.h:226
daal::data_management::interface1::DataSourceFeature::setType
void setType()
Definition: data_source_dictionary.h:154
daal::data_management::interface1::DataSourceFeature
Data structure that describes the Data Source feature.
Definition: data_source_dictionary.h:75
daal::data_management::interface1::NumericTable::getDictionarySharedPtr
virtual NumericTableDictionaryPtr getDictionarySharedPtr() const DAAL_C11_OVERRIDE
Definition: numeric_table.h:658
daal::data_management::interface1::DataSourceIface::DataSourceStatus
DataSourceStatus
Specifies the status of the Data Source.
Definition: data_source.h:83
daal::data_management::interface1::BlockDescriptor::getBlockPtr
DataType * getBlockPtr() const
Definition: numeric_table.h:95
daal::data_management::interface1::MySQLFeatureManager::createDictionary
void createDictionary(SQLHSTMT hdlStmt, DataSourceDictionary *dict)
Definition: mysql_feature_manager.h:100
daal::data_management::interface1::DataSourceFeature::setFeatureName
void setFeatureName(const std::string &featureName)
Definition: data_source_dictionary.h:138
daal::services::interface1::ErrorCollection
Class that represents an error collection.
Definition: error_handling.h:338
daal::data_management::interface1::MySQLFeatureManager
Contains MySQL-specific commands.
Definition: mysql_feature_manager.h:80
daal::services::interface1::SharedPtr
Shared pointer that retains shared ownership of an object through a pointer. Several SharedPtr object...
Definition: daal_shared_ptr.h:187
daal::services::daal_malloc
DAAL_EXPORT void * daal_malloc(size_t size, size_t alignment=DAAL_MALLOC_DEFAULT_ALIGNMENT)
daal::data_management::interface1::NumericTable
Class for a data management component responsible for representation of data in the numeric format...
Definition: numeric_table.h:600
daal::data_management::interface1::NumericTable::resize
virtual services::Status resize(size_t nrows) DAAL_C11_OVERRIDE
Definition: numeric_table.h:662
daal::data_management::interface1::Dictionary::setNumberOfFeatures
virtual services::Status setNumberOfFeatures(size_t numberOfFeatures)
Definition: data_dictionary.h:289
daal::data_management::interface1::MySQLFeatureManager::setLimitQuery
std::string setLimitQuery(std::string &query, size_t idx_last_read, size_t maxRows)
Definition: mysql_feature_manager.h:176
daal::services::daal_free
DAAL_EXPORT void daal_free(void *ptr)
daal::data_management::interface1::BlockDescriptor< DAAL_DATA_TYPE >
daal::data_management::interface1::DenseNumericTableIface::releaseBlockOfRows
virtual services::Status releaseBlockOfRows(BlockDescriptor< double > &block)=0
daal::data_management::interface1::NumericTable::getNumberOfColumns
size_t getNumberOfColumns() const
Definition: numeric_table.h:677
daal::services::ErrorODBC
Definition: error_indexes.h:400
daal::data_management::interface1::DataSourceIface::notReady
Definition: data_source.h:88
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:184