void tst_QSqlDriver::primaryIndex() { QFETCH_GLOBAL(QString, dbName); QSqlDatabase db = QSqlDatabase::database(dbName); CHECK_DATABASE(db); QString tablename(qTableName("relTEST1", __FILE__)); //check that we can get primary index using unquoted mixed case table name QSqlIndex index = db.driver()->primaryIndex(tablename); QCOMPARE(index.count(), 1); if( db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) QCOMPARE(index.fieldName(0), QString::fromLatin1("ID")); else QCOMPARE(index.fieldName(0), QString::fromLatin1("id")); //check that we can get the primary index using a quoted tablename if( db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) tablename = tablename.toUpper(); else if (db.driverName().startsWith("QPSQL")) tablename = tablename.toLower(); if(!db.driverName().startsWith("QODBC") && !db.databaseName().contains("PostgreSql")) { index = db.driver()->primaryIndex(db.driver()->escapeIdentifier(tablename, QSqlDriver::TableName)); QCOMPARE(index.count(), 1); } if( db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) QCOMPARE(index.fieldName(0), QString::fromLatin1("ID")); else QCOMPARE(index.fieldName(0), QString::fromLatin1("id")); //check that we can not get the primary index using a quoted but incorrect table name casing if( db.driverName().startsWith("QIBASE") || db.driverName().startsWith("QOCI") || db.driverName().startsWith("QDB2")) tablename = tablename.toLower(); else if (db.driverName().startsWith("QPSQL")) tablename = tablename.toUpper(); index = db.driver()->primaryIndex(db.driver()->escapeIdentifier(tablename, QSqlDriver::TableName)); if (tst_Databases::isMySQL(db) || db.driverName().startsWith("QSQLITE") || db.driverName().startsWith("QTDS") || tst_Databases::isSqlServer(db) || tst_Databases::isMSAccess(db)) QCOMPARE(index.count(), 1); //mysql will always find the table name regardless of casing else QCOMPARE(index.count(), 0); }
QString qOrderByClause( const QSqlIndex & i, const QString& prefix = QString::null ) { QString str; int k = i.count(); if( k == 0 ) return QString::null; str = " order by " + i.toString( prefix ); return str; }
QString qOrderByClause(const QSqlIndex & i, const QString& prefix = QString()) { QString str; int k = i.count(); if(k == 0) return QString(); str = QLatin1String(" order by ") + i.toString(prefix); return str; }
QString getPrimary(QSqlDatabase &db, QString sTable) { QString sPrimary = "kbrecordid"; QSqlIndex i = db.driver()->primaryIndex(sTable); if (i.count()){ sPrimary = i.fieldName(0); } return sPrimary; }
static bool index_matches(const Q3SqlCursor* cur, const QSqlRecord* buf, const QSqlIndex& idx) { bool indexEquals = false; for (int i = 0; i < idx.count(); ++i) { const QString fn(idx.field(i).name()); if (cur->value(fn) == buf->value(fn)) indexEquals = true; else { indexEquals = false; break; } } return indexEquals; }
bool Q3SqlCursor::select(const QString & filter, const QSqlIndex & sort) { QString fieldList(toString(d->nm)); if (fieldList.isEmpty()) return false; QString str(QLatin1String("select ") + fieldList); str += QLatin1String(" from ") + d->nm; if (!filter.isEmpty()) { d->ftr = filter; str += QLatin1String(" where ") + filter; } else d->ftr.clear(); if (sort.count() > 0) str += QLatin1String(" order by ") + sort.toString(d->nm); d->srt = sort; return exec(str); }
bool QSqlCursor::select( const QString & filter, const QSqlIndex & sort ) { QString fieldList = toString( d->nm ); if ( fieldList.isEmpty() ) return FALSE; QString str= "select " + fieldList; str += " from " + d->nm; if ( !filter.isEmpty() ) { d->ftr = filter; str += " where " + filter; } else d->ftr = QString::null; if ( sort.count() > 0 ) str += " order by " + sort.toString( d->nm ); d->srt = sort; return exec( str ); }
QString Q3SqlCursor::toString(const QSqlIndex& i, QSqlRecord* rec, const QString& prefix, const QString& fieldSep, const QString& sep) const { QString filter; bool separator = false; for(int j = 0; j < i.count(); ++j){ if (rec->isGenerated(j)) { if(separator) { filter += QLatin1Char(' ') + sep + QLatin1Char(' ') ; } QString fn = i.fieldName(j); QSqlField f = rec->field(fn); filter += toString(prefix, &f, fieldSep); separator = true; } } return filter; }
QString QSqlCursor::toString( const QSqlIndex& i, QSqlRecord* rec, const QString& prefix, const QString& fieldSep, const QString& sep ) const { QString filter; bool separator = FALSE; for( uint j = 0; j < i.count(); ++j ){ if ( rec->isGenerated( j ) ) { if( separator ) { filter += " " + sep + " " ; } QString fn = i.fieldName( j ); QSqlField* f = rec->field( fn ); filter += toString( prefix, f, fieldSep ); separator = TRUE; } } return filter; }
//## possibly add sizeHint parameter bool Q3SqlCursorManager::findBuffer(const QSqlIndex& idx, int atHint) { #ifdef QT_DEBUG_DATAMANAGER qDebug("Q3SqlCursorManager::findBuffer:"); #endif Q3SqlCursor* cur = cursor(); if (!cur) return false; if (!cur->isActive()) return false; if (!idx.count()) { if (cur->at() == QSql::BeforeFirst) cur->next(); return false; } QSqlRecord* buf = cur->editBuffer(); bool indexEquals = false; #ifdef QT_DEBUG_DATAMANAGER qDebug(" Checking hint..."); #endif /* check the hint */ if (cur->seek(atHint)) indexEquals = index_matches(cur, buf, idx); if (!indexEquals) { #ifdef QT_DEBUG_DATAMANAGER qDebug(" Checking current page..."); #endif /* check current page */ int pageSize = 20; int startIdx = qMax(atHint - pageSize, 0); int endIdx = atHint + pageSize; for (int j = startIdx; j <= endIdx; ++j) { if (cur->seek(j)) { indexEquals = index_matches(cur, buf, idx); if (indexEquals) break; } } } if (!indexEquals && cur->driver()->hasFeature(QSqlDriver::QuerySize) && cur->sort().count()) { #ifdef QT_DEBUG_DATAMANAGER qDebug(" Using binary search..."); #endif // binary search based on record buffer and current sort fields int lo = 0; int hi = cur->size(); int mid; if (compare_recs(buf, cur, cur->sort()) >= 0) lo = cur->at(); while (lo != hi) { mid = lo + (hi - lo) / 2; if (!cur->seek(mid)) break; if (index_matches(cur, buf, idx)) { indexEquals = true; break; } int c = compare_recs(buf, cur, cur->sort()); if (c < 0) { hi = mid; } else if (c == 0) { // found it, but there may be duplicates int at = mid; do { mid--; if (!cur->seek(mid)) break; if (index_matches(cur, buf, idx)) { indexEquals = true; break; } } while (compare_recs(buf, cur, cur->sort()) == 0); if (!indexEquals) { mid = at; do { mid++; if (!cur->seek(mid)) break; if (index_matches(cur, buf, idx)) { indexEquals = true; break; } } while (compare_recs(buf, cur, cur->sort()) == 0); } break; } else if (c > 0) { lo = mid + 1; } } } if (!indexEquals) { #ifdef QT_DEBUG_DATAMANAGER qDebug(" Using brute search..."); #endif #ifndef QT_NO_CURSOR QApplication::setOverrideCursor(Qt::WaitCursor); #endif /* give up, use brute force */ int startIdx = 0; if (cur->at() != startIdx) { cur->seek(startIdx); } for (;;) { indexEquals = false; indexEquals = index_matches(cur, buf, idx); if (indexEquals) break; if (!cur->next()) break; } #ifndef QT_NO_CURSOR QApplication::restoreOverrideCursor(); #endif } #ifdef QT_DEBUG_DATAMANAGER qDebug(" Done, result:" + QString::number(indexEquals)); #endif return indexEquals; }
bool QgsDb2GeometryColumns::populateLayerProperty( QgsDb2LayerProperty &layer ) { if ( !mQuery.isActive() || !mQuery.next() ) { return false; } layer.schemaName = mQuery.value( 0 ).toString().trimmed(); layer.tableName = mQuery.value( 1 ).toString().trimmed(); layer.geometryColName = mQuery.value( 2 ).toString().trimmed(); layer.type = mQuery.value( 3 ).toString(); if ( mQuery.value( 4 ).isNull() ) { layer.srid.clear(); layer.srsName.clear(); } else { layer.srid = mQuery.value( 4 ).toString(); layer.srsName = mQuery.value( 5 ).toString(); } layer.extents = QStringLiteral( "0 0 0 0" ); // no extents if ( ENV_LUW == mEnvironment ) { if ( !mQuery.value( 6 ).isNull() ) // Don't get values if null { layer.extents = QString( mQuery.value( 6 ).toString() + ' ' + mQuery.value( 7 ).toString() + ' ' + mQuery.value( 8 ).toString() + ' ' + mQuery.value( 9 ).toString() ).trimmed(); } } QgsDebugMsg( QStringLiteral( "layer: %1.%2(%3) type='%4' srid='%5' srsName='%6'" ) .arg( layer.schemaName, layer.tableName, layer.geometryColName, layer.type, layer.srid, layer.srsName ) ); QgsDebugMsg( "Extents: '" + layer.extents + "'" ); layer.pkCols = QStringList(); // Use the Qt functionality to get the primary key information // to set the FID column. // We can only use the primary key if it only has one column and // the type is Integer or BigInt. QString table = QStringLiteral( "%1.%2" ).arg( layer.schemaName, layer.tableName ); QSqlIndex pk = mDatabase.primaryIndex( table ); if ( pk.count() == 1 ) { QSqlField pkFld = pk.field( 0 ); QVariant::Type pkType = pkFld.type(); if ( ( pkType == QVariant::Int || pkType == QVariant::LongLong ) ) { QString fidColName = pk.fieldName( 0 ); layer.pkCols.append( fidColName ); QgsDebugMsg( "pk is: " + fidColName ); } } else { QgsDebugMsg( "Warning: table primary key count is " + QString::number( pk.count() ) ); } layer.pkColumnName = layer.pkCols.size() > 0 ? layer.pkCols.at( 0 ) : QString(); return true; }