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.4KB

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