data_model.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. """
  2. /***************************************************************************
  3. Name : DB Manager
  4. Description : Database manager plugin for QGIS
  5. Date : May 23, 2011
  6. copyright : (C) 2011 by Giuseppe Sucameli
  7. email : brush.tyler@gmail.com
  8. ***************************************************************************/
  9. /***************************************************************************
  10. * *
  11. * This program is free software; you can redistribute it and/or modify *
  12. * it under the terms of the GNU General Public License as published by *
  13. * the Free Software Foundation; either version 2 of the License, or *
  14. * (at your option) any later version. *
  15. * *
  16. ***************************************************************************/
  17. """
  18. from qgis.core import QgsMessageLog
  19. from ..plugin import BaseError
  20. from ..data_model import (TableDataModel,
  21. SqlResultModel,
  22. SqlResultModelAsync,
  23. SqlResultModelTask)
  24. class PGTableDataModel(TableDataModel):
  25. def __init__(self, table, parent=None):
  26. self.cursor = None
  27. TableDataModel.__init__(self, table, parent)
  28. if self.table.rowCount is None:
  29. self.table.refreshRowCount()
  30. if self.table.rowCount is None:
  31. return
  32. self.table.aboutToChange.connect(self._deleteCursor)
  33. self._createCursor()
  34. def _createCursor(self):
  35. fields_txt = ", ".join(self.fields)
  36. table_txt = self.db.quoteId((self.table.schemaName(), self.table.name))
  37. self.cursor = self.db._get_cursor()
  38. sql = "SELECT %s FROM %s" % (fields_txt, table_txt)
  39. self.db._execute(self.cursor, sql)
  40. def _sanitizeTableField(self, field):
  41. # get fields, ignore geometry columns
  42. if field.dataType.lower() == "geometry":
  43. return "CASE WHEN %(fld)s IS NULL THEN NULL ELSE GeometryType(%(fld)s) END AS %(fld)s" % {
  44. 'fld': self.db.quoteId(field.name)}
  45. elif field.dataType.lower() == "raster":
  46. return "CASE WHEN %(fld)s IS NULL THEN NULL ELSE 'RASTER' END AS %(fld)s" % {
  47. 'fld': self.db.quoteId(field.name)}
  48. return "%s::text" % self.db.quoteId(field.name)
  49. def _deleteCursor(self):
  50. self.db._close_cursor(self.cursor)
  51. self.cursor = None
  52. def __del__(self):
  53. self.table.aboutToChange.disconnect(self._deleteCursor)
  54. self._deleteCursor()
  55. pass # print "PGTableModel.__del__"
  56. def fetchMoreData(self, row_start):
  57. if not self.cursor:
  58. self._createCursor()
  59. try:
  60. self.cursor.scroll(row_start, mode='absolute')
  61. except self.db.error_types():
  62. self._deleteCursor()
  63. return self.fetchMoreData(row_start)
  64. self.resdata = self.cursor.fetchmany(self.fetchedCount)
  65. self.fetchedFrom = row_start
  66. class PGSqlResultModelTask(SqlResultModelTask):
  67. def __init__(self, db, sql, parent):
  68. super().__init__(db, sql, parent)
  69. def run(self):
  70. try:
  71. self.model = PGSqlResultModel(self.db, self.sql, None)
  72. except BaseError as e:
  73. self.error = e
  74. QgsMessageLog.logMessage(e.msg)
  75. return False
  76. return True
  77. def cancel(self):
  78. self.db.connector.cancel()
  79. SqlResultModelTask.cancel(self)
  80. class PGSqlResultModelAsync(SqlResultModelAsync):
  81. def __init__(self, db, sql, parent):
  82. super().__init__()
  83. self.task = PGSqlResultModelTask(db, sql, parent)
  84. self.task.taskCompleted.connect(self.modelDone)
  85. self.task.taskTerminated.connect(self.modelDone)
  86. class PGSqlResultModel(SqlResultModel):
  87. pass