def test_rasterTableURI(self): def check_rasterTableURI(expected_dbname): tables = database.tables() raster_tables_count = 0 for tab in tables: if tab.type == Table.RasterType: raster_tables_count += 1 uri = tab.uri() m = re.search(' dbname=\'([^ ]*)\' ', uri) self.assertTrue(m) actual_dbname = m.group(1) self.assertEqual(actual_dbname, expected_dbname) # print(tab.type) # print(tab.quotedName()) # print(tab) # We need to make sure a database is created with at # least one raster table ! self.assertGreaterEqual(raster_tables_count, 1) obj = QObject() # needs to be kept alive obj.connectionName = lambda: 'fake' obj.providerName = lambda: 'postgres' # Test for empty URI # See https://github.com/qgis/QGIS/issues/24525 # and https://github.com/qgis/QGIS/issues/19005 expected_dbname = self.testdb os.environ['PGDATABASE'] = expected_dbname database = PGDatabase(obj, QgsDataSourceUri()) self.assertIsInstance(database, PGDatabase) uri = database.uri() self.assertEqual(uri.host(), '') self.assertEqual(uri.username(), '') self.assertEqual(uri.database(), expected_dbname) self.assertEqual(uri.service(), '') check_rasterTableURI(expected_dbname) # Test for service-only URI # See https://github.com/qgis/QGIS/issues/24526 os.environ['PGDATABASE'] = 'fake' database = PGDatabase(obj, QgsDataSourceUri('service=dbmanager')) self.assertIsInstance(database, PGDatabase) uri = database.uri() self.assertEqual(uri.host(), '') self.assertEqual(uri.username(), '') self.assertEqual(uri.database(), '') self.assertEqual(uri.service(), 'dbmanager') check_rasterTableURI(expected_dbname)
def getConnectorFromUri(connectionParams: Dict[str, str]) -> 'DBConnector': """ Set connector property for the given database type and parameters """ connector = None uri = QgsDataSourceUri() if connectionParams['dbType'] == 'postgis': if connectionParams['host']: uri.setConnection( connectionParams['host'], connectionParams['port'], connectionParams['dbname'], connectionParams['user'], connectionParams['password'] ) if connectionParams['service']: uri.setConnection( connectionParams['service'], connectionParams['dbname'], connectionParams['user'], connectionParams['password'] ) if Qgis.QGIS_VERSION_INT >= 31200: # we need a fake DBPlugin object # with connectionName and providerName methods obj = QObject() obj.connectionName = lambda: 'fake' obj.providerName = lambda: 'postgres' connector = PostGisDBConnector(uri, obj) else: connector = PostGisDBConnector(uri) if connectionParams['dbType'] == 'spatialite': uri.setConnection('', '', connectionParams['dbname'], '', '') if hasSpatialiteSupport(): from db_manager.db_plugins.spatialite.connector import ( SpatiaLiteDBConnector, ) # Il y a bug évident ici si il n'y pas le support spatialite, quid de SpatiaLiteDBConnector ? try: connector = SpatiaLiteDBConnector(uri) except ConnectionError as e: QgsMessageLog.logMessage( "Erreur lors de la récupération du fichier SQLite : {}".format(str(e)), 'cadastre', Qgis.Critical) return connector
def test_unicodeInQuery(self): os.environ['PGDATABASE'] = self.testdb obj = QObject() # needs to be kept alive obj.connectionName = lambda: 'fake' obj.providerName = lambda: 'postgres' database = PGDatabase(obj, QgsDataSourceUri()) self.assertIsInstance(database, PGDatabase) # SQL as string literal res = database.sqlResultModel("SELECT 'é'::text", obj) self.assertIsInstance(res, PGSqlResultModel) dat = res.getData(0, 0) self.assertEqual(dat, u"é") # SQL as unicode literal res = database.sqlResultModel(u"SELECT 'é'::text", obj) self.assertIsInstance(res, PGSqlResultModel) dat = res.getData(0, 0) self.assertEqual(dat, u"é")
def getConnectorFromUri(connectionParams: Dict[str, str]) -> 'DBConnector': """ Set connector property for the given database type and parameters """ connector = None uri = QgsDataSourceUri() if connectionParams['dbType'] == 'postgis': if connectionParams['host']: uri.setConnection( connectionParams['host'], connectionParams['port'], connectionParams['dbname'], connectionParams['user'], connectionParams['password'] ) if connectionParams['service']: uri.setConnection( connectionParams['service'], connectionParams['dbname'], connectionParams['user'], connectionParams['password'] ) if Qgis.QGIS_VERSION_INT >= 31200: # we need a fake DBPlugin object # with connectionName and providerName methods obj = QObject() obj.connectionName = lambda: 'fake' obj.providerName = lambda: 'postgres' connector = PostGisDBConnector(uri, obj) else: connector = PostGisDBConnector(uri) if connectionParams['dbType'] == 'spatialite': uri.setConnection('', '', connectionParams['dbname'], '', '') if hasSpatialiteSupport(): from db_manager.db_plugins.spatialite.connector import SpatiaLiteDBConnector connector = SpatiaLiteDBConnector(uri) return connector
def test_dbnameLessURI(self): obj = QObject() # needs to be kept alive obj.connectionName = lambda: 'fake' obj.providerName = lambda: 'postgres' c = PostGisDBConnector(QgsDataSourceUri(), obj) self.assertIsInstance(c, PostGisDBConnector) uri = c.uri() # No username was passed, so we expect it to be taken # from PGUSER or USER environment variables expected_user = os.environ.get('PGUSER') or os.environ.get('USER') actual_user = self._getUser(c) self.assertEqual(actual_user, expected_user) # No database was passed, so we expect it to be taken # from PGDATABASE or expected user expected_db = os.environ.get('PGDATABASE') or expected_user actual_db = self._getDatabase(c) self.assertEqual(actual_db, expected_db)