mongodb.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import bson
  2. import pymongo
  3. import traceback
  4. from colorama import Fore
  5. from toolset.utils.output_helper import log
  6. from toolset.databases.abstract_database import AbstractDatabase
  7. class Database(AbstractDatabase):
  8. @classmethod
  9. def get_connection(cls, config):
  10. return pymongo.MongoClient(host = config.database_host)
  11. @classmethod
  12. def get_current_world_table(cls, config):
  13. results_json = []
  14. try:
  15. worlds_json = {}
  16. print("DATABASE_HOST: %s" % config.database_host)
  17. connection = cls.get_connection(config)
  18. db = connection.hello_world
  19. for world in db.world.find():
  20. if "randomNumber" in world:
  21. if "id" in world:
  22. worlds_json[str(int(world["id"]))] = int(
  23. world["randomNumber"])
  24. elif "_id" in world:
  25. worlds_json[str(int(world["_id"]))] = int(
  26. world["randomNumber"])
  27. results_json.append(worlds_json)
  28. connection.close()
  29. except Exception:
  30. tb = traceback.format_exc()
  31. log("ERROR: Unable to load current MongoDB World table.",
  32. color=Fore.RED)
  33. log(tb)
  34. return results_json
  35. @classmethod
  36. def test_connection(cls, config):
  37. try:
  38. connection = cls.get_connection(config)
  39. db = connection.hello_world
  40. db.world.find()
  41. connection.close()
  42. return True
  43. except:
  44. return False
  45. @classmethod
  46. def get_queries(cls, config):
  47. co = cls.get_connection(config)
  48. status = co.admin.command(bson.son.SON([('serverStatus', 1)]))
  49. return int(status["opcounters"]["query"]) + int(status["opcounters"]["update"]) #get_queries returns all the queries
  50. @classmethod
  51. def get_rows(cls, config):
  52. co = cls.get_connection(config)
  53. status = co.admin.command(bson.son.SON([('serverStatus', 1)]))
  54. return int(status["opcounters"]["query"]) * cls.get_rows_per_query(co)
  55. @classmethod
  56. def get_rows_updated(cls, config):
  57. co = cls.get_connection(config)
  58. status = co.admin.command(bson.son.SON([('serverStatus', 1)]))
  59. return int(status["opcounters"]["update"]) * cls.get_rows_per_query(co)
  60. @classmethod
  61. def reset_cache(cls, config):
  62. co = cls.get_connection(config)
  63. co.admin.command({"planCacheClear": "world"})
  64. co.admin.command({"planCacheClear": "fortune"})
  65. @classmethod
  66. def get_rows_per_query(cls, co):
  67. rows_per_query = 1
  68. if cls.tbl_name == "fortune":
  69. rows_per_query = co["hello_world"][cls.tbl_name].count_documents({})
  70. return rows_per_query