No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ledatasourcesql.py 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #-*- coding: utf-8 -*-
  2. from leobject.datasources.dummy import DummyDatasource
  3. from mosql.db import Database, all_to_dicts
  4. from mosql.query import select, insert, update, delete, join
  5. from leobject.leobject import REL_SUB, REL_SUP
  6. ## SQL DataSource for LeObject
  7. class LeDataSourceSQL(DummyDatasource):
  8. RELATIONS_TABLE_NAME = 'relations'
  9. RELATIONS_POSITIONS_FIELDS = {REL_SUP: 'superior_id', REL_SUB: 'subordinate_id'}
  10. RELATIONS_NATURE_FIELD = 'nature'
  11. MODULE = 'sqlite3'
  12. def __init__(self, module=None, *conn_args, **conn_kargs):
  13. self.module = self.MODULE if module is None else module
  14. super(LeDataSourceSQL, self).__init__()
  15. self.connection = Database(self.module, self.conn_args, self.conn_kargs)
  16. ## @brief update an existing object's data
  17. # @param letype LeType
  18. # @param leclass LeClass
  19. # @param filters list : list of tuples formatted as (FIELD, OPERATOR, VALUE)
  20. # @param rel_filters list : list of tuples formatted as (('superior'|'subordinate', FIELD), OPERATOR, VALUE)
  21. # @param data dict
  22. # @return bool
  23. # @todo prendre en compte les rel_filters
  24. def update(self, letype, leclass, filters, rel_filters, data):
  25. query_table_name = leclass.name
  26. where_filters = filters
  27. set_data = data
  28. # Building the query
  29. query = update(table=query_table_name, where=where_filters, set=set_data)
  30. # Executing the query
  31. with self.connection as cur:
  32. cur.execute(query)
  33. return True
  34. ## @brief create a new object in the datasource
  35. # @param letype LeType
  36. # @param leclass LeClass
  37. # @param datas dict : dictionnary of field:value pairs to save
  38. # @return int : lodel_id of the created object
  39. def insert(self, letype, leclass, datas):
  40. query_table_name = leclass.name
  41. #building the query
  42. query = insert(query_table_name, datas)
  43. #executing the query
  44. with self.connection as cur:
  45. cur.execute(query)
  46. return True
  47. ## @brief delete an existing object
  48. # @param letype LeType
  49. # @param leclass LeClass
  50. # @param filters list : list of tuples formatted as (FIELD, OPERATOR, VALUE)
  51. # @param relational_filters list : list of tuples formatted as (('superior'|'subordinate', FIELD), OPERATOR, VALUE)
  52. # @return bool : True on success
  53. # @todo prendre en compte les rel_filters
  54. def delete(self, letype, leclass, filters, relational_filters):
  55. query_table_name = leclass.name
  56. query = delete(query_table_name, filters)
  57. with self.connection as cur:
  58. cur.execute(query)
  59. return True
  60. ## @brief search for a collection of objects
  61. # @param leclass LeClass
  62. # @param letype LeType
  63. # @field_list list
  64. # @param filters list : list of tuples formatted as (FIELD, OPERATOR, VALUE)
  65. # @param relational_filters list : list of tuples formatted as (('superior'|'subordinate', FIELD), OPERATOR, VALUE)
  66. # @return list
  67. def get(self, leclass, letype, field_list, filters, relational_filters=None):
  68. query_table_name = leclass.name
  69. where_filters = self._prepare_filters(filters)
  70. join_fields = {}
  71. if relational_filters or len(relational_filters) > 0:
  72. for relational_filter in relational_filters:
  73. # Parsing the relation_filter
  74. relational_position = REL_SUB if relational_filter[0][0] == REL_SUP else REL_SUP
  75. relational_nature = relational_filter[0][1]
  76. relational_operator = relational_filter[1]
  77. relational_condition_key = (self.RELATIONS_POSITIONS_FIELDS[relational_filter[0][0]], relational_operator)
  78. relational_condition_value = relational_filter[2]
  79. # Definition of the join condition
  80. relation_table_join_field = "%s.%s" % (self.RELATIONS_TABLE_NAME, self.RELATIONS_POSITIONS_FIELDS[relational_position])
  81. query_table_join_field = "%s.lodel_id" % query_table_name
  82. join_fields[query_table_join_field] = relation_table_join_field
  83. # Adding "where" filters
  84. where_filters['%s.%s' % (self.RELATIONS_TABLE_NAME, self.RELATIONS_NATURE_FIELD)] = relational_nature
  85. where_filters[relational_condition_key] = relational_condition_value
  86. # Building the query
  87. query = select(query_table_name, where=where_filters, select=field_list, joins=join(self.RELATIONS_TABLE_NAME, join_fields))
  88. else:
  89. query = select(query_table_name, where=where_filters, select=field_list)
  90. # Executing the query
  91. with self.connection as cur:
  92. results = cur.execute(query)
  93. # Returning it as a list of dict
  94. return all_to_dicts(results)
  95. ## @brief prepares the filters to be used by the mosql library's functions
  96. # @params filters : (FIELD, OPERATOR, VALUE) tuples
  97. # @return dict : Dictionnary with (FIELD, OPERATOR):VALUE style elements
  98. def _prepare_filters(self, filters):
  99. prepared_filters = {}
  100. for filter_item in filters:
  101. prepared_filter_key = (filter_item[0], filter_item[1])
  102. prepared_filter_value = filter_item[2]
  103. prepared_filters[prepared_filter_key] = prepared_filter_value
  104. return prepared_filters