mcp-dbutils 1.0.0__tar.gz → 1.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/CHANGELOG.md +14 -0
  2. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/PKG-INFO +1 -1
  3. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/write-operations.md +22 -0
  4. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/configuration-write-operations.md +29 -6
  5. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/pyproject.toml +1 -1
  6. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/base.py +16 -15
  7. mcp_dbutils-1.0.2/tests/unit/test_base_extended.py +504 -0
  8. mcp_dbutils-1.0.2/tests/unit/test_init.py +141 -0
  9. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_write_permissions.py +27 -11
  10. mcp_dbutils-1.0.0/coverage.xml +0 -1928
  11. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.coveragerc +0 -0
  12. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_ar.md +0 -0
  13. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_en.md +0 -0
  14. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_es.md +0 -0
  15. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_fr.md +0 -0
  16. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_ru.md +0 -0
  17. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/bug_report_zh.md +0 -0
  18. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  19. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_ar.md +0 -0
  20. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_en.md +0 -0
  21. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_es.md +0 -0
  22. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_fr.md +0 -0
  23. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_ru.md +0 -0
  24. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/documentation_improvement_zh.md +0 -0
  25. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_ar.md +0 -0
  26. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_en.md +0 -0
  27. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_es.md +0 -0
  28. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_fr.md +0 -0
  29. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_ru.md +0 -0
  30. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/feature_request_zh.md +0 -0
  31. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_ar.md +0 -0
  32. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_en.md +0 -0
  33. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_es.md +0 -0
  34. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_fr.md +0 -0
  35. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_ru.md +0 -0
  36. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/performance_issue_zh.md +0 -0
  37. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_ar.md +0 -0
  38. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_en.md +0 -0
  39. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_es.md +0 -0
  40. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_fr.md +0 -0
  41. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_ru.md +0 -0
  42. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/ISSUE_TEMPLATE/security_vulnerability_zh.md +0 -0
  43. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/workflows/code-style.yml +0 -0
  44. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/workflows/issue-translator.yml +0 -0
  45. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/workflows/quality-assurance.yml +0 -0
  46. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.github/workflows/release.yml +0 -0
  47. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.gitignore +0 -0
  48. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.pre-commit-config.yaml +0 -0
  49. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/.releaserc.json +0 -0
  50. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/Dockerfile +0 -0
  51. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/LICENSE +0 -0
  52. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/README.md +0 -0
  53. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/README_AR.md +0 -0
  54. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/README_EN.md +0 -0
  55. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/README_ES.md +0 -0
  56. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/README_FR.md +0 -0
  57. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/README_RU.md +0 -0
  58. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/config.yaml.example +0 -0
  59. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/configuration.md +0 -0
  60. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/examples/README.md +0 -0
  61. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/examples/advanced-llm-interactions.md +0 -0
  62. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/examples/mysql-examples.md +0 -0
  63. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/examples/postgresql-examples.md +0 -0
  64. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/examples/sqlite-examples.md +0 -0
  65. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/installation-platform-specific.md +0 -0
  66. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/installation.md +0 -0
  67. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/technical/architecture.md +0 -0
  68. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/technical/development.md +0 -0
  69. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/technical/security.md +0 -0
  70. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/technical/sonarcloud-integration.md +0 -0
  71. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/technical/testing.md +0 -0
  72. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ar/usage.md +0 -0
  73. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/document-consistency-check.md +0 -0
  74. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/document-version-history.md +0 -0
  75. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/configuration.md +0 -0
  76. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/examples/advanced-llm-interactions.md +0 -0
  77. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/examples/mysql-examples.md +0 -0
  78. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/examples/postgresql-examples.md +0 -0
  79. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/examples/sqlite-examples.md +0 -0
  80. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/installation-platform-specific.md +0 -0
  81. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/installation.md +0 -0
  82. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/technical/architecture.md +0 -0
  83. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/technical/development.md +0 -0
  84. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/technical/security.md +0 -0
  85. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/technical/sonarcloud-integration.md +0 -0
  86. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/technical/testing.md +0 -0
  87. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/en/usage.md +0 -0
  88. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/configuration.md +0 -0
  89. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/examples/README.md +0 -0
  90. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/examples/advanced-llm-interactions.md +0 -0
  91. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/examples/mysql-examples.md +0 -0
  92. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/examples/postgresql-examples.md +0 -0
  93. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/examples/sqlite-examples.md +0 -0
  94. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/installation-platform-specific.md +0 -0
  95. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/installation.md +0 -0
  96. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/technical/architecture.md +0 -0
  97. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/technical/development.md +0 -0
  98. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/technical/security.md +0 -0
  99. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/technical/sonarcloud-integration.md +0 -0
  100. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/technical/testing.md +0 -0
  101. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/es/usage.md +0 -0
  102. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/configuration.md +0 -0
  103. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/examples/README.md +0 -0
  104. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/examples/advanced-llm-interactions.md +0 -0
  105. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/examples/mysql-examples.md +0 -0
  106. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/examples/postgresql-examples.md +0 -0
  107. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/examples/sqlite-examples.md +0 -0
  108. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/installation-platform-specific.md +0 -0
  109. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/installation.md +0 -0
  110. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/technical/architecture.md +0 -0
  111. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/technical/development.md +0 -0
  112. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/technical/security.md +0 -0
  113. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/technical/sonarcloud-integration.md +0 -0
  114. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/technical/testing.md +0 -0
  115. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/fr/usage.md +0 -0
  116. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/index.md +0 -0
  117. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/configuration.md +0 -0
  118. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/examples/README.md +0 -0
  119. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/examples/advanced-llm-interactions.md +0 -0
  120. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/examples/mysql-examples.md +0 -0
  121. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/examples/postgresql-examples.md +0 -0
  122. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/examples/sqlite-examples.md +0 -0
  123. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/installation-platform-specific.md +0 -0
  124. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/installation.md +0 -0
  125. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/technical/architecture.md +0 -0
  126. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/technical/development.md +0 -0
  127. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/technical/security.md +0 -0
  128. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/technical/sonarcloud-integration.md +0 -0
  129. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/technical/testing.md +0 -0
  130. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/ru/usage.md +0 -0
  131. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/configuration.md +0 -0
  132. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/examples/advanced-llm-interactions.md +0 -0
  133. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/examples/mysql-examples.md +0 -0
  134. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/examples/postgresql-examples.md +0 -0
  135. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/examples/sqlite-examples.md +0 -0
  136. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/installation-platform-specific.md +0 -0
  137. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/installation.md +0 -0
  138. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/security-best-practices.md +0 -0
  139. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/technical/architecture.md +0 -0
  140. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/technical/audit-logging.md +0 -0
  141. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/technical/development.md +0 -0
  142. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/technical/security.md +0 -0
  143. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/technical/sonarcloud-integration.md +0 -0
  144. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/technical/testing.md +0 -0
  145. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/technical/write-operations-design.md +0 -0
  146. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/usage-write-operations.md +0 -0
  147. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/docs/zh/usage.md +0 -0
  148. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/examples/config.yaml +0 -0
  149. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/check_docs_consistency.py +0 -0
  150. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/check_zh_docs.py +0 -0
  151. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/fix_en_nav_links.py +0 -0
  152. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/fix_imports.sh +0 -0
  153. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/fix_remaining_issues.sh +0 -0
  154. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/fix_zh_nav_links.py +0 -0
  155. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/run_sonar_analysis.sh +0 -0
  156. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/scripts/sonar-ai-fix.fish +0 -0
  157. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/smithery.yaml +0 -0
  158. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/sonar-project.properties +0 -0
  159. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/__init__.py +0 -0
  160. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/audit.py +0 -0
  161. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/config.py +0 -0
  162. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/log.py +0 -0
  163. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/__init__.py +0 -0
  164. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/config.py +0 -0
  165. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/handler.py +0 -0
  166. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/mysql/server.py +0 -0
  167. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/__init__.py +0 -0
  168. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/config.py +0 -0
  169. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/handler.py +0 -0
  170. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/postgres/server.py +0 -0
  171. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/__init__.py +0 -0
  172. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/config.py +0 -0
  173. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/handler.py +0 -0
  174. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/sqlite/server.py +0 -0
  175. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/src/mcp_dbutils/stats.py +0 -0
  176. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/conftest.py +0 -0
  177. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/__init__.py +0 -0
  178. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/conftest.py +0 -0
  179. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/fixtures.py +0 -0
  180. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_list_connections.py +0 -0
  181. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_logging.py +0 -0
  182. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_monitoring.py +0 -0
  183. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_monitoring_enhanced.py +0 -0
  184. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_mysql.py +0 -0
  185. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_mysql_config.py +0 -0
  186. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_mysql_config_helpers.py +0 -0
  187. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_mysql_handler_extended.py +0 -0
  188. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_postgres.py +0 -0
  189. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_postgres_config.py +0 -0
  190. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_prompts.py +0 -0
  191. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_sqlite.py +0 -0
  192. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_sqlite_config.py +0 -0
  193. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_sqlite_handler_extended.py +0 -0
  194. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_tools.py +0 -0
  195. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/integration/test_tools_advanced.py +0 -0
  196. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/test_write_operations.py +0 -0
  197. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_audit.py +0 -0
  198. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_base.py +0 -0
  199. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_base_handlers.py +0 -0
  200. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_base_helpers.py +0 -0
  201. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_base_server.py +0 -0
  202. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_base_write_operations.py +0 -0
  203. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_log.py +0 -0
  204. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_mysql_handler.py +0 -0
  205. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_mysql_server.py +0 -0
  206. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_postgres_handler.py +0 -0
  207. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_postgres_server.py +0 -0
  208. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_sql_parsing.py +0 -0
  209. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_sqlite_handler.py +0 -0
  210. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_sqlite_server.py +0 -0
  211. {mcp_dbutils-1.0.0 → mcp_dbutils-1.0.2}/tests/unit/test_stats.py +0 -0
