@libredb/studio 0.9.7 → 0.9.13
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-CPF7XWV5.mjs +1289 -0
- package/dist/chunk-CPF7XWV5.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-FYSE52VB.js +242 -0
- package/dist/chunk-FYSE52VB.js.map +1 -0
- package/dist/chunk-G3S66G64.mjs +6673 -0
- package/dist/chunk-G3S66G64.mjs.map +1 -0
- package/dist/chunk-G4WYE6TI.js +4 -0
- package/dist/chunk-G4WYE6TI.js.map +1 -0
- package/dist/chunk-HGPD6PWV.js +1310 -0
- package/dist/chunk-HGPD6PWV.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-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-Y52UIFEX.js +6741 -0
- package/dist/chunk-Y52UIFEX.js.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 +4174 -0
- package/dist/workspace.js.map +1 -0
- package/dist/workspace.mjs +4147 -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
|
@@ -0,0 +1,833 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkKV356UXJ_js = require('./chunk-KV356UXJ.js');
|
|
4
|
+
var chunkPTIRB2JO_js = require('./chunk-PTIRB2JO.js');
|
|
5
|
+
var chunkJZO5KRZN_js = require('./chunk-JZO5KRZN.js');
|
|
6
|
+
var chunkQ6LRDBK7_js = require('./chunk-Q6LRDBK7.js');
|
|
7
|
+
var mysql = require('mysql2/promise');
|
|
8
|
+
|
|
9
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
|
|
11
|
+
var mysql__default = /*#__PURE__*/_interopDefault(mysql);
|
|
12
|
+
|
|
13
|
+
var _MySQLProvider = class _MySQLProvider extends chunkKV356UXJ_js.SQLBaseProvider {
|
|
14
|
+
// 5 minutes
|
|
15
|
+
constructor(config, options = {}) {
|
|
16
|
+
super(config, options);
|
|
17
|
+
this.pool = null;
|
|
18
|
+
// Transaction support: dedicated connection held outside pool
|
|
19
|
+
this.txConn = null;
|
|
20
|
+
this.txActive = false;
|
|
21
|
+
this.txTimeout = null;
|
|
22
|
+
// Track running query thread IDs for cancellation
|
|
23
|
+
this.runningQueryThreadIds = /* @__PURE__ */ new Map();
|
|
24
|
+
this.validate();
|
|
25
|
+
}
|
|
26
|
+
// ============================================================================
|
|
27
|
+
// Provider Metadata
|
|
28
|
+
// ============================================================================
|
|
29
|
+
getCapabilities() {
|
|
30
|
+
return chunkQ6LRDBK7_js.__spreadProps(chunkQ6LRDBK7_js.__spreadValues({}, super.getCapabilities()), {
|
|
31
|
+
defaultPort: 3306,
|
|
32
|
+
supportsExplain: true,
|
|
33
|
+
supportsConnectionString: true,
|
|
34
|
+
maintenanceOperations: ["analyze", "optimize", "check", "kill"]
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
// ============================================================================
|
|
38
|
+
// Validation
|
|
39
|
+
// ============================================================================
|
|
40
|
+
validate() {
|
|
41
|
+
super.validate();
|
|
42
|
+
if (!this.config.connectionString) {
|
|
43
|
+
if (!this.config.host) {
|
|
44
|
+
throw new chunkJZO5KRZN_js.DatabaseConfigError("Host is required for MySQL", "mysql");
|
|
45
|
+
}
|
|
46
|
+
if (!this.config.database) {
|
|
47
|
+
throw new chunkJZO5KRZN_js.DatabaseConfigError("Database name is required for MySQL", "mysql");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// ============================================================================
|
|
52
|
+
// Connection Management
|
|
53
|
+
// ============================================================================
|
|
54
|
+
async connect() {
|
|
55
|
+
if (this.pool) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
this.pool = mysql__default.default.createPool(this.buildPoolConfig());
|
|
60
|
+
const conn = await this.pool.getConnection();
|
|
61
|
+
conn.release();
|
|
62
|
+
this.setConnected(true);
|
|
63
|
+
} catch (error) {
|
|
64
|
+
this.setError(error instanceof Error ? error : new Error(String(error)));
|
|
65
|
+
throw new chunkJZO5KRZN_js.ConnectionError(
|
|
66
|
+
`Failed to connect to MySQL: ${error instanceof Error ? error.message : error}`,
|
|
67
|
+
"mysql",
|
|
68
|
+
this.config.host,
|
|
69
|
+
this.config.port
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async disconnect() {
|
|
74
|
+
if (this.pool) {
|
|
75
|
+
await this.pool.end();
|
|
76
|
+
this.pool = null;
|
|
77
|
+
this.setConnected(false);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
buildPoolConfig() {
|
|
81
|
+
var _a, _b;
|
|
82
|
+
const baseConfig = {
|
|
83
|
+
connectionLimit: this.poolConfig.max,
|
|
84
|
+
waitForConnections: true,
|
|
85
|
+
queueLimit: 0,
|
|
86
|
+
enableKeepAlive: true,
|
|
87
|
+
keepAliveInitialDelay: 1e4
|
|
88
|
+
};
|
|
89
|
+
if (this.config.connectionString) {
|
|
90
|
+
return chunkQ6LRDBK7_js.__spreadProps(chunkQ6LRDBK7_js.__spreadValues({}, baseConfig), {
|
|
91
|
+
uri: this.config.connectionString
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return chunkQ6LRDBK7_js.__spreadProps(chunkQ6LRDBK7_js.__spreadValues({}, baseConfig), {
|
|
95
|
+
host: this.config.host,
|
|
96
|
+
port: (_a = this.config.port) != null ? _a : 3306,
|
|
97
|
+
user: this.config.user,
|
|
98
|
+
password: this.config.password,
|
|
99
|
+
database: this.config.database,
|
|
100
|
+
ssl: this.buildSSLConfig(),
|
|
101
|
+
timezone: (_b = this.options.timezone) != null ? _b : "Z"
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
buildSSLConfig() {
|
|
105
|
+
const connSSL = this.config.ssl;
|
|
106
|
+
if (connSSL) {
|
|
107
|
+
if (connSSL.mode === "disable") return void 0;
|
|
108
|
+
const ssl = {
|
|
109
|
+
rejectUnauthorized: connSSL.mode === "verify-ca" || connSSL.mode === "verify-full"
|
|
110
|
+
};
|
|
111
|
+
if (connSSL.caCert) ssl.ca = connSSL.caCert;
|
|
112
|
+
if (connSSL.clientCert) ssl.cert = connSSL.clientCert;
|
|
113
|
+
if (connSSL.clientKey) ssl.key = connSSL.clientKey;
|
|
114
|
+
return ssl;
|
|
115
|
+
}
|
|
116
|
+
if (this.shouldEnableSSL()) {
|
|
117
|
+
return { rejectUnauthorized: false };
|
|
118
|
+
}
|
|
119
|
+
return void 0;
|
|
120
|
+
}
|
|
121
|
+
// ============================================================================
|
|
122
|
+
// Query Execution
|
|
123
|
+
// ============================================================================
|
|
124
|
+
sanitizeRow(row) {
|
|
125
|
+
const sanitized = {};
|
|
126
|
+
for (const [key, value] of Object.entries(row)) {
|
|
127
|
+
if (Buffer.isBuffer(value)) {
|
|
128
|
+
sanitized[key] = value.length === 0 ? "" : `0x${value.toString("hex")}`;
|
|
129
|
+
} else {
|
|
130
|
+
sanitized[key] = value;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return sanitized;
|
|
134
|
+
}
|
|
135
|
+
async query(sql, params, queryId) {
|
|
136
|
+
this.ensureConnected();
|
|
137
|
+
return this.trackQuery(async () => {
|
|
138
|
+
var _a, _b;
|
|
139
|
+
const { result, executionTime } = await this.measureExecution(async () => {
|
|
140
|
+
const conn = await this.pool.getConnection();
|
|
141
|
+
try {
|
|
142
|
+
if (queryId) {
|
|
143
|
+
this.runningQueryThreadIds.set(queryId, conn.threadId);
|
|
144
|
+
}
|
|
145
|
+
const [rows, fields] = await conn.execute(sql, params);
|
|
146
|
+
return { rows, fields };
|
|
147
|
+
} catch (error) {
|
|
148
|
+
throw chunkJZO5KRZN_js.mapDatabaseError(error, "mysql", sql);
|
|
149
|
+
} finally {
|
|
150
|
+
if (queryId) this.runningQueryThreadIds.delete(queryId);
|
|
151
|
+
conn.release();
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
return {
|
|
155
|
+
rows: result.rows.map((row) => this.sanitizeRow(row)),
|
|
156
|
+
fields: (_b = (_a = result.fields) == null ? void 0 : _a.map((f) => f.name)) != null ? _b : [],
|
|
157
|
+
rowCount: Array.isArray(result.rows) ? result.rows.length : 0,
|
|
158
|
+
executionTime
|
|
159
|
+
};
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
async cancelQuery(queryId) {
|
|
163
|
+
const threadId = this.runningQueryThreadIds.get(queryId);
|
|
164
|
+
if (!threadId) return false;
|
|
165
|
+
try {
|
|
166
|
+
await this.pool.execute(`KILL QUERY ${threadId}`);
|
|
167
|
+
return true;
|
|
168
|
+
} catch (error) {
|
|
169
|
+
console.error("[MySQL] Failed to cancel query:", error);
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// ============================================================================
|
|
174
|
+
// Transaction Support
|
|
175
|
+
// ============================================================================
|
|
176
|
+
clearTxTimeout() {
|
|
177
|
+
if (this.txTimeout) {
|
|
178
|
+
clearTimeout(this.txTimeout);
|
|
179
|
+
this.txTimeout = null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Force-expire an active transaction (auto-rollback).
|
|
184
|
+
* Called by the timeout timer, but also available for testing.
|
|
185
|
+
*/
|
|
186
|
+
async expireTransaction() {
|
|
187
|
+
if (this.txActive && this.txConn) {
|
|
188
|
+
console.warn("[MySQL] Transaction timed out, auto-rolling back");
|
|
189
|
+
try {
|
|
190
|
+
await this.txConn.rollback();
|
|
191
|
+
} catch (e) {
|
|
192
|
+
} finally {
|
|
193
|
+
this.txConn.release();
|
|
194
|
+
this.txConn = null;
|
|
195
|
+
this.txActive = false;
|
|
196
|
+
this.clearTxTimeout();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async beginTransaction() {
|
|
201
|
+
this.ensureConnected();
|
|
202
|
+
if (this.txActive) throw new chunkJZO5KRZN_js.QueryError("Transaction already active", "mysql");
|
|
203
|
+
this.txConn = await this.pool.getConnection();
|
|
204
|
+
await this.txConn.beginTransaction();
|
|
205
|
+
this.txActive = true;
|
|
206
|
+
this.txTimeout = setTimeout(() => {
|
|
207
|
+
this.expireTransaction();
|
|
208
|
+
}, _MySQLProvider.TX_TIMEOUT_MS);
|
|
209
|
+
}
|
|
210
|
+
async commitTransaction() {
|
|
211
|
+
if (!this.txConn || !this.txActive) throw new chunkJZO5KRZN_js.QueryError("No active transaction", "mysql");
|
|
212
|
+
this.clearTxTimeout();
|
|
213
|
+
try {
|
|
214
|
+
await this.txConn.commit();
|
|
215
|
+
} finally {
|
|
216
|
+
this.txConn.release();
|
|
217
|
+
this.txConn = null;
|
|
218
|
+
this.txActive = false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async rollbackTransaction() {
|
|
222
|
+
if (!this.txConn || !this.txActive) throw new chunkJZO5KRZN_js.QueryError("No active transaction", "mysql");
|
|
223
|
+
this.clearTxTimeout();
|
|
224
|
+
try {
|
|
225
|
+
await this.txConn.rollback();
|
|
226
|
+
} finally {
|
|
227
|
+
this.txConn.release();
|
|
228
|
+
this.txConn = null;
|
|
229
|
+
this.txActive = false;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
isInTransaction() {
|
|
233
|
+
return this.txActive;
|
|
234
|
+
}
|
|
235
|
+
async queryInTransaction(sql, params) {
|
|
236
|
+
if (!this.txConn || !this.txActive) throw new chunkJZO5KRZN_js.QueryError("No active transaction", "mysql");
|
|
237
|
+
return this.trackQuery(async () => {
|
|
238
|
+
var _a, _b;
|
|
239
|
+
const { result, executionTime } = await this.measureExecution(async () => {
|
|
240
|
+
try {
|
|
241
|
+
const [rows, fields] = await this.txConn.execute(sql, params);
|
|
242
|
+
return { rows, fields };
|
|
243
|
+
} catch (error) {
|
|
244
|
+
throw chunkJZO5KRZN_js.mapDatabaseError(error, "mysql", sql);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
return {
|
|
248
|
+
rows: result.rows.map((row) => this.sanitizeRow(row)),
|
|
249
|
+
fields: (_b = (_a = result.fields) == null ? void 0 : _a.map((f) => f.name)) != null ? _b : [],
|
|
250
|
+
rowCount: Array.isArray(result.rows) ? result.rows.length : 0,
|
|
251
|
+
executionTime
|
|
252
|
+
};
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
// ============================================================================
|
|
256
|
+
// Schema Operations
|
|
257
|
+
// ============================================================================
|
|
258
|
+
async getSchema() {
|
|
259
|
+
this.ensureConnected();
|
|
260
|
+
const conn = await this.pool.getConnection();
|
|
261
|
+
try {
|
|
262
|
+
const [tablesRows] = await conn.execute(`
|
|
263
|
+
SELECT
|
|
264
|
+
TABLE_NAME as table_name,
|
|
265
|
+
TABLE_ROWS as row_count,
|
|
266
|
+
DATA_LENGTH + INDEX_LENGTH as total_size
|
|
267
|
+
FROM information_schema.TABLES
|
|
268
|
+
WHERE TABLE_SCHEMA = ?
|
|
269
|
+
AND TABLE_TYPE = 'BASE TABLE'
|
|
270
|
+
ORDER BY TABLE_NAME ASC;
|
|
271
|
+
`, [this.config.database]);
|
|
272
|
+
const schemas = [];
|
|
273
|
+
for (const row of tablesRows) {
|
|
274
|
+
const tableName = row.table_name;
|
|
275
|
+
const rowCount = parseInt(row.row_count || "0");
|
|
276
|
+
const sizeBytes = parseInt(row.total_size || "0");
|
|
277
|
+
const [columnsRows] = await conn.execute(`
|
|
278
|
+
SELECT
|
|
279
|
+
COLUMN_NAME as column_name,
|
|
280
|
+
DATA_TYPE as data_type,
|
|
281
|
+
IS_NULLABLE as is_nullable,
|
|
282
|
+
COLUMN_DEFAULT as column_default,
|
|
283
|
+
COLUMN_KEY as column_key
|
|
284
|
+
FROM information_schema.COLUMNS
|
|
285
|
+
WHERE TABLE_SCHEMA = ?
|
|
286
|
+
AND TABLE_NAME = ?
|
|
287
|
+
ORDER BY ORDINAL_POSITION
|
|
288
|
+
LIMIT 100;
|
|
289
|
+
`, [this.config.database, tableName]);
|
|
290
|
+
const [fkRows] = await conn.execute(`
|
|
291
|
+
SELECT
|
|
292
|
+
COLUMN_NAME as column_name,
|
|
293
|
+
REFERENCED_TABLE_NAME as referenced_table,
|
|
294
|
+
REFERENCED_COLUMN_NAME as referenced_column
|
|
295
|
+
FROM information_schema.KEY_COLUMN_USAGE
|
|
296
|
+
WHERE TABLE_SCHEMA = ?
|
|
297
|
+
AND TABLE_NAME = ?
|
|
298
|
+
AND REFERENCED_TABLE_NAME IS NOT NULL;
|
|
299
|
+
`, [this.config.database, tableName]);
|
|
300
|
+
const [indexRows] = await conn.execute(`
|
|
301
|
+
SELECT
|
|
302
|
+
INDEX_NAME as index_name,
|
|
303
|
+
GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) as columns,
|
|
304
|
+
NOT NON_UNIQUE as is_unique
|
|
305
|
+
FROM information_schema.STATISTICS
|
|
306
|
+
WHERE TABLE_SCHEMA = ?
|
|
307
|
+
AND TABLE_NAME = ?
|
|
308
|
+
GROUP BY INDEX_NAME, NON_UNIQUE;
|
|
309
|
+
`, [this.config.database, tableName]);
|
|
310
|
+
schemas.push({
|
|
311
|
+
name: tableName,
|
|
312
|
+
rowCount,
|
|
313
|
+
size: chunkPTIRB2JO_js.formatBytes(sizeBytes),
|
|
314
|
+
columns: columnsRows.map((col) => {
|
|
315
|
+
var _a;
|
|
316
|
+
return {
|
|
317
|
+
name: col.column_name,
|
|
318
|
+
type: col.data_type,
|
|
319
|
+
nullable: col.is_nullable === "YES",
|
|
320
|
+
isPrimary: col.column_key === "PRI",
|
|
321
|
+
defaultValue: (_a = col.column_default) != null ? _a : void 0
|
|
322
|
+
};
|
|
323
|
+
}),
|
|
324
|
+
indexes: indexRows.map((idx) => {
|
|
325
|
+
var _a, _b;
|
|
326
|
+
return {
|
|
327
|
+
name: idx.index_name,
|
|
328
|
+
columns: (_b = (_a = idx.columns) == null ? void 0 : _a.split(",")) != null ? _b : [],
|
|
329
|
+
unique: Boolean(idx.is_unique)
|
|
330
|
+
};
|
|
331
|
+
}),
|
|
332
|
+
foreignKeys: fkRows.map((fk) => ({
|
|
333
|
+
columnName: fk.column_name,
|
|
334
|
+
referencedTable: fk.referenced_table,
|
|
335
|
+
referencedColumn: fk.referenced_column
|
|
336
|
+
}))
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
return schemas;
|
|
340
|
+
} finally {
|
|
341
|
+
conn.release();
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// ============================================================================
|
|
345
|
+
// Health & Monitoring
|
|
346
|
+
// ============================================================================
|
|
347
|
+
async getHealth() {
|
|
348
|
+
var _a, _b, _c;
|
|
349
|
+
this.ensureConnected();
|
|
350
|
+
const conn = await this.pool.getConnection();
|
|
351
|
+
try {
|
|
352
|
+
const [connRows] = await conn.execute(
|
|
353
|
+
"SHOW STATUS LIKE 'Threads_connected'"
|
|
354
|
+
);
|
|
355
|
+
const activeConnections = parseInt(((_a = connRows[0]) == null ? void 0 : _a.Value) || "0");
|
|
356
|
+
const [sizeRows] = await conn.execute(`
|
|
357
|
+
SELECT
|
|
358
|
+
ROUND(SUM(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) as size_mb
|
|
359
|
+
FROM information_schema.TABLES
|
|
360
|
+
WHERE TABLE_SCHEMA = ?;
|
|
361
|
+
`, [this.config.database]);
|
|
362
|
+
const databaseSize = `${((_b = sizeRows[0]) == null ? void 0 : _b.size_mb) || 0} MB`;
|
|
363
|
+
const [hitRows] = await conn.execute(`
|
|
364
|
+
SELECT
|
|
365
|
+
(1 - (
|
|
366
|
+
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads') /
|
|
367
|
+
NULLIF((SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests'), 0)
|
|
368
|
+
)) * 100 as hit_ratio;
|
|
369
|
+
`);
|
|
370
|
+
const cacheHitRatio = `${(((_c = hitRows[0]) == null ? void 0 : _c.hit_ratio) || 99).toFixed(1)}%`;
|
|
371
|
+
let slowQueries = [];
|
|
372
|
+
try {
|
|
373
|
+
const [slowRows] = await conn.execute(`
|
|
374
|
+
SELECT
|
|
375
|
+
LEFT(sql_text, 100) as query,
|
|
376
|
+
count_star as calls,
|
|
377
|
+
CONCAT(ROUND(avg_timer_wait / 1000000000, 2), 'ms') as avgTime
|
|
378
|
+
FROM performance_schema.events_statements_summary_by_digest
|
|
379
|
+
WHERE schema_name = ?
|
|
380
|
+
ORDER BY sum_timer_wait DESC
|
|
381
|
+
LIMIT 5;
|
|
382
|
+
`, [this.config.database]);
|
|
383
|
+
slowQueries = slowRows.map((r) => ({
|
|
384
|
+
query: r.query || "",
|
|
385
|
+
calls: parseInt(r.calls || "0"),
|
|
386
|
+
avgTime: r.avgTime || "N/A"
|
|
387
|
+
}));
|
|
388
|
+
} catch (e) {
|
|
389
|
+
slowQueries = [{ query: "Performance schema not available", calls: 0, avgTime: "N/A" }];
|
|
390
|
+
}
|
|
391
|
+
const [sessionRows] = await conn.execute(`
|
|
392
|
+
SELECT
|
|
393
|
+
ID as pid,
|
|
394
|
+
USER as user,
|
|
395
|
+
DB as \`database\`,
|
|
396
|
+
COMMAND as state,
|
|
397
|
+
LEFT(COALESCE(INFO, ''), 100) as query,
|
|
398
|
+
CONCAT(TIME, 's') as duration
|
|
399
|
+
FROM information_schema.PROCESSLIST
|
|
400
|
+
WHERE DB = ?
|
|
401
|
+
ORDER BY TIME DESC
|
|
402
|
+
LIMIT 10;
|
|
403
|
+
`, [this.config.database]);
|
|
404
|
+
const activeSessions = sessionRows.map((r) => ({
|
|
405
|
+
pid: r.pid,
|
|
406
|
+
user: r.user || "unknown",
|
|
407
|
+
database: r.database || "",
|
|
408
|
+
state: r.state || "unknown",
|
|
409
|
+
query: r.query || "",
|
|
410
|
+
duration: r.duration || "N/A"
|
|
411
|
+
}));
|
|
412
|
+
return {
|
|
413
|
+
activeConnections,
|
|
414
|
+
databaseSize,
|
|
415
|
+
cacheHitRatio,
|
|
416
|
+
slowQueries,
|
|
417
|
+
activeSessions
|
|
418
|
+
};
|
|
419
|
+
} finally {
|
|
420
|
+
conn.release();
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
// ============================================================================
|
|
424
|
+
// Maintenance Operations
|
|
425
|
+
// ============================================================================
|
|
426
|
+
async runMaintenance(type, target) {
|
|
427
|
+
this.ensureConnected();
|
|
428
|
+
const { result, executionTime } = await this.measureExecution(async () => {
|
|
429
|
+
const conn = await this.pool.getConnection();
|
|
430
|
+
try {
|
|
431
|
+
let sql = "";
|
|
432
|
+
switch (type) {
|
|
433
|
+
case "analyze":
|
|
434
|
+
sql = target ? `ANALYZE TABLE ${this.escapeIdentifier(target)}` : `ANALYZE TABLE ${await this.getAllTablesForMaintenance(conn)}`;
|
|
435
|
+
break;
|
|
436
|
+
case "optimize":
|
|
437
|
+
sql = target ? `OPTIMIZE TABLE ${this.escapeIdentifier(target)}` : `OPTIMIZE TABLE ${await this.getAllTablesForMaintenance(conn)}`;
|
|
438
|
+
break;
|
|
439
|
+
case "check":
|
|
440
|
+
sql = target ? `CHECK TABLE ${this.escapeIdentifier(target)}` : `CHECK TABLE ${await this.getAllTablesForMaintenance(conn)}`;
|
|
441
|
+
break;
|
|
442
|
+
case "kill":
|
|
443
|
+
if (!target) {
|
|
444
|
+
throw new chunkJZO5KRZN_js.QueryError("Target connection ID is required for kill operation", "mysql");
|
|
445
|
+
}
|
|
446
|
+
const connId = parseInt(target, 10);
|
|
447
|
+
if (isNaN(connId)) {
|
|
448
|
+
throw new chunkJZO5KRZN_js.QueryError("Invalid connection ID for kill operation", "mysql");
|
|
449
|
+
}
|
|
450
|
+
sql = `KILL ${connId}`;
|
|
451
|
+
break;
|
|
452
|
+
default:
|
|
453
|
+
throw new chunkJZO5KRZN_js.QueryError(`Unsupported maintenance type for MySQL: ${type}`, "mysql");
|
|
454
|
+
}
|
|
455
|
+
await conn.execute(sql);
|
|
456
|
+
return { success: true };
|
|
457
|
+
} finally {
|
|
458
|
+
conn.release();
|
|
459
|
+
}
|
|
460
|
+
});
|
|
461
|
+
return {
|
|
462
|
+
success: result.success,
|
|
463
|
+
executionTime,
|
|
464
|
+
message: `${type.toUpperCase()} completed successfully`
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
async getAllTablesForMaintenance(conn) {
|
|
468
|
+
const [rows] = await conn.execute(`
|
|
469
|
+
SELECT TABLE_NAME
|
|
470
|
+
FROM information_schema.TABLES
|
|
471
|
+
WHERE TABLE_SCHEMA = ?
|
|
472
|
+
AND TABLE_TYPE = 'BASE TABLE'
|
|
473
|
+
LIMIT 50;
|
|
474
|
+
`, [this.config.database]);
|
|
475
|
+
return rows.map((r) => this.escapeIdentifier(r.TABLE_NAME)).join(", ");
|
|
476
|
+
}
|
|
477
|
+
// ============================================================================
|
|
478
|
+
// Monitoring Operations
|
|
479
|
+
// ============================================================================
|
|
480
|
+
async getOverview() {
|
|
481
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
482
|
+
this.ensureConnected();
|
|
483
|
+
const conn = await this.pool.getConnection();
|
|
484
|
+
try {
|
|
485
|
+
const [versionRows] = await conn.execute("SELECT VERSION() as version");
|
|
486
|
+
const version = ((_a = versionRows[0]) == null ? void 0 : _a.version) || "Unknown";
|
|
487
|
+
const [uptimeRows] = await conn.execute(
|
|
488
|
+
"SHOW STATUS LIKE 'Uptime'"
|
|
489
|
+
);
|
|
490
|
+
const uptimeSeconds = parseInt(((_b = uptimeRows[0]) == null ? void 0 : _b.Value) || "0");
|
|
491
|
+
const uptime = this.formatUptimeString(uptimeSeconds);
|
|
492
|
+
const [connRows] = await conn.execute(
|
|
493
|
+
"SHOW STATUS LIKE 'Threads_connected'"
|
|
494
|
+
);
|
|
495
|
+
const activeConnections = parseInt(((_c = connRows[0]) == null ? void 0 : _c.Value) || "0");
|
|
496
|
+
const [maxConnRows] = await conn.execute(
|
|
497
|
+
"SHOW VARIABLES LIKE 'max_connections'"
|
|
498
|
+
);
|
|
499
|
+
const maxConnections = parseInt(((_d = maxConnRows[0]) == null ? void 0 : _d.Value) || "151");
|
|
500
|
+
const [sizeRows] = await conn.execute(`
|
|
501
|
+
SELECT SUM(DATA_LENGTH + INDEX_LENGTH) as size_bytes
|
|
502
|
+
FROM information_schema.TABLES
|
|
503
|
+
WHERE TABLE_SCHEMA = ?;
|
|
504
|
+
`, [this.config.database]);
|
|
505
|
+
const databaseSizeBytes = parseInt(((_e = sizeRows[0]) == null ? void 0 : _e.size_bytes) || "0");
|
|
506
|
+
const [countRows] = await conn.execute(`
|
|
507
|
+
SELECT
|
|
508
|
+
COUNT(DISTINCT TABLE_NAME) as table_count,
|
|
509
|
+
COUNT(DISTINCT INDEX_NAME) as index_count
|
|
510
|
+
FROM information_schema.STATISTICS
|
|
511
|
+
WHERE TABLE_SCHEMA = ?;
|
|
512
|
+
`, [this.config.database]);
|
|
513
|
+
const [tableCountRows] = await conn.execute(`
|
|
514
|
+
SELECT COUNT(*) as cnt FROM information_schema.TABLES
|
|
515
|
+
WHERE TABLE_SCHEMA = ? AND TABLE_TYPE = 'BASE TABLE';
|
|
516
|
+
`, [this.config.database]);
|
|
517
|
+
return {
|
|
518
|
+
version: `MySQL ${version}`,
|
|
519
|
+
uptime,
|
|
520
|
+
startTime: new Date(Date.now() - uptimeSeconds * 1e3),
|
|
521
|
+
activeConnections,
|
|
522
|
+
maxConnections,
|
|
523
|
+
databaseSize: chunkPTIRB2JO_js.formatBytes(databaseSizeBytes),
|
|
524
|
+
databaseSizeBytes,
|
|
525
|
+
tableCount: parseInt(((_f = tableCountRows[0]) == null ? void 0 : _f.cnt) || "0"),
|
|
526
|
+
indexCount: parseInt(((_g = countRows[0]) == null ? void 0 : _g.index_count) || "0")
|
|
527
|
+
};
|
|
528
|
+
} finally {
|
|
529
|
+
conn.release();
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
async getPerformanceMetrics() {
|
|
533
|
+
var _a, _b, _c, _d, _e, _f;
|
|
534
|
+
this.ensureConnected();
|
|
535
|
+
const conn = await this.pool.getConnection();
|
|
536
|
+
try {
|
|
537
|
+
const [hitRows] = await conn.execute(`
|
|
538
|
+
SELECT
|
|
539
|
+
(1 - (
|
|
540
|
+
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads') /
|
|
541
|
+
NULLIF((SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests'), 0)
|
|
542
|
+
)) * 100 as hit_ratio;
|
|
543
|
+
`);
|
|
544
|
+
const cacheHitRatio = parseFloat(((_a = hitRows[0]) == null ? void 0 : _a.hit_ratio) || "99");
|
|
545
|
+
const [poolRows] = await conn.execute(`
|
|
546
|
+
SELECT
|
|
547
|
+
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data') as data_pages,
|
|
548
|
+
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total') as total_pages;
|
|
549
|
+
`);
|
|
550
|
+
const dataPages = parseInt(((_b = poolRows[0]) == null ? void 0 : _b.data_pages) || "0");
|
|
551
|
+
const totalPages = parseInt(((_c = poolRows[0]) == null ? void 0 : _c.total_pages) || "1");
|
|
552
|
+
const bufferPoolUsage = dataPages / totalPages * 100;
|
|
553
|
+
const [qpsRows] = await conn.execute(`
|
|
554
|
+
SELECT
|
|
555
|
+
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Queries') as queries,
|
|
556
|
+
(SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Uptime') as uptime;
|
|
557
|
+
`);
|
|
558
|
+
const queries = parseInt(((_d = qpsRows[0]) == null ? void 0 : _d.queries) || "0");
|
|
559
|
+
const uptime = parseInt(((_e = qpsRows[0]) == null ? void 0 : _e.uptime) || "1");
|
|
560
|
+
const queriesPerSecond = queries / uptime;
|
|
561
|
+
const [deadlockRows] = await conn.execute(
|
|
562
|
+
"SHOW STATUS LIKE 'Innodb_deadlocks'"
|
|
563
|
+
);
|
|
564
|
+
const deadlocks = parseInt(((_f = deadlockRows[0]) == null ? void 0 : _f.Value) || "0");
|
|
565
|
+
return {
|
|
566
|
+
cacheHitRatio: Math.min(100, Math.max(0, cacheHitRatio)),
|
|
567
|
+
queriesPerSecond: Math.round(queriesPerSecond * 100) / 100,
|
|
568
|
+
bufferPoolUsage: Math.round(bufferPoolUsage * 100) / 100,
|
|
569
|
+
deadlocks
|
|
570
|
+
};
|
|
571
|
+
} catch (e) {
|
|
572
|
+
return {
|
|
573
|
+
cacheHitRatio: 99,
|
|
574
|
+
queriesPerSecond: 0,
|
|
575
|
+
bufferPoolUsage: 0,
|
|
576
|
+
deadlocks: 0
|
|
577
|
+
};
|
|
578
|
+
} finally {
|
|
579
|
+
conn.release();
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
async getSlowQueries(options) {
|
|
583
|
+
var _a;
|
|
584
|
+
this.ensureConnected();
|
|
585
|
+
const limit = (_a = options == null ? void 0 : options.limit) != null ? _a : 10;
|
|
586
|
+
const conn = await this.pool.getConnection();
|
|
587
|
+
try {
|
|
588
|
+
const [rows] = await conn.execute(`
|
|
589
|
+
SELECT
|
|
590
|
+
DIGEST as query_id,
|
|
591
|
+
LEFT(DIGEST_TEXT, 500) as query,
|
|
592
|
+
COUNT_STAR as calls,
|
|
593
|
+
SUM_TIMER_WAIT / 1000000000 as total_time_ms,
|
|
594
|
+
AVG_TIMER_WAIT / 1000000000 as avg_time_ms,
|
|
595
|
+
MIN_TIMER_WAIT / 1000000000 as min_time_ms,
|
|
596
|
+
MAX_TIMER_WAIT / 1000000000 as max_time_ms,
|
|
597
|
+
SUM_ROWS_EXAMINED as rows_examined
|
|
598
|
+
FROM performance_schema.events_statements_summary_by_digest
|
|
599
|
+
WHERE SCHEMA_NAME = ?
|
|
600
|
+
ORDER BY SUM_TIMER_WAIT DESC
|
|
601
|
+
LIMIT ${Number(limit)};
|
|
602
|
+
`, [this.config.database]);
|
|
603
|
+
return rows.map((r) => ({
|
|
604
|
+
queryId: r.query_id || void 0,
|
|
605
|
+
query: r.query || "",
|
|
606
|
+
calls: parseInt(r.calls || "0"),
|
|
607
|
+
totalTime: parseFloat(r.total_time_ms || "0"),
|
|
608
|
+
avgTime: parseFloat(r.avg_time_ms || "0"),
|
|
609
|
+
minTime: parseFloat(r.min_time_ms || "0"),
|
|
610
|
+
maxTime: parseFloat(r.max_time_ms || "0"),
|
|
611
|
+
rows: parseInt(r.rows_examined || "0")
|
|
612
|
+
}));
|
|
613
|
+
} catch (e) {
|
|
614
|
+
return [];
|
|
615
|
+
} finally {
|
|
616
|
+
conn.release();
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
async getActiveSessions(options) {
|
|
620
|
+
var _a;
|
|
621
|
+
this.ensureConnected();
|
|
622
|
+
const limit = (_a = options == null ? void 0 : options.limit) != null ? _a : 50;
|
|
623
|
+
const conn = await this.pool.getConnection();
|
|
624
|
+
try {
|
|
625
|
+
const [rows] = await conn.execute(`
|
|
626
|
+
SELECT
|
|
627
|
+
ID as pid,
|
|
628
|
+
USER as user,
|
|
629
|
+
DB as database_name,
|
|
630
|
+
HOST as client_addr,
|
|
631
|
+
COMMAND as state,
|
|
632
|
+
LEFT(COALESCE(INFO, ''), 500) as query,
|
|
633
|
+
TIME as duration_seconds
|
|
634
|
+
FROM information_schema.PROCESSLIST
|
|
635
|
+
WHERE DB = ? OR DB IS NULL
|
|
636
|
+
ORDER BY TIME DESC
|
|
637
|
+
LIMIT ${Number(limit)};
|
|
638
|
+
`, [this.config.database]);
|
|
639
|
+
return rows.map((r) => {
|
|
640
|
+
var _a2;
|
|
641
|
+
const durationSeconds = parseInt(r.duration_seconds || "0");
|
|
642
|
+
return {
|
|
643
|
+
pid: r.pid,
|
|
644
|
+
user: r.user || "unknown",
|
|
645
|
+
database: r.database_name || "",
|
|
646
|
+
clientAddr: ((_a2 = r.client_addr) == null ? void 0 : _a2.split(":")[0]) || void 0,
|
|
647
|
+
state: r.state || "unknown",
|
|
648
|
+
query: r.query || "",
|
|
649
|
+
duration: this.formatDurationString(durationSeconds * 1e3),
|
|
650
|
+
durationMs: durationSeconds * 1e3
|
|
651
|
+
};
|
|
652
|
+
});
|
|
653
|
+
} finally {
|
|
654
|
+
conn.release();
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
async getTableStats(options) {
|
|
658
|
+
var _a;
|
|
659
|
+
this.ensureConnected();
|
|
660
|
+
const schema = (_a = options == null ? void 0 : options.schema) != null ? _a : this.config.database;
|
|
661
|
+
const conn = await this.pool.getConnection();
|
|
662
|
+
try {
|
|
663
|
+
const [rows] = await conn.execute(`
|
|
664
|
+
SELECT
|
|
665
|
+
TABLE_SCHEMA as schema_name,
|
|
666
|
+
TABLE_NAME as table_name,
|
|
667
|
+
TABLE_ROWS as row_count,
|
|
668
|
+
DATA_LENGTH as table_size_bytes,
|
|
669
|
+
INDEX_LENGTH as index_size_bytes,
|
|
670
|
+
DATA_LENGTH + INDEX_LENGTH as total_size_bytes,
|
|
671
|
+
DATA_FREE as free_space_bytes
|
|
672
|
+
FROM information_schema.TABLES
|
|
673
|
+
WHERE TABLE_SCHEMA = ?
|
|
674
|
+
AND TABLE_TYPE = 'BASE TABLE'
|
|
675
|
+
ORDER BY DATA_LENGTH + INDEX_LENGTH DESC
|
|
676
|
+
LIMIT 100;
|
|
677
|
+
`, [schema]);
|
|
678
|
+
return rows.map((r) => {
|
|
679
|
+
const tableSizeBytes = parseInt(r.table_size_bytes || "0");
|
|
680
|
+
const indexSizeBytes = parseInt(r.index_size_bytes || "0");
|
|
681
|
+
const totalSizeBytes = parseInt(r.total_size_bytes || "0");
|
|
682
|
+
const freeSpaceBytes = parseInt(r.free_space_bytes || "0");
|
|
683
|
+
const bloatRatio = totalSizeBytes > 0 ? freeSpaceBytes / totalSizeBytes * 100 : 0;
|
|
684
|
+
return {
|
|
685
|
+
schemaName: r.schema_name || schema || "",
|
|
686
|
+
tableName: r.table_name || "",
|
|
687
|
+
rowCount: parseInt(r.row_count || "0"),
|
|
688
|
+
tableSize: chunkPTIRB2JO_js.formatBytes(tableSizeBytes),
|
|
689
|
+
tableSizeBytes,
|
|
690
|
+
indexSize: chunkPTIRB2JO_js.formatBytes(indexSizeBytes),
|
|
691
|
+
totalSize: chunkPTIRB2JO_js.formatBytes(totalSizeBytes),
|
|
692
|
+
totalSizeBytes,
|
|
693
|
+
bloatRatio: Math.round(bloatRatio * 10) / 10
|
|
694
|
+
};
|
|
695
|
+
});
|
|
696
|
+
} finally {
|
|
697
|
+
conn.release();
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
async getIndexStats(options) {
|
|
701
|
+
var _a;
|
|
702
|
+
this.ensureConnected();
|
|
703
|
+
const schema = (_a = options == null ? void 0 : options.schema) != null ? _a : this.config.database;
|
|
704
|
+
const conn = await this.pool.getConnection();
|
|
705
|
+
try {
|
|
706
|
+
const [rows] = await conn.execute(`
|
|
707
|
+
SELECT
|
|
708
|
+
TABLE_SCHEMA as schema_name,
|
|
709
|
+
TABLE_NAME as table_name,
|
|
710
|
+
INDEX_NAME as index_name,
|
|
711
|
+
INDEX_TYPE as index_type,
|
|
712
|
+
GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) as columns,
|
|
713
|
+
NOT NON_UNIQUE as is_unique,
|
|
714
|
+
INDEX_NAME = 'PRIMARY' as is_primary,
|
|
715
|
+
MAX(CARDINALITY) as cardinality
|
|
716
|
+
FROM information_schema.STATISTICS
|
|
717
|
+
WHERE TABLE_SCHEMA = ?
|
|
718
|
+
GROUP BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, INDEX_TYPE, NON_UNIQUE
|
|
719
|
+
ORDER BY TABLE_NAME, INDEX_NAME
|
|
720
|
+
LIMIT 200;
|
|
721
|
+
`, [schema]);
|
|
722
|
+
const indexSizes = {};
|
|
723
|
+
try {
|
|
724
|
+
const [sizeRows] = await conn.execute(`
|
|
725
|
+
SELECT
|
|
726
|
+
CONCAT(t.NAME) as full_name,
|
|
727
|
+
SUM(s.INDEX_SIZE * @@innodb_page_size) as size_bytes
|
|
728
|
+
FROM information_schema.INNODB_INDEXES i
|
|
729
|
+
JOIN information_schema.INNODB_TABLES t ON i.TABLE_ID = t.TABLE_ID
|
|
730
|
+
JOIN information_schema.INNODB_TABLESPACES s ON t.SPACE = s.SPACE
|
|
731
|
+
WHERE t.NAME LIKE ?
|
|
732
|
+
GROUP BY t.NAME, i.NAME;
|
|
733
|
+
`, [`${schema}/%`]);
|
|
734
|
+
for (const row of sizeRows) {
|
|
735
|
+
indexSizes[row.full_name] = parseInt(row.size_bytes || "0");
|
|
736
|
+
}
|
|
737
|
+
} catch (e) {
|
|
738
|
+
}
|
|
739
|
+
return rows.map((r) => {
|
|
740
|
+
var _a2;
|
|
741
|
+
const indexKey = `${r.schema_name}/${r.table_name}`;
|
|
742
|
+
const indexSizeBytes = indexSizes[indexKey] || 0;
|
|
743
|
+
return {
|
|
744
|
+
schemaName: r.schema_name || schema || "",
|
|
745
|
+
tableName: r.table_name || "",
|
|
746
|
+
indexName: r.index_name || "",
|
|
747
|
+
indexType: r.index_type || "BTREE",
|
|
748
|
+
columns: ((_a2 = r.columns) == null ? void 0 : _a2.split(",")) || [],
|
|
749
|
+
isUnique: Boolean(r.is_unique),
|
|
750
|
+
isPrimary: Boolean(r.is_primary),
|
|
751
|
+
indexSize: chunkPTIRB2JO_js.formatBytes(indexSizeBytes),
|
|
752
|
+
indexSizeBytes,
|
|
753
|
+
scans: parseInt(r.cardinality || "0")
|
|
754
|
+
};
|
|
755
|
+
});
|
|
756
|
+
} finally {
|
|
757
|
+
conn.release();
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
async getStorageStats() {
|
|
761
|
+
this.ensureConnected();
|
|
762
|
+
const conn = await this.pool.getConnection();
|
|
763
|
+
try {
|
|
764
|
+
const stats = [];
|
|
765
|
+
const [dbRows] = await conn.execute(`
|
|
766
|
+
SELECT
|
|
767
|
+
TABLE_SCHEMA as name,
|
|
768
|
+
SUM(DATA_LENGTH + INDEX_LENGTH) as size_bytes
|
|
769
|
+
FROM information_schema.TABLES
|
|
770
|
+
WHERE TABLE_SCHEMA = ?
|
|
771
|
+
GROUP BY TABLE_SCHEMA;
|
|
772
|
+
`, [this.config.database]);
|
|
773
|
+
if (dbRows.length > 0) {
|
|
774
|
+
const sizeBytes = parseInt(dbRows[0].size_bytes || "0");
|
|
775
|
+
stats.push({
|
|
776
|
+
name: "Data",
|
|
777
|
+
location: this.config.database || "default",
|
|
778
|
+
size: chunkPTIRB2JO_js.formatBytes(sizeBytes),
|
|
779
|
+
sizeBytes
|
|
780
|
+
});
|
|
781
|
+
}
|
|
782
|
+
try {
|
|
783
|
+
const [binlogRows] = await conn.execute("SHOW BINARY LOGS");
|
|
784
|
+
const binlogSize = binlogRows.reduce((sum, r) => sum + parseInt(r.File_size || "0"), 0);
|
|
785
|
+
if (binlogSize > 0) {
|
|
786
|
+
stats.push({
|
|
787
|
+
name: "Binary Logs",
|
|
788
|
+
size: chunkPTIRB2JO_js.formatBytes(binlogSize),
|
|
789
|
+
sizeBytes: binlogSize
|
|
790
|
+
});
|
|
791
|
+
}
|
|
792
|
+
} catch (e) {
|
|
793
|
+
}
|
|
794
|
+
try {
|
|
795
|
+
const [innodbRows] = await conn.execute(
|
|
796
|
+
"SHOW VARIABLES LIKE 'innodb_data_file_path'"
|
|
797
|
+
);
|
|
798
|
+
if (innodbRows.length > 0) {
|
|
799
|
+
stats.push({
|
|
800
|
+
name: "InnoDB",
|
|
801
|
+
location: innodbRows[0].Value || "ibdata1",
|
|
802
|
+
size: "N/A",
|
|
803
|
+
sizeBytes: 0
|
|
804
|
+
});
|
|
805
|
+
}
|
|
806
|
+
} catch (e) {
|
|
807
|
+
}
|
|
808
|
+
return stats;
|
|
809
|
+
} finally {
|
|
810
|
+
conn.release();
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
formatUptimeString(seconds) {
|
|
814
|
+
const days = Math.floor(seconds / 86400);
|
|
815
|
+
const hours = Math.floor(seconds % 86400 / 3600);
|
|
816
|
+
const minutes = Math.floor(seconds % 3600 / 60);
|
|
817
|
+
if (days > 0) return `${days}d ${hours}h`;
|
|
818
|
+
if (hours > 0) return `${hours}h ${minutes}m`;
|
|
819
|
+
return `${minutes}m`;
|
|
820
|
+
}
|
|
821
|
+
formatDurationString(ms) {
|
|
822
|
+
if (ms < 1e3) return `${ms}ms`;
|
|
823
|
+
if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
|
|
824
|
+
if (ms < 36e5) return `${Math.floor(ms / 6e4)}m ${Math.floor(ms % 6e4 / 1e3)}s`;
|
|
825
|
+
return `${Math.floor(ms / 36e5)}h ${Math.floor(ms % 36e5 / 6e4)}m`;
|
|
826
|
+
}
|
|
827
|
+
};
|
|
828
|
+
_MySQLProvider.TX_TIMEOUT_MS = 5 * 60 * 1e3;
|
|
829
|
+
var MySQLProvider = _MySQLProvider;
|
|
830
|
+
|
|
831
|
+
exports.MySQLProvider = MySQLProvider;
|
|
832
|
+
//# sourceMappingURL=mysql-Y3MSA5QY.js.map
|
|
833
|
+
//# sourceMappingURL=mysql-Y3MSA5QY.js.map
|