/*! Get the types and properties for each column. */ bool MySQLMigrate::drv_readTableSchema( const QString& originalName, KexiDB::TableSchema& tableSchema) { // m_table = new KexiDB::TableSchema(table); // //TODO IDEA: ask for user input for captions // tableSchema.setCaption(table + " table"); //Perform a query on the table to get some data QString query = QString("SELECT * FROM `") + drv_escapeIdentifier(originalName) + "` LIMIT 0"; if(d->executeSQL(query)) { MYSQL_RES *res = mysql_store_result(d->mysql); if (res != NULL) { unsigned int numFlds = mysql_num_fields(res); MYSQL_FIELD *fields = mysql_fetch_fields(res); for(unsigned int i = 0; i < numFlds; i++) { QString fldName(fields[i].name); QString fldID( KexiUtils::string2Identifier(fldName) ); KexiDB::Field *fld = new KexiDB::Field(fldID, type(originalName, &fields[i])); if(fld->type() == KexiDB::Field::Enum) { QStringList values = examineEnumField(originalName, &fields[i]); } fld->setCaption(fldName); getConstraints(fields[i].flags, fld); getOptions(fields[i].flags, fld); tableSchema.addField(fld); } mysql_free_result(res); } else { kdDebug() << "MySQLMigrate::drv_tableNames: null result" << endl; } return true; } else { return false; } }
void KexiDataSourcePage::slotFieldSelected() { KexiDB::Field::Type dataType = KexiDB::Field::InvalidType; #ifdef KEXI_NO_AUTOFIELD_WIDGET KexiDB::Field *field = m_tableOrQuerySchema->field( m_widgetDataSourceCombo->fieldOrExpression()); //temp #else //! @todo this should also work for expressions KexiDB::Field *field = m_fieldListView->schema()->field( m_widgetDataSourceCombo->fieldOrExpression()); #endif if (field) dataType = field->type(); emit dataSourceFieldOrExpressionChanged( m_widgetDataSourceCombo->fieldOrExpression(), m_widgetDataSourceCombo->fieldOrExpressionCaption(), dataType ); }
KexiTableEdit* KexiCellEditorFactory::createEditor(KexiTableViewColumn &column, QWidget* parent) { KexiDB::Field *realField; if (column.visibleLookupColumnInfo()) { realField = column.visibleLookupColumnInfo()->field; } else { realField = column.field(); } KexiCellEditorFactoryItem *item = 0; if (hasEnumType(column)) { //--we need to create combo box because of relationship: item = KexiCellEditorFactory::item(KexiDB::Field::Enum); } else { item = KexiCellEditorFactory::item(realField->type(), realField->subType()); } #if 0 //js: TODO LATER //--check if we need to create combo box because of relationship: //WARNING: it's assumed that indices are one-field long KexiDB::TableSchema *table = f.table(); if (table) { //find index that contain this field KexiDB::IndexSchema::ListIterator it = table->indicesIterator(); for (;it.current();++it) { KexiDB::IndexSchema *idx = it.current(); if (idx->fields()->contains(&f)) { //find details-side rel. for this index KexiDB::Relationship *rel = idx->detailsRelationships()->first(); if (rel) { } } } } #endif return item->createEditor(column, parent); }
//================================================================================== //Return the value for a given column for the current record - Private const version QVariant pqxxSqlCursor::pValue(uint pos)const { if (m_res->size() <= 0) { KexiDBDrvWarn << "pqxxSqlCursor::value - ERROR: result size not greater than 0"; return QVariant(); } if (pos >= m_fieldsToStoreInRow) { // KexiDBDrvWarn << "pqxxSqlCursor::value - ERROR: requested position is greater than the number of fields"; return QVariant(); } KexiDB::Field *f = (m_fieldsExpanded && pos < qMin((uint)m_fieldsExpanded->count(), m_fieldCount)) ? m_fieldsExpanded->at(pos)->field : 0; // KexiDBDrvDbg << "pqxxSqlCursor::value(" << pos << ")"; //from most to least frequently used types: if (f) { //We probably have a schema type query so can use kexi to determin the row type if ((f->isIntegerType()) || (/*ROWID*/!f && m_containsROWIDInfo && pos == m_fieldCount)) { return (*m_res)[at()][pos].as(int()); } else if (f->isTextType()) { return QString::fromUtf8((*m_res)[at()][pos].c_str()); //utf8? } else if (f->isFPNumericType()) { return (*m_res)[at()][pos].as(double()); } else if (f->type() == Field::Boolean) { return QString((*m_res)[at()][pos].c_str()).toLower() == "t" ? QVariant(true) : QVariant(false); } else if (f->typeGroup() == Field::BLOBGroup) { // pqxx::result::field r = (*m_res)[at()][pos]; // kDebug() << r.name() << ", " << r.c_str() << ", " << r.type() << ", " << r.size(); return ::pgsqlByteaToByteArray((*m_res)[at()][pos]); } else { return pgsqlCStrToVariant((*m_res)[at()][pos]); } } else { // We probably have a raw type query so use pqxx to determin the column type return pgsqlCStrToVariant((*m_res)[at()][pos]); } return QString::fromUtf8((*m_res)[at()][pos].c_str(), (*m_res)[at()][pos].size()); //utf8? }
void KexiDataSourcePage::slotFieldSelected() { KexiDB::Field::Type dataType = KexiDB::Field::InvalidType; #ifdef KEXI_NO_AUTOFIELD_WIDGET KexiDB::Field *field = m_tableOrQuerySchema->field( m_widgetDataSourceCombo->fieldOrExpression()); //temp #else //! @todo this should also work for expressions KexiDB::Field *field = m_fieldListView->schema()->field( m_widgetDataSourceCombo->fieldOrExpression()); #endif if (field) dataType = field->type(); /*2.0: clear button is available in the combobox itself m_clearWidgetDSButton->setEnabled(!m_widgetDataSourceCombo->fieldOrExpression().isEmpty());*/ emit dataSourceFieldOrExpressionChanged( m_widgetDataSourceCombo->fieldOrExpression(), m_widgetDataSourceCombo->fieldOrExpressionCaption(), dataType ); }
bool SQLitePreparedStatement::execute() { #ifdef SQLITE2 //! @todo #else if (!prepared_st_handle) return false; if (m_resetRequired) { res = sqlite3_reset(prepared_st_handle); if (SQLITE_OK != res) { //! @todo msg? return false; } m_resetRequired = false; } int arg=1; //arg index counted from 1 KexiDB::Field *field; Field::List _dummy; Field::ListIterator itFields(_dummy); //for INSERT, we're iterating over inserting values //for SELECT, we're iterating over WHERE conditions if (m_type == SelectStatement) itFields = *m_whereFields; else if (m_type == InsertStatement) itFields = m_fields->fieldsIterator(); else assert(0); //impl. error for (QValueListConstIterator<QVariant> it = m_args.constBegin(); (field = itFields.current()); ++it, ++itFields, arg++) { if (it==m_args.constEnd() || (*it).isNull()) {//no value to bind or the value is null: bind NULL res = sqlite3_bind_null(prepared_st_handle, arg); if (SQLITE_OK != res) { //! @todo msg? return false; } continue; } if (field->isTextType()) { //! @todo optimize: make a static copy so SQLITE_STATIC can be used QCString utf8String((*it).toString().utf8()); res = sqlite3_bind_text(prepared_st_handle, arg, (const char*)utf8String, utf8String.length(), SQLITE_TRANSIENT /*??*/); if (SQLITE_OK != res) { //! @todo msg? return false; } } else switch (field->type()) { case KexiDB::Field::Byte: case KexiDB::Field::ShortInteger: case KexiDB::Field::Integer: { //! @todo what about unsigned > INT_MAX ? bool ok; const int value = (*it).toInt(&ok); if (ok) { res = sqlite3_bind_int(prepared_st_handle, arg, value); if (SQLITE_OK != res) { //! @todo msg? return false; } } else { res = sqlite3_bind_null(prepared_st_handle, arg); if (SQLITE_OK != res) { //! @todo msg? return false; } } break; } case KexiDB::Field::Float: case KexiDB::Field::Double: res = sqlite3_bind_double(prepared_st_handle, arg, (*it).toDouble()); if (SQLITE_OK != res) { //! @todo msg? return false; } break; case KexiDB::Field::BigInteger: { //! @todo what about unsigned > LLONG_MAX ? bool ok; Q_LLONG value = (*it).toLongLong(&ok); if (ok) { res = sqlite3_bind_int64(prepared_st_handle, arg, value); if (SQLITE_OK != res) { //! @todo msg? return false; } } else { res = sqlite3_bind_null(prepared_st_handle, arg); if (SQLITE_OK != res) { //! @todo msg? return false; } } break; } case KexiDB::Field::Boolean: res = sqlite3_bind_text(prepared_st_handle, arg, QString::number((*it).toBool() ? 1 : 0).latin1(), 1, SQLITE_TRANSIENT /*??*/); if (SQLITE_OK != res) { //! @todo msg? return false; } break; case KexiDB::Field::Time: res = sqlite3_bind_text(prepared_st_handle, arg, (*it).toTime().toString(Qt::ISODate).latin1(), sizeof("HH:MM:SS"), SQLITE_TRANSIENT /*??*/); if (SQLITE_OK != res) { //! @todo msg? return false; } break; case KexiDB::Field::Date: res = sqlite3_bind_text(prepared_st_handle, arg, (*it).toDate().toString(Qt::ISODate).latin1(), sizeof("YYYY-MM-DD"), SQLITE_TRANSIENT /*??*/); if (SQLITE_OK != res) { //! @todo msg? return false; } break; case KexiDB::Field::DateTime: res = sqlite3_bind_text(prepared_st_handle, arg, (*it).toDateTime().toString(Qt::ISODate).latin1(), sizeof("YYYY-MM-DDTHH:MM:SS"), SQLITE_TRANSIENT /*??*/); if (SQLITE_OK != res) { //! @todo msg? return false; } break; case KexiDB::Field::BLOB: { const QByteArray byteArray((*it).toByteArray()); res = sqlite3_bind_blob(prepared_st_handle, arg, (const char*)byteArray, byteArray.size(), SQLITE_TRANSIENT /*??*/); if (SQLITE_OK != res) { //! @todo msg? return false; } break; } default: KexiDBWarn << "PreparedStatement::execute(): unsupported field type: " << field->type() << " - NULL value bound to column #" << arg << endl; res = sqlite3_bind_null(prepared_st_handle, arg); if (SQLITE_OK != res) { //! @todo msg? return false; } } //switch } //real execution res = sqlite3_step(prepared_st_handle); m_resetRequired = true; if (m_type == InsertStatement && res == SQLITE_DONE) { return true; } if (m_type == SelectStatement) { //fetch result //todo } #endif return false; }