Пример #1
0
int QSqlCursor::insert( bool invalidate )
{
    if ( ( d->md & Insert ) != Insert || !driver() )
	return FALSE;
    int k = d->editBuffer.count();
    if ( k == 0 )
	return 0;
    
    QString fList;
    QString vList;
    bool comma = FALSE;
    // use a prepared query if the driver supports it
    if ( driver()->hasFeature( QSqlDriver::PreparedQueries ) ) {
	int cnt = 0;
	bool oraStyle = driver()->hasFeature( QSqlDriver::NamedPlaceholders );
	for( int j = 0; j < k; ++j ) {
	    QSqlField* f = d->editBuffer.field( j );
	    if ( d->editBuffer.isGenerated( j ) ) {
		if ( comma ) {
		    fList += ",";
		    vList += ",";
		}
		fList += f->name();
		vList += (oraStyle == TRUE) ? ":f" + QString::number(cnt) : QString("?");
		cnt++;
		comma = TRUE;
	    }
	}
	if ( !comma ) {
	    return 0;
	}
	QString str;
	str.append( "insert into " ).append( name() ).append( "(" ).append( fList ).append( ") values (" ).append( vList ). append ( ")" );
	return applyPrepared( str, invalidate );
    } else {
	for( int j = 0; j < k; ++j ) {
	    QSqlField* f = d->editBuffer.field( j );
	    if ( d->editBuffer.isGenerated( j ) ) {
		if ( comma ) {
		    fList += ",";
		    vList += ",";
		}
		fList += f->name();
		vList += driver()->formatValue( f );
		comma = TRUE;
	    }
	}

	if ( !comma ) {
	    // no valid fields found
	    return 0;
	}
	QString str;
	str.append( "insert into " ).append( name() ).append( "(" ).append( fList ).append( ") values (" ).append( vList ). append ( ")" );
	return apply( str, invalidate );
    }
}
Пример #2
0
	QString repr(QSqlRecord record) {
		QString record_str;
		QSqlField field;
		for(int i=0; i<record.count(); i++) {
			field = record.field(i);
			if (field.isNull())
				record_str.append(QString("%1 = NULL, ").arg(field.name()));
			else
				record_str.append(QString("%1 = %2, ").arg(field.name(), field.value().toString()));
		}
		return record_str;
	}
