Skip to content

Commit e830c23

Browse files
committed
Improve handling of geometryless mssql tables
1 parent d827076 commit e830c23

File tree

1 file changed

+47
-18
lines changed

1 file changed

+47
-18
lines changed

src/providers/mssql/qgsmssqlprovider.cpp

+47-18
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,9 @@ void QgsMssqlProvider::uniqueValues( int index, QList<QVariant> &uniqueValues, i
603603
// update the extent, wkb type and srid for this layer
604604
void QgsMssqlProvider::UpdateStatistics( bool estimate )
605605
{
606+
if ( mGeometryColName.isEmpty() )
607+
return;
608+
606609
// get features to calculate the statistics
607610
QString statement;
608611

@@ -1300,12 +1303,24 @@ bool QgsMssqlProvider::deleteFeatures( const QgsFeatureIds & id )
13001303

13011304
int QgsMssqlProvider::capabilities() const
13021305
{
1306+
int cap = CreateAttributeIndex | AddFeatures | AddAttributes;
1307+
bool hasGeom = false;
1308+
if ( !mGeometryColName.isEmpty() )
1309+
{
1310+
hasGeom = true;
1311+
cap |= CreateSpatialIndex;
1312+
}
1313+
13031314
if ( mFidColName.isEmpty() )
1304-
return CreateSpatialIndex | CreateAttributeIndex | AddFeatures | AddAttributes;
1315+
return cap;
13051316
else
1306-
return CreateSpatialIndex | CreateAttributeIndex | AddFeatures | DeleteFeatures |
1307-
ChangeAttributeValues | ChangeGeometries | AddAttributes | DeleteAttributes |
1308-
QgsVectorDataProvider::SelectAtId | QgsVectorDataProvider::SelectGeometryAtId;
1317+
{
1318+
if ( hasGeom )
1319+
cap |= ChangeGeometries | QgsVectorDataProvider::SelectGeometryAtId;
1320+
1321+
return cap | DeleteFeatures | ChangeAttributeValues | DeleteAttributes |
1322+
QgsVectorDataProvider::SelectAtId;
1323+
}
13091324
}
13101325

13111326
bool QgsMssqlProvider::createSpatialIndex()
@@ -1657,7 +1672,7 @@ QgsVectorLayerImport::ImportError QgsMssqlProvider::createEmptyLayer(
16571672
if ( schemaName.isEmpty() )
16581673
schemaName = "dbo";
16591674

1660-
if ( geometryColumn.isEmpty() )
1675+
if ( wkbType != QGis::WKBNoGeometry && geometryColumn.isEmpty() )
16611676
geometryColumn = "geom";
16621677

16631678
if ( primaryKey.isEmpty() )
@@ -1770,19 +1785,33 @@ QgsVectorLayerImport::ImportError QgsMssqlProvider::createEmptyLayer(
17701785
}
17711786
}
17721787

1773-
sql = QString( "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[%1].[%2]') AND type in (N'U')) DROP TABLE [%1].[%2]\n"
1774-
"CREATE TABLE [%1].[%2]([%3] [int] IDENTITY(1,1) NOT NULL, [%4] [geometry] NULL CONSTRAINT [PK_%2] PRIMARY KEY CLUSTERED ( [%3] ASC ))\n"
1775-
"DELETE FROM geometry_columns WHERE f_table_schema = '%1' AND f_table_name = '%2'\n"
1776-
"INSERT INTO [geometry_columns] ([f_table_catalog], [f_table_schema],[f_table_name], "
1777-
"[f_geometry_column],[coord_dimension],[srid],[geometry_type]) VALUES ('%5', '%1', '%2', '%4', %6, %7, '%8')" )
1778-
.arg( schemaName,
1779-
tableName,
1780-
primaryKey,
1781-
geometryColumn,
1782-
dbName,
1783-
QString::number( dim ),
1784-
QString::number( srid ),
1785-
geometryType );
1788+
if ( !geometryColumn.isEmpty() )
1789+
{
1790+
sql = QString( "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[%1].[%2]') AND type in (N'U')) DROP TABLE [%1].[%2]\n"
1791+
"CREATE TABLE [%1].[%2]([%3] [int] IDENTITY(1,1) NOT NULL, [%4] [geometry] NULL CONSTRAINT [PK_%2] PRIMARY KEY CLUSTERED ( [%3] ASC ))\n"
1792+
"DELETE FROM geometry_columns WHERE f_table_schema = '%1' AND f_table_name = '%2'\n"
1793+
"INSERT INTO [geometry_columns] ([f_table_catalog], [f_table_schema],[f_table_name], "
1794+
"[f_geometry_column],[coord_dimension],[srid],[geometry_type]) VALUES ('%5', '%1', '%2', '%4', %6, %7, '%8')" )
1795+
.arg( schemaName,
1796+
tableName,
1797+
primaryKey,
1798+
geometryColumn,
1799+
dbName,
1800+
QString::number( dim ),
1801+
QString::number( srid ),
1802+
geometryType );
1803+
}
1804+
else
1805+
{
1806+
//geometryless table
1807+
sql = QString( "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[%1].[%2]') AND type in (N'U')) DROP TABLE [%1].[%2]\n"
1808+
"CREATE TABLE [%1].[%2]([%3] [int] IDENTITY(1,1) NOT NULL CONSTRAINT [PK_%2] PRIMARY KEY CLUSTERED ( [%3] ASC ))\n"
1809+
"DELETE FROM geometry_columns WHERE f_table_schema = '%1' AND f_table_name = '%2'\n"
1810+
)
1811+
.arg( schemaName,
1812+
tableName,
1813+
primaryKey );
1814+
}
17861815

17871816
if ( !q.exec( sql ) )
17881817
{

0 commit comments

Comments
 (0)