@@ -1,3 +1,17 @@
1
+ ## [1.0.2](https://github.com/donghao1393/mcp-dbutils/compare/v1.0.1...v1.0.2) (2025-05-05)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * 修复表名大小写敏感性问题 ([#95](https://github.com/donghao1393/mcp-dbutils/issues/95)) ([2986101](https://github.com/donghao1393/mcp-dbutils/commit/2986101656d3f6d8d70ee21c051e4d140c0c9eee)), closes [#92](https://github.com/donghao1393/mcp-dbutils/issues/92)
7
+
8
+ ## [1.0.1](https://github.com/donghao1393/mcp-dbutils/compare/v1.0.0...v1.0.1) (2025-05-04)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * 提高代码覆盖率以解决SonarCloud检查失败问题 ([#90](https://github.com/donghao1393/mcp-dbutils/issues/90)) ([adbc9f2](https://github.com/donghao1393/mcp-dbutils/commit/adbc9f2e6fb54ed446d96775c65edf67611637ed))
14
+
1
15
  # [1.0.0](https://github.com/donghao1393/mcp-dbutils/compare/v0.23.1...v1.0.0) (2025-05-04)
2
16
 
3
17
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-dbutils
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: MCP Database Utilities Service
5
5
  Author: Dong Hao
6
6
  License-Expression: MIT