Пример #3
0
QVariant SchemaModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid ()) {
        return QVariant ();
    }

    if (role == Qt::DisplayRole) {
        if (index.row () >= record.count ()) {
            return QVariant ();
        }

        QSqlField field = record.field(index.row());

        switch (index.column ()) {
        case 0:
            return field.name ();

        case 1:
            return QLatin1String (QVariant::typeToName(field.type()));

        case 2:
            return field.length ();

        case 3: {
            QStringList mods;

            if (pindex.indexOf (field.name ()) >= 0) {
                mods << tr("PRIMARY KEY");
            }

            if (field.requiredStatus () == QSqlField::Required) {
                mods << tr("NOT NULL");
            }
            else if (field.requiredStatus () == QSqlField::Optional) {
                mods << tr ("NULL");
            }

            if (field.isAutoValue ()) {
                mods << tr ("AUTO_INCREMENT");
            }

            return mods.join(", ");
        }

        case 4:
            return field.defaultValue ();
        }
    }
    else if (role == Qt::DecorationRole) {
    }

    return QVariant ();
}
Пример #4
0
QSqlRecord Query::record() const
{
	QSqlRecord ret = Super::record();
	for(int i=0; i<ret.count(); i++) {
		QSqlField fld = ret.field(i);
		QString n = QueryBuilder::unmangleLongFieldName(fld.name());
		if(n != fld.name()) {
			fld.setName(n);
			ret.replace(i, fld);
		}
	}
	return ret;
}
Пример #5
0
QSqlRecord Query::record() const
{
	if(m_demangledRecord.isEmpty()) {
		m_demangledRecord = Super::record();
		for(int i=0; i<m_demangledRecord.count(); i++) {
			QSqlField fld = m_demangledRecord.field(i);
			QString n = QueryBuilder::unmangleLongFieldName(fld.name());
			if(n != fld.name()) {
				fld.setName(n);
				m_demangledRecord.replace(i, fld);
			}
		}
	}
	return m_demangledRecord;
}
Пример #6
0
QString Browser::StructureTable( QSqlRecord now )
{
    QSqlRecord rec = now;
    QString createtable;
    QString sqltipename;
    QStringList CreateTable;
    int totalcools = rec.count();
    if (totalcools > 0) {
              /* sqlite3 table construct from odbc converter */
              for (int i = 0; i < totalcools; ++i) {
                QSqlField fld = rec.field(i);
                  QString name = Strtrimmed(fld.name());
                  QString typeoffield = QString(QVariant::typeToName(fld.type()));
                  /* fld.isAutoValue()  never true from auto_increment mysql ??? */
                  if (fld.requiredStatus() and i < 2 and typeoffield == "int") {
                   sqltipename = QString("%1 INTEGER PRIMARY KEY").arg(name); 
                  } else if (  typeoffield == "double" or typeoffield == "int" ) {
                   sqltipename = QString("%1 NUMERIC").arg(name); 
                  } else if (  typeoffield == "QByteArray") {
                   sqltipename = QString("%1 BLOB").arg(name); 
                  } else {
                   sqltipename = QString("%1 TEXT").arg(name);   
                  }
                  CreateTable.append(sqltipename);
                  ////////qDebug() << "### fieldname "  << name;
                  ///////////qDebug() << "### typeoffield "  << typeoffield;
              }
        QString midlecreate = CreateTable.join(",");
                midlecreate.prepend(QString("CREATE TABLE %1 (").arg(runningtable));
                midlecreate.append(");");
        createtable = midlecreate;
   }
return createtable;
}
QList<QPair<QString, QVariant::Type>> TableSchema::getFieldTypeList() const
{
    QList<QPair<QString, QVariant::Type>> fieldList;
    for (int i = 0; i < tableFields.count(); ++i) {
        QSqlField f = tableFields.field(i);
        fieldList << QPair<QString, QVariant::Type>(f.name(), f.type());
    }
    return fieldList;
}
QString TableSchema::autoValueFieldName() const
{
    for (int i = 0; i < tableFields.count(); ++i) {
        QSqlField f = tableFields.field(i);
        if (f.isAutoValue())
            return f.name();
    }
    return QString();
}
QPair<QString, QVariant::Type> TableSchema::getPrimaryKeyFieldType() const
{
    QPair<QString, QVariant::Type> pair;
    int index = primaryKeyIndex();
    if (index >= 0) {
        QSqlField f = tableFields.field(index);
        pair = QPair<QString, QVariant::Type>(f.name(), f.type());
    }
    return pair;
}
int TableSchema::lockRevisionIndex() const
{
    for (int i = 0; i < tableFields.count(); ++i) {
        QSqlField f = tableFields.field(i);
        if (fieldNameToVariableName(f.name()) == "lockRevision") {
            return i;
        }
    }
    return -1;
}
Пример #11
0
void DataViewer::onDatabaseItemActivated(const DatabaseItem &item)
{
    if ((DatabaseItem::Table != item.m_type) &&
            (DatabaseItem::View != item.m_type))
    {
        return;
    }

    d_ptr->database = item.m_database;

    // for table tableShema
    QSqlRecord record = item.m_database.record(item.m_value);

    d_ptr->m_shemaModel->removeRows(0, d_ptr->m_shemaModel->rowCount());
    d_ptr->m_shemaModel->insertRows(0, record.count());

    for (int i = 0; i < record.count(); ++i)
    {
        QSqlField field = record.field(i);

        d_ptr->m_shemaModel->setData(d_ptr->m_shemaModel->index(i, 0), field.name());
        d_ptr->m_shemaModel->setData(d_ptr->m_shemaModel->index(i, 1),
                              field.type() == QVariant::Invalid ? "???" : QString(QVariant::typeToName(field.type())));
        d_ptr->m_shemaModel->setData(d_ptr->m_shemaModel->index(i, 2),
                              (field.length() < 0) ? QVariant("???") : field.length());
        d_ptr->m_shemaModel->setData(d_ptr->m_shemaModel->index(i, 3),
                              (field.precision() < 0) ? QVariant("???") : field.precision());
        d_ptr->m_shemaModel->setData(d_ptr->m_shemaModel->index(i, 4),
                              field.requiredStatus() == QSqlField::Unknown ? "???" : QVariant(bool(field.requiredStatus())));
        d_ptr->m_shemaModel->setData(d_ptr->m_shemaModel->index(i, 5), field.isAutoValue());
        d_ptr->m_shemaModel->setData(d_ptr->m_shemaModel->index(i, 6), field.defaultValue());
    }

    d_ptr->m_tableShema->setModel(d_ptr->m_shemaModel.data());
    d_ptr->m_tableShema->setEditTriggers(QAbstractItemView::NoEditTriggers);
    d_ptr->m_tableShema->resizeColumnsToContents();

    d_ptr->m_tab->setTabText(::Scheme, tr(::c_schemeTable).arg(item.m_value));

    // for table tableData
    QSqlTableModel *modelData = new QSqlTableModel(0, item.m_database);
    modelData->setEditStrategy(QSqlTableModel::OnRowChange);
    modelData->setTable(item.m_value);
    modelData->select();

    d_ptr->m_tableData->setModel(modelData);
    d_ptr->m_tableData->setEditTriggers(QAbstractItemView::DoubleClicked | QAbstractItemView::EditKeyPressed);
    d_ptr->m_tableData->resizeColumnsToContents();

    d_ptr->m_tab->setTabText(::Data, tr(::c_dataTable).arg(item.m_value));

    d_ptr->m_sqlDataModel.reset(modelData);
}
int TableSchema::primaryKeyIndex() const
{
    QSqlTableModel model;
    model.setTable(tablename);
    QSqlIndex index = model.primaryKey();
    if (index.isEmpty()) {
        return -1;
    }

    QSqlField fi = index.field(0);
    return model.record().indexOf(fi.name());
}
QString TableSchema::primaryKeyFieldName() const
{
    QSqlTableModel model;
    model.setTable(tablename);
    QSqlIndex index = model.primaryKey();
    if (index.isEmpty()) {
        return QString();
    }

    QSqlField fi = index.field(0);
    return fi.name();
}
Пример #14
0
QString Browser::StructureMYSQLTable( QSqlRecord now )
{
    QSqlRecord rec = now;
    QString createtable;
    QString sqltipename, mkey;
    QStringList CreateTable;
    int totalcools = rec.count();
    if (totalcools > 0) {
              /* sqlite3 table construct from odbc converter */
              for (int i = 0; i < totalcools; ++i) {
                QSqlField fld = rec.field(i);
                  QString name = Strtrimmed(fld.name());
                  name.toUpper();
                  if (name == "id") {
                  name = "ID";
                  }
                  QString typeoffield = QString(QVariant::typeToName(fld.type()));
                  int sizefe = fld.length();
                  if (sizefe > 255) {
                  sizefe = 255;
                  }
                  if (sizefe < 1) {
                  sizefe = 255;
                  }
                  /* fld.isAutoValue()  never true from auto_increment mysql ??? */
                  if (fld.requiredStatus() and i < 2 and typeoffield == "int") {
                   sqltipename = QString("  `%1` INT(%2) NOT NULL auto_increment").arg(name).arg(sizefe);
                   mkey = QString("   KEY `%1` (`%1`)").arg(name);
                  } else if ( typeoffield == "int" ) {
                   sqltipename = QString("  `%1` int(%2) default NULL").arg(name).arg(sizefe); 
                  } else if (  typeoffield == "double") {
                   sqltipename = QString("  `%1` int(%2) default NULL").arg(name).arg(sizefe);    
                  } else if (  typeoffield == "QByteArray") {
                   sqltipename = QString("  `%1` LONGBLOB default NULL").arg(name);    
                  } else {
                   sqltipename = QString("  `%1` VARCHAR(%2) default NULL").arg(name).arg(sizefe);   
                  }
                  CreateTable.append(sqltipename);
                  
                  ////////qDebug() << "### fieldname "  << name;
                  ///////////qDebug() << "### typeoffield "  << typeoffield;
              }
                  if (mkey.size() > 0) {
                  CreateTable.append(mkey);
                  }
                  
        QString midlecreate = CreateTable.join(",\n");
                midlecreate.prepend(QString("### mysql version 5 or > ###\nDROP TABLE IF EXISTS `%1`;\nCREATE TABLE `%1` (\n").arg(runningtable));
                midlecreate.append("\n) TYPE=MyISAM;");
        createtable = midlecreate;
   }
return createtable;
}
Пример #15
0
/*!
    Returns an SQL \c{ORDER BY} clause based on the currently set
    sort order.

    \sa setSort(), selectStatement()
*/
QString QSqlTableModel::orderByClause() const
{
    Q_D(const QSqlTableModel);
    QSqlField f = d->rec.field(d->sortColumn);
    if (!f.isValid())
        return QString();

    //we can safely escape the field because it would have been obtained from the database
    //and have the correct case
    QString field = d->db.driver()->escapeIdentifier(f.name(), QSqlDriver::FieldName);
    field.prepend(QLatin1Char('.')).prepend(d->tableName);
    field = d->sortOrder == Qt::AscendingOrder ? Sql::asc(field) : Sql::desc(field);
    return Sql::orderBy(field);
}
Пример #16
0
/*!
    Returns an SQL \c{ORDER BY} clause based on the currently set
    sort order.

    \sa setSort(), selectStatement()
*/
QString QSqlTableModel::orderByClause() const
{
    Q_D(const QSqlTableModel);
    QString s;
    QSqlField f = d->rec.field(d->sortColumn);
    if (!f.isValid())
        return s;
        
    QString table = d->db.driver()->escapeIdentifier(d->tableName, QSqlDriver::TableName);
    QString field = d->db.driver()->escapeIdentifier(f.name(), QSqlDriver::FieldName);
    s.append(QLatin1String("ORDER BY ")).append(table).append(QLatin1Char('.')).append(field);
    s += d->sortOrder == Qt::AscendingOrder ? QLatin1String(" ASC") : QLatin1String(" DESC");

    return s;
}
Пример #17
0
/*!
    Returns an SQL \c{ORDER BY} clause based on the currently set
    sort order.

    \sa setSort(), selectStatement()
*/
QString QSqlTableModel::orderByClause() const
{
    Q_D(const QSqlTableModel);
    QString s;
    QSqlField f = d->rec.field(d->sortColumn);
    if (!f.isValid())
        return s;
        
    QString table = d->tableName;
    //we can safely escape the field because it would have been obtained from the database
    //and have the correct case
    QString field = d->db.driver()->escapeIdentifier(f.name(), QSqlDriver::FieldName);
    s.append(QLatin1String("ORDER BY ")).append(table).append(QLatin1Char('.')).append(field);
    s += d->sortOrder == Qt::AscendingOrder ? QLatin1String(" ASC") : QLatin1String(" DESC");

    return s;
}
Пример #18
0
QDebug operator<<(QDebug dbg, const QSqlField &f)
{
    dbg.nospace() << "QSqlField(" << f.name() << ", " << QMetaType::typeName(f.type());
    if (f.length() >= 0)
        dbg.nospace() << ", length: " << f.length();
    if (f.precision() >= 0)
        dbg.nospace() << ", precision: " << f.precision();
    if (f.requiredStatus() != QSqlField::Unknown)
        dbg.nospace() << ", required: "
                      << (f.requiredStatus() == QSqlField::Required ? "yes" : "no");
    dbg.nospace() << ", generated: " << (f.isGenerated() ? "yes" : "no");
    if (f.typeID() >= 0)
        dbg.nospace() << ", typeID: " << f.typeID();
    if (!f.defaultValue().isNull())
        dbg.nospace() << ", auto-value: \"" << f.defaultValue() << '\"';
    dbg.nospace() << ')';
    return dbg.space();
}
Пример #19
0
int QSqlCursor::update( const QString & filter, bool invalidate )
{    
    if ( ( d->md & Update ) != Update ) {
	return FALSE;
    }
    int k = count();
    if ( k == 0 ) {
	return 0;
    }
    
    // use a prepared query if the driver supports it
    if ( driver()->hasFeature( QSqlDriver::PreparedQueries ) ) {
	QString fList;
	bool comma = FALSE;
	int cnt = 0;
	bool oraStyle = driver()->hasFeature( QSqlDriver::NamedPlaceholders );
	for( int j = 0; j < k; ++j ) {
	    QSqlField* f = d->editBuffer.field( j );
	    if ( d->editBuffer.isGenerated( j ) ) {
		if ( comma ) {
		    fList += ",";
		}
		fList += f->name() + " = " + (oraStyle == TRUE ? ":f" + QString::number(cnt) : QString("?"));
		cnt++;
		comma = TRUE;
	    }
	}
	if ( !comma ) {
	    return 0;
	}
	QString str = "update " + name() + " set " + fList;
	if ( filter.length() ) {
	    str+= " where " + filter;
	}
	return applyPrepared( str, invalidate );
    } else {
	QString str = "update " + name();
	str += " set " + toString( &d->editBuffer, QString::null, "=", "," );
	if ( filter.length() ) {
	    str+= " where " + filter;
	}
	return apply( str, invalidate );
    }
}
Пример #20
0
int Q3SqlCursor::update(const QString & filter, bool invalidate)
{
    if ((d->md & Update) != Update) {
        return false;
    }
    int k = count();
    if (k == 0) {
        return 0;
    }
    
    // use a prepared query if the driver supports it
    if (driver()->hasFeature(QSqlDriver::PreparedQueries)) {
        QString fList;
        bool comma = false;
        int cnt = 0;
        bool oraStyle = driver()->hasFeature(QSqlDriver::NamedPlaceholders);
        for(int j = 0; j < k; ++j) {
            QSqlField f = d->editBuffer.field(j);
            if (d->editBuffer.isGenerated(j)) {
                if (comma) {
                    fList += QLatin1Char(',');
                }
                fList += f.name() + QLatin1String(" = ") + (oraStyle == true ? QLatin1String(":f") + QString::number(cnt) : QString(QLatin1Char('?')));
                cnt++;
                comma = true;
            }
        }
        if (!comma) {
            return 0;
        }
        QString str(QLatin1String("update ") + name() + QLatin1String(" set ") + fList);
        if (filter.length()) {
            str+= QLatin1String(" where ") + filter;
        }
        return applyPrepared(str, invalidate);
    } else {
        QString str = QLatin1String("update ") + name();
        str += QLatin1String(" set ") + toString(&d->editBuffer, QString(), QString(QLatin1Char('=')), QString(QLatin1Char(',')));
        if (filter.length()) {
            str+= QLatin1String(" where ") + filter;
        }
        return apply(str, invalidate);
    }
}
//start id="findrecord"
MetaDataValue MetaDataTable::findRecord(QString fileName) {
    using namespace DbUtils;
    QFileInfo fi(fileName);
    MetaDataObject f;
    if (!fi.exists()) return f;                  /* Return a QObject by value? Don't forget, MetaDataValue is the base class of this particular QObject. */
    QString abs = fi.absoluteFilePath();

    QSqlDatabase db = DbConnectionSettings::lastSaved();
    QString qs = QString("select * from %1 where FileName = \"%2\"")
                  .arg(m_tableName).arg(escape(abs));
    QSqlQuery findQuery(qs);
    if (!findQuery.isActive()) {
        qDebug() << "Query Failed: " << findQuery.lastQuery() 
                 << findQuery.lastError().text();
        return f;
    }
    if (!findQuery.first()) return f;
    QSqlRecord rec = findQuery.record();
    for (int i=rec.count() -1; i >= 0; --i) {    /* Properties in QObject map to column names / field values in the table! */
        QSqlField field = rec.field(i);
        QString key = field.name();
        QVariant value = field.value();
        if (key == "Preference") {
            int v = value.toInt();
            Preference p(v);
            f.setPreference(p);
        }
        else if (key == "TrackTime") {           /* SQLite has no time type, so we must store as int. */
            QTime trackTime;
            trackTime = trackTime.addSecs(value.toInt());
            f.setTrackTime(trackTime);
        }
        else {
            f.setProperty(key, value);           /* Using QObject setProperty for other columns. */
        }

    }
    return f;                                    /* Create a value type from this local stack QObject about to be destroyed. */
}
Пример #22
0
void Browser::showTable(const QString &t)
{
    model = new QSqlTableModel(table, connectionWidget->currentDatabase());
    model->setEditStrategy(QSqlTableModel::OnRowChange);
    model->setTable(t);
    runningtable = t;
    ////QSqlQuery fatto = model->query();
    ////QString fatto_query = fatto.executedQuery();
    model->select();
    QString tasble = model->tableName();
    QStringList rowsname;
    rowsname.clear();
    QSqlRecord rec = connectionWidget->currentDatabase().record(tasble);
    QString nami;
    SendToArea("",0);
    for (int i = 0; i < rec.count(); ++i) {
             QSqlField fld = rec.field(i);
             nami = fld.name();
             rowsname.append(nami);
    }
    QString brow = rowsname.join(",");
    QString running = QString("SELECT %2 FROM %1").arg(tasble,brow);
    SendToArea(running,1);
    runningtable = tasble;
    
    if (model->lastError().type() != QSqlError::NoError)
        emit statusMessage(model->lastError().text());
    table->setModel(model);
    table->setEditTriggers(QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed);

    connect(table->selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),
            this, SLOT(currentChanged()));
    
    
    
    
    updateActions();
}
Пример #23
0
QDebug operator<<(QDebug dbg, const QSqlField &f)
{
#ifndef Q_BROKEN_DEBUG_STREAM
    dbg.nospace() << "QSqlField(" << f.name() << ", " << QVariant::typeToName(f.type());
    if (f.length() >= 0)
        dbg.nospace() << ", length: " << f.length();
    if (f.precision() >= 0)
        dbg.nospace() << ", precision: " << f.precision();
    if (f.requiredStatus() != QSqlField::Unknown)
        dbg.nospace() << ", required: "
                      << (f.requiredStatus() == QSqlField::Required ? "yes" : "no");
    dbg.nospace() << ", generated: " << (f.isGenerated() ? "yes" : "no");
    if (f.typeID() >= 0)
        dbg.nospace() << ", typeID: " << f.typeID();
    if (!f.defaultValue().isNull())
        dbg.nospace() << ", auto-value: \"" << f.defaultValue() << '\"';
    dbg.nospace() << ')';
    return dbg.space();
#else
    qWarning("This compiler doesn't support streaming QSqlField to QDebug");
    return dbg;
    Q_UNUSED(f);
#endif
}
Пример #24
0
void Browser::showMetaData(const QString &t)
{
    QSqlRecord rec = connectionWidget->currentDatabase().record(t);
    QStandardItemModel *model = new QStandardItemModel(table);

    model->insertRows(0, rec.count());
    model->insertColumns(0, 7);

    model->setHeaderData(0, Qt::Horizontal, "Fieldname");
    model->setHeaderData(1, Qt::Horizontal, "Type");
    model->setHeaderData(2, Qt::Horizontal, "Length");
    model->setHeaderData(3, Qt::Horizontal, "Precision");
    model->setHeaderData(4, Qt::Horizontal, "Required");
    model->setHeaderData(5, Qt::Horizontal, "AutoValue");
    model->setHeaderData(6, Qt::Horizontal, "DefaultValue");


    for (int i = 0; i < rec.count(); ++i) {
        QSqlField fld = rec.field(i);
        model->setData(model->index(i, 0), fld.name());
        model->setData(model->index(i, 1), fld.typeID() == -1
                ? QString(QVariant::typeToName(fld.type()))
                : QString("%1 (%2)").arg(QVariant::typeToName(fld.type())).arg(fld.typeID()));
        model->setData(model->index(i, 2), fld.length());
        model->setData(model->index(i, 3), fld.precision());
        model->setData(model->index(i, 4), fld.requiredStatus() == -1 ? QVariant("?")
                : QVariant(bool(fld.requiredStatus())));
        model->setData(model->index(i, 5), fld.isAutoValue());
        model->setData(model->index(i, 6), fld.defaultValue());
    }

    table->setModel(model);
    table->setEditTriggers(QAbstractItemView::NoEditTriggers);

    updateActions();
}
Пример #25
0
// loadFields() gets the type from the field record
void QgsDb2Provider::loadFields()
{
  mAttributeFields.clear();
  //mDefaultValues.clear();
  QString table = QString( "%1.%2" ).arg( mSchemaName, mTableName );

  // Use the Qt functionality to get the fields and their definitions.
  QSqlRecord r = mDatabase.record( table );
  int fieldCount = r.count();

  for ( int i = 0; i < fieldCount; i++ )
  {
    QSqlField f = r.field( i );
    int typeID = f.typeID(); // seems to be DB2 numeric type id (standard?)
    QString sqlTypeName = db2TypeName( typeID );
    QVariant::Type sqlType = f.type();
    QgsDebugMsg( QString( "name: %1; length: %2; sqlTypeID: %3; sqlTypeName: %4" )
                 .arg( f.name() ).arg( f.length() ).arg( QString::number( typeID ), sqlTypeName ) );
    if ( f.name() == mGeometryColName ) continue; // Got this with uri, just skip
    if ( sqlType == QVariant::String )
    {
      mAttributeFields.append(
        QgsField(
          f.name(),
          sqlType,
          sqlTypeName,
          f.length()
        ) );
    }
    else if ( sqlType == QVariant::Double )
    {
      mAttributeFields.append(
        QgsField(
          f.name(),
          sqlType,
          sqlTypeName,
          f.length(),
          f.precision()
        ) );
    }
    else
    {
      mAttributeFields.append(
        QgsField(
          f.name(),
          sqlType,
          sqlTypeName
        ) );
    }

    if ( !f.defaultValue().isNull() )
    {
      mDefaultValues.insert( i, f.defaultValue() );
    }
// Hack to get primary key since the primaryIndex function above doesn't work
// on z/OS. Pick first integer column.
    if ( mFidColName.length() == 0 &&
         ( sqlType == QVariant::LongLong || sqlType == QVariant::Int ) )
    {
      mFidColName = f.name();
    }
  }
}
Пример #26
0
void ODBC_Connection::LoadTableColumns(QTreeWidgetItem *item)
{
	for (int i = 0, count = item->childCount(); i < count; i++)
		item->removeChild(item->child(0));
		
	QString sTableName = item->text(0);

	if (m_db.isOpen())
	{
		if (!m_db.tables().contains(sTableName)) // if it isnt a table, return
			return;

		// set wait cursor
		QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
		QApplication::processEvents();
		Logging::getInstance()->WriteLog(INFORMATION, QString("Retrieving tableinfo for table \"%1\" of connection \"%2\"...").arg(sTableName, m_sConnectionName));
		bool bTableWarningShown = false;
		QSqlRecord records = m_db.record(sTableName);
		QSqlField field;
		QSqlIndex index = m_db.primaryIndex(sTableName);
		QString sName;
		QSqlQuery query;
		QString sTypeName;
		QString sLength;
		QString sNullable;
		for (int i = 0, count = records.count(); i < count; i++)
		{
			field = records.field(i);
			sName = field.name();
			query = m_db.exec(QString("SELECT DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = '%1' AND TABLE_NAME = '%2'").arg(sName, sTableName));
			if (query.next())
			{
				sTypeName = query.value(0).toString();
				sLength = query.value(1).toString() != "0" ? query.value(1).toString() : query.value(2).toString();
				sNullable = query.value(3).toString();
				query.finish();
			}
			else
			{
				if (!bTableWarningShown)
				{	
					Logging::getInstance()->WriteLog(WARNING, QString("Couldn't retrieve fieldinfo for table \"%1\" of connection \"%2\", database INFORMATION_SCHEMA.COLUMNS doesn't exist, starting fallback to manual type detection").arg(sTableName, m_sConnectionName));
					#ifdef _DEBUG
					qDebug() << QString("Couldn't retrieve fieldinfo for table \"%1\" of connection \"%2\", database INFORMATION_SCHEMA.COLUMNS doesn't exist, starting fallback to manual type detection").arg(sTableName, m_sConnectionName);
					#endif
					bTableWarningShown = true;
				}
				sTypeName = QVariant::typeToName(field.type());
				sLength = QString().setNum(field.length());
				sNullable = (field.requiredStatus() == 1 ? "YES" : "NO");
			}
			bool isPrimaryKey = index.contains(sName) ? true : false;
			QTreeWidgetItem *pItem = new QTreeWidgetItem();
			if (isPrimaryKey)
			{
				pItem->setText(0, QString("%1 (PS, %2(%3), %4)").arg(sName, sTypeName, sLength, (sNullable == "YES" ? "NULL" : "NOT NULL")));
				pItem->setIcon(0, QIcon(":/ODBC_Query/Resources/primary_key.png"));
			}
			else
			{
				pItem->setText(0, QString("%1 (%2(%3), %4)").arg(sName, sTypeName, sLength, (sNullable == "YES" ? "NULL" : "NOT NULL")));
				pItem->setIcon(0, QIcon(":/ODBC_Query/Resources/row.png"));
			}
			item->addChild(pItem);
		}
		m_ui.TableTreeWidget->expandItem(item);
		Logging::getInstance()->WriteLog(INFORMATION, QString("Tableinfo for table \"%1\" of connection \"%2\" retrieved").arg(sTableName, m_sConnectionName));
	}
	else
	{
		Logging::getInstance()->WriteLog(ERR, QString("Couldn't retrieve tableinfo for table \"%1\" of connection \"%2\", connection isn't open").arg(sTableName, m_sConnectionName));
		#ifdef _DEBUG
		qDebug() << QString("Couldn't retrieve tableinfo for table \"%1\" of connection \"%2\", connection isn't open").arg(sTableName, m_sConnectionName);
		#endif
	}
	// set back to arrow cursor
	QApplication::restoreOverrideCursor();
}
Пример #27
0
static QString copy_sql_table(const QString &table_name, const QSqlRecord &dest_rec, qfs::Connection &from_conn, qfs::Connection &to_conn)
{
	qfLogFuncFrame() << table_name;
	qfInfo() << "Copying table:" << table_name;
	if(!to_conn.tableExists(table_name)) {
		qfWarning() << "Destination table" << table_name << "doesn't exist!";
		return QString();
	}
	qfs::Query from_q(from_conn);
	if(!from_q.exec(QString("SELECT * FROM %1").arg(table_name))) {
		qfWarning() << "Source table" << table_name << "doesn't exist!";
		return QString();
	}
	const QSqlRecord src_rec = from_q.record();
	// copy only fields which can be found in both records
	QSqlRecord rec;
	for (int i = 0; i < dest_rec.count(); ++i) {
		QString fld_name = dest_rec.fieldName(i);
		if(src_rec.indexOf(fld_name) >= 0) {
			qfDebug() << fld_name << "\t added to imported fields since it is present in both databases";
			rec.append(dest_rec.field(i));
		}
	}
	auto *sqldrv = to_conn.driver();
	QString qs = sqldrv->sqlStatement(QSqlDriver::InsertStatement, table_name, rec, true);
	qfDebug() << qs;
	qfs::Query to_q(to_conn);
	if(!to_q.prepare(qs)) {
		return QString("Cannot prepare insert table SQL statement, table: %1.").arg(table_name);
	}
	bool has_id_int = false;
	while(from_q.next()) {
		if(table_name == QLatin1String("config")) {
			if(from_q.value(0).toString() == QLatin1String("db.version"))
				continue;
		}
		for (int i = 0; i < rec.count(); ++i) {
			QSqlField fld = rec.field(i);
			QString fld_name = fld.name();
			//qfDebug() << "copy:" << fld_name << from_q.value(fld_name);
			QVariant v = from_q.value(fld_name);
			v.convert(rec.field(i).type());
			if(!has_id_int
					&& (fld.type() == QVariant::Int
						|| fld.type() == QVariant::UInt
						|| fld.type() == QVariant::LongLong
						|| fld.type() == QVariant::ULongLong)
					&& fld_name == QLatin1String("id")) {
				// probably ID INT AUTO_INCREMENT
				//max_id = qMax(max_id, v.toInt());
				has_id_int = true;
			}
			to_q.addBindValue(v);
		}
		if(!to_q.exec())
			return QString("SQL Error: %1").arg(to_q.lastError().text());
	}
	if(has_id_int && to_conn.driverName().endsWith(QLatin1String("PSQL"), Qt::CaseInsensitive)) {
		// set sequence current value when importing to PSQL
		qfInfo() << "updating seq number table:" << table_name;
		if(!to_q.exec("SELECT pg_catalog.setval(pg_get_serial_sequence(" QF_SARG(table_name) ", 'id'), MAX(id)) FROM " QF_CARG(table_name), !qf::core::Exception::Throw)) {
			return QString("Cannot update sequence counter, table: %1.").arg(table_name);
		}
	}
	return QString();
}
Пример #28
0
int Q3SqlCursor::insert(bool invalidate)
{
    if ((d->md & Insert) != Insert || !driver())
        return false;
    int k = d->editBuffer.count();
    if (k == 0)
        return 0;

    QString fList;
    QString vList;
    bool comma = false;
    // use a prepared query if the driver supports it
    if (driver()->hasFeature(QSqlDriver::PreparedQueries)) {
        int cnt = 0;
        bool oraStyle = driver()->hasFeature(QSqlDriver::NamedPlaceholders);
        for(int j = 0; j < k; ++j) {
            QSqlField f = d->editBuffer.field(j);
            if (d->editBuffer.isGenerated(j)) {
                if (comma) {
                    fList += QLatin1Char(',');
                    vList += QLatin1Char(',');
                }
                fList += driver()->escapeIdentifier(f.name(), QSqlDriver::FieldName);
                vList += (oraStyle == true) ? QLatin1String(":f") + QString::number(cnt) : QString(QLatin1Char('?'));
                cnt++;
                comma = true;
            }
        }
        if (!comma) {
            return 0;
        }
        QString str;
        str.append(QLatin1String("insert into ")).append(name())
           .append(QLatin1String(" (")).append(fList)
           .append(QLatin1String(") values (")).append(vList). append(QLatin1Char(')'));

        return applyPrepared(str, invalidate);
    } else {
        for(int j = 0; j < k; ++j) {
            QSqlField f = d->editBuffer.field(j);
            if (d->editBuffer.isGenerated(j)) {
                if (comma) {
                    fList += QLatin1Char(',');
                    vList += QLatin1Char(',');
                }
                fList += driver()->escapeIdentifier(f.name(), QSqlDriver::FieldName);
                vList += driver()->formatValue(&f);
                comma = true;
            }
        }

        if (!comma) {
            // no valid fields found
            return 0;
        }
        QString str;
        str.append(QLatin1String("insert into ")).append(name()).append(QLatin1String(" ("))
           .append(fList).append(QLatin1String(") values (")).append(vList). append (QLatin1String(")"));
        return apply(str, invalidate);
    }
}