uri.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. from pathlib import Path
  2. class Uri:
  3. def __init__(self, layer=None, uri=''):
  4. if layer is not None or not isinstance(uri, Uri):
  5. self._uri = layer.dataProvider().dataSourceUri() if layer is not None else uri
  6. self._has_filter = False
  7. self._filter = None
  8. self._geometry_type = None
  9. self._database = None
  10. if layer is not None and self.is_memory_layer():
  11. self._layer_name = layer.name()
  12. elif layer is not None and self.is_database():
  13. self._layer_name = self.layer_name()
  14. else:
  15. self._layer_name = None
  16. if uri is not None and isinstance(uri, Uri):
  17. self._uri = uri._uri
  18. self._has_filter = uri._has_filter
  19. self._filter = uri._filter
  20. self._geometry_type = uri._geometry_type
  21. self._database = uri._database
  22. self._layer_name = uri._layer_name
  23. def database_layer_name_same(self):
  24. if self.database() is not None and self.layer_name() is not None:
  25. return Path(self.database().lower()).stem == self.layer_name().lower()
  26. return False
  27. def has_filter(self):
  28. return '|subset=' in self._uri
  29. def filter(self):
  30. if self.has_filter():
  31. parts = self._uri.split('|')
  32. for p in parts:
  33. if 'subset=' in p:
  34. return p.split('subset=')[1]
  35. def strip_filter(self):
  36. if self.has_filter():
  37. self._has_filter = True
  38. parts = self._uri.split('|')
  39. rebuild = []
  40. for p in parts:
  41. if 'subset=' in p:
  42. self._filter = p.split('subset=')[1]
  43. else:
  44. rebuild.append(p)
  45. self._uri = '|'.join(rebuild)
  46. def is_database(self):
  47. return '|layername=' in self._uri
  48. def has_geometry_defn(self):
  49. return '|geometrytype=' in self._uri
  50. def geometry_type(self):
  51. if self.has_geometry_defn():
  52. parts = self._uri.split('|')
  53. for p in parts:
  54. if 'geometrytype=' in p:
  55. return p.split('geometrytype=')[1]
  56. def database(self):
  57. return self._uri.split('|')[0]
  58. def layer_name(self):
  59. if self.is_database():
  60. parts = self._uri.split('|')
  61. for p in parts:
  62. if 'layername=' in p:
  63. return p.split('layername=')[1]
  64. elif self.is_memory_layer():
  65. return self._layer_name
  66. else:
  67. return Path(self.database()).stem
  68. def layer_uri(self):
  69. if self.is_database():
  70. return f'{self.database()}|layername={self.layer_name()}'
  71. else:
  72. return self.database()
  73. def is_memory_layer(self):
  74. return self._uri[:6] == 'memory'
  75. def ext(self):
  76. if self.is_memory_layer():
  77. return '.memory'
  78. else:
  79. return Path(self.database()).suffix
  80. def set_database(self, db):
  81. self._database = db
  82. def set_layer_name(self, lyr_name):
  83. self._layer_name = lyr_name
  84. def build(self, uri=None):
  85. self._uri = ''
  86. if self._database is not None:
  87. self._uri = f'{self._uri}{self._database}'
  88. if self._layer_name is not None:
  89. self._uri = f'{self._uri}|layername={self._layer_name}'
  90. if uri is not None and uri.has_geometry_defn():
  91. self._uri = f'{self._uri}|geometrytype={uri.geometry_type()}'
  92. elif self._geometry_type is not None:
  93. self._uri = f'{self._uri}|geometrytype={self._geometry_type}'
  94. if uri is not None and uri.has_filter():
  95. self._uri = f'{self._uri}|subset={uri.filter()}'
  96. elif self._filter is not None:
  97. self._uri = f'{self._uri}|subset={self._filter}'
  98. def uri(self):
  99. return self._uri