@@ -41,6 +41,28 @@ connections:
41
41
  - `default_policy`:默认策略,可选值为 `read_only`(只读)或 `allow_all`(允许所有写操作)。
42
42
  - `tables`:表级权限配置,可以为每个表指定允许的操作类型。
43
43
 
44
+ ### 表名大小写处理
45
+
46
+ MCP-DBUtils 在处理表名时采用大小写不敏感的比较策略:
47
+
48
+ - 在配置文件中,表名可以使用任意大小写(如 `users`、`Users` 或 `USERS`)。
49
+ - 在 SQL 语句中,表名同样可以使用任意大小写。
50
+ - 系统会自动将表名转换为小写进行比较,确保大小写不影响权限检查。
51
+
52
+ 例如,以下配置和 SQL 语句都能正确匹配:
53
+
54
+ ```yaml
55
+ # 配置文件中使用小写表名
56
+ tables:
57
+ users:
58
+ operations: ["INSERT", "UPDATE"]
59
+ ```
60
+
61
+ ```sql
62
+ -- SQL 语句中使用大写表名,仍然能正确匹配权限
63
+ INSERT INTO USERS (id, name) VALUES (1, 'test');
64
+ ```
65
+
44
66
  ## 使用写操作工具
45
67
 
46
68
  MCP-DBUtils 提供了 `dbutils-execute-write` 工具用于执行写操作:
