sql_models.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import re
  2. from itertools import groupby
  3. from gluon.dal import DAL, Field
  4. from config import sql_databases
  5. from kitcube import KITCube
  6. from helper import process_views
  7. kitcube = {}
  8. for database in sql_databases:
  9. if database['disabled']: continue
  10. db_key = database['key']
  11. db_host = database['host']
  12. db = database['db']
  13. modules = database['modules']
  14. views = database.get('views', None)
  15. connector = KITCube(db_key, db_host, db)
  16. connector.views = process_views(views)
  17. if isinstance(modules, basestring):
  18. connector.module_pattern = modules
  19. else:
  20. connector.modules = modules
  21. connector.connect()
  22. kitcube[db_key] = connector
  23. ### Save DB meta info into database
  24. info = DAL('sqlite://info.storage.sqlite',
  25. pool_size=10,
  26. check_reserved=False)
  27. info.define_table('sql_db',
  28. Field('key', 'string'),
  29. Field('host', 'string'),
  30. Field('db', 'string'),
  31. Field('modules', 'list:integer'),
  32. Field('flag', 'boolean', default=False))
  33. info.define_table('sql_module',
  34. Field('mark', 'integer'),
  35. Field('name', 'string'),
  36. Field('db_id', 'reference sql_db'))
  37. info.define_table('sql_sensor',
  38. Field('name', 'string'),
  39. Field('type', 'string'),
  40. Field('unit', 'string'),
  41. Field('length', 'integer'),
  42. Field('rname', 'string'),
  43. Field('module_name', 'string'),
  44. Field('db_id', 'reference sql_db'),
  45. Field('module_id', 'reference sql_module'))
  46. for connector in kitcube.values():
  47. q = (info.sql_db.db==db) & (info.sql_db.host==db_host)
  48. r = info(q).select().last()
  49. if r is None:
  50. modules = connector.modules
  51. sensors = connector.sensors
  52. module_marks = [ m['mark'] for m in modules]
  53. module_ids = {}
  54. db_id = info.sql_db.insert(key=db_key, host=db_host,
  55. db=db, modules=module_marks)
  56. for m in modules:
  57. module_id = info.sql_module.insert(db_id=db_id, **m)
  58. module_ids[m['name']] = module_id
  59. for s in sensors:
  60. module_id = module_ids[ s['module_name'] ]
  61. info.sql_sensor.insert(db_id=db_id, module_id=module_id, **s)
  62. else:
  63. if r.key != db_key:
  64. r.update_record(key=db_key)