Example #1
0
    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
Example #3
0
 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
Example #5
0
    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)