@@ -92,6 +92,28 @@ tables:
92
92
 
93
93
  如果未指定`operations`,则默认允许所有写操作(INSERT、UPDATE、DELETE)。
94
94
 
95
+ ### 2.4 表名大小写处理
96
+
97
+ MCP-DBUtils 在处理表名时采用大小写不敏感的比较策略:
98
+
99
+ - 在配置文件中,表名可以使用任意大小写(如 `users`、`Users` 或 `USERS`)。
100
+ - 在 SQL 语句中,表名同样可以使用任意大小写。
101
+ - 系统会自动将表名转换为小写进行比较,确保大小写不影响权限检查。
102
+
103
+ 例如,以下配置和 SQL 语句都能正确匹配:
104
+
105
+ ```yaml
106
+ # 配置文件中使用小写表名
107
+ tables:
108
+ users:
109
+ operations: [INSERT, UPDATE]
110
+ ```
111
+
112
+ ```sql
113
+ -- SQL 语句中使用大写表名,仍然能正确匹配权限
114
+ INSERT INTO USERS (id, name) VALUES (1, 'test');
115
+ ```
116
+
95
117
  ## 3. 完整配置示例
96
118
 
97
119
  以下是一个包含多种配置场景的完整示例:
@@ -103,7 +125,7 @@ connections:
103
125
  type: sqlite
104
126
  database: ":memory:"
105
127
  # 未指定writable,默认为false(只读)
106
-
128
+
107
129
  # 示例2:可写连接,无细粒度控制
108
130
  simple_writable_mysql:
109
131
  type: mysql
@@ -114,7 +136,7 @@ connections:
114
136
  password: secret
115
137
  writable: true
116
138
  # 未指定write_permissions,所有表都可写
117
-
139
+
118
140
  # 示例3:可写连接,有表级和操作级控制
119
141
  controlled_postgres:
120
142
  type: postgres
@@ -124,7 +146,7 @@ connections:
124
146
  user: postgres
125
147
  password: postgres
126
148
  writable: true
127
-
149
+
128
150
  write_permissions:
129
151
  # 表级权限
130
152
  tables:
@@ -134,10 +156,10 @@ connections:
134
156
  operations: [INSERT] # 只允许插入
135
157
  temp_data:
136
158
  operations: [INSERT, UPDATE, DELETE] # 允许所有写操作
137
-
159
+
138
160
  # 默认策略
139
161
  default_policy: read_only # 未指定的表默认只读
140
-
162
+
141
163
  # 示例4:可写连接,只有默认策略
142
164
  all_writable_postgres:
143
165
  type: postgres
@@ -147,7 +169,7 @@ connections:
147
169
  user: postgres
148
170
  password: postgres
149
171
  writable: true
150
-
172
+
151
173
  write_permissions:
152
174
  default_policy: allow_all # 所有表默认可写
