data_model.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. from .plugin import SLDatabase
  25. class SLTableDataModel(TableDataModel):
  26. def __init__(self, table, parent=None):
  27. TableDataModel.__init__(self, table, parent)
  28. fields_txt = ", ".join(self.fields)
  29. table_txt = self.db.quoteId((self.table.schemaName(), self.table.name))
  30. # run query and get results
  31. sql = "SELECT %s FROM %s" % (fields_txt, table_txt)
  32. c = self.db._get_cursor()
  33. self.db._execute(c, sql)
  34. self.resdata = self.db._fetchall(c)
  35. c.close()
  36. del c
  37. self.fetchedFrom = 0
  38. self.fetchedCount = len(self.resdata)
  39. def _sanitizeTableField(self, field):
  40. # get fields, ignore geometry columns
  41. dataType = field.dataType.upper()
  42. if dataType[:5] == "MULTI":
  43. dataType = dataType[5:]
  44. if dataType[-3:] == "25D":
  45. dataType = dataType[:-3]
  46. if dataType[-10:] == "COLLECTION":
  47. dataType = dataType[:-10]
  48. if dataType in ["POINT", "LINESTRING", "POLYGON", "GEOMETRY"]:
  49. return 'GeometryType(%s)' % self.db.quoteId(field.name)
  50. return self.db.quoteId(field.name)
  51. def rowCount(self, index=None):
  52. return self.fetchedCount
  53. class SLSqlResultModelTask(SqlResultModelTask):
  54. def __init__(self, db, sql, parent):
  55. super().__init__(db, sql, parent)
  56. self.clone = None
  57. def run(self):
  58. try:
  59. self.clone = SLDatabase(None, self.db.connector.uri())
  60. self.model = SLSqlResultModel(self.clone, self.sql, None)
  61. except BaseError as e:
  62. self.error = e
  63. QgsMessageLog.logMessage(e.msg)
  64. return False
  65. return True
  66. def cancel(self):
  67. if self.clone:
  68. self.clone.connector.cancel()
  69. SqlResultModelTask.cancel(self)
  70. class SLSqlResultModelAsync(SqlResultModelAsync):
  71. def __init__(self, db, sql, parent):
  72. super().__init__()
  73. self.task = SLSqlResultModelTask(db, sql, parent)
  74. self.task.taskCompleted.connect(self.modelDone)
  75. self.task.taskTerminated.connect(self.modelDone)
  76. class SLSqlResultModel(SqlResultModel):
  77. pass