queries.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from collections import defaultdict
  2. import operator
  3. import db
  4. def search(q):
  5. with db.cursor() as c:
  6. corps = db.query(c, '''
  7. SELECT DISTINCT corporation_id, corporation_name FROM characters
  8. WHERE corporation_name LIKE ?
  9. ''', '%{}%'.format(q))
  10. return {'corporations': corps}
  11. def corporation(corp_id):
  12. with db.cursor() as c:
  13. kills = db.query(c, '''
  14. SELECT DISTINCT(kills.kill_id), kill_time,
  15. solarSystemName as system_name, security, regionName as region
  16. FROM kills
  17. JOIN characters ON characters.kill_id = kills.kill_id
  18. JOIN eve.mapSolarSystems ON solar_system_id = solarSystemID
  19. JOIN eve.mapRegions ON mapSolarSystems.regionID = mapRegions.regionID
  20. WHERE corporation_id = ?
  21. ''', corp_id)
  22. kill_ids = list(map(operator.itemgetter('kill_id'), kills))
  23. char_rows = db.query(c, '''
  24. SELECT
  25. kill_id, victim, final_blow,
  26. character_id, character_name, corporation_id, corporation_name, alliance_id, alliance_name, faction_id, faction_name,
  27. ship_type_id, typeName AS ship_name
  28. FROM characters
  29. JOIN eve.invTypes ON ship_type_id = typeID
  30. WHERE kill_id IN ({})
  31. '''.format(','.join(map(str, kill_ids))))
  32. characters = defaultdict(dict)
  33. for kill_id in kill_ids:
  34. characters[kill_id]['attackers'] = 1 # count final_blow now
  35. for char in char_rows:
  36. kill_id = char['kill_id']
  37. if char['victim']:
  38. characters[kill_id]['victim'] = char
  39. elif char['final_blow']:
  40. characters[kill_id]['final_blow'] = char
  41. else:
  42. characters[kill_id]['attackers'] += 1
  43. for kill in kills:
  44. chars = characters[kill['kill_id']]
  45. kill['victim'] = chars['victim']
  46. kill['final_blow'] = chars['final_blow']
  47. kill['attackers'] = chars['attackers']
  48. return kills
  49. def kill(kill_id):
  50. with db.cursor() as c:
  51. kill = db.get(c, '''
  52. SELECT kill_time, solarSystemName, security FROM kills
  53. JOIN eve.mapSolarSystems ON solar_system_id = solarSystemID
  54. WHERE kill_id = ?
  55. ''', kill_id)
  56. characters = db.query(c, '''
  57. SELECT character_id, character_name, damage, victim, final_blow,
  58. corporation_id, corporation_name, alliance_id, alliance_name, faction_id, faction_name,
  59. ship_type_id, weapon_type_id,
  60. ship.typeName AS ship_name, weapon.typeName AS weapon_name
  61. FROM characters
  62. JOIN eve.invTypes AS ship ON ship_type_id = ship.typeID
  63. LEFT JOIN eve.invTypes AS weapon ON weapon_type_id = weapon.typeID
  64. WHERE kill_id = ?
  65. ''', kill_id)
  66. attackers = []
  67. for char in characters:
  68. if char['victim']:
  69. victim = char
  70. elif char['final_blow']:
  71. final_blow = char
  72. else:
  73. attackers.append(char)
  74. items = db.query(c, '''
  75. SELECT type_id, flag, dropped, destroyed, singleton,
  76. typeName AS item_name
  77. FROM items
  78. JOIN eve.invTypes ON type_id = typeID
  79. WHERE kill_id = ? ORDER BY flag ASC
  80. ''', kill_id)
  81. return {
  82. 'kill': kill,
  83. 'victim': victim,
  84. 'final_blow': final_blow,
  85. 'attackers': attackers,
  86. 'items': items,
  87. }