@libredb/studio 0.9.7 → 0.9.12
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.
- package/dist/chunk-34YQUUCM.mjs +319 -0
- package/dist/chunk-34YQUUCM.mjs.map +1 -0
- package/dist/chunk-4LVB3K53.mjs +37 -0
- package/dist/chunk-4LVB3K53.mjs.map +1 -0
- package/dist/chunk-6DRZXXNT.mjs +100 -0
- package/dist/chunk-6DRZXXNT.mjs.map +1 -0
- package/dist/chunk-CZVV3JJB.mjs +160 -0
- package/dist/chunk-CZVV3JJB.mjs.map +1 -0
- package/dist/chunk-D4WVWWWF.js +332 -0
- package/dist/chunk-D4WVWWWF.js.map +1 -0
- package/dist/chunk-DY3KXE44.mjs +3 -0
- package/dist/chunk-DY3KXE44.mjs.map +1 -0
- package/dist/chunk-DZ2UB3C6.mjs +6679 -0
- package/dist/chunk-DZ2UB3C6.mjs.map +1 -0
- package/dist/chunk-FYSE52VB.js +242 -0
- package/dist/chunk-FYSE52VB.js.map +1 -0
- package/dist/chunk-G4WYE6TI.js +4 -0
- package/dist/chunk-G4WYE6TI.js.map +1 -0
- package/dist/chunk-JOGLIOFO.js +1310 -0
- package/dist/chunk-JOGLIOFO.js.map +1 -0
- package/dist/chunk-JZO5KRZN.js +165 -0
- package/dist/chunk-JZO5KRZN.js.map +1 -0
- package/dist/chunk-KV356UXJ.js +253 -0
- package/dist/chunk-KV356UXJ.js.map +1 -0
- package/dist/chunk-PPODO6HX.mjs +237 -0
- package/dist/chunk-PPODO6HX.mjs.map +1 -0
- package/dist/chunk-PTIRB2JO.js +258 -0
- package/dist/chunk-PTIRB2JO.js.map +1 -0
- package/dist/chunk-Q6LRDBK7.js +42 -0
- package/dist/chunk-Q6LRDBK7.js.map +1 -0
- package/dist/chunk-QJP5FZRY.mjs +255 -0
- package/dist/chunk-QJP5FZRY.mjs.map +1 -0
- package/dist/chunk-R3POCJK6.mjs +248 -0
- package/dist/chunk-R3POCJK6.mjs.map +1 -0
- package/dist/chunk-RBVDMLFV.js +6747 -0
- package/dist/chunk-RBVDMLFV.js.map +1 -0
- package/dist/chunk-RCQB4FCE.js +186 -0
- package/dist/chunk-RCQB4FCE.js.map +1 -0
- package/dist/chunk-SR5DRGBX.mjs +174 -0
- package/dist/chunk-SR5DRGBX.mjs.map +1 -0
- package/dist/chunk-VLCRUZX7.js +102 -0
- package/dist/chunk-VLCRUZX7.js.map +1 -0
- package/dist/chunk-VWVRUCQO.mjs +1289 -0
- package/dist/chunk-VWVRUCQO.mjs.map +1 -0
- package/dist/components.d.mts +273 -0
- package/dist/components.d.ts +273 -0
- package/dist/components.js +59 -0
- package/dist/components.js.map +1 -0
- package/dist/components.mjs +6 -0
- package/dist/components.mjs.map +1 -0
- package/dist/custom-BNDOYC5P.js +134 -0
- package/dist/custom-BNDOYC5P.js.map +1 -0
- package/dist/custom-S2EKFMP3.mjs +132 -0
- package/dist/custom-S2EKFMP3.mjs.map +1 -0
- package/dist/gemini-4ASHNK4H.js +81 -0
- package/dist/gemini-4ASHNK4H.js.map +1 -0
- package/dist/gemini-C5RBLQEJ.mjs +79 -0
- package/dist/gemini-C5RBLQEJ.mjs.map +1 -0
- package/dist/index.d.mts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +10 -0
- package/dist/index.mjs.map +1 -0
- package/dist/mongodb-XMZEZA4A.mjs +748 -0
- package/dist/mongodb-XMZEZA4A.mjs.map +1 -0
- package/dist/mongodb-YQJJTLX3.js +750 -0
- package/dist/mongodb-YQJJTLX3.js.map +1 -0
- package/dist/mssql-PMOU4D36.js +916 -0
- package/dist/mssql-PMOU4D36.js.map +1 -0
- package/{src/lib/db/providers/sql/mssql.ts → dist/mssql-ZH5VP2C5.mjs} +268 -423
- package/dist/mssql-ZH5VP2C5.mjs.map +1 -0
- package/{src/lib/db/providers/sql/mysql.ts → dist/mysql-I3WJQXN2.mjs} +277 -428
- package/dist/mysql-I3WJQXN2.mjs.map +1 -0
- package/dist/mysql-Y3MSA5QY.js +833 -0
- package/dist/mysql-Y3MSA5QY.js.map +1 -0
- package/dist/ollama-26BYLVEV.mjs +115 -0
- package/dist/ollama-26BYLVEV.mjs.map +1 -0
- package/dist/ollama-HVWAGKQC.js +117 -0
- package/dist/ollama-HVWAGKQC.js.map +1 -0
- package/dist/openai-4U56KPG7.mjs +111 -0
- package/dist/openai-4U56KPG7.mjs.map +1 -0
- package/dist/openai-AK3R37BS.js +113 -0
- package/dist/openai-AK3R37BS.js.map +1 -0
- package/dist/oracle-L6VEAVXO.js +917 -0
- package/dist/oracle-L6VEAVXO.js.map +1 -0
- package/{src/lib/db/providers/sql/oracle.ts → dist/oracle-P2G7T4P4.mjs} +321 -454
- package/dist/oracle-P2G7T4P4.mjs.map +1 -0
- package/{src/lib/db/providers/sql/postgres.ts → dist/postgres-O5KOQUVP.mjs} +261 -471
- package/dist/postgres-O5KOQUVP.mjs.map +1 -0
- package/dist/postgres-RLCWNFFX.js +971 -0
- package/dist/postgres-RLCWNFFX.js.map +1 -0
- package/dist/providers.d.mts +149 -0
- package/dist/providers.d.ts +149 -0
- package/dist/providers.js +44 -0
- package/dist/providers.js.map +1 -0
- package/dist/providers.mjs +7 -0
- package/dist/providers.mjs.map +1 -0
- package/dist/redis-4WMQOVLX.mjs +435 -0
- package/dist/redis-4WMQOVLX.mjs.map +1 -0
- package/dist/redis-QVQ6YU62.js +441 -0
- package/dist/redis-QVQ6YU62.js.map +1 -0
- package/dist/sqlite-4I2P2OGQ.js +554 -0
- package/dist/sqlite-4I2P2OGQ.js.map +1 -0
- package/dist/sqlite-OA4YJX5S.mjs +531 -0
- package/dist/sqlite-OA4YJX5S.mjs.map +1 -0
- package/dist/types-BJvJfxSY.d.mts +141 -0
- package/dist/types-BJvJfxSY.d.ts +141 -0
- package/dist/types-ClAg_v5k.d.mts +343 -0
- package/dist/types-Der_X8E8.d.ts +343 -0
- package/dist/types.d.mts +2 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +3 -0
- package/dist/types.mjs.map +1 -0
- package/dist/workspace.d.mts +80 -0
- package/dist/workspace.d.ts +80 -0
- package/dist/workspace.js +4182 -0
- package/dist/workspace.js.map +1 -0
- package/dist/workspace.mjs +4155 -0
- package/dist/workspace.mjs.map +1 -0
- package/package.json +60 -5
- package/.claude/settings.local.json +0 -127
- package/.cursorrules +0 -426
- package/.devin/wiki.json +0 -143
- package/.dockerignore +0 -80
- package/.env.example +0 -159
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -49
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -29
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -57
- package/.github/workflows/ci.yml +0 -185
- package/.github/workflows/codeql.yml +0 -57
- package/.github/workflows/docker-build-push.yml +0 -118
- package/.github/workflows/helm-release.yml +0 -113
- package/CLAUDE.md +0 -265
- package/CODE_OF_CONDUCT.md +0 -124
- package/CONTRIBUTING.md +0 -154
- package/Dockerfile +0 -73
- package/SECURITY.md +0 -107
- package/artifacthub-repo.yml +0 -4
- package/bun.lock +0 -1714
- package/bunfig.toml +0 -3
- package/charts/libredb-studio/.helmignore +0 -11
- package/charts/libredb-studio/Chart.lock +0 -6
- package/charts/libredb-studio/Chart.yaml +0 -50
- package/charts/libredb-studio/README.md +0 -206
- package/charts/libredb-studio/templates/NOTES.txt +0 -59
- package/charts/libredb-studio/templates/_helpers.tpl +0 -135
- package/charts/libredb-studio/templates/configmap.yaml +0 -37
- package/charts/libredb-studio/templates/deployment.yaml +0 -184
- package/charts/libredb-studio/templates/hpa.yaml +0 -32
- package/charts/libredb-studio/templates/ingress.yaml +0 -41
- package/charts/libredb-studio/templates/networkpolicy.yaml +0 -50
- package/charts/libredb-studio/templates/pdb.yaml +0 -18
- package/charts/libredb-studio/templates/pvc.yaml +0 -23
- package/charts/libredb-studio/templates/secret.yaml +0 -30
- package/charts/libredb-studio/templates/seed-configmap.yaml +0 -11
- package/charts/libredb-studio/templates/service.yaml +0 -22
- package/charts/libredb-studio/templates/serviceaccount.yaml +0 -13
- package/charts/libredb-studio/values.schema.json +0 -246
- package/charts/libredb-studio/values.yaml +0 -286
- package/components.json +0 -22
- package/conductor/code_styleguides/typescript.md +0 -43
- package/conductor/product-guidelines.md +0 -43
- package/conductor/product.md +0 -3
- package/conductor/setup_state.json +0 -1
- package/conductor/tech-stack.md +0 -39
- package/conductor/tracks/enhance_postgres_monitoring_20251227/metadata.json +0 -8
- package/conductor/tracks/enhance_postgres_monitoring_20251227/plan.md +0 -44
- package/conductor/tracks/enhance_postgres_monitoring_20251227/spec.md +0 -31
- package/conductor/tracks.md +0 -8
- package/conductor/workflow.md +0 -333
- package/database-compose.yml +0 -55
- package/docker/postgres-init/01-extensions.sql +0 -10
- package/docker/postgres-init/02-sample-data.sql +0 -585
- package/docker/postgres.yml +0 -68
- package/docker-compose.yml +0 -38
- package/docs/AI_PLAN.md +0 -74
- package/docs/API_DOCS.md +0 -875
- package/docs/ARCHITECTURE.md +0 -218
- package/docs/DATABASE_PROVIDERS.md +0 -358
- package/docs/FEATURES.md +0 -116
- package/docs/HELM_CHART.md +0 -252
- package/docs/LOGIN_PAGE.md +0 -178
- package/docs/MONACO_EDITOR_PERFORMANCE.md +0 -315
- package/docs/OIDC_ARCH.md +0 -681
- package/docs/OIDC_SETUP.md +0 -322
- package/docs/POSTGRES_METRICS.md +0 -516
- package/docs/QUERY_OPTIMIZATION.md +0 -370
- package/docs/SEED_CONNECTIONS.md +0 -468
- package/docs/SQL_ALIAS_COMPLETION.md +0 -190
- package/docs/STORAGE_ARCHITECTURE.md +0 -565
- package/docs/STORAGE_QUICK_SETUP.md +0 -419
- package/docs/TECHNICAL_PLAN.md +0 -36
- package/docs/THEMING.md +0 -345
- package/docs/adding-a-new-database-provider.md +0 -642
- package/docs/backlogs/000-PLATFORM_DATA_SYNC_DATABASE.md +0 -360
- package/docs/backlogs/001-INLINE_DATA_EDITING.md +0 -118
- package/docs/backlogs/002-DATA_IMPORT.md +0 -215
- package/docs/backlogs/003-QUERY_TIME_MACHINE.md +0 -183
- package/docs/backlogs/004-AI_DATA_STORYTELLER.md +0 -292
- package/docs/backlogs/005-QUERY_PLAYGROUND.md +0 -352
- package/docs/backlogs/006-DATA_MASKING.md +0 -418
- package/docs/enterprise-features.md +0 -718
- package/docs/kubernetes-helm-chart-artifacthub-plan.md +0 -803
- package/docs/medium-koyeb-article-en.md +0 -215
- package/docs/plans/test-plans.md +0 -445
- package/docs/releases/RELEASE.V0.3.0.md +0 -22
- package/docs/releases/RELEASE.V0.4.0.md +0 -154
- package/docs/releases/RELEASE.V0.5.0.md +0 -252
- package/docs/releases/RELEASE_v0.5.6.md +0 -145
- package/docs/releases/RELEASE_v0.6.1.md +0 -303
- package/docs/releases/RELEASE_v0.6.7.md +0 -292
- package/docs/releases/RELEASE_v0.7.0.md +0 -332
- package/docs/releases/RELEASE_v0.8.0.md +0 -521
- package/docs/sampledb/titanic.sql +0 -1379
- package/docs/superpowers/plans/2026-03-25-seed-connections.md +0 -1362
- package/docs/superpowers/specs/2026-03-25-seed-connections-design.md +0 -590
- package/e2e/admin-dashboard.spec.ts +0 -64
- package/e2e/connection-management.spec.ts +0 -58
- package/e2e/export.spec.ts +0 -34
- package/e2e/login.spec.ts +0 -85
- package/e2e/query-execution.spec.ts +0 -35
- package/e2e/tab-management.spec.ts +0 -64
- package/eslint.config.mjs +0 -28
- package/fly.toml +0 -43
- package/next.config.ts +0 -32
- package/playwright.config.ts +0 -34
- package/postcss.config.mjs +0 -7
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/file.svg +0 -1
- package/public/globe.svg +0 -1
- package/public/logo.svg +0 -32
- package/public/next.svg +0 -1
- package/public/screenshots/code-generator.png +0 -0
- package/public/screenshots/connection-modal.png +0 -0
- package/public/screenshots/data-profiler.png +0 -0
- package/public/screenshots/erd-diagram.png +0 -0
- package/public/screenshots/hero-editor.png +0 -0
- package/public/screenshots/nl2sql.png +0 -0
- package/public/vercel.svg +0 -1
- package/public/window.svg +0 -1
- package/render.yaml +0 -58
- package/scripts/merge-lcov.mjs +0 -239
- package/sonar-project.properties +0 -16
- package/src/app/admin/error.tsx +0 -46
- package/src/app/admin/page.tsx +0 -10
- package/src/app/api/admin/audit/route.ts +0 -52
- package/src/app/api/admin/fleet-health/route.ts +0 -81
- package/src/app/api/ai/autopilot/route.ts +0 -105
- package/src/app/api/ai/chat/route.ts +0 -132
- package/src/app/api/ai/describe-schema/route.ts +0 -52
- package/src/app/api/ai/explain/route.ts +0 -86
- package/src/app/api/ai/impact/route.ts +0 -97
- package/src/app/api/ai/index-advisor/route.ts +0 -98
- package/src/app/api/ai/nl2sql/route.ts +0 -87
- package/src/app/api/ai/query-safety/route.ts +0 -87
- package/src/app/api/auth/login/route.ts +0 -62
- package/src/app/api/auth/logout/route.ts +0 -25
- package/src/app/api/auth/me/route.ts +0 -10
- package/src/app/api/auth/oidc/callback/route.ts +0 -82
- package/src/app/api/auth/oidc/login/route.ts +0 -43
- package/src/app/api/connections/managed/route.ts +0 -35
- package/src/app/api/db/cancel/route.ts +0 -42
- package/src/app/api/db/disconnect/route.ts +0 -28
- package/src/app/api/db/health/route.ts +0 -49
- package/src/app/api/db/maintenance/route.ts +0 -72
- package/src/app/api/db/monitoring/route.ts +0 -62
- package/src/app/api/db/multi-query/route.ts +0 -116
- package/src/app/api/db/pool-stats/route.ts +0 -37
- package/src/app/api/db/profile/route.ts +0 -144
- package/src/app/api/db/provider-meta/route.ts +0 -49
- package/src/app/api/db/query/route.ts +0 -50
- package/src/app/api/db/schema/route.ts +0 -47
- package/src/app/api/db/schema-snapshot/route.ts +0 -42
- package/src/app/api/db/test-connection/route.ts +0 -55
- package/src/app/api/db/transaction/route.ts +0 -111
- package/src/app/api/storage/[collection]/route.ts +0 -67
- package/src/app/api/storage/config/route.ts +0 -17
- package/src/app/api/storage/migrate/route.ts +0 -45
- package/src/app/api/storage/route.ts +0 -32
- package/src/app/error.tsx +0 -49
- package/src/app/global-error.tsx +0 -55
- package/src/app/globals.css +0 -146
- package/src/app/icon.svg +0 -42
- package/src/app/layout.tsx +0 -34
- package/src/app/login/login-form.tsx +0 -301
- package/src/app/login/page.tsx +0 -11
- package/src/app/monitoring/page.tsx +0 -8
- package/src/app/not-found.tsx +0 -29
- package/src/app/page.tsx +0 -5
- package/src/components/AIAutopilotPanel.tsx +0 -238
- package/src/components/CodeGenerator.tsx +0 -271
- package/src/components/CommandPalette.tsx +0 -227
- package/src/components/ConnectionModal.tsx +0 -759
- package/src/components/CreateTableModal.tsx +0 -281
- package/src/components/DataCharts.tsx +0 -962
- package/src/components/DataImportModal.tsx +0 -582
- package/src/components/DataProfiler.tsx +0 -335
- package/src/components/DatabaseDocs.tsx +0 -251
- package/src/components/MaskingSettings.tsx +0 -414
- package/src/components/MobileNav.tsx +0 -50
- package/src/components/NL2SQLPanel.tsx +0 -281
- package/src/components/PivotTable.tsx +0 -257
- package/src/components/QueryEditor.tsx +0 -760
- package/src/components/QueryHistory.tsx +0 -344
- package/src/components/QuerySafetyDialog.tsx +0 -290
- package/src/components/ResultsGrid.tsx +0 -644
- package/src/components/SaveQueryModal.tsx +0 -104
- package/src/components/SavedQueries.tsx +0 -128
- package/src/components/SchemaDiagram.tsx +0 -473
- package/src/components/SchemaDiff.tsx +0 -473
- package/src/components/SnapshotTimeline.tsx +0 -116
- package/src/components/Studio.tsx +0 -639
- package/src/components/TestDataGenerator.tsx +0 -261
- package/src/components/VisualExplain.tsx +0 -820
- package/src/components/admin/AdminDashboard.tsx +0 -163
- package/src/components/admin/tabs/AuditTab.tsx +0 -531
- package/src/components/admin/tabs/MonitoringEmbed.tsx +0 -11
- package/src/components/admin/tabs/OperationsTab.tsx +0 -646
- package/src/components/admin/tabs/OverviewTab.tsx +0 -1328
- package/src/components/admin/tabs/SecurityTab.tsx +0 -284
- package/src/components/community-section.tsx +0 -92
- package/src/components/icons/db-icons.tsx +0 -84
- package/src/components/libredb-logo.tsx +0 -61
- package/src/components/monitoring/MonitoringDashboard.tsx +0 -345
- package/src/components/monitoring/tabs/MetricChart.tsx +0 -82
- package/src/components/monitoring/tabs/OverviewTab.tsx +0 -263
- package/src/components/monitoring/tabs/PerformanceTab.tsx +0 -254
- package/src/components/monitoring/tabs/PoolTab.tsx +0 -174
- package/src/components/monitoring/tabs/QueriesTab.tsx +0 -287
- package/src/components/monitoring/tabs/SessionsTab.tsx +0 -316
- package/src/components/monitoring/tabs/StorageTab.tsx +0 -335
- package/src/components/monitoring/tabs/TablesTab.tsx +0 -300
- package/src/components/results-grid/ResultCard.tsx +0 -111
- package/src/components/results-grid/RowDetailSheet.tsx +0 -178
- package/src/components/results-grid/StatsBar.tsx +0 -201
- package/src/components/results-grid/index.ts +0 -1
- package/src/components/results-grid/utils.ts +0 -23
- package/src/components/schema-explorer/ColumnList.tsx +0 -53
- package/src/components/schema-explorer/SchemaExplorer.tsx +0 -182
- package/src/components/schema-explorer/TableItem.tsx +0 -210
- package/src/components/schema-explorer/index.ts +0 -1
- package/src/components/sidebar/ConnectionItem.tsx +0 -105
- package/src/components/sidebar/ConnectionsList.tsx +0 -62
- package/src/components/sidebar/Sidebar.tsx +0 -130
- package/src/components/sidebar/index.ts +0 -2
- package/src/components/studio/BottomPanel.tsx +0 -286
- package/src/components/studio/QueryToolbar.tsx +0 -180
- package/src/components/studio/StudioDesktopHeader.tsx +0 -114
- package/src/components/studio/StudioMobileHeader.tsx +0 -340
- package/src/components/studio/StudioTabBar.tsx +0 -82
- package/src/components/studio/index.ts +0 -5
- package/src/components/ui/accordion.tsx +0 -66
- package/src/components/ui/alert-dialog.tsx +0 -157
- package/src/components/ui/alert.tsx +0 -66
- package/src/components/ui/aspect-ratio.tsx +0 -11
- package/src/components/ui/avatar.tsx +0 -53
- package/src/components/ui/badge.tsx +0 -46
- package/src/components/ui/breadcrumb.tsx +0 -109
- package/src/components/ui/button-group.tsx +0 -83
- package/src/components/ui/button.tsx +0 -60
- package/src/components/ui/calendar.tsx +0 -216
- package/src/components/ui/card.tsx +0 -92
- package/src/components/ui/carousel.tsx +0 -241
- package/src/components/ui/chart.tsx +0 -357
- package/src/components/ui/checkbox.tsx +0 -32
- package/src/components/ui/collapsible.tsx +0 -33
- package/src/components/ui/command.tsx +0 -184
- package/src/components/ui/context-menu.tsx +0 -252
- package/src/components/ui/dialog.tsx +0 -143
- package/src/components/ui/drawer.tsx +0 -135
- package/src/components/ui/dropdown-menu.tsx +0 -257
- package/src/components/ui/empty.tsx +0 -104
- package/src/components/ui/field.tsx +0 -248
- package/src/components/ui/form.tsx +0 -167
- package/src/components/ui/hover-card.tsx +0 -44
- package/src/components/ui/input-group.tsx +0 -170
- package/src/components/ui/input-otp.tsx +0 -77
- package/src/components/ui/input.tsx +0 -21
- package/src/components/ui/item.tsx +0 -193
- package/src/components/ui/kbd.tsx +0 -28
- package/src/components/ui/label.tsx +0 -24
- package/src/components/ui/menubar.tsx +0 -276
- package/src/components/ui/navigation-menu.tsx +0 -168
- package/src/components/ui/pagination.tsx +0 -127
- package/src/components/ui/popover.tsx +0 -48
- package/src/components/ui/progress.tsx +0 -31
- package/src/components/ui/radio-group.tsx +0 -45
- package/src/components/ui/resizable.tsx +0 -56
- package/src/components/ui/scroll-area.tsx +0 -58
- package/src/components/ui/select.tsx +0 -187
- package/src/components/ui/separator.tsx +0 -28
- package/src/components/ui/sheet.tsx +0 -139
- package/src/components/ui/sidebar.tsx +0 -726
- package/src/components/ui/skeleton.tsx +0 -13
- package/src/components/ui/slider.tsx +0 -63
- package/src/components/ui/sonner.tsx +0 -40
- package/src/components/ui/spinner.tsx +0 -16
- package/src/components/ui/switch.tsx +0 -31
- package/src/components/ui/table.tsx +0 -116
- package/src/components/ui/tabs.tsx +0 -66
- package/src/components/ui/textarea.tsx +0 -18
- package/src/components/ui/toggle-group.tsx +0 -83
- package/src/components/ui/toggle.tsx +0 -47
- package/src/components/ui/tooltip.tsx +0 -61
- package/src/exports/components.ts +0 -15
- package/src/exports/index.ts +0 -4
- package/src/exports/providers.ts +0 -4
- package/src/exports/types.ts +0 -26
- package/src/hooks/use-ai-chat.ts +0 -182
- package/src/hooks/use-all-connections.ts +0 -66
- package/src/hooks/use-api-call.ts +0 -71
- package/src/hooks/use-auth.ts +0 -51
- package/src/hooks/use-connection-form.ts +0 -349
- package/src/hooks/use-connection-manager.ts +0 -169
- package/src/hooks/use-connection-payload.ts +0 -15
- package/src/hooks/use-inline-editing.ts +0 -109
- package/src/hooks/use-mobile.ts +0 -20
- package/src/hooks/use-monitoring-data.ts +0 -270
- package/src/hooks/use-provider-metadata.ts +0 -62
- package/src/hooks/use-query-execution.ts +0 -478
- package/src/hooks/use-storage-sync.ts +0 -259
- package/src/hooks/use-tab-manager.ts +0 -231
- package/src/hooks/use-toast.ts +0 -20
- package/src/hooks/use-transaction-control.ts +0 -64
- package/src/lib/api/error-codes.ts +0 -30
- package/src/lib/api/errors.ts +0 -236
- package/src/lib/api/with-error-handler.ts +0 -41
- package/src/lib/audit.ts +0 -105
- package/src/lib/auth.ts +0 -87
- package/src/lib/connection-string-parser.ts +0 -172
- package/src/lib/data-masking.ts +0 -385
- package/src/lib/db/base-provider.ts +0 -325
- package/src/lib/db/errors.ts +0 -317
- package/src/lib/db/factory.ts +0 -324
- package/src/lib/db/index.ts +0 -123
- package/src/lib/db/providers/document/index.ts +0 -6
- package/src/lib/db/providers/document/mongodb.ts +0 -992
- package/src/lib/db/providers/keyvalue/redis.ts +0 -554
- package/src/lib/db/providers/sql/index.ts +0 -11
- package/src/lib/db/providers/sql/sql-base.ts +0 -174
- package/src/lib/db/providers/sql/sqlite.ts +0 -721
- package/src/lib/db/types.ts +0 -437
- package/src/lib/db/utils/pool-manager.ts +0 -287
- package/src/lib/db/utils/query-limiter.ts +0 -239
- package/src/lib/db-ui-config.ts +0 -86
- package/src/lib/editor/mongodb-completions.ts +0 -172
- package/src/lib/editor/sql-completions.ts +0 -280
- package/src/lib/llm/base-provider.ts +0 -117
- package/src/lib/llm/factory.ts +0 -102
- package/src/lib/llm/index.ts +0 -90
- package/src/lib/llm/providers/custom.ts +0 -181
- package/src/lib/llm/providers/gemini.ts +0 -126
- package/src/lib/llm/providers/ollama.ts +0 -154
- package/src/lib/llm/providers/openai.ts +0 -146
- package/src/lib/llm/types.ts +0 -173
- package/src/lib/llm/utils/config.ts +0 -187
- package/src/lib/llm/utils/retry.ts +0 -119
- package/src/lib/llm/utils/streaming.ts +0 -202
- package/src/lib/logger.ts +0 -127
- package/src/lib/monitoring-thresholds.ts +0 -44
- package/src/lib/oidc.ts +0 -262
- package/src/lib/query-generators.ts +0 -61
- package/src/lib/schema-diff/diff-engine.ts +0 -273
- package/src/lib/schema-diff/migration-generator.ts +0 -208
- package/src/lib/schema-diff/types.ts +0 -55
- package/src/lib/seed/config-loader.ts +0 -79
- package/src/lib/seed/connection-filter.ts +0 -49
- package/src/lib/seed/credential-resolver.ts +0 -62
- package/src/lib/seed/index.ts +0 -40
- package/src/lib/seed/resolve-connection.ts +0 -57
- package/src/lib/seed/types.ts +0 -69
- package/src/lib/sql/alias-extractor.ts +0 -267
- package/src/lib/sql/index.ts +0 -8
- package/src/lib/sql/statement-splitter.ts +0 -167
- package/src/lib/sql/types.ts +0 -40
- package/src/lib/ssh/tunnel.ts +0 -142
- package/src/lib/storage/factory.ts +0 -84
- package/src/lib/storage/index.ts +0 -14
- package/src/lib/storage/local-storage.ts +0 -99
- package/src/lib/storage/providers/postgres.ts +0 -225
- package/src/lib/storage/providers/sqlite.ts +0 -153
- package/src/lib/storage/storage-facade.ts +0 -272
- package/src/lib/storage/types.ts +0 -75
- package/src/lib/time-series-buffer.ts +0 -58
- package/src/lib/types.ts +0 -173
- package/src/lib/utils.ts +0 -6
- package/src/proxy.ts +0 -104
- package/src/types/db-drivers.d.ts +0 -23
- package/src/types/html2canvas.d.ts +0 -9
- package/tests/api/admin/audit.test.ts +0 -178
- package/tests/api/admin/fleet-health.test.ts +0 -183
- package/tests/api/ai/autopilot.test.ts +0 -174
- package/tests/api/ai/chat.test.ts +0 -250
- package/tests/api/ai/describe-schema.test.ts +0 -266
- package/tests/api/ai/explain.test.ts +0 -199
- package/tests/api/ai/impact.test.ts +0 -168
- package/tests/api/ai/index-advisor.test.ts +0 -171
- package/tests/api/ai/nl2sql.test.ts +0 -202
- package/tests/api/ai/query-safety.test.ts +0 -196
- package/tests/api/auth/login.test.ts +0 -170
- package/tests/api/auth/logout.test.ts +0 -140
- package/tests/api/auth/me.test.ts +0 -73
- package/tests/api/auth/oidc-callback.test.ts +0 -215
- package/tests/api/auth/oidc-login.test.ts +0 -127
- package/tests/api/db/cancel.test.ts +0 -198
- package/tests/api/db/disconnect.test.ts +0 -124
- package/tests/api/db/health.test.ts +0 -222
- package/tests/api/db/maintenance.test.ts +0 -263
- package/tests/api/db/monitoring.test.ts +0 -221
- package/tests/api/db/multi-query.test.ts +0 -316
- package/tests/api/db/pool-stats.test.ts +0 -135
- package/tests/api/db/profile.test.ts +0 -330
- package/tests/api/db/provider-meta.test.ts +0 -193
- package/tests/api/db/query.test.ts +0 -314
- package/tests/api/db/schema-snapshot.test.ts +0 -170
- package/tests/api/db/schema.test.ts +0 -191
- package/tests/api/db/test-connection.test.ts +0 -185
- package/tests/api/db/transaction.test.ts +0 -314
- package/tests/api/proxy.test.ts +0 -191
- package/tests/api/seed/managed-route.test.ts +0 -113
- package/tests/api/storage/config.test.ts +0 -42
- package/tests/api/storage/storage-routes.test.ts +0 -309
- package/tests/components/AIAutopilotPanel.test.tsx +0 -756
- package/tests/components/AdminPage.test.tsx +0 -33
- package/tests/components/CodeGenerator.test.tsx +0 -182
- package/tests/components/CommandPalette.test.tsx +0 -428
- package/tests/components/CommunitySection.test.tsx +0 -91
- package/tests/components/ConnectionModal.mobile.test.tsx +0 -284
- package/tests/components/ConnectionModal.test.tsx +0 -570
- package/tests/components/CreateTableModal.test.tsx +0 -383
- package/tests/components/DataCharts.test.tsx +0 -739
- package/tests/components/DataImportModal.test.tsx +0 -751
- package/tests/components/DataProfiler.test.tsx +0 -589
- package/tests/components/DatabaseDocs.test.tsx +0 -353
- package/tests/components/LoginPage.test.tsx +0 -163
- package/tests/components/LoginPageOIDC.test.tsx +0 -92
- package/tests/components/MaskingSettings.test.tsx +0 -498
- package/tests/components/MobileNav.test.tsx +0 -30
- package/tests/components/MonitoringPage.test.tsx +0 -32
- package/tests/components/NL2SQLPanel.test.tsx +0 -621
- package/tests/components/Page.test.tsx +0 -33
- package/tests/components/PivotTable.test.tsx +0 -350
- package/tests/components/QueryEditor.test.tsx +0 -1730
- package/tests/components/QueryHistory.test.tsx +0 -572
- package/tests/components/QuerySafetyDialog.test.tsx +0 -586
- package/tests/components/ResultsGrid.test.tsx +0 -804
- package/tests/components/RootLayout.test.tsx +0 -83
- package/tests/components/SaveQueryModal.test.tsx +0 -25
- package/tests/components/SavedQueries.test.tsx +0 -43
- package/tests/components/SchemaDiagram.test.tsx +0 -1034
- package/tests/components/SchemaDiff.test.tsx +0 -906
- package/tests/components/SnapshotTimeline.test.tsx +0 -174
- package/tests/components/Studio.test.tsx +0 -1030
- package/tests/components/TestDataGenerator.test.tsx +0 -291
- package/tests/components/VisualExplain.test.tsx +0 -704
- package/tests/components/admin/AdminDashboard.test.tsx +0 -205
- package/tests/components/admin/AuditTab.test.tsx +0 -220
- package/tests/components/admin/MonitoringEmbed.test.tsx +0 -58
- package/tests/components/admin/OperationsTab.test.tsx +0 -975
- package/tests/components/admin/OverviewTab.test.tsx +0 -254
- package/tests/components/admin/SecurityTab.test.tsx +0 -467
- package/tests/components/monitoring/MetricChart.test.tsx +0 -111
- package/tests/components/monitoring/MonitoringDashboard.test.tsx +0 -259
- package/tests/components/monitoring/OverviewTab.test.tsx +0 -78
- package/tests/components/monitoring/PerformanceTab.test.tsx +0 -87
- package/tests/components/monitoring/PoolTab.test.tsx +0 -42
- package/tests/components/monitoring/QueriesTab.test.tsx +0 -80
- package/tests/components/monitoring/SessionsTab.test.tsx +0 -154
- package/tests/components/monitoring/StorageTab.test.tsx +0 -127
- package/tests/components/monitoring/TablesTab.test.tsx +0 -153
- package/tests/components/results-grid/ResultCard.test.tsx +0 -105
- package/tests/components/results-grid/RowDetailSheet.test.tsx +0 -308
- package/tests/components/results-grid/StatsBar.test.tsx +0 -162
- package/tests/components/schema-explorer/ColumnList.test.tsx +0 -151
- package/tests/components/schema-explorer/SchemaExplorer.test.tsx +0 -461
- package/tests/components/schema-explorer/TableItem.test.tsx +0 -415
- package/tests/components/sidebar/ConnectionItem.test.tsx +0 -201
- package/tests/components/sidebar/ConnectionsList.test.tsx +0 -176
- package/tests/components/sidebar/Sidebar.test.tsx +0 -187
- package/tests/components/studio/BottomPanel.test.tsx +0 -383
- package/tests/components/studio/QueryToolbar.test.tsx +0 -321
- package/tests/components/studio/StudioDesktopHeader.test.tsx +0 -377
- package/tests/components/studio/StudioMobileHeader.test.tsx +0 -198
- package/tests/components/studio/StudioTabBar.test.tsx +0 -331
- package/tests/fixtures/connections.ts +0 -96
- package/tests/fixtures/masking-configs.ts +0 -86
- package/tests/fixtures/query-results.ts +0 -71
- package/tests/fixtures/schemas.ts +0 -64
- package/tests/fixtures/seed-connections/invalid-config.yaml +0 -7
- package/tests/fixtures/seed-connections/minimal-config.yaml +0 -8
- package/tests/fixtures/seed-connections/mixed-credentials.yaml +0 -23
- package/tests/fixtures/seed-connections/multi-role-config.yaml +0 -30
- package/tests/fixtures/seed-connections/valid-config.json +0 -15
- package/tests/fixtures/seed-connections/valid-config.yaml +0 -51
- package/tests/helpers/mock-fetch.ts +0 -59
- package/tests/helpers/mock-monaco.ts +0 -112
- package/tests/helpers/mock-navigation.ts +0 -28
- package/tests/helpers/mock-next.ts +0 -80
- package/tests/helpers/mock-provider.ts +0 -133
- package/tests/helpers/mock-sonner.ts +0 -29
- package/tests/helpers/render-with-providers.tsx +0 -19
- package/tests/hooks/use-ai-chat.test.ts +0 -600
- package/tests/hooks/use-auth.test.ts +0 -371
- package/tests/hooks/use-connection-form.test.ts +0 -743
- package/tests/hooks/use-connection-manager.test.ts +0 -466
- package/tests/hooks/use-inline-editing.test.ts +0 -321
- package/tests/hooks/use-mobile.test.ts +0 -177
- package/tests/hooks/use-monitoring-data.test.ts +0 -819
- package/tests/hooks/use-provider-metadata.test.ts +0 -228
- package/tests/hooks/use-query-execution.test.ts +0 -1212
- package/tests/hooks/use-tab-manager.test.ts +0 -756
- package/tests/hooks/use-toast.test.ts +0 -74
- package/tests/hooks/use-transaction-control.test.ts +0 -211
- package/tests/integration/db/mongodb-provider.test.ts +0 -698
- package/tests/integration/db/mssql-provider.test.ts +0 -840
- package/tests/integration/db/mysql-provider.test.ts +0 -872
- package/tests/integration/db/oracle-provider.test.ts +0 -843
- package/tests/integration/db/postgres-provider.test.ts +0 -1382
- package/tests/integration/db/redis-provider.test.ts +0 -526
- package/tests/integration/db/sqlite-provider.test.ts +0 -480
- package/tests/integration/seed/seed-pipeline.test.ts +0 -102
- package/tests/isolated/factory-singleton.test.ts +0 -150
- package/tests/isolated/use-storage-sync.test.ts +0 -389
- package/tests/run-components.sh +0 -196
- package/tests/setup-dom.ts +0 -58
- package/tests/setup.ts +0 -40
- package/tests/unit/api-errors.test.ts +0 -210
- package/tests/unit/code-generator-functions.test.ts +0 -271
- package/tests/unit/components/column-list.test.tsx +0 -190
- package/tests/unit/components/data-import-modal.test.tsx +0 -441
- package/tests/unit/components/studio-mobile-header.test.tsx +0 -327
- package/tests/unit/data-charts-functions.test.ts +0 -496
- package/tests/unit/data-import-functions.test.ts +0 -320
- package/tests/unit/data-import-utils.test.ts +0 -125
- package/tests/unit/db/base-provider.test.ts +0 -517
- package/tests/unit/db/errors.test.ts +0 -403
- package/tests/unit/db/factory.test.ts +0 -436
- package/tests/unit/db/pool-manager.test.ts +0 -440
- package/tests/unit/db/query-limiter.test.ts +0 -387
- package/tests/unit/db/sql-base.test.ts +0 -438
- package/tests/unit/lib/api/error-codes.test.ts +0 -39
- package/tests/unit/lib/audit.test.ts +0 -326
- package/tests/unit/lib/auth.test.ts +0 -146
- package/tests/unit/lib/connection-string-parser.test.ts +0 -424
- package/tests/unit/lib/data-masking.test.ts +0 -583
- package/tests/unit/lib/db-icons.test.tsx +0 -41
- package/tests/unit/lib/monitoring-thresholds.test.ts +0 -133
- package/tests/unit/lib/oidc.test.ts +0 -509
- package/tests/unit/lib/query-generators.test.ts +0 -127
- package/tests/unit/lib/storage/factory.test.ts +0 -71
- package/tests/unit/lib/storage/local-storage.test.ts +0 -114
- package/tests/unit/lib/storage/providers/postgres.test.ts +0 -312
- package/tests/unit/lib/storage/providers/sqlite.test.ts +0 -232
- package/tests/unit/lib/storage/storage-facade-extended.test.ts +0 -331
- package/tests/unit/lib/storage/storage-facade.test.ts +0 -184
- package/tests/unit/lib/storage.test.ts +0 -317
- package/tests/unit/lib/time-series-buffer.test.ts +0 -212
- package/tests/unit/lib/utils.test.ts +0 -24
- package/tests/unit/llm/base-provider.test.ts +0 -238
- package/tests/unit/llm/config.test.ts +0 -262
- package/tests/unit/llm/custom-provider.test.ts +0 -281
- package/tests/unit/llm/gemini-provider.test.ts +0 -248
- package/tests/unit/llm/llm-factory.test.ts +0 -155
- package/tests/unit/llm/ollama-provider.test.ts +0 -288
- package/tests/unit/llm/openai-provider.test.ts +0 -324
- package/tests/unit/llm/retry.test.ts +0 -180
- package/tests/unit/llm/streaming.test.ts +0 -355
- package/tests/unit/logger.test.ts +0 -198
- package/tests/unit/mongodb-completions.test.ts +0 -516
- package/tests/unit/pivot-table-functions.test.ts +0 -76
- package/tests/unit/query-cancelled-error.test.ts +0 -81
- package/tests/unit/schema-diff/diff-engine.test.ts +0 -367
- package/tests/unit/schema-diff/migration-generator.test.ts +0 -513
- package/tests/unit/seed/config-loader.test.ts +0 -73
- package/tests/unit/seed/connection-filter.test.ts +0 -91
- package/tests/unit/seed/credential-resolver.test.ts +0 -85
- package/tests/unit/seed/index.test.ts +0 -72
- package/tests/unit/seed/resolve-connection.test.ts +0 -74
- package/tests/unit/seed/types.test.ts +0 -129
- package/tests/unit/sql/alias-extractor.test.ts +0 -444
- package/tests/unit/sql/statement-splitter.test.ts +0 -348
- package/tests/unit/sql-completions.test.ts +0 -463
- package/tests/unit/ssh-tunnel.test.ts +0 -465
- package/tsconfig.json +0 -42
|
@@ -1,256 +1,189 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
type TableSchema,
|
|
11
|
-
type QueryResult,
|
|
12
|
-
type HealthInfo,
|
|
13
|
-
type MaintenanceType,
|
|
14
|
-
type MaintenanceResult,
|
|
15
|
-
type ProviderOptions,
|
|
16
|
-
type ProviderCapabilities,
|
|
17
|
-
type SlowQuery,
|
|
18
|
-
type ActiveSession,
|
|
19
|
-
type DatabaseOverview,
|
|
20
|
-
type PerformanceMetrics,
|
|
21
|
-
type SlowQueryStats,
|
|
22
|
-
type ActiveSessionDetails,
|
|
23
|
-
type TableStats,
|
|
24
|
-
type IndexStats,
|
|
25
|
-
type StorageStats,
|
|
26
|
-
} from '../../types';
|
|
27
|
-
import {
|
|
28
|
-
DatabaseConfigError,
|
|
29
|
-
ConnectionError,
|
|
30
|
-
QueryError,
|
|
31
|
-
mapDatabaseError,
|
|
32
|
-
} from '../../errors';
|
|
33
|
-
import { formatBytes } from '../../utils/pool-manager';
|
|
34
|
-
|
|
35
|
-
// ============================================================================
|
|
36
|
-
// MySQL Provider
|
|
37
|
-
// ============================================================================
|
|
38
|
-
|
|
39
|
-
export class MySQLProvider extends SQLBaseProvider {
|
|
40
|
-
private pool: Pool | null = null;
|
|
41
|
-
|
|
42
|
-
// Transaction support: dedicated connection held outside pool
|
|
43
|
-
private txConn: PoolConnection | null = null;
|
|
44
|
-
private txActive = false;
|
|
45
|
-
private txTimeout: ReturnType<typeof setTimeout> | null = null;
|
|
46
|
-
private static readonly TX_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
|
|
47
|
-
|
|
48
|
-
constructor(config: DatabaseConnection, options: ProviderOptions = {}) {
|
|
1
|
+
import { SQLBaseProvider } from './chunk-R3POCJK6.mjs';
|
|
2
|
+
import { formatBytes } from './chunk-QJP5FZRY.mjs';
|
|
3
|
+
import { DatabaseConfigError, ConnectionError, mapDatabaseError, QueryError } from './chunk-CZVV3JJB.mjs';
|
|
4
|
+
import { __spreadProps, __spreadValues } from './chunk-4LVB3K53.mjs';
|
|
5
|
+
import mysql from 'mysql2/promise';
|
|
6
|
+
|
|
7
|
+
var _MySQLProvider = class _MySQLProvider extends SQLBaseProvider {
|
|
8
|
+
// 5 minutes
|
|
9
|
+
constructor(config, options = {}) {
|
|
49
10
|
super(config, options);
|
|
11
|
+
this.pool = null;
|
|
12
|
+
// Transaction support: dedicated connection held outside pool
|
|
13
|
+
this.txConn = null;
|
|
14
|
+
this.txActive = false;
|
|
15
|
+
this.txTimeout = null;
|
|
16
|
+
// Track running query thread IDs for cancellation
|
|
17
|
+
this.runningQueryThreadIds = /* @__PURE__ */ new Map();
|
|
50
18
|
this.validate();
|
|
51
19
|
}
|
|
52
|
-
|
|
53
20
|
// ============================================================================
|
|
54
21
|
// Provider Metadata
|
|
55
22
|
// ============================================================================
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return {
|
|
59
|
-
...super.getCapabilities(),
|
|
23
|
+
getCapabilities() {
|
|
24
|
+
return __spreadProps(__spreadValues({}, super.getCapabilities()), {
|
|
60
25
|
defaultPort: 3306,
|
|
61
26
|
supportsExplain: true,
|
|
62
27
|
supportsConnectionString: true,
|
|
63
|
-
maintenanceOperations: [
|
|
64
|
-
};
|
|
28
|
+
maintenanceOperations: ["analyze", "optimize", "check", "kill"]
|
|
29
|
+
});
|
|
65
30
|
}
|
|
66
|
-
|
|
67
31
|
// ============================================================================
|
|
68
32
|
// Validation
|
|
69
33
|
// ============================================================================
|
|
70
|
-
|
|
71
|
-
public validate(): void {
|
|
34
|
+
validate() {
|
|
72
35
|
super.validate();
|
|
73
|
-
|
|
74
36
|
if (!this.config.connectionString) {
|
|
75
37
|
if (!this.config.host) {
|
|
76
|
-
throw new DatabaseConfigError(
|
|
38
|
+
throw new DatabaseConfigError("Host is required for MySQL", "mysql");
|
|
77
39
|
}
|
|
78
40
|
if (!this.config.database) {
|
|
79
|
-
throw new DatabaseConfigError(
|
|
41
|
+
throw new DatabaseConfigError("Database name is required for MySQL", "mysql");
|
|
80
42
|
}
|
|
81
43
|
}
|
|
82
44
|
}
|
|
83
|
-
|
|
84
45
|
// ============================================================================
|
|
85
46
|
// Connection Management
|
|
86
47
|
// ============================================================================
|
|
87
|
-
|
|
88
|
-
public async connect(): Promise<void> {
|
|
48
|
+
async connect() {
|
|
89
49
|
if (this.pool) {
|
|
90
50
|
return;
|
|
91
51
|
}
|
|
92
|
-
|
|
93
52
|
try {
|
|
94
53
|
this.pool = mysql.createPool(this.buildPoolConfig());
|
|
95
|
-
|
|
96
54
|
const conn = await this.pool.getConnection();
|
|
97
55
|
conn.release();
|
|
98
|
-
|
|
99
56
|
this.setConnected(true);
|
|
100
57
|
} catch (error) {
|
|
101
58
|
this.setError(error instanceof Error ? error : new Error(String(error)));
|
|
102
59
|
throw new ConnectionError(
|
|
103
60
|
`Failed to connect to MySQL: ${error instanceof Error ? error.message : error}`,
|
|
104
|
-
|
|
61
|
+
"mysql",
|
|
105
62
|
this.config.host,
|
|
106
63
|
this.config.port
|
|
107
64
|
);
|
|
108
65
|
}
|
|
109
66
|
}
|
|
110
|
-
|
|
111
|
-
public async disconnect(): Promise<void> {
|
|
67
|
+
async disconnect() {
|
|
112
68
|
if (this.pool) {
|
|
113
69
|
await this.pool.end();
|
|
114
70
|
this.pool = null;
|
|
115
71
|
this.setConnected(false);
|
|
116
72
|
}
|
|
117
73
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
const baseConfig
|
|
74
|
+
buildPoolConfig() {
|
|
75
|
+
var _a, _b;
|
|
76
|
+
const baseConfig = {
|
|
121
77
|
connectionLimit: this.poolConfig.max,
|
|
122
78
|
waitForConnections: true,
|
|
123
79
|
queueLimit: 0,
|
|
124
80
|
enableKeepAlive: true,
|
|
125
|
-
keepAliveInitialDelay:
|
|
81
|
+
keepAliveInitialDelay: 1e4
|
|
126
82
|
};
|
|
127
|
-
|
|
128
83
|
if (this.config.connectionString) {
|
|
129
|
-
return {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
};
|
|
84
|
+
return __spreadProps(__spreadValues({}, baseConfig), {
|
|
85
|
+
uri: this.config.connectionString
|
|
86
|
+
});
|
|
133
87
|
}
|
|
134
|
-
|
|
135
|
-
return {
|
|
136
|
-
...baseConfig,
|
|
88
|
+
return __spreadProps(__spreadValues({}, baseConfig), {
|
|
137
89
|
host: this.config.host,
|
|
138
|
-
port: this.config.port
|
|
90
|
+
port: (_a = this.config.port) != null ? _a : 3306,
|
|
139
91
|
user: this.config.user,
|
|
140
92
|
password: this.config.password,
|
|
141
93
|
database: this.config.database,
|
|
142
94
|
ssl: this.buildSSLConfig(),
|
|
143
|
-
timezone: this.options.timezone
|
|
144
|
-
};
|
|
95
|
+
timezone: (_b = this.options.timezone) != null ? _b : "Z"
|
|
96
|
+
});
|
|
145
97
|
}
|
|
146
|
-
|
|
147
|
-
private buildSSLConfig(): mysql.SslOptions | undefined {
|
|
98
|
+
buildSSLConfig() {
|
|
148
99
|
const connSSL = this.config.ssl;
|
|
149
|
-
|
|
150
100
|
if (connSSL) {
|
|
151
|
-
if (connSSL.mode ===
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
rejectUnauthorized: connSSL.mode === 'verify-ca' || connSSL.mode === 'verify-full',
|
|
101
|
+
if (connSSL.mode === "disable") return void 0;
|
|
102
|
+
const ssl = {
|
|
103
|
+
rejectUnauthorized: connSSL.mode === "verify-ca" || connSSL.mode === "verify-full"
|
|
155
104
|
};
|
|
156
|
-
|
|
157
105
|
if (connSSL.caCert) ssl.ca = connSSL.caCert;
|
|
158
106
|
if (connSSL.clientCert) ssl.cert = connSSL.clientCert;
|
|
159
107
|
if (connSSL.clientKey) ssl.key = connSSL.clientKey;
|
|
160
|
-
|
|
161
108
|
return ssl;
|
|
162
109
|
}
|
|
163
|
-
|
|
164
110
|
if (this.shouldEnableSSL()) {
|
|
165
111
|
return { rejectUnauthorized: false };
|
|
166
112
|
}
|
|
167
|
-
|
|
168
|
-
return undefined;
|
|
113
|
+
return void 0;
|
|
169
114
|
}
|
|
170
|
-
|
|
171
115
|
// ============================================================================
|
|
172
116
|
// Query Execution
|
|
173
117
|
// ============================================================================
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
const sanitized: Record<string, unknown> = {};
|
|
118
|
+
sanitizeRow(row) {
|
|
119
|
+
const sanitized = {};
|
|
177
120
|
for (const [key, value] of Object.entries(row)) {
|
|
178
121
|
if (Buffer.isBuffer(value)) {
|
|
179
|
-
sanitized[key] = value.length === 0 ?
|
|
122
|
+
sanitized[key] = value.length === 0 ? "" : `0x${value.toString("hex")}`;
|
|
180
123
|
} else {
|
|
181
124
|
sanitized[key] = value;
|
|
182
125
|
}
|
|
183
126
|
}
|
|
184
127
|
return sanitized;
|
|
185
128
|
}
|
|
186
|
-
|
|
187
|
-
// Track running query thread IDs for cancellation
|
|
188
|
-
private runningQueryThreadIds = new Map<string, number>();
|
|
189
|
-
|
|
190
|
-
public async query(sql: string, params?: unknown[], queryId?: string): Promise<QueryResult> {
|
|
129
|
+
async query(sql, params, queryId) {
|
|
191
130
|
this.ensureConnected();
|
|
192
|
-
|
|
193
131
|
return this.trackQuery(async () => {
|
|
132
|
+
var _a, _b;
|
|
194
133
|
const { result, executionTime } = await this.measureExecution(async () => {
|
|
195
|
-
const conn = await this.pool
|
|
134
|
+
const conn = await this.pool.getConnection();
|
|
196
135
|
try {
|
|
197
|
-
// Track thread ID for cancellation support
|
|
198
136
|
if (queryId) {
|
|
199
137
|
this.runningQueryThreadIds.set(queryId, conn.threadId);
|
|
200
138
|
}
|
|
201
|
-
const [rows, fields] = await conn.execute
|
|
139
|
+
const [rows, fields] = await conn.execute(sql, params);
|
|
202
140
|
return { rows, fields };
|
|
203
141
|
} catch (error) {
|
|
204
|
-
throw mapDatabaseError(error,
|
|
142
|
+
throw mapDatabaseError(error, "mysql", sql);
|
|
205
143
|
} finally {
|
|
206
144
|
if (queryId) this.runningQueryThreadIds.delete(queryId);
|
|
207
145
|
conn.release();
|
|
208
146
|
}
|
|
209
147
|
});
|
|
210
|
-
|
|
211
148
|
return {
|
|
212
|
-
rows:
|
|
213
|
-
fields: result.fields
|
|
149
|
+
rows: result.rows.map((row) => this.sanitizeRow(row)),
|
|
150
|
+
fields: (_b = (_a = result.fields) == null ? void 0 : _a.map((f) => f.name)) != null ? _b : [],
|
|
214
151
|
rowCount: Array.isArray(result.rows) ? result.rows.length : 0,
|
|
215
|
-
executionTime
|
|
152
|
+
executionTime
|
|
216
153
|
};
|
|
217
154
|
});
|
|
218
155
|
}
|
|
219
|
-
|
|
220
|
-
public async cancelQuery(queryId: string): Promise<boolean> {
|
|
156
|
+
async cancelQuery(queryId) {
|
|
221
157
|
const threadId = this.runningQueryThreadIds.get(queryId);
|
|
222
158
|
if (!threadId) return false;
|
|
223
|
-
|
|
224
159
|
try {
|
|
225
|
-
await this.pool
|
|
160
|
+
await this.pool.execute(`KILL QUERY ${threadId}`);
|
|
226
161
|
return true;
|
|
227
162
|
} catch (error) {
|
|
228
|
-
console.error(
|
|
163
|
+
console.error("[MySQL] Failed to cancel query:", error);
|
|
229
164
|
return false;
|
|
230
165
|
}
|
|
231
166
|
}
|
|
232
|
-
|
|
233
167
|
// ============================================================================
|
|
234
168
|
// Transaction Support
|
|
235
169
|
// ============================================================================
|
|
236
|
-
|
|
237
|
-
private clearTxTimeout(): void {
|
|
170
|
+
clearTxTimeout() {
|
|
238
171
|
if (this.txTimeout) {
|
|
239
172
|
clearTimeout(this.txTimeout);
|
|
240
173
|
this.txTimeout = null;
|
|
241
174
|
}
|
|
242
175
|
}
|
|
243
|
-
|
|
244
176
|
/**
|
|
245
177
|
* Force-expire an active transaction (auto-rollback).
|
|
246
178
|
* Called by the timeout timer, but also available for testing.
|
|
247
179
|
*/
|
|
248
|
-
|
|
180
|
+
async expireTransaction() {
|
|
249
181
|
if (this.txActive && this.txConn) {
|
|
250
|
-
console.warn(
|
|
182
|
+
console.warn("[MySQL] Transaction timed out, auto-rolling back");
|
|
251
183
|
try {
|
|
252
184
|
await this.txConn.rollback();
|
|
253
|
-
} catch
|
|
185
|
+
} catch (e) {
|
|
186
|
+
} finally {
|
|
254
187
|
this.txConn.release();
|
|
255
188
|
this.txConn = null;
|
|
256
189
|
this.txActive = false;
|
|
@@ -258,20 +191,18 @@ export class MySQLProvider extends SQLBaseProvider {
|
|
|
258
191
|
}
|
|
259
192
|
}
|
|
260
193
|
}
|
|
261
|
-
|
|
262
|
-
public async beginTransaction(): Promise<void> {
|
|
194
|
+
async beginTransaction() {
|
|
263
195
|
this.ensureConnected();
|
|
264
|
-
if (this.txActive) throw new QueryError(
|
|
265
|
-
this.txConn = await this.pool
|
|
196
|
+
if (this.txActive) throw new QueryError("Transaction already active", "mysql");
|
|
197
|
+
this.txConn = await this.pool.getConnection();
|
|
266
198
|
await this.txConn.beginTransaction();
|
|
267
199
|
this.txActive = true;
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
200
|
+
this.txTimeout = setTimeout(() => {
|
|
201
|
+
this.expireTransaction();
|
|
202
|
+
}, _MySQLProvider.TX_TIMEOUT_MS);
|
|
271
203
|
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
if (!this.txConn || !this.txActive) throw new QueryError('No active transaction', 'mysql');
|
|
204
|
+
async commitTransaction() {
|
|
205
|
+
if (!this.txConn || !this.txActive) throw new QueryError("No active transaction", "mysql");
|
|
275
206
|
this.clearTxTimeout();
|
|
276
207
|
try {
|
|
277
208
|
await this.txConn.commit();
|
|
@@ -281,9 +212,8 @@ export class MySQLProvider extends SQLBaseProvider {
|
|
|
281
212
|
this.txActive = false;
|
|
282
213
|
}
|
|
283
214
|
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
if (!this.txConn || !this.txActive) throw new QueryError('No active transaction', 'mysql');
|
|
215
|
+
async rollbackTransaction() {
|
|
216
|
+
if (!this.txConn || !this.txActive) throw new QueryError("No active transaction", "mysql");
|
|
287
217
|
this.clearTxTimeout();
|
|
288
218
|
try {
|
|
289
219
|
await this.txConn.rollback();
|
|
@@ -293,43 +223,37 @@ export class MySQLProvider extends SQLBaseProvider {
|
|
|
293
223
|
this.txActive = false;
|
|
294
224
|
}
|
|
295
225
|
}
|
|
296
|
-
|
|
297
|
-
public isInTransaction(): boolean {
|
|
226
|
+
isInTransaction() {
|
|
298
227
|
return this.txActive;
|
|
299
228
|
}
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
if (!this.txConn || !this.txActive) throw new QueryError('No active transaction', 'mysql');
|
|
303
|
-
|
|
229
|
+
async queryInTransaction(sql, params) {
|
|
230
|
+
if (!this.txConn || !this.txActive) throw new QueryError("No active transaction", "mysql");
|
|
304
231
|
return this.trackQuery(async () => {
|
|
232
|
+
var _a, _b;
|
|
305
233
|
const { result, executionTime } = await this.measureExecution(async () => {
|
|
306
234
|
try {
|
|
307
|
-
const [rows, fields] = await this.txConn
|
|
235
|
+
const [rows, fields] = await this.txConn.execute(sql, params);
|
|
308
236
|
return { rows, fields };
|
|
309
237
|
} catch (error) {
|
|
310
|
-
throw mapDatabaseError(error,
|
|
238
|
+
throw mapDatabaseError(error, "mysql", sql);
|
|
311
239
|
}
|
|
312
240
|
});
|
|
313
|
-
|
|
314
241
|
return {
|
|
315
|
-
rows:
|
|
316
|
-
fields: result.fields
|
|
242
|
+
rows: result.rows.map((row) => this.sanitizeRow(row)),
|
|
243
|
+
fields: (_b = (_a = result.fields) == null ? void 0 : _a.map((f) => f.name)) != null ? _b : [],
|
|
317
244
|
rowCount: Array.isArray(result.rows) ? result.rows.length : 0,
|
|
318
|
-
executionTime
|
|
245
|
+
executionTime
|
|
319
246
|
};
|
|
320
247
|
});
|
|
321
248
|
}
|
|
322
|
-
|
|
323
249
|
// ============================================================================
|
|
324
250
|
// Schema Operations
|
|
325
251
|
// ============================================================================
|
|
326
|
-
|
|
327
|
-
public async getSchema(): Promise<TableSchema[]> {
|
|
252
|
+
async getSchema() {
|
|
328
253
|
this.ensureConnected();
|
|
329
|
-
|
|
330
|
-
const conn = await this.pool!.getConnection();
|
|
254
|
+
const conn = await this.pool.getConnection();
|
|
331
255
|
try {
|
|
332
|
-
const [tablesRows] = await conn.execute
|
|
256
|
+
const [tablesRows] = await conn.execute(`
|
|
333
257
|
SELECT
|
|
334
258
|
TABLE_NAME as table_name,
|
|
335
259
|
TABLE_ROWS as row_count,
|
|
@@ -339,15 +263,12 @@ export class MySQLProvider extends SQLBaseProvider {
|
|
|
339
263
|
AND TABLE_TYPE = 'BASE TABLE'
|
|
340
264
|
ORDER BY TABLE_NAME ASC;
|
|
341
265
|
`, [this.config.database]);
|
|
342
|
-
|
|
343
|
-
const schemas: TableSchema[] = [];
|
|
344
|
-
|
|
266
|
+
const schemas = [];
|
|
345
267
|
for (const row of tablesRows) {
|
|
346
268
|
const tableName = row.table_name;
|
|
347
|
-
const rowCount = parseInt(row.row_count ||
|
|
348
|
-
const sizeBytes = parseInt(row.total_size ||
|
|
349
|
-
|
|
350
|
-
const [columnsRows] = await conn.execute<RowDataPacket[]>(`
|
|
269
|
+
const rowCount = parseInt(row.row_count || "0");
|
|
270
|
+
const sizeBytes = parseInt(row.total_size || "0");
|
|
271
|
+
const [columnsRows] = await conn.execute(`
|
|
351
272
|
SELECT
|
|
352
273
|
COLUMN_NAME as column_name,
|
|
353
274
|
DATA_TYPE as data_type,
|
|
@@ -360,8 +281,7 @@ export class MySQLProvider extends SQLBaseProvider {
|
|
|
360
281
|
ORDER BY ORDINAL_POSITION
|
|
361
282
|
LIMIT 100;
|
|
362
283
|
`, [this.config.database, tableName]);
|
|
363
|
-
|
|
364
|
-
const [fkRows] = await conn.execute<RowDataPacket[]>(`
|
|
284
|
+
const [fkRows] = await conn.execute(`
|
|
365
285
|
SELECT
|
|
366
286
|
COLUMN_NAME as column_name,
|
|
367
287
|
REFERENCED_TABLE_NAME as referenced_table,
|
|
@@ -371,8 +291,7 @@ export class MySQLProvider extends SQLBaseProvider {
|
|
|
371
291
|
AND TABLE_NAME = ?
|
|
372
292
|
AND REFERENCED_TABLE_NAME IS NOT NULL;
|
|
373
293
|
`, [this.config.database, tableName]);
|
|
374
|
-
|
|
375
|
-
const [indexRows] = await conn.execute<RowDataPacket[]>(`
|
|
294
|
+
const [indexRows] = await conn.execute(`
|
|
376
295
|
SELECT
|
|
377
296
|
INDEX_NAME as index_name,
|
|
378
297
|
GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) as columns,
|
|
@@ -382,71 +301,70 @@ export class MySQLProvider extends SQLBaseProvider {
|
|
|
382
301
|
AND TABLE_NAME = ?
|
|
383
302
|
GROUP BY INDEX_NAME, NON_UNIQUE;
|
|
384
303
|
`, [this.config.database, tableName]);
|
|
385
|
-
|
|
386
304
|
schemas.push({
|
|
387
305
|
name: tableName,
|
|
388
306
|
rowCount,
|
|
389
307
|
size: formatBytes(sizeBytes),
|
|
390
|
-
columns: columnsRows.map((col) =>
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
308
|
+
columns: columnsRows.map((col) => {
|
|
309
|
+
var _a;
|
|
310
|
+
return {
|
|
311
|
+
name: col.column_name,
|
|
312
|
+
type: col.data_type,
|
|
313
|
+
nullable: col.is_nullable === "YES",
|
|
314
|
+
isPrimary: col.column_key === "PRI",
|
|
315
|
+
defaultValue: (_a = col.column_default) != null ? _a : void 0
|
|
316
|
+
};
|
|
317
|
+
}),
|
|
318
|
+
indexes: indexRows.map((idx) => {
|
|
319
|
+
var _a, _b;
|
|
320
|
+
return {
|
|
321
|
+
name: idx.index_name,
|
|
322
|
+
columns: (_b = (_a = idx.columns) == null ? void 0 : _a.split(",")) != null ? _b : [],
|
|
323
|
+
unique: Boolean(idx.is_unique)
|
|
324
|
+
};
|
|
325
|
+
}),
|
|
402
326
|
foreignKeys: fkRows.map((fk) => ({
|
|
403
327
|
columnName: fk.column_name,
|
|
404
328
|
referencedTable: fk.referenced_table,
|
|
405
|
-
referencedColumn: fk.referenced_column
|
|
406
|
-
}))
|
|
329
|
+
referencedColumn: fk.referenced_column
|
|
330
|
+
}))
|
|
407
331
|
});
|
|
408
332
|
}
|
|
409
|
-
|
|
410
333
|
return schemas;
|
|
411
334
|
} finally {
|
|
412
335
|
conn.release();
|
|
413
336
|
}
|
|
414
337
|
}
|
|
415
|
-
|
|
416
338
|
// ============================================================================
|
|
417
339
|
// Health & Monitoring
|
|
418
340
|
// ============================================================================
|
|
419
|
-
|
|
420
|
-
|
|
341
|
+
async getHealth() {
|
|
342
|
+
var _a, _b, _c;
|
|
421
343
|
this.ensureConnected();
|
|
422
|
-
|
|
423
|
-
const conn = await this.pool!.getConnection();
|
|
344
|
+
const conn = await this.pool.getConnection();
|
|
424
345
|
try {
|
|
425
|
-
const [connRows] = await conn.execute
|
|
346
|
+
const [connRows] = await conn.execute(
|
|
426
347
|
"SHOW STATUS LIKE 'Threads_connected'"
|
|
427
348
|
);
|
|
428
|
-
const activeConnections = parseInt(connRows[0]
|
|
429
|
-
|
|
430
|
-
const [sizeRows] = await conn.execute<RowDataPacket[]>(`
|
|
349
|
+
const activeConnections = parseInt(((_a = connRows[0]) == null ? void 0 : _a.Value) || "0");
|
|
350
|
+
const [sizeRows] = await conn.execute(`
|
|
431
351
|
SELECT
|
|
432
352
|
ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) as size_mb
|
|
433
353
|
FROM information_schema.TABLES
|
|
434
354
|
WHERE TABLE_SCHEMA = ?;
|
|
435
355
|
`, [this.config.database]);
|
|
436
|
-
const databaseSize = `${sizeRows[0]
|
|
437
|
-
|
|
438
|
-
const [hitRows] = await conn.execute<RowDataPacket[]>(`
|
|
356
|
+
const databaseSize = `${((_b = sizeRows[0]) == null ? void 0 : _b.size_mb) || 0} MB`;
|
|
357
|
+
const [hitRows] = await conn.execute(`
|
|
439
358
|
SELECT
|
|
440
359
|
(1 - (
|
|
441
360
|
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads') /
|
|
442
361
|
NULLIF((SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests'), 0)
|
|
443
362
|
)) * 100 as hit_ratio;
|
|
444
363
|
`);
|
|
445
|
-
const cacheHitRatio = `${(hitRows[0]
|
|
446
|
-
|
|
447
|
-
let slowQueries: SlowQuery[] = [];
|
|
364
|
+
const cacheHitRatio = `${(((_c = hitRows[0]) == null ? void 0 : _c.hit_ratio) || 99).toFixed(1)}%`;
|
|
365
|
+
let slowQueries = [];
|
|
448
366
|
try {
|
|
449
|
-
const [slowRows] = await conn.execute
|
|
367
|
+
const [slowRows] = await conn.execute(`
|
|
450
368
|
SELECT
|
|
451
369
|
LEFT(sql_text, 100) as query,
|
|
452
370
|
count_star as calls,
|
|
@@ -457,15 +375,14 @@ export class MySQLProvider extends SQLBaseProvider {
|
|
|
457
375
|
LIMIT 5;
|
|
458
376
|
`, [this.config.database]);
|
|
459
377
|
slowQueries = slowRows.map((r) => ({
|
|
460
|
-
query: r.query ||
|
|
461
|
-
calls: parseInt(r.calls ||
|
|
462
|
-
avgTime: r.avgTime ||
|
|
378
|
+
query: r.query || "",
|
|
379
|
+
calls: parseInt(r.calls || "0"),
|
|
380
|
+
avgTime: r.avgTime || "N/A"
|
|
463
381
|
}));
|
|
464
|
-
} catch {
|
|
465
|
-
slowQueries = [{ query:
|
|
382
|
+
} catch (e) {
|
|
383
|
+
slowQueries = [{ query: "Performance schema not available", calls: 0, avgTime: "N/A" }];
|
|
466
384
|
}
|
|
467
|
-
|
|
468
|
-
const [sessionRows] = await conn.execute<RowDataPacket[]>(`
|
|
385
|
+
const [sessionRows] = await conn.execute(`
|
|
469
386
|
SELECT
|
|
470
387
|
ID as pid,
|
|
471
388
|
USER as user,
|
|
@@ -478,236 +395,191 @@ export class MySQLProvider extends SQLBaseProvider {
|
|
|
478
395
|
ORDER BY TIME DESC
|
|
479
396
|
LIMIT 10;
|
|
480
397
|
`, [this.config.database]);
|
|
481
|
-
|
|
482
|
-
const activeSessions: ActiveSession[] = sessionRows.map((r) => ({
|
|
398
|
+
const activeSessions = sessionRows.map((r) => ({
|
|
483
399
|
pid: r.pid,
|
|
484
|
-
user: r.user ||
|
|
485
|
-
database: r.database ||
|
|
486
|
-
state: r.state ||
|
|
487
|
-
query: r.query ||
|
|
488
|
-
duration: r.duration ||
|
|
400
|
+
user: r.user || "unknown",
|
|
401
|
+
database: r.database || "",
|
|
402
|
+
state: r.state || "unknown",
|
|
403
|
+
query: r.query || "",
|
|
404
|
+
duration: r.duration || "N/A"
|
|
489
405
|
}));
|
|
490
|
-
|
|
491
406
|
return {
|
|
492
407
|
activeConnections,
|
|
493
408
|
databaseSize,
|
|
494
409
|
cacheHitRatio,
|
|
495
410
|
slowQueries,
|
|
496
|
-
activeSessions
|
|
411
|
+
activeSessions
|
|
497
412
|
};
|
|
498
413
|
} finally {
|
|
499
414
|
conn.release();
|
|
500
415
|
}
|
|
501
416
|
}
|
|
502
|
-
|
|
503
417
|
// ============================================================================
|
|
504
418
|
// Maintenance Operations
|
|
505
419
|
// ============================================================================
|
|
506
|
-
|
|
507
|
-
public async runMaintenance(
|
|
508
|
-
type: MaintenanceType,
|
|
509
|
-
target?: string
|
|
510
|
-
): Promise<MaintenanceResult> {
|
|
420
|
+
async runMaintenance(type, target) {
|
|
511
421
|
this.ensureConnected();
|
|
512
|
-
|
|
513
422
|
const { result, executionTime } = await this.measureExecution(async () => {
|
|
514
|
-
const conn = await this.pool
|
|
423
|
+
const conn = await this.pool.getConnection();
|
|
515
424
|
try {
|
|
516
|
-
let sql =
|
|
517
|
-
|
|
425
|
+
let sql = "";
|
|
518
426
|
switch (type) {
|
|
519
|
-
case
|
|
520
|
-
sql = target
|
|
521
|
-
? `ANALYZE TABLE ${this.escapeIdentifier(target)}`
|
|
522
|
-
: `ANALYZE TABLE ${await this.getAllTablesForMaintenance(conn)}`;
|
|
427
|
+
case "analyze":
|
|
428
|
+
sql = target ? `ANALYZE TABLE ${this.escapeIdentifier(target)}` : `ANALYZE TABLE ${await this.getAllTablesForMaintenance(conn)}`;
|
|
523
429
|
break;
|
|
524
|
-
case
|
|
525
|
-
sql = target
|
|
526
|
-
? `OPTIMIZE TABLE ${this.escapeIdentifier(target)}`
|
|
527
|
-
: `OPTIMIZE TABLE ${await this.getAllTablesForMaintenance(conn)}`;
|
|
430
|
+
case "optimize":
|
|
431
|
+
sql = target ? `OPTIMIZE TABLE ${this.escapeIdentifier(target)}` : `OPTIMIZE TABLE ${await this.getAllTablesForMaintenance(conn)}`;
|
|
528
432
|
break;
|
|
529
|
-
case
|
|
530
|
-
sql = target
|
|
531
|
-
? `CHECK TABLE ${this.escapeIdentifier(target)}`
|
|
532
|
-
: `CHECK TABLE ${await this.getAllTablesForMaintenance(conn)}`;
|
|
433
|
+
case "check":
|
|
434
|
+
sql = target ? `CHECK TABLE ${this.escapeIdentifier(target)}` : `CHECK TABLE ${await this.getAllTablesForMaintenance(conn)}`;
|
|
533
435
|
break;
|
|
534
|
-
case
|
|
436
|
+
case "kill":
|
|
535
437
|
if (!target) {
|
|
536
|
-
throw new QueryError(
|
|
438
|
+
throw new QueryError("Target connection ID is required for kill operation", "mysql");
|
|
537
439
|
}
|
|
538
440
|
const connId = parseInt(target, 10);
|
|
539
441
|
if (isNaN(connId)) {
|
|
540
|
-
throw new QueryError(
|
|
442
|
+
throw new QueryError("Invalid connection ID for kill operation", "mysql");
|
|
541
443
|
}
|
|
542
444
|
sql = `KILL ${connId}`;
|
|
543
445
|
break;
|
|
544
446
|
default:
|
|
545
|
-
throw new QueryError(`Unsupported maintenance type for MySQL: ${type}`,
|
|
447
|
+
throw new QueryError(`Unsupported maintenance type for MySQL: ${type}`, "mysql");
|
|
546
448
|
}
|
|
547
|
-
|
|
548
449
|
await conn.execute(sql);
|
|
549
450
|
return { success: true };
|
|
550
451
|
} finally {
|
|
551
452
|
conn.release();
|
|
552
453
|
}
|
|
553
454
|
});
|
|
554
|
-
|
|
555
455
|
return {
|
|
556
456
|
success: result.success,
|
|
557
457
|
executionTime,
|
|
558
|
-
message: `${type.toUpperCase()} completed successfully
|
|
458
|
+
message: `${type.toUpperCase()} completed successfully`
|
|
559
459
|
};
|
|
560
460
|
}
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
const [rows] = await conn.execute<RowDataPacket[]>(`
|
|
461
|
+
async getAllTablesForMaintenance(conn) {
|
|
462
|
+
const [rows] = await conn.execute(`
|
|
564
463
|
SELECT TABLE_NAME
|
|
565
464
|
FROM information_schema.TABLES
|
|
566
465
|
WHERE TABLE_SCHEMA = ?
|
|
567
466
|
AND TABLE_TYPE = 'BASE TABLE'
|
|
568
467
|
LIMIT 50;
|
|
569
468
|
`, [this.config.database]);
|
|
570
|
-
|
|
571
|
-
return rows.map((r) => this.escapeIdentifier(r.TABLE_NAME)).join(', ');
|
|
469
|
+
return rows.map((r) => this.escapeIdentifier(r.TABLE_NAME)).join(", ");
|
|
572
470
|
}
|
|
573
|
-
|
|
574
471
|
// ============================================================================
|
|
575
472
|
// Monitoring Operations
|
|
576
473
|
// ============================================================================
|
|
577
|
-
|
|
578
|
-
|
|
474
|
+
async getOverview() {
|
|
475
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
579
476
|
this.ensureConnected();
|
|
580
|
-
|
|
581
|
-
const conn = await this.pool!.getConnection();
|
|
477
|
+
const conn = await this.pool.getConnection();
|
|
582
478
|
try {
|
|
583
|
-
|
|
584
|
-
const
|
|
585
|
-
const
|
|
586
|
-
|
|
587
|
-
// Get uptime
|
|
588
|
-
const [uptimeRows] = await conn.execute<RowDataPacket[]>(
|
|
479
|
+
const [versionRows] = await conn.execute("SELECT VERSION() as version");
|
|
480
|
+
const version = ((_a = versionRows[0]) == null ? void 0 : _a.version) || "Unknown";
|
|
481
|
+
const [uptimeRows] = await conn.execute(
|
|
589
482
|
"SHOW STATUS LIKE 'Uptime'"
|
|
590
483
|
);
|
|
591
|
-
const uptimeSeconds = parseInt(uptimeRows[0]
|
|
484
|
+
const uptimeSeconds = parseInt(((_b = uptimeRows[0]) == null ? void 0 : _b.Value) || "0");
|
|
592
485
|
const uptime = this.formatUptimeString(uptimeSeconds);
|
|
593
|
-
|
|
594
|
-
// Get active connections
|
|
595
|
-
const [connRows] = await conn.execute<RowDataPacket[]>(
|
|
486
|
+
const [connRows] = await conn.execute(
|
|
596
487
|
"SHOW STATUS LIKE 'Threads_connected'"
|
|
597
488
|
);
|
|
598
|
-
const activeConnections = parseInt(connRows[0]
|
|
599
|
-
|
|
600
|
-
// Get max connections
|
|
601
|
-
const [maxConnRows] = await conn.execute<RowDataPacket[]>(
|
|
489
|
+
const activeConnections = parseInt(((_c = connRows[0]) == null ? void 0 : _c.Value) || "0");
|
|
490
|
+
const [maxConnRows] = await conn.execute(
|
|
602
491
|
"SHOW VARIABLES LIKE 'max_connections'"
|
|
603
492
|
);
|
|
604
|
-
const maxConnections = parseInt(maxConnRows[0]
|
|
605
|
-
|
|
606
|
-
// Get database size
|
|
607
|
-
const [sizeRows] = await conn.execute<RowDataPacket[]>(`
|
|
493
|
+
const maxConnections = parseInt(((_d = maxConnRows[0]) == null ? void 0 : _d.Value) || "151");
|
|
494
|
+
const [sizeRows] = await conn.execute(`
|
|
608
495
|
SELECT SUM(DATA_LENGTH + INDEX_LENGTH) as size_bytes
|
|
609
496
|
FROM information_schema.TABLES
|
|
610
497
|
WHERE TABLE_SCHEMA = ?;
|
|
611
498
|
`, [this.config.database]);
|
|
612
|
-
const databaseSizeBytes = parseInt(sizeRows[0]
|
|
613
|
-
|
|
614
|
-
// Get table and index count
|
|
615
|
-
const [countRows] = await conn.execute<RowDataPacket[]>(`
|
|
499
|
+
const databaseSizeBytes = parseInt(((_e = sizeRows[0]) == null ? void 0 : _e.size_bytes) || "0");
|
|
500
|
+
const [countRows] = await conn.execute(`
|
|
616
501
|
SELECT
|
|
617
502
|
COUNT(DISTINCT TABLE_NAME) as table_count,
|
|
618
503
|
COUNT(DISTINCT INDEX_NAME) as index_count
|
|
619
504
|
FROM information_schema.STATISTICS
|
|
620
505
|
WHERE TABLE_SCHEMA = ?;
|
|
621
506
|
`, [this.config.database]);
|
|
622
|
-
|
|
623
|
-
const [tableCountRows] = await conn.execute<RowDataPacket[]>(`
|
|
507
|
+
const [tableCountRows] = await conn.execute(`
|
|
624
508
|
SELECT COUNT(*) as cnt FROM information_schema.TABLES
|
|
625
509
|
WHERE TABLE_SCHEMA = ? AND TABLE_TYPE = 'BASE TABLE';
|
|
626
510
|
`, [this.config.database]);
|
|
627
|
-
|
|
628
511
|
return {
|
|
629
512
|
version: `MySQL ${version}`,
|
|
630
513
|
uptime,
|
|
631
|
-
startTime: new Date(Date.now() - uptimeSeconds *
|
|
514
|
+
startTime: new Date(Date.now() - uptimeSeconds * 1e3),
|
|
632
515
|
activeConnections,
|
|
633
516
|
maxConnections,
|
|
634
517
|
databaseSize: formatBytes(databaseSizeBytes),
|
|
635
518
|
databaseSizeBytes,
|
|
636
|
-
tableCount: parseInt(tableCountRows[0]
|
|
637
|
-
indexCount: parseInt(countRows[0]
|
|
519
|
+
tableCount: parseInt(((_f = tableCountRows[0]) == null ? void 0 : _f.cnt) || "0"),
|
|
520
|
+
indexCount: parseInt(((_g = countRows[0]) == null ? void 0 : _g.index_count) || "0")
|
|
638
521
|
};
|
|
639
522
|
} finally {
|
|
640
523
|
conn.release();
|
|
641
524
|
}
|
|
642
525
|
}
|
|
643
|
-
|
|
644
|
-
|
|
526
|
+
async getPerformanceMetrics() {
|
|
527
|
+
var _a, _b, _c, _d, _e, _f;
|
|
645
528
|
this.ensureConnected();
|
|
646
|
-
|
|
647
|
-
const conn = await this.pool!.getConnection();
|
|
529
|
+
const conn = await this.pool.getConnection();
|
|
648
530
|
try {
|
|
649
|
-
|
|
650
|
-
const [hitRows] = await conn.execute<RowDataPacket[]>(`
|
|
531
|
+
const [hitRows] = await conn.execute(`
|
|
651
532
|
SELECT
|
|
652
533
|
(1 - (
|
|
653
534
|
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads') /
|
|
654
535
|
NULLIF((SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests'), 0)
|
|
655
536
|
)) * 100 as hit_ratio;
|
|
656
537
|
`);
|
|
657
|
-
const cacheHitRatio = parseFloat(hitRows[0]
|
|
658
|
-
|
|
659
|
-
// Get buffer pool usage
|
|
660
|
-
const [poolRows] = await conn.execute<RowDataPacket[]>(`
|
|
538
|
+
const cacheHitRatio = parseFloat(((_a = hitRows[0]) == null ? void 0 : _a.hit_ratio) || "99");
|
|
539
|
+
const [poolRows] = await conn.execute(`
|
|
661
540
|
SELECT
|
|
662
541
|
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data') as data_pages,
|
|
663
542
|
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total') as total_pages;
|
|
664
543
|
`);
|
|
665
|
-
const dataPages = parseInt(poolRows[0]
|
|
666
|
-
const totalPages = parseInt(poolRows[0]
|
|
667
|
-
const bufferPoolUsage =
|
|
668
|
-
|
|
669
|
-
// Get queries per second
|
|
670
|
-
const [qpsRows] = await conn.execute<RowDataPacket[]>(`
|
|
544
|
+
const dataPages = parseInt(((_b = poolRows[0]) == null ? void 0 : _b.data_pages) || "0");
|
|
545
|
+
const totalPages = parseInt(((_c = poolRows[0]) == null ? void 0 : _c.total_pages) || "1");
|
|
546
|
+
const bufferPoolUsage = dataPages / totalPages * 100;
|
|
547
|
+
const [qpsRows] = await conn.execute(`
|
|
671
548
|
SELECT
|
|
672
549
|
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Queries') as queries,
|
|
673
550
|
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Uptime') as uptime;
|
|
674
551
|
`);
|
|
675
|
-
const queries = parseInt(qpsRows[0]
|
|
676
|
-
const uptime = parseInt(qpsRows[0]
|
|
552
|
+
const queries = parseInt(((_d = qpsRows[0]) == null ? void 0 : _d.queries) || "0");
|
|
553
|
+
const uptime = parseInt(((_e = qpsRows[0]) == null ? void 0 : _e.uptime) || "1");
|
|
677
554
|
const queriesPerSecond = queries / uptime;
|
|
678
|
-
|
|
679
|
-
// Get deadlocks
|
|
680
|
-
const [deadlockRows] = await conn.execute<RowDataPacket[]>(
|
|
555
|
+
const [deadlockRows] = await conn.execute(
|
|
681
556
|
"SHOW STATUS LIKE 'Innodb_deadlocks'"
|
|
682
557
|
);
|
|
683
|
-
const deadlocks = parseInt(deadlockRows[0]
|
|
684
|
-
|
|
558
|
+
const deadlocks = parseInt(((_f = deadlockRows[0]) == null ? void 0 : _f.Value) || "0");
|
|
685
559
|
return {
|
|
686
560
|
cacheHitRatio: Math.min(100, Math.max(0, cacheHitRatio)),
|
|
687
561
|
queriesPerSecond: Math.round(queriesPerSecond * 100) / 100,
|
|
688
562
|
bufferPoolUsage: Math.round(bufferPoolUsage * 100) / 100,
|
|
689
|
-
deadlocks
|
|
563
|
+
deadlocks
|
|
690
564
|
};
|
|
691
|
-
} catch {
|
|
692
|
-
// Fallback if performance_schema is not available
|
|
565
|
+
} catch (e) {
|
|
693
566
|
return {
|
|
694
567
|
cacheHitRatio: 99,
|
|
695
568
|
queriesPerSecond: 0,
|
|
696
569
|
bufferPoolUsage: 0,
|
|
697
|
-
deadlocks: 0
|
|
570
|
+
deadlocks: 0
|
|
698
571
|
};
|
|
699
572
|
} finally {
|
|
700
573
|
conn.release();
|
|
701
574
|
}
|
|
702
575
|
}
|
|
703
|
-
|
|
704
|
-
|
|
576
|
+
async getSlowQueries(options) {
|
|
577
|
+
var _a;
|
|
705
578
|
this.ensureConnected();
|
|
706
|
-
const limit = options
|
|
707
|
-
|
|
708
|
-
const conn = await this.pool!.getConnection();
|
|
579
|
+
const limit = (_a = options == null ? void 0 : options.limit) != null ? _a : 10;
|
|
580
|
+
const conn = await this.pool.getConnection();
|
|
709
581
|
try {
|
|
710
|
-
const [rows] = await conn.execute
|
|
582
|
+
const [rows] = await conn.execute(`
|
|
711
583
|
SELECT
|
|
712
584
|
DIGEST as query_id,
|
|
713
585
|
LEFT(DIGEST_TEXT, 500) as query,
|
|
@@ -722,32 +594,29 @@ export class MySQLProvider extends SQLBaseProvider {
|
|
|
722
594
|
ORDER BY SUM_TIMER_WAIT DESC
|
|
723
595
|
LIMIT ${Number(limit)};
|
|
724
596
|
`, [this.config.database]);
|
|
725
|
-
|
|
726
597
|
return rows.map((r) => ({
|
|
727
|
-
queryId: r.query_id ||
|
|
728
|
-
query: r.query ||
|
|
729
|
-
calls: parseInt(r.calls ||
|
|
730
|
-
totalTime: parseFloat(r.total_time_ms ||
|
|
731
|
-
avgTime: parseFloat(r.avg_time_ms ||
|
|
732
|
-
minTime: parseFloat(r.min_time_ms ||
|
|
733
|
-
maxTime: parseFloat(r.max_time_ms ||
|
|
734
|
-
rows: parseInt(r.rows_examined ||
|
|
598
|
+
queryId: r.query_id || void 0,
|
|
599
|
+
query: r.query || "",
|
|
600
|
+
calls: parseInt(r.calls || "0"),
|
|
601
|
+
totalTime: parseFloat(r.total_time_ms || "0"),
|
|
602
|
+
avgTime: parseFloat(r.avg_time_ms || "0"),
|
|
603
|
+
minTime: parseFloat(r.min_time_ms || "0"),
|
|
604
|
+
maxTime: parseFloat(r.max_time_ms || "0"),
|
|
605
|
+
rows: parseInt(r.rows_examined || "0")
|
|
735
606
|
}));
|
|
736
|
-
} catch {
|
|
737
|
-
// Performance schema not available
|
|
607
|
+
} catch (e) {
|
|
738
608
|
return [];
|
|
739
609
|
} finally {
|
|
740
610
|
conn.release();
|
|
741
611
|
}
|
|
742
612
|
}
|
|
743
|
-
|
|
744
|
-
|
|
613
|
+
async getActiveSessions(options) {
|
|
614
|
+
var _a;
|
|
745
615
|
this.ensureConnected();
|
|
746
|
-
const limit = options
|
|
747
|
-
|
|
748
|
-
const conn = await this.pool!.getConnection();
|
|
616
|
+
const limit = (_a = options == null ? void 0 : options.limit) != null ? _a : 50;
|
|
617
|
+
const conn = await this.pool.getConnection();
|
|
749
618
|
try {
|
|
750
|
-
const [rows] = await conn.execute
|
|
619
|
+
const [rows] = await conn.execute(`
|
|
751
620
|
SELECT
|
|
752
621
|
ID as pid,
|
|
753
622
|
USER as user,
|
|
@@ -761,32 +630,31 @@ export class MySQLProvider extends SQLBaseProvider {
|
|
|
761
630
|
ORDER BY TIME DESC
|
|
762
631
|
LIMIT ${Number(limit)};
|
|
763
632
|
`, [this.config.database]);
|
|
764
|
-
|
|
765
633
|
return rows.map((r) => {
|
|
766
|
-
|
|
634
|
+
var _a2;
|
|
635
|
+
const durationSeconds = parseInt(r.duration_seconds || "0");
|
|
767
636
|
return {
|
|
768
637
|
pid: r.pid,
|
|
769
|
-
user: r.user ||
|
|
770
|
-
database: r.database_name ||
|
|
771
|
-
clientAddr: r.client_addr
|
|
772
|
-
state: r.state ||
|
|
773
|
-
query: r.query ||
|
|
774
|
-
duration: this.formatDurationString(durationSeconds *
|
|
775
|
-
durationMs: durationSeconds *
|
|
638
|
+
user: r.user || "unknown",
|
|
639
|
+
database: r.database_name || "",
|
|
640
|
+
clientAddr: ((_a2 = r.client_addr) == null ? void 0 : _a2.split(":")[0]) || void 0,
|
|
641
|
+
state: r.state || "unknown",
|
|
642
|
+
query: r.query || "",
|
|
643
|
+
duration: this.formatDurationString(durationSeconds * 1e3),
|
|
644
|
+
durationMs: durationSeconds * 1e3
|
|
776
645
|
};
|
|
777
646
|
});
|
|
778
647
|
} finally {
|
|
779
648
|
conn.release();
|
|
780
649
|
}
|
|
781
650
|
}
|
|
782
|
-
|
|
783
|
-
|
|
651
|
+
async getTableStats(options) {
|
|
652
|
+
var _a;
|
|
784
653
|
this.ensureConnected();
|
|
785
|
-
const schema = options
|
|
786
|
-
|
|
787
|
-
const conn = await this.pool!.getConnection();
|
|
654
|
+
const schema = (_a = options == null ? void 0 : options.schema) != null ? _a : this.config.database;
|
|
655
|
+
const conn = await this.pool.getConnection();
|
|
788
656
|
try {
|
|
789
|
-
const [rows] = await conn.execute
|
|
657
|
+
const [rows] = await conn.execute(`
|
|
790
658
|
SELECT
|
|
791
659
|
TABLE_SCHEMA as schema_name,
|
|
792
660
|
TABLE_NAME as table_name,
|
|
@@ -801,40 +669,35 @@ export class MySQLProvider extends SQLBaseProvider {
|
|
|
801
669
|
ORDER BY DATA_LENGTH + INDEX_LENGTH DESC
|
|
802
670
|
LIMIT 100;
|
|
803
671
|
`, [schema]);
|
|
804
|
-
|
|
805
672
|
return rows.map((r) => {
|
|
806
|
-
const tableSizeBytes = parseInt(r.table_size_bytes ||
|
|
807
|
-
const indexSizeBytes = parseInt(r.index_size_bytes ||
|
|
808
|
-
const totalSizeBytes = parseInt(r.total_size_bytes ||
|
|
809
|
-
const freeSpaceBytes = parseInt(r.free_space_bytes ||
|
|
810
|
-
|
|
811
|
-
// Estimate bloat ratio from free space
|
|
812
|
-
const bloatRatio = totalSizeBytes > 0 ? (freeSpaceBytes / totalSizeBytes) * 100 : 0;
|
|
813
|
-
|
|
673
|
+
const tableSizeBytes = parseInt(r.table_size_bytes || "0");
|
|
674
|
+
const indexSizeBytes = parseInt(r.index_size_bytes || "0");
|
|
675
|
+
const totalSizeBytes = parseInt(r.total_size_bytes || "0");
|
|
676
|
+
const freeSpaceBytes = parseInt(r.free_space_bytes || "0");
|
|
677
|
+
const bloatRatio = totalSizeBytes > 0 ? freeSpaceBytes / totalSizeBytes * 100 : 0;
|
|
814
678
|
return {
|
|
815
|
-
schemaName: r.schema_name || schema ||
|
|
816
|
-
tableName: r.table_name ||
|
|
817
|
-
rowCount: parseInt(r.row_count ||
|
|
679
|
+
schemaName: r.schema_name || schema || "",
|
|
680
|
+
tableName: r.table_name || "",
|
|
681
|
+
rowCount: parseInt(r.row_count || "0"),
|
|
818
682
|
tableSize: formatBytes(tableSizeBytes),
|
|
819
683
|
tableSizeBytes,
|
|
820
684
|
indexSize: formatBytes(indexSizeBytes),
|
|
821
685
|
totalSize: formatBytes(totalSizeBytes),
|
|
822
686
|
totalSizeBytes,
|
|
823
|
-
bloatRatio: Math.round(bloatRatio * 10) / 10
|
|
687
|
+
bloatRatio: Math.round(bloatRatio * 10) / 10
|
|
824
688
|
};
|
|
825
689
|
});
|
|
826
690
|
} finally {
|
|
827
691
|
conn.release();
|
|
828
692
|
}
|
|
829
693
|
}
|
|
830
|
-
|
|
831
|
-
|
|
694
|
+
async getIndexStats(options) {
|
|
695
|
+
var _a;
|
|
832
696
|
this.ensureConnected();
|
|
833
|
-
const schema = options
|
|
834
|
-
|
|
835
|
-
const conn = await this.pool!.getConnection();
|
|
697
|
+
const schema = (_a = options == null ? void 0 : options.schema) != null ? _a : this.config.database;
|
|
698
|
+
const conn = await this.pool.getConnection();
|
|
836
699
|
try {
|
|
837
|
-
const [rows] = await conn.execute
|
|
700
|
+
const [rows] = await conn.execute(`
|
|
838
701
|
SELECT
|
|
839
702
|
TABLE_SCHEMA as schema_name,
|
|
840
703
|
TABLE_NAME as table_name,
|
|
@@ -850,11 +713,9 @@ export class MySQLProvider extends SQLBaseProvider {
|
|
|
850
713
|
ORDER BY TABLE_NAME, INDEX_NAME
|
|
851
714
|
LIMIT 200;
|
|
852
715
|
`, [schema]);
|
|
853
|
-
|
|
854
|
-
// Get index sizes from INNODB_SYS_INDEXES if available
|
|
855
|
-
const indexSizes: Record<string, number> = {};
|
|
716
|
+
const indexSizes = {};
|
|
856
717
|
try {
|
|
857
|
-
const [sizeRows] = await conn.execute
|
|
718
|
+
const [sizeRows] = await conn.execute(`
|
|
858
719
|
SELECT
|
|
859
720
|
CONCAT(t.NAME) as full_name,
|
|
860
721
|
SUM(s.INDEX_SIZE * @@innodb_page_size) as size_bytes
|
|
@@ -864,45 +725,38 @@ export class MySQLProvider extends SQLBaseProvider {
|
|
|
864
725
|
WHERE t.NAME LIKE ?
|
|
865
726
|
GROUP BY t.NAME, i.NAME;
|
|
866
727
|
`, [`${schema}/%`]);
|
|
867
|
-
|
|
868
728
|
for (const row of sizeRows) {
|
|
869
|
-
indexSizes[row.full_name] = parseInt(row.size_bytes ||
|
|
729
|
+
indexSizes[row.full_name] = parseInt(row.size_bytes || "0");
|
|
870
730
|
}
|
|
871
|
-
} catch {
|
|
872
|
-
// INNODB_SYS tables not available
|
|
731
|
+
} catch (e) {
|
|
873
732
|
}
|
|
874
|
-
|
|
875
733
|
return rows.map((r) => {
|
|
734
|
+
var _a2;
|
|
876
735
|
const indexKey = `${r.schema_name}/${r.table_name}`;
|
|
877
736
|
const indexSizeBytes = indexSizes[indexKey] || 0;
|
|
878
|
-
|
|
879
737
|
return {
|
|
880
|
-
schemaName: r.schema_name || schema ||
|
|
881
|
-
tableName: r.table_name ||
|
|
882
|
-
indexName: r.index_name ||
|
|
883
|
-
indexType: r.index_type ||
|
|
884
|
-
columns: r.columns
|
|
738
|
+
schemaName: r.schema_name || schema || "",
|
|
739
|
+
tableName: r.table_name || "",
|
|
740
|
+
indexName: r.index_name || "",
|
|
741
|
+
indexType: r.index_type || "BTREE",
|
|
742
|
+
columns: ((_a2 = r.columns) == null ? void 0 : _a2.split(",")) || [],
|
|
885
743
|
isUnique: Boolean(r.is_unique),
|
|
886
744
|
isPrimary: Boolean(r.is_primary),
|
|
887
745
|
indexSize: formatBytes(indexSizeBytes),
|
|
888
746
|
indexSizeBytes,
|
|
889
|
-
scans: parseInt(r.cardinality ||
|
|
747
|
+
scans: parseInt(r.cardinality || "0")
|
|
890
748
|
};
|
|
891
749
|
});
|
|
892
750
|
} finally {
|
|
893
751
|
conn.release();
|
|
894
752
|
}
|
|
895
753
|
}
|
|
896
|
-
|
|
897
|
-
public async getStorageStats(): Promise<StorageStats[]> {
|
|
754
|
+
async getStorageStats() {
|
|
898
755
|
this.ensureConnected();
|
|
899
|
-
|
|
900
|
-
const conn = await this.pool!.getConnection();
|
|
756
|
+
const conn = await this.pool.getConnection();
|
|
901
757
|
try {
|
|
902
|
-
const stats
|
|
903
|
-
|
|
904
|
-
// Get database size
|
|
905
|
-
const [dbRows] = await conn.execute<RowDataPacket[]>(`
|
|
758
|
+
const stats = [];
|
|
759
|
+
const [dbRows] = await conn.execute(`
|
|
906
760
|
SELECT
|
|
907
761
|
TABLE_SCHEMA as name,
|
|
908
762
|
SUM(DATA_LENGTH + INDEX_LENGTH) as size_bytes
|
|
@@ -910,69 +764,64 @@ export class MySQLProvider extends SQLBaseProvider {
|
|
|
910
764
|
WHERE TABLE_SCHEMA = ?
|
|
911
765
|
GROUP BY TABLE_SCHEMA;
|
|
912
766
|
`, [this.config.database]);
|
|
913
|
-
|
|
914
767
|
if (dbRows.length > 0) {
|
|
915
|
-
const sizeBytes = parseInt(dbRows[0].size_bytes ||
|
|
768
|
+
const sizeBytes = parseInt(dbRows[0].size_bytes || "0");
|
|
916
769
|
stats.push({
|
|
917
|
-
name:
|
|
918
|
-
location: this.config.database ||
|
|
770
|
+
name: "Data",
|
|
771
|
+
location: this.config.database || "default",
|
|
919
772
|
size: formatBytes(sizeBytes),
|
|
920
|
-
sizeBytes
|
|
773
|
+
sizeBytes
|
|
921
774
|
});
|
|
922
775
|
}
|
|
923
|
-
|
|
924
|
-
// Get binary log size if available
|
|
925
776
|
try {
|
|
926
|
-
const [binlogRows] = await conn.execute
|
|
927
|
-
const binlogSize = binlogRows.reduce((sum, r) => sum + parseInt(r.File_size ||
|
|
777
|
+
const [binlogRows] = await conn.execute("SHOW BINARY LOGS");
|
|
778
|
+
const binlogSize = binlogRows.reduce((sum, r) => sum + parseInt(r.File_size || "0"), 0);
|
|
928
779
|
if (binlogSize > 0) {
|
|
929
780
|
stats.push({
|
|
930
|
-
name:
|
|
781
|
+
name: "Binary Logs",
|
|
931
782
|
size: formatBytes(binlogSize),
|
|
932
|
-
sizeBytes: binlogSize
|
|
783
|
+
sizeBytes: binlogSize
|
|
933
784
|
});
|
|
934
785
|
}
|
|
935
|
-
} catch {
|
|
936
|
-
// Binary logging not enabled
|
|
786
|
+
} catch (e) {
|
|
937
787
|
}
|
|
938
|
-
|
|
939
|
-
// Get InnoDB data file size
|
|
940
788
|
try {
|
|
941
|
-
const [innodbRows] = await conn.execute
|
|
789
|
+
const [innodbRows] = await conn.execute(
|
|
942
790
|
"SHOW VARIABLES LIKE 'innodb_data_file_path'"
|
|
943
791
|
);
|
|
944
792
|
if (innodbRows.length > 0) {
|
|
945
793
|
stats.push({
|
|
946
|
-
name:
|
|
947
|
-
location: innodbRows[0].Value ||
|
|
948
|
-
size:
|
|
949
|
-
sizeBytes: 0
|
|
794
|
+
name: "InnoDB",
|
|
795
|
+
location: innodbRows[0].Value || "ibdata1",
|
|
796
|
+
size: "N/A",
|
|
797
|
+
sizeBytes: 0
|
|
950
798
|
});
|
|
951
799
|
}
|
|
952
|
-
} catch {
|
|
953
|
-
// Could not get InnoDB info
|
|
800
|
+
} catch (e) {
|
|
954
801
|
}
|
|
955
|
-
|
|
956
802
|
return stats;
|
|
957
803
|
} finally {
|
|
958
804
|
conn.release();
|
|
959
805
|
}
|
|
960
806
|
}
|
|
961
|
-
|
|
962
|
-
private formatUptimeString(seconds: number): string {
|
|
807
|
+
formatUptimeString(seconds) {
|
|
963
808
|
const days = Math.floor(seconds / 86400);
|
|
964
|
-
const hours = Math.floor(
|
|
965
|
-
const minutes = Math.floor(
|
|
966
|
-
|
|
809
|
+
const hours = Math.floor(seconds % 86400 / 3600);
|
|
810
|
+
const minutes = Math.floor(seconds % 3600 / 60);
|
|
967
811
|
if (days > 0) return `${days}d ${hours}h`;
|
|
968
812
|
if (hours > 0) return `${hours}h ${minutes}m`;
|
|
969
813
|
return `${minutes}m`;
|
|
970
814
|
}
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
if (ms <
|
|
974
|
-
if (ms <
|
|
975
|
-
|
|
976
|
-
return `${Math.floor(ms / 3600000)}h ${Math.floor((ms % 3600000) / 60000)}m`;
|
|
815
|
+
formatDurationString(ms) {
|
|
816
|
+
if (ms < 1e3) return `${ms}ms`;
|
|
817
|
+
if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
|
|
818
|
+
if (ms < 36e5) return `${Math.floor(ms / 6e4)}m ${Math.floor(ms % 6e4 / 1e3)}s`;
|
|
819
|
+
return `${Math.floor(ms / 36e5)}h ${Math.floor(ms % 36e5 / 6e4)}m`;
|
|
977
820
|
}
|
|
978
|
-
}
|
|
821
|
+
};
|
|
822
|
+
_MySQLProvider.TX_TIMEOUT_MS = 5 * 60 * 1e3;
|
|
823
|
+
var MySQLProvider = _MySQLProvider;
|
|
824
|
+
|
|
825
|
+
export { MySQLProvider };
|
|
826
|
+
//# sourceMappingURL=mysql-I3WJQXN2.mjs.map
|
|
827
|
+
//# sourceMappingURL=mysql-I3WJQXN2.mjs.map
|