Skip to content

Commit

Permalink
[Orcale] Add determinePrimaryKeyFromUriKeyColumn method to provider
Browse files Browse the repository at this point in the history
Like Postgres provider defined a determinePrimaryKeyFromUriKeyColumn method in Oracle provider.
  • Loading branch information
rldhont committed Aug 11, 2020
1 parent 779d218 commit e940e01
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 50 deletions.
95 changes: 45 additions & 50 deletions src/providers/oracle/qgsoracleprovider.cpp
Expand Up @@ -939,60 +939,12 @@ bool QgsOracleProvider::determinePrimaryKey()
}
else
{
QString primaryKey = mUri.keyColumn();
mPrimaryKeyType = PktUnknown;

if ( !primaryKey.isEmpty() )
{
int idx = fieldNameIndex( primaryKey );

if ( idx >= 0 )
{
QgsField fld = mAttributeFields.at( idx );

if ( mUseEstimatedMetadata || uniqueData( mQuery, primaryKey ) )
{
mPrimaryKeyType = ( fld.type() == QVariant::Int || fld.type() == QVariant::LongLong || ( fld.type() == QVariant::Double && fld.precision() == 0 ) ) ? PktInt : PktFidMap;
mPrimaryKeyAttrs << idx;
}
else
{
QgsMessageLog::logMessage( tr( "Primary key field '%1' for view not unique." ).arg( primaryKey ), tr( "Oracle" ) );
}
}
else
{
QgsMessageLog::logMessage( tr( "Key field '%1' for view not found." ).arg( primaryKey ), tr( "Oracle" ) );
}
}
else
{
QgsMessageLog::logMessage( tr( "No key field for view given." ), tr( "Oracle" ) );
}
determinePrimaryKeyFromUriKeyColumn();
}
}
else
{
QString primaryKey = mUri.keyColumn();
int idx = fieldNameIndex( mUri.keyColumn() );

if ( idx >= 0 && (
mAttributeFields.at( idx ).type() == QVariant::Int ||
mAttributeFields.at( idx ).type() == QVariant::LongLong ||
mAttributeFields.at( idx ).type() == QVariant::Double
) )
{
if ( mUseEstimatedMetadata || uniqueData( mQuery, primaryKey ) )
{
mPrimaryKeyType = PktInt;
mPrimaryKeyAttrs << idx;
}
}
else
{
QgsMessageLog::logMessage( tr( "No key field for query given." ), tr( "Oracle" ) );
mPrimaryKeyType = PktUnknown;
}
determinePrimaryKeyFromUriKeyColumn();
}

qry.finish();
Expand All @@ -1012,6 +964,49 @@ bool QgsOracleProvider::determinePrimaryKey()
return mValid;
}

void QgsOracleProvider::determinePrimaryKeyFromUriKeyColumn()
{
QString primaryKey = mUri.keyColumn();
mPrimaryKeyType = PktUnknown;

if ( !primaryKey.isEmpty() )
{
int idx = fieldNameIndex( primaryKey );

if ( idx >= 0 )
{
QgsField fld = mAttributeFields.at( idx );

if ( mUseEstimatedMetadata || uniqueData( mQuery, primaryKey ) )
{
if ( fld.type() == QVariant::Int ||
fld.type() == QVariant::LongLong ||
( fld.type() == QVariant::Double && fld.precision() == 0 ) )
{
mPrimaryKeyType = PktInt;
}
else
{
mPrimaryKeyType = PktFidMap;
}
mPrimaryKeyAttrs << idx;
}
else
{
QgsMessageLog::logMessage( tr( "Primary key field '%1' for view/query not unique." ).arg( primaryKey ), tr( "Oracle" ) );
}
}
else
{
QgsMessageLog::logMessage( tr( "Key field '%1' for view/query not found." ).arg( primaryKey ), tr( "Oracle" ) );
}
}
else
{
QgsMessageLog::logMessage( tr( "No key field for view/query given." ), tr( "Oracle" ) );
}
}

bool QgsOracleProvider::determineAlwaysGeneratedKeys()
{
if ( !loadFields() )
Expand Down
8 changes: 8 additions & 0 deletions src/providers/oracle/qgsoracleprovider.h
Expand Up @@ -127,6 +127,14 @@ class QgsOracleProvider final: public QgsVectorDataProvider
*/
bool determinePrimaryKey();

/**
* Determine the fields making up the primary key from the uri attribute keyColumn
*
* Fills mPrimaryKeyType and mPrimaryKeyAttrs
* from mUri
*/
void determinePrimaryKeyFromUriKeyColumn();

/**
* Determine the always generated identity fields
*/
Expand Down

0 comments on commit e940e01

Please sign in to comment.