153
175
  ```
@@ -210,6 +232,7 @@ connections:
210
232
  | "Connection is not configured for write operations" | 连接未设置`writable: true` | 在配置文件中添加`writable: true` |
211
233
  | "No permission to perform [操作] on table [表名]" | 表未被允许执行该操作 | 在`write_permissions.tables`中添加表和操作 |
212
234
  | "Operation not confirmed" | 未提供正确的确认参数 | 在工具调用中添加`confirmation: "CONFIRM_WRITE"` |
235
+ | "No permission to perform [操作] on table [大写表名]" | SQL语句中使用了大写表名,但配置中使用小写表名 | 系统已支持大小写不敏感的表名比较,此问题在v1.0.1及以上版本已修复 |
213
236
 
214
237
  ## 6. 配置迁移
215
238
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "mcp-dbutils"
3
- version = "1.0.0"
3
+ version = "1.0.2"
4
4
  description = "MCP Database Utilities Service"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -188,8 +188,8 @@ class ConnectionHandler(ABC):
188
188
  if "row" in result and "affected" in result:
189
189
  # 从结果字符串中提取受影响的行数
190
190
  import re
191
- # 使用更安全的正则表达式,避免回溯问题
192
- match = re.search(r"(\d+) rows?", result)
191
+ # 限制数字长度,避免DoS风险
192
+ match = re.search(r"(\d{1,10}) rows?", result)
193
193
  if match:
194
194
  affected_rows = int(match.group(1))
195
195
  except Exception:
@@ -601,7 +601,7 @@ class ConnectionServer:
601
601
  # Default fallback
602
602
  return "unknown_table"
603
603
 
604
- async def _check_write_permission(self, connection: str, table_name: str, operation_type: str) -> bool:
604
+ async def _check_write_permission(self, connection: str, table_name: str, operation_type: str) -> None:
605
605
  """检查写操作权限
606
606
 
607
607
  Args:
@@ -609,9 +609,6 @@ class ConnectionServer:
609
609
  table_name: 表名
610
610
  operation_type: 操作类型 (INSERT, UPDATE, DELETE)
611
611
 
612
- Returns:
613
- bool: 是否有权限执行写操作
614
-
615
612
  Raises:
616
613
  ConfigurationError: 如果连接不可写或没有表级权限
617
614
  """
@@ -626,7 +623,10 @@ class ConnectionServer:
626
623
  write_permissions = db_config.get("write_permissions", {})
627
624
  if not write_permissions:
628
625
  # 没有细粒度权限控制,默认允许所有写操作
629
- return True
626
+ return
627
+
628
+ # 将表名转换为小写,用于大小写不敏感的比较
629
+ table_name_lower = table_name.lower()
630
630
 
631
631
  # 检查表级权限
632
632
  tables = write_permissions.get("tables", {})
@@ -634,19 +634,22 @@ class ConnectionServer:
634
634
  # 没有表级权限配置,检查默认策略
635
635
  default_policy = write_permissions.get("default_policy", "read_only")
636
636
  if default_policy == "allow_all":
637
- return True
637
+ return
638
638
  else:
639
639
  # 默认只读
640
640
  raise ConfigurationError(WRITE_OPERATION_NOT_ALLOWED_ERROR.format(
641
641
  operation=operation_type, table=table_name
642
642
  ))
643
643
 
644
- # 检查特定表的权限
645
- if table_name in tables:
646
- table_config = tables[table_name]
644
+ # 创建表名到配置的映射,支持大小写不敏感的比较
645
+ tables_lower = {k.lower(): v for k, v in tables.items()}
646
+
647
+ # 检查特定表的权限(大小写不敏感)
648
+ if table_name_lower in tables_lower:
649
+ table_config = tables_lower[table_name_lower]
647
650
  operations = table_config.get("operations", ["INSERT", "UPDATE", "DELETE"])
648
651
  if operation_type in operations:
649
- return True
652
+ return
650
653
  else:
651
654
  raise ConfigurationError(WRITE_OPERATION_NOT_ALLOWED_ERROR.format(
652
655
  operation=operation_type, table=table_name
@@ -655,15 +658,13 @@ class ConnectionServer:
655
658
  # 表未明确配置,检查默认策略
656
659
  default_policy = write_permissions.get("default_policy", "read_only")
657
660
  if default_policy == "allow_all":
658
- return True
661
+ return
659
662
  else:
660
663
  # 默认只读
661
664
  raise ConfigurationError(WRITE_OPERATION_NOT_ALLOWED_ERROR.format(
662
665
  operation=operation_type, table=table_name
663
666
  ))
664
667
 
665
- return False
666
-
667
668
  def _create_handler_for_type(
668
669
  self, db_type: str, connection: str
669
670
  ) -> ConnectionHandler: