Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

opendal_conn.py 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import opendal
  2. import logging
  3. import pymysql
  4. import yaml
  5. from rag.utils import singleton
  6. SERVICE_CONF_PATH = "conf/service_conf.yaml"
  7. CREATE_TABLE_SQL = """
  8. CREATE TABLE IF NOT EXISTS `{}` (
  9. `key` VARCHAR(255) PRIMARY KEY,
  10. `value` LONGBLOB,
  11. `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  12. `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  13. );
  14. """
  15. SET_MAX_ALLOWED_PACKET_SQL = """
  16. SET GLOBAL max_allowed_packet={}
  17. """
  18. def get_opendal_config_from_yaml(yaml_path=SERVICE_CONF_PATH):
  19. try:
  20. with open(yaml_path, 'r') as f:
  21. config = yaml.safe_load(f)
  22. opendal_config = config.get('opendal', {})
  23. kwargs = {}
  24. if opendal_config.get("schema") == 'mysql':
  25. mysql_config = config.get('mysql', {})
  26. kwargs = {
  27. "schema": "mysql",
  28. "host": mysql_config.get("host", "127.0.0.1"),
  29. "port": str(mysql_config.get("port", 3306)),
  30. "user": mysql_config.get("user", "root"),
  31. "password": mysql_config.get("password", ""),
  32. "database": mysql_config.get("name", "test_open_dal"),
  33. "table": opendal_config.get("config").get("table", "opendal_storage")
  34. }
  35. kwargs["connection_string"] = f"mysql://{kwargs['user']}:{kwargs['password']}@{kwargs['host']}:{kwargs['port']}/{kwargs['database']}"
  36. else:
  37. schema = opendal_config.get("schema")
  38. config_data = opendal_config.get("config", {})
  39. kwargs = {"schema": schema, **config_data}
  40. logging.info("Loaded OpenDAL configuration from yaml: %s", kwargs)
  41. return kwargs
  42. except Exception as e:
  43. logging.error("Failed to load OpenDAL configuration from yaml: %s", str(e))
  44. raise
  45. @singleton
  46. class OpenDALStorage:
  47. def __init__(self):
  48. self._kwargs = get_opendal_config_from_yaml()
  49. self._schema = self._kwargs.get('schema', 'mysql')
  50. if self._schema == 'mysql':
  51. self.init_db_config()
  52. self.init_opendal_mysql_table()
  53. self._operator = opendal.Operator(self._schema, **self._kwargs)
  54. logging.info("OpenDALStorage initialized successfully")
  55. def put(self, bucket, fnm, binary):
  56. self._operator.write(f"{bucket}/{fnm}", binary)
  57. def get(self, bucket, fnm):
  58. return self._operator.read(f"{bucket}/{fnm}")
  59. def rm(self, bucket, fnm):
  60. self._operator.delete(f"{bucket}/{fnm}")
  61. self._operator.__init__()
  62. def scan(self, bucket, fnm):
  63. return self._operator.scan(f"{bucket}/{fnm}")
  64. def obj_exist(self, bucket, fnm):
  65. return self._operator.exists(f"{bucket}/{fnm}")
  66. def init_db_config(self):
  67. try:
  68. conn = pymysql.connect(
  69. host=self._kwargs['host'],
  70. port=int(self._kwargs['port']),
  71. user=self._kwargs['user'],
  72. password=self._kwargs['password'],
  73. database=self._kwargs['database']
  74. )
  75. cursor = conn.cursor()
  76. max_packet = self._kwargs.get('max_allowed_packet', 4194304) # Default to 4MB if not specified
  77. cursor.execute(SET_MAX_ALLOWED_PACKET_SQL.format(max_packet))
  78. conn.commit()
  79. cursor.close()
  80. conn.close()
  81. logging.info(f"Database configuration initialized with max_allowed_packet={max_packet}")
  82. except Exception as e:
  83. logging.error(f"Failed to initialize database configuration: {str(e)}")
  84. raise
  85. def init_opendal_mysql_table(self):
  86. conn = pymysql.connect(
  87. host=self._kwargs['host'],
  88. port=int(self._kwargs['port']),
  89. user=self._kwargs['user'],
  90. password=self._kwargs['password'],
  91. database=self._kwargs['database']
  92. )
  93. cursor = conn.cursor()
  94. cursor.execute(CREATE_TABLE_SQL.format(self._kwargs['table']))
  95. conn.commit()
  96. cursor.close()
  97. conn.close()
  98. logging.info(f"Table `{self._kwargs['table']}` initialized.")