sql.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. def index():
  2. response.generic_patterns = ['*.html']
  3. db = meta_dbs()
  4. return locals()
  5. def reset():
  6. if True:
  7. # if False:
  8. info.sql_db.truncate()
  9. info.sql_module.truncate()
  10. info.sql_sensor.truncate()
  11. return locals()
  12. def error():
  13. return dict(error=session.error)
  14. def meta_dbs():
  15. return info(info.sql_db).select()
  16. def meta_modules(db):
  17. return info(info.sql_db.key==db)\
  18. (info.sql_module.db_id==info.sql_db.id)\
  19. .select(info.sql_module.ALL)
  20. def meta_sensors(db, module):
  21. return info(info.sql_db.key==db)\
  22. (info.sql_module.name==module)\
  23. (info.sql_sensor.db_id==info.sql_db.id)\
  24. (info.sql_sensor.module_id==info.sql_module.id)\
  25. .select(info.sql_sensor.ALL)
  26. @request.restful()
  27. def api():
  28. if request.extension is 'html':
  29. request.extension = 'xml'
  30. if request.env.http_origin:
  31. response.headers['Access-Control-Allow-Origin'] = '*'
  32. response.generic_patterns = ['*.html', '*.xml', '*.json']
  33. def GET(*args, **kargs):
  34. try:
  35. db_key = args[0]
  36. except IndexError:
  37. session.error = 'no database is specified'
  38. request.extension = 'html'
  39. redirect('error')
  40. databases = meta_dbs()
  41. if db_key not in [d.key for d in databases]:
  42. session.error = 'database "%s" does not exits' % db_key
  43. request.extension = 'html'
  44. redirect('error')
  45. else:
  46. modules = [ m.name for m in meta_modules(db_key) ]
  47. logger.info(locals().get('modules'))
  48. try:
  49. module = args[1]
  50. except IndexError:
  51. error = 'Module is not specified'
  52. # mods = {}
  53. # for m in modules:
  54. # s = meta_sensors(db_key, m.name)
  55. # mods[m.name] = [ _s.name for _s in s ]
  56. mods = { m: [ s.name for s in meta_sensors(db_key, m) ] for m in modules }
  57. # mods = { m.name : meta_sensors(db_key, m.name) for m in modules }
  58. return dict(error=error, modules=mods)
  59. try:
  60. module = modules[int(module)]
  61. except ValueError:
  62. module = module
  63. except KeyError:
  64. session.error = 'Module index out of range: module index = %s' % module
  65. session.modules = modules
  66. request.extension = 'html'
  67. redirect(URL('error'))
  68. len = int(kargs.get('len', 1))
  69. db = globals()[db_key]
  70. db_connector = kitcube[db_key]
  71. views = db_connector.views
  72. if module in modules:
  73. res = db_connector.query(module, len=len)
  74. elif module in views.keys():
  75. v = views[module]
  76. res = db_connector.query_view(v, len=len)
  77. else:
  78. session.error = 'Module "%s" does not exits' % module
  79. session.modules = modules
  80. request.extension = 'html'
  81. redirect(URL('error'))
  82. unit = {}
  83. if kargs.get('unit', None):
  84. if module in modules:
  85. unit[module] = info(info.sql_sensor.module_name==module).select(info.sql_sensor.name, info.sql_sensor.unit)
  86. else:
  87. for mod, s in views[module]:
  88. rows = info(info.sql_sensor.module_name==mod).select(info.sql_sensor.name, info.sql_sensor.unit)
  89. rows.exclude(lambda row: row.name not in s )
  90. unit[mod] = rows
  91. for m, s in unit.iteritems():
  92. unit[m] = { _s['name']: _s['unit'] for _s in s }
  93. return dict(data=res, unit=unit)
  94. return locals()