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 ); } }
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; }
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 (); }
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; }
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; }
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; }
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(); }
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; }
/*! 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); }
/*! 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; }
/*! 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; }
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(); }
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 ); } }
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. */ }
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(); }
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 }
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(); }
// 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(); } } }
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(); }
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(); }
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); } }