@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
|
@@ -0,0 +1,916 @@
|
|
|
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 mssql = require('mssql');
|
|
8
|
+
|
|
9
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
|
|
11
|
+
var mssql__default = /*#__PURE__*/_interopDefault(mssql);
|
|
12
|
+
|
|
13
|
+
var MSSQLProvider = class extends chunkKV356UXJ_js.SQLBaseProvider {
|
|
14
|
+
constructor(config, options = {}) {
|
|
15
|
+
super(config, options);
|
|
16
|
+
this.pool = null;
|
|
17
|
+
// Transaction support
|
|
18
|
+
this.txTransaction = null;
|
|
19
|
+
this.txActive = false;
|
|
20
|
+
// Track running requests for cancellation
|
|
21
|
+
this.runningRequests = /* @__PURE__ */ new Map();
|
|
22
|
+
this.validate();
|
|
23
|
+
}
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Provider Metadata
|
|
26
|
+
// ============================================================================
|
|
27
|
+
getCapabilities() {
|
|
28
|
+
return chunkQ6LRDBK7_js.__spreadProps(chunkQ6LRDBK7_js.__spreadValues({}, super.getCapabilities()), {
|
|
29
|
+
defaultPort: 1433,
|
|
30
|
+
supportsExplain: true,
|
|
31
|
+
supportsConnectionString: true,
|
|
32
|
+
maintenanceOperations: ["analyze", "check", "optimize", "kill"]
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
getLabels() {
|
|
36
|
+
return chunkQ6LRDBK7_js.__spreadProps(chunkQ6LRDBK7_js.__spreadValues({}, super.getLabels()), {
|
|
37
|
+
analyzeAction: "Update Statistics",
|
|
38
|
+
vacuumAction: "Rebuild Indexes",
|
|
39
|
+
analyzeGlobalLabel: "Update Stats",
|
|
40
|
+
analyzeGlobalTitle: "Update Statistics",
|
|
41
|
+
analyzeGlobalDesc: "Updates query optimizer statistics for all tables to improve query performance.",
|
|
42
|
+
vacuumGlobalLabel: "Rebuild Indexes",
|
|
43
|
+
vacuumGlobalTitle: "Rebuild All Indexes",
|
|
44
|
+
vacuumGlobalDesc: "Rebuilds all indexes to reclaim space and reduce fragmentation."
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
// ============================================================================
|
|
48
|
+
// SQL Dialect Overrides
|
|
49
|
+
// ============================================================================
|
|
50
|
+
escapeIdentifier(identifier) {
|
|
51
|
+
const escaped = identifier.replace(/\]/g, "]]");
|
|
52
|
+
return `[${escaped}]`;
|
|
53
|
+
}
|
|
54
|
+
// ============================================================================
|
|
55
|
+
// Validation
|
|
56
|
+
// ============================================================================
|
|
57
|
+
validate() {
|
|
58
|
+
super.validate();
|
|
59
|
+
if (!this.config.connectionString) {
|
|
60
|
+
if (!this.config.host) {
|
|
61
|
+
throw new chunkJZO5KRZN_js.DatabaseConfigError("Host is required for SQL Server", "mssql");
|
|
62
|
+
}
|
|
63
|
+
if (!this.config.database) {
|
|
64
|
+
throw new chunkJZO5KRZN_js.DatabaseConfigError("Database name is required for SQL Server", "mssql");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// ============================================================================
|
|
69
|
+
// Connection Management
|
|
70
|
+
// ============================================================================
|
|
71
|
+
buildConfig() {
|
|
72
|
+
const host = this.config.host || "localhost";
|
|
73
|
+
const port = this.config.port || 1433;
|
|
74
|
+
const isAzure = host.endsWith(".database.windows.net");
|
|
75
|
+
const sslConfig = this.config.ssl;
|
|
76
|
+
let encrypt = true;
|
|
77
|
+
let trustServerCertificate = !isAzure;
|
|
78
|
+
if (sslConfig) {
|
|
79
|
+
if (sslConfig.mode === "disable") {
|
|
80
|
+
encrypt = false;
|
|
81
|
+
} else {
|
|
82
|
+
encrypt = true;
|
|
83
|
+
trustServerCertificate = sslConfig.mode === "require";
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const config = {
|
|
87
|
+
user: this.config.user,
|
|
88
|
+
password: this.config.password,
|
|
89
|
+
server: host,
|
|
90
|
+
port,
|
|
91
|
+
database: this.config.database,
|
|
92
|
+
pool: {
|
|
93
|
+
min: this.poolConfig.min,
|
|
94
|
+
max: this.poolConfig.max,
|
|
95
|
+
idleTimeoutMillis: this.poolConfig.idleTimeout
|
|
96
|
+
},
|
|
97
|
+
options: {
|
|
98
|
+
encrypt,
|
|
99
|
+
trustServerCertificate,
|
|
100
|
+
connectTimeout: this.poolConfig.acquireTimeout,
|
|
101
|
+
requestTimeout: this.queryTimeout
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
if (this.config.instanceName) {
|
|
105
|
+
config.options = chunkQ6LRDBK7_js.__spreadProps(chunkQ6LRDBK7_js.__spreadValues({}, config.options), {
|
|
106
|
+
instanceName: this.config.instanceName
|
|
107
|
+
});
|
|
108
|
+
delete config.port;
|
|
109
|
+
}
|
|
110
|
+
return config;
|
|
111
|
+
}
|
|
112
|
+
async connect() {
|
|
113
|
+
if (this.pool) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
const config = this.buildConfig();
|
|
118
|
+
this.pool = new mssql__default.default.ConnectionPool(config);
|
|
119
|
+
await this.pool.connect();
|
|
120
|
+
await this.pool.request().query("SELECT 1 AS test");
|
|
121
|
+
this.setConnected(true);
|
|
122
|
+
} catch (error) {
|
|
123
|
+
this.setError(error instanceof Error ? error : new Error(String(error)));
|
|
124
|
+
throw new chunkJZO5KRZN_js.ConnectionError(
|
|
125
|
+
`Failed to connect to SQL Server: ${error instanceof Error ? error.message : error}`,
|
|
126
|
+
"mssql",
|
|
127
|
+
this.config.host,
|
|
128
|
+
this.config.port
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async disconnect() {
|
|
133
|
+
if (this.pool) {
|
|
134
|
+
try {
|
|
135
|
+
await this.pool.close();
|
|
136
|
+
} catch (e) {
|
|
137
|
+
}
|
|
138
|
+
this.pool = null;
|
|
139
|
+
this.setConnected(false);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// ============================================================================
|
|
143
|
+
// Query Execution
|
|
144
|
+
// ============================================================================
|
|
145
|
+
async query(sql, params, queryId) {
|
|
146
|
+
this.ensureConnected();
|
|
147
|
+
return this.trackQuery(async () => {
|
|
148
|
+
var _a, _b;
|
|
149
|
+
const { result, executionTime } = await this.measureExecution(async () => {
|
|
150
|
+
try {
|
|
151
|
+
const request = this.pool.request();
|
|
152
|
+
if (queryId) {
|
|
153
|
+
this.runningRequests.set(queryId, request);
|
|
154
|
+
}
|
|
155
|
+
if (params && params.length > 0) {
|
|
156
|
+
params.forEach((p, i) => {
|
|
157
|
+
request.input(`p${i + 1}`, p);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
const res = await request.query(sql);
|
|
161
|
+
return res;
|
|
162
|
+
} catch (error) {
|
|
163
|
+
throw chunkJZO5KRZN_js.mapDatabaseError(error, "mssql", sql);
|
|
164
|
+
} finally {
|
|
165
|
+
if (queryId) this.runningRequests.delete(queryId);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
const recordset = result.recordset || [];
|
|
169
|
+
const fields = recordset.columns ? Object.keys(recordset.columns) : recordset.length > 0 ? Object.keys(recordset[0]) : [];
|
|
170
|
+
return {
|
|
171
|
+
rows: recordset,
|
|
172
|
+
fields,
|
|
173
|
+
rowCount: (_b = (_a = result.rowsAffected) == null ? void 0 : _a[0]) != null ? _b : recordset.length,
|
|
174
|
+
executionTime
|
|
175
|
+
};
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
async cancelQuery(queryId) {
|
|
179
|
+
const request = this.runningRequests.get(queryId);
|
|
180
|
+
if (!request) return false;
|
|
181
|
+
try {
|
|
182
|
+
request.cancel();
|
|
183
|
+
return true;
|
|
184
|
+
} catch (error) {
|
|
185
|
+
console.error("[MSSQL] Failed to cancel query:", error);
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// ============================================================================
|
|
190
|
+
// Query Preparation (MSSQL TOP / OFFSET FETCH)
|
|
191
|
+
// ============================================================================
|
|
192
|
+
prepareQuery(query, options = {}) {
|
|
193
|
+
const { limit = chunkKV356UXJ_js.DEFAULT_QUERY_LIMIT, offset = 0, unlimited = false } = options;
|
|
194
|
+
const effectiveLimit = unlimited ? chunkKV356UXJ_js.MAX_UNLIMITED_ROWS : limit;
|
|
195
|
+
const queryInfo = chunkKV356UXJ_js.analyzeQuery(query);
|
|
196
|
+
if (queryInfo.type === "SELECT" && !queryInfo.hasLimit) {
|
|
197
|
+
let modifiedSql = query.trim();
|
|
198
|
+
const hasSemicolon = modifiedSql.endsWith(";");
|
|
199
|
+
if (hasSemicolon) modifiedSql = modifiedSql.slice(0, -1).trim();
|
|
200
|
+
if (offset > 0) {
|
|
201
|
+
const hasOrderBy = /\bORDER\s+BY\b/i.test(modifiedSql);
|
|
202
|
+
if (!hasOrderBy) {
|
|
203
|
+
modifiedSql = `${modifiedSql} ORDER BY (SELECT NULL)`;
|
|
204
|
+
}
|
|
205
|
+
modifiedSql = `${modifiedSql} OFFSET ${offset} ROWS FETCH NEXT ${effectiveLimit} ROWS ONLY`;
|
|
206
|
+
} else {
|
|
207
|
+
modifiedSql = modifiedSql.replace(
|
|
208
|
+
/^(\s*SELECT\s+)(DISTINCT\s+)?/i,
|
|
209
|
+
`$1$2TOP ${effectiveLimit} `
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
if (hasSemicolon) modifiedSql += ";";
|
|
213
|
+
return {
|
|
214
|
+
query: modifiedSql,
|
|
215
|
+
wasLimited: true,
|
|
216
|
+
limit: effectiveLimit,
|
|
217
|
+
offset
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
return { query, wasLimited: false, limit: effectiveLimit, offset };
|
|
221
|
+
}
|
|
222
|
+
// ============================================================================
|
|
223
|
+
// Transaction Support
|
|
224
|
+
// ============================================================================
|
|
225
|
+
async beginTransaction() {
|
|
226
|
+
this.ensureConnected();
|
|
227
|
+
if (this.txActive) throw new chunkJZO5KRZN_js.QueryError("Transaction already active", "mssql");
|
|
228
|
+
this.txTransaction = new mssql__default.default.Transaction(this.pool);
|
|
229
|
+
await this.txTransaction.begin();
|
|
230
|
+
this.txActive = true;
|
|
231
|
+
}
|
|
232
|
+
async commitTransaction() {
|
|
233
|
+
if (!this.txTransaction || !this.txActive) throw new chunkJZO5KRZN_js.QueryError("No active transaction", "mssql");
|
|
234
|
+
try {
|
|
235
|
+
await this.txTransaction.commit();
|
|
236
|
+
} finally {
|
|
237
|
+
this.txTransaction = null;
|
|
238
|
+
this.txActive = false;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
async rollbackTransaction() {
|
|
242
|
+
if (!this.txTransaction || !this.txActive) throw new chunkJZO5KRZN_js.QueryError("No active transaction", "mssql");
|
|
243
|
+
try {
|
|
244
|
+
await this.txTransaction.rollback();
|
|
245
|
+
} finally {
|
|
246
|
+
this.txTransaction = null;
|
|
247
|
+
this.txActive = false;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
isInTransaction() {
|
|
251
|
+
return this.txActive;
|
|
252
|
+
}
|
|
253
|
+
async queryInTransaction(sql, params) {
|
|
254
|
+
if (!this.txTransaction || !this.txActive) throw new chunkJZO5KRZN_js.QueryError("No active transaction", "mssql");
|
|
255
|
+
return this.trackQuery(async () => {
|
|
256
|
+
var _a, _b;
|
|
257
|
+
const { result, executionTime } = await this.measureExecution(async () => {
|
|
258
|
+
try {
|
|
259
|
+
const request = new mssql__default.default.Request(this.txTransaction);
|
|
260
|
+
if (params && params.length > 0) {
|
|
261
|
+
params.forEach((p, i) => {
|
|
262
|
+
request.input(`p${i + 1}`, p);
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
return await request.query(sql);
|
|
266
|
+
} catch (error) {
|
|
267
|
+
throw chunkJZO5KRZN_js.mapDatabaseError(error, "mssql", sql);
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
const recordset = result.recordset || [];
|
|
271
|
+
const fields = recordset.length > 0 ? Object.keys(recordset[0]) : [];
|
|
272
|
+
return {
|
|
273
|
+
rows: recordset,
|
|
274
|
+
fields,
|
|
275
|
+
rowCount: (_b = (_a = result.rowsAffected) == null ? void 0 : _a[0]) != null ? _b : recordset.length,
|
|
276
|
+
executionTime
|
|
277
|
+
};
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
// ============================================================================
|
|
281
|
+
// Schema Operations
|
|
282
|
+
// ============================================================================
|
|
283
|
+
async getSchema() {
|
|
284
|
+
this.ensureConnected();
|
|
285
|
+
try {
|
|
286
|
+
const tablesRes = await this.pool.request().query(`
|
|
287
|
+
SELECT
|
|
288
|
+
s.name AS schema_name,
|
|
289
|
+
t.name AS table_name,
|
|
290
|
+
SUM(p.rows) AS row_count
|
|
291
|
+
FROM sys.tables t
|
|
292
|
+
JOIN sys.schemas s ON t.schema_id = s.schema_id
|
|
293
|
+
LEFT JOIN sys.partitions p ON t.object_id = p.object_id AND p.index_id IN (0, 1)
|
|
294
|
+
WHERE t.type = 'U'
|
|
295
|
+
GROUP BY s.name, t.name
|
|
296
|
+
ORDER BY s.name, t.name
|
|
297
|
+
`);
|
|
298
|
+
const tables = tablesRes.recordset || [];
|
|
299
|
+
const colsRes = await this.pool.request().query(`
|
|
300
|
+
SELECT
|
|
301
|
+
TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE,
|
|
302
|
+
IS_NULLABLE, COLUMN_DEFAULT, ORDINAL_POSITION
|
|
303
|
+
FROM INFORMATION_SCHEMA.COLUMNS
|
|
304
|
+
ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION
|
|
305
|
+
`);
|
|
306
|
+
const allCols = colsRes.recordset || [];
|
|
307
|
+
const pkRes = await this.pool.request().query(`
|
|
308
|
+
SELECT
|
|
309
|
+
s.name AS schema_name,
|
|
310
|
+
t.name AS table_name,
|
|
311
|
+
c.name AS column_name
|
|
312
|
+
FROM sys.indexes i
|
|
313
|
+
JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
|
|
314
|
+
JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
|
|
315
|
+
JOIN sys.tables t ON i.object_id = t.object_id
|
|
316
|
+
JOIN sys.schemas s ON t.schema_id = s.schema_id
|
|
317
|
+
WHERE i.is_primary_key = 1
|
|
318
|
+
`);
|
|
319
|
+
const pkMap = /* @__PURE__ */ new Map();
|
|
320
|
+
for (const row of pkRes.recordset || []) {
|
|
321
|
+
const key = `${row.schema_name}.${row.table_name}`;
|
|
322
|
+
if (!pkMap.has(key)) pkMap.set(key, /* @__PURE__ */ new Set());
|
|
323
|
+
pkMap.get(key).add(row.column_name);
|
|
324
|
+
}
|
|
325
|
+
const fkRes = await this.pool.request().query(`
|
|
326
|
+
SELECT
|
|
327
|
+
OBJECT_SCHEMA_NAME(fk.parent_object_id) AS schema_name,
|
|
328
|
+
OBJECT_NAME(fk.parent_object_id) AS table_name,
|
|
329
|
+
COL_NAME(fkc.parent_object_id, fkc.parent_column_id) AS column_name,
|
|
330
|
+
OBJECT_NAME(fk.referenced_object_id) AS ref_table,
|
|
331
|
+
COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) AS ref_column
|
|
332
|
+
FROM sys.foreign_keys fk
|
|
333
|
+
JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
|
|
334
|
+
`);
|
|
335
|
+
const fksByTable = /* @__PURE__ */ new Map();
|
|
336
|
+
for (const row of fkRes.recordset || []) {
|
|
337
|
+
const key = `${row.schema_name}.${row.table_name}`;
|
|
338
|
+
if (!fksByTable.has(key)) fksByTable.set(key, []);
|
|
339
|
+
fksByTable.get(key).push({
|
|
340
|
+
columnName: row.column_name,
|
|
341
|
+
referencedTable: row.ref_table,
|
|
342
|
+
referencedColumn: row.ref_column
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
const idxRes = await this.pool.request().query(`
|
|
346
|
+
SELECT
|
|
347
|
+
s.name AS schema_name,
|
|
348
|
+
t.name AS table_name,
|
|
349
|
+
i.name AS index_name,
|
|
350
|
+
i.is_unique,
|
|
351
|
+
c.name AS column_name,
|
|
352
|
+
ic.key_ordinal
|
|
353
|
+
FROM sys.indexes i
|
|
354
|
+
JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
|
|
355
|
+
JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
|
|
356
|
+
JOIN sys.tables t ON i.object_id = t.object_id
|
|
357
|
+
JOIN sys.schemas s ON t.schema_id = s.schema_id
|
|
358
|
+
WHERE i.name IS NOT NULL AND i.is_primary_key = 0
|
|
359
|
+
ORDER BY s.name, t.name, i.name, ic.key_ordinal
|
|
360
|
+
`);
|
|
361
|
+
const idxByTable = /* @__PURE__ */ new Map();
|
|
362
|
+
for (const row of idxRes.recordset || []) {
|
|
363
|
+
const key = `${row.schema_name}.${row.table_name}`;
|
|
364
|
+
if (!idxByTable.has(key)) idxByTable.set(key, /* @__PURE__ */ new Map());
|
|
365
|
+
const tableIdxs = idxByTable.get(key);
|
|
366
|
+
if (!tableIdxs.has(row.index_name)) {
|
|
367
|
+
tableIdxs.set(row.index_name, { unique: row.is_unique, columns: [] });
|
|
368
|
+
}
|
|
369
|
+
tableIdxs.get(row.index_name).columns.push(row.column_name);
|
|
370
|
+
}
|
|
371
|
+
const colsByTable = /* @__PURE__ */ new Map();
|
|
372
|
+
for (const c of allCols) {
|
|
373
|
+
const key = `${c.TABLE_SCHEMA}.${c.TABLE_NAME}`;
|
|
374
|
+
if (!colsByTable.has(key)) colsByTable.set(key, []);
|
|
375
|
+
colsByTable.get(key).push(c);
|
|
376
|
+
}
|
|
377
|
+
return tables.map((t) => {
|
|
378
|
+
const schemaName = String(t.schema_name || "dbo");
|
|
379
|
+
const tableName = String(t.table_name || "");
|
|
380
|
+
const key = `${schemaName}.${tableName}`;
|
|
381
|
+
const displayName = schemaName === "dbo" ? tableName : `${schemaName}.${tableName}`;
|
|
382
|
+
const pks = pkMap.get(key) || /* @__PURE__ */ new Set();
|
|
383
|
+
const columns = (colsByTable.get(key) || []).map((c) => ({
|
|
384
|
+
name: String(c.COLUMN_NAME || ""),
|
|
385
|
+
type: String(c.DATA_TYPE || ""),
|
|
386
|
+
nullable: String(c.IS_NULLABLE || "") === "YES",
|
|
387
|
+
isPrimary: pks.has(String(c.COLUMN_NAME || "")),
|
|
388
|
+
defaultValue: c.COLUMN_DEFAULT ? String(c.COLUMN_DEFAULT) : void 0
|
|
389
|
+
}));
|
|
390
|
+
const foreignKeys = fksByTable.get(key) || [];
|
|
391
|
+
const tableIdxs = idxByTable.get(key) || /* @__PURE__ */ new Map();
|
|
392
|
+
const indexes = Array.from(tableIdxs.entries()).map(([name, info]) => ({
|
|
393
|
+
name,
|
|
394
|
+
columns: info.columns,
|
|
395
|
+
unique: info.unique
|
|
396
|
+
}));
|
|
397
|
+
return {
|
|
398
|
+
name: displayName,
|
|
399
|
+
rowCount: Number(t.row_count || 0),
|
|
400
|
+
columns,
|
|
401
|
+
indexes,
|
|
402
|
+
foreignKeys
|
|
403
|
+
};
|
|
404
|
+
});
|
|
405
|
+
} catch (error) {
|
|
406
|
+
throw chunkJZO5KRZN_js.mapDatabaseError(error, "mssql");
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
// ============================================================================
|
|
410
|
+
// Health & Monitoring
|
|
411
|
+
// ============================================================================
|
|
412
|
+
async getHealth() {
|
|
413
|
+
var _a, _b, _c;
|
|
414
|
+
this.ensureConnected();
|
|
415
|
+
try {
|
|
416
|
+
let activeConnections = 0;
|
|
417
|
+
let databaseSize = "N/A";
|
|
418
|
+
let cacheHitRatio = "N/A";
|
|
419
|
+
const slowQueries = [];
|
|
420
|
+
const activeSessions = [];
|
|
421
|
+
try {
|
|
422
|
+
const connRes = await this.pool.request().query(
|
|
423
|
+
`SELECT COUNT(*) AS cnt FROM sys.dm_exec_sessions WHERE is_user_process = 1`
|
|
424
|
+
);
|
|
425
|
+
activeConnections = ((_a = connRes.recordset[0]) == null ? void 0 : _a.cnt) || 0;
|
|
426
|
+
} catch (e) {
|
|
427
|
+
}
|
|
428
|
+
try {
|
|
429
|
+
const sizeRes = await this.pool.request().query(`
|
|
430
|
+
SELECT
|
|
431
|
+
CAST(SUM(size) * 8.0 / 1024 AS DECIMAL(10,2)) AS size_mb
|
|
432
|
+
FROM sys.database_files
|
|
433
|
+
`);
|
|
434
|
+
const mb = Number(((_b = sizeRes.recordset[0]) == null ? void 0 : _b.size_mb) || 0);
|
|
435
|
+
databaseSize = mb > 1024 ? `${(mb / 1024).toFixed(2)} GB` : `${mb} MB`;
|
|
436
|
+
} catch (e) {
|
|
437
|
+
}
|
|
438
|
+
try {
|
|
439
|
+
const cacheRes = await this.pool.request().query(`
|
|
440
|
+
SELECT
|
|
441
|
+
CAST(
|
|
442
|
+
(a.cntr_value * 1.0 / NULLIF(b.cntr_value, 0)) * 100
|
|
443
|
+
AS DECIMAL(5,2)
|
|
444
|
+
) AS hit_ratio
|
|
445
|
+
FROM sys.dm_os_performance_counters a
|
|
446
|
+
CROSS JOIN sys.dm_os_performance_counters b
|
|
447
|
+
WHERE a.counter_name = 'Buffer cache hit ratio'
|
|
448
|
+
AND a.object_name LIKE '%Buffer Manager%'
|
|
449
|
+
AND b.counter_name = 'Buffer cache hit ratio base'
|
|
450
|
+
AND b.object_name LIKE '%Buffer Manager%'
|
|
451
|
+
`);
|
|
452
|
+
cacheHitRatio = `${((_c = cacheRes.recordset[0]) == null ? void 0 : _c.hit_ratio) || 0}%`;
|
|
453
|
+
} catch (e) {
|
|
454
|
+
}
|
|
455
|
+
try {
|
|
456
|
+
const slowRes = await this.pool.request().query(`
|
|
457
|
+
SELECT TOP 5
|
|
458
|
+
SUBSTRING(qt.text, 1, 100) AS query,
|
|
459
|
+
qs.execution_count AS calls,
|
|
460
|
+
CAST(qs.total_elapsed_time / NULLIF(qs.execution_count, 0) / 1000.0 AS DECIMAL(10,2)) AS avg_time_ms
|
|
461
|
+
FROM sys.dm_exec_query_stats qs
|
|
462
|
+
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
|
|
463
|
+
WHERE qs.execution_count > 0
|
|
464
|
+
ORDER BY qs.total_elapsed_time DESC
|
|
465
|
+
`);
|
|
466
|
+
for (const row of slowRes.recordset || []) {
|
|
467
|
+
slowQueries.push({
|
|
468
|
+
query: String(row.query || ""),
|
|
469
|
+
calls: Number(row.calls || 0),
|
|
470
|
+
avgTime: `${row.avg_time_ms}ms`
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
} catch (e) {
|
|
474
|
+
}
|
|
475
|
+
try {
|
|
476
|
+
const sessRes = await this.pool.request().query(`
|
|
477
|
+
SELECT TOP 10
|
|
478
|
+
s.session_id AS pid,
|
|
479
|
+
s.login_name AS [user],
|
|
480
|
+
DB_NAME(s.database_id) AS [database],
|
|
481
|
+
s.status AS state,
|
|
482
|
+
ISNULL(SUBSTRING(t.text, 1, 100), '') AS query,
|
|
483
|
+
ISNULL(CAST(DATEDIFF(SECOND, s.last_request_start_time, GETDATE()) AS VARCHAR) + 's', 'N/A') AS duration
|
|
484
|
+
FROM sys.dm_exec_sessions s
|
|
485
|
+
LEFT JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
|
|
486
|
+
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t
|
|
487
|
+
WHERE s.is_user_process = 1
|
|
488
|
+
ORDER BY s.last_request_start_time DESC
|
|
489
|
+
`);
|
|
490
|
+
for (const row of sessRes.recordset || []) {
|
|
491
|
+
activeSessions.push({
|
|
492
|
+
pid: Number(row.pid || 0),
|
|
493
|
+
user: String(row.user || "unknown"),
|
|
494
|
+
database: String(row.database || ""),
|
|
495
|
+
state: String(row.state || "unknown"),
|
|
496
|
+
query: String(row.query || ""),
|
|
497
|
+
duration: String(row.duration || "N/A")
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
} catch (e) {
|
|
501
|
+
}
|
|
502
|
+
return { activeConnections, databaseSize, cacheHitRatio, slowQueries, activeSessions };
|
|
503
|
+
} catch (error) {
|
|
504
|
+
throw chunkJZO5KRZN_js.mapDatabaseError(error, "mssql");
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
// ============================================================================
|
|
508
|
+
// Maintenance Operations
|
|
509
|
+
// ============================================================================
|
|
510
|
+
async runMaintenance(type, target) {
|
|
511
|
+
this.ensureConnected();
|
|
512
|
+
const { result, executionTime } = await this.measureExecution(async () => {
|
|
513
|
+
try {
|
|
514
|
+
let sql = "";
|
|
515
|
+
switch (type) {
|
|
516
|
+
case "analyze":
|
|
517
|
+
if (target) {
|
|
518
|
+
sql = `UPDATE STATISTICS [${target.replace(/\]/g, "]]")}]`;
|
|
519
|
+
} else {
|
|
520
|
+
sql = `EXEC sp_updatestats`;
|
|
521
|
+
}
|
|
522
|
+
break;
|
|
523
|
+
case "check":
|
|
524
|
+
sql = `DBCC CHECKDB WITH NO_INFOMSGS`;
|
|
525
|
+
break;
|
|
526
|
+
case "optimize":
|
|
527
|
+
if (target) {
|
|
528
|
+
sql = `ALTER INDEX ALL ON [${target.replace(/\]/g, "]]")}] REBUILD`;
|
|
529
|
+
} else {
|
|
530
|
+
sql = `
|
|
531
|
+
DECLARE @sql NVARCHAR(MAX) = '';
|
|
532
|
+
SELECT @sql = @sql + 'ALTER INDEX ALL ON [' + s.name + '].[' + t.name + '] REBUILD;'
|
|
533
|
+
FROM sys.tables t
|
|
534
|
+
JOIN sys.schemas s ON t.schema_id = s.schema_id
|
|
535
|
+
WHERE t.type = 'U';
|
|
536
|
+
EXEC sp_executesql @sql;
|
|
537
|
+
`;
|
|
538
|
+
}
|
|
539
|
+
break;
|
|
540
|
+
case "kill":
|
|
541
|
+
if (!target) {
|
|
542
|
+
throw new chunkJZO5KRZN_js.QueryError("Target SPID is required for kill operation", "mssql");
|
|
543
|
+
}
|
|
544
|
+
const spid = parseInt(target, 10);
|
|
545
|
+
if (isNaN(spid)) {
|
|
546
|
+
throw new chunkJZO5KRZN_js.QueryError("Invalid SPID for kill operation", "mssql");
|
|
547
|
+
}
|
|
548
|
+
sql = `KILL ${spid}`;
|
|
549
|
+
break;
|
|
550
|
+
default:
|
|
551
|
+
throw new chunkJZO5KRZN_js.QueryError(`Unsupported maintenance type: ${type}`, "mssql");
|
|
552
|
+
}
|
|
553
|
+
await this.pool.request().query(sql);
|
|
554
|
+
return { success: true };
|
|
555
|
+
} catch (error) {
|
|
556
|
+
throw chunkJZO5KRZN_js.mapDatabaseError(error, "mssql");
|
|
557
|
+
}
|
|
558
|
+
});
|
|
559
|
+
return {
|
|
560
|
+
success: result.success,
|
|
561
|
+
executionTime,
|
|
562
|
+
message: `${type.toUpperCase()} completed successfully`
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
// ============================================================================
|
|
566
|
+
// Pool Statistics
|
|
567
|
+
// ============================================================================
|
|
568
|
+
getPoolStats() {
|
|
569
|
+
if (!this.pool) {
|
|
570
|
+
return { total: 0, idle: 0, active: 0, waiting: 0 };
|
|
571
|
+
}
|
|
572
|
+
return {
|
|
573
|
+
total: this.pool.size,
|
|
574
|
+
idle: this.pool.available,
|
|
575
|
+
active: this.pool.size - this.pool.available,
|
|
576
|
+
waiting: this.pool.pending
|
|
577
|
+
};
|
|
578
|
+
}
|
|
579
|
+
// ============================================================================
|
|
580
|
+
// Extended Monitoring Methods
|
|
581
|
+
// ============================================================================
|
|
582
|
+
async getOverview() {
|
|
583
|
+
var _a, _b, _c, _d, _e, _f;
|
|
584
|
+
this.ensureConnected();
|
|
585
|
+
try {
|
|
586
|
+
let version = "SQL Server";
|
|
587
|
+
let uptime = "N/A";
|
|
588
|
+
let startTime;
|
|
589
|
+
let activeConnections = 0;
|
|
590
|
+
let maxConnections = 0;
|
|
591
|
+
let databaseSize = "0 bytes";
|
|
592
|
+
let databaseSizeBytes = 0;
|
|
593
|
+
let tableCount = 0;
|
|
594
|
+
let indexCount = 0;
|
|
595
|
+
try {
|
|
596
|
+
const vRes = await this.pool.request().query(`SELECT @@VERSION AS version`);
|
|
597
|
+
version = String(((_a = vRes.recordset[0]) == null ? void 0 : _a.version) || "").split("\n")[0];
|
|
598
|
+
} catch (e) {
|
|
599
|
+
}
|
|
600
|
+
try {
|
|
601
|
+
const upRes = await this.pool.request().query(`
|
|
602
|
+
SELECT sqlserver_start_time,
|
|
603
|
+
DATEDIFF(SECOND, sqlserver_start_time, GETDATE()) AS uptime_seconds
|
|
604
|
+
FROM sys.dm_os_sys_info
|
|
605
|
+
`);
|
|
606
|
+
if (upRes.recordset[0]) {
|
|
607
|
+
const secs = Number(upRes.recordset[0].uptime_seconds || 0);
|
|
608
|
+
const days = Math.floor(secs / 86400);
|
|
609
|
+
const hours = Math.floor(secs % 86400 / 3600);
|
|
610
|
+
const minutes = Math.floor(secs % 3600 / 60);
|
|
611
|
+
uptime = days > 0 ? `${days}d ${hours}h ${minutes}m` : hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`;
|
|
612
|
+
startTime = new Date(upRes.recordset[0].sqlserver_start_time);
|
|
613
|
+
}
|
|
614
|
+
} catch (e) {
|
|
615
|
+
}
|
|
616
|
+
try {
|
|
617
|
+
const connRes = await this.pool.request().query(`
|
|
618
|
+
SELECT
|
|
619
|
+
COUNT(*) AS active_connections,
|
|
620
|
+
(SELECT CAST(value_in_use AS INT) FROM sys.configurations WHERE name = 'user connections') AS max_connections
|
|
621
|
+
FROM sys.dm_exec_sessions
|
|
622
|
+
WHERE is_user_process = 1
|
|
623
|
+
`);
|
|
624
|
+
activeConnections = Number(((_b = connRes.recordset[0]) == null ? void 0 : _b.active_connections) || 0);
|
|
625
|
+
maxConnections = Number(((_c = connRes.recordset[0]) == null ? void 0 : _c.max_connections) || 32767);
|
|
626
|
+
if (maxConnections === 0) maxConnections = 32767;
|
|
627
|
+
} catch (e) {
|
|
628
|
+
}
|
|
629
|
+
try {
|
|
630
|
+
const sizeRes = await this.pool.request().query(`
|
|
631
|
+
SELECT SUM(CAST(size AS BIGINT)) * 8 * 1024 AS size_bytes FROM sys.database_files
|
|
632
|
+
`);
|
|
633
|
+
databaseSizeBytes = Number(((_d = sizeRes.recordset[0]) == null ? void 0 : _d.size_bytes) || 0);
|
|
634
|
+
databaseSize = chunkPTIRB2JO_js.formatBytes(databaseSizeBytes);
|
|
635
|
+
} catch (e) {
|
|
636
|
+
}
|
|
637
|
+
try {
|
|
638
|
+
const cntRes = await this.pool.request().query(`
|
|
639
|
+
SELECT
|
|
640
|
+
(SELECT COUNT(*) FROM sys.tables WHERE type = 'U') AS table_count,
|
|
641
|
+
(SELECT COUNT(*) FROM sys.indexes WHERE object_id IN (SELECT object_id FROM sys.tables WHERE type = 'U') AND name IS NOT NULL) AS index_count
|
|
642
|
+
`);
|
|
643
|
+
tableCount = Number(((_e = cntRes.recordset[0]) == null ? void 0 : _e.table_count) || 0);
|
|
644
|
+
indexCount = Number(((_f = cntRes.recordset[0]) == null ? void 0 : _f.index_count) || 0);
|
|
645
|
+
} catch (e) {
|
|
646
|
+
}
|
|
647
|
+
return {
|
|
648
|
+
version,
|
|
649
|
+
uptime,
|
|
650
|
+
startTime,
|
|
651
|
+
activeConnections,
|
|
652
|
+
maxConnections,
|
|
653
|
+
databaseSize,
|
|
654
|
+
databaseSizeBytes,
|
|
655
|
+
tableCount,
|
|
656
|
+
indexCount
|
|
657
|
+
};
|
|
658
|
+
} catch (error) {
|
|
659
|
+
throw chunkJZO5KRZN_js.mapDatabaseError(error, "mssql");
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
async getPerformanceMetrics() {
|
|
663
|
+
var _a;
|
|
664
|
+
this.ensureConnected();
|
|
665
|
+
try {
|
|
666
|
+
let cacheHitRatio = 100;
|
|
667
|
+
let bufferPoolUsage;
|
|
668
|
+
try {
|
|
669
|
+
const cacheRes = await this.pool.request().query(`
|
|
670
|
+
SELECT
|
|
671
|
+
CAST(
|
|
672
|
+
(a.cntr_value * 1.0 / NULLIF(b.cntr_value, 0)) * 100
|
|
673
|
+
AS DECIMAL(5,2)
|
|
674
|
+
) AS hit_ratio
|
|
675
|
+
FROM sys.dm_os_performance_counters a
|
|
676
|
+
CROSS JOIN sys.dm_os_performance_counters b
|
|
677
|
+
WHERE a.counter_name = 'Buffer cache hit ratio'
|
|
678
|
+
AND a.object_name LIKE '%Buffer Manager%'
|
|
679
|
+
AND b.counter_name = 'Buffer cache hit ratio base'
|
|
680
|
+
AND b.object_name LIKE '%Buffer Manager%'
|
|
681
|
+
`);
|
|
682
|
+
cacheHitRatio = Number(((_a = cacheRes.recordset[0]) == null ? void 0 : _a.hit_ratio) || 100);
|
|
683
|
+
bufferPoolUsage = cacheHitRatio;
|
|
684
|
+
} catch (e) {
|
|
685
|
+
}
|
|
686
|
+
return {
|
|
687
|
+
cacheHitRatio,
|
|
688
|
+
bufferPoolUsage
|
|
689
|
+
};
|
|
690
|
+
} catch (error) {
|
|
691
|
+
throw chunkJZO5KRZN_js.mapDatabaseError(error, "mssql");
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
async getSlowQueries(options) {
|
|
695
|
+
var _a;
|
|
696
|
+
this.ensureConnected();
|
|
697
|
+
const limit = (_a = options == null ? void 0 : options.limit) != null ? _a : 10;
|
|
698
|
+
try {
|
|
699
|
+
const res = await this.pool.request().query(`
|
|
700
|
+
SELECT TOP ${limit}
|
|
701
|
+
CAST(qs.query_hash AS VARCHAR(50)) AS query_id,
|
|
702
|
+
SUBSTRING(qt.text, 1, 500) AS query,
|
|
703
|
+
qs.execution_count AS calls,
|
|
704
|
+
CAST(qs.total_elapsed_time / 1000.0 AS DECIMAL(18,2)) AS total_time,
|
|
705
|
+
CAST(qs.total_elapsed_time / NULLIF(qs.execution_count, 0) / 1000.0 AS DECIMAL(18,2)) AS avg_time,
|
|
706
|
+
CAST(qs.min_elapsed_time / 1000.0 AS DECIMAL(18,2)) AS min_time,
|
|
707
|
+
CAST(qs.max_elapsed_time / 1000.0 AS DECIMAL(18,2)) AS max_time,
|
|
708
|
+
qs.total_rows AS row_cnt,
|
|
709
|
+
qs.total_logical_reads AS logical_reads,
|
|
710
|
+
qs.total_physical_reads AS physical_reads
|
|
711
|
+
FROM sys.dm_exec_query_stats qs
|
|
712
|
+
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
|
|
713
|
+
WHERE qs.execution_count > 0
|
|
714
|
+
ORDER BY qs.total_elapsed_time DESC
|
|
715
|
+
`);
|
|
716
|
+
return (res.recordset || []).map((r) => ({
|
|
717
|
+
queryId: String(r.query_id || ""),
|
|
718
|
+
query: String(r.query || ""),
|
|
719
|
+
calls: Number(r.calls || 0),
|
|
720
|
+
totalTime: Number(r.total_time || 0),
|
|
721
|
+
avgTime: Number(r.avg_time || 0),
|
|
722
|
+
minTime: Number(r.min_time || 0),
|
|
723
|
+
maxTime: Number(r.max_time || 0),
|
|
724
|
+
rows: Number(r.row_cnt || 0),
|
|
725
|
+
sharedBlksHit: Number(r.logical_reads || 0),
|
|
726
|
+
sharedBlksRead: Number(r.physical_reads || 0)
|
|
727
|
+
}));
|
|
728
|
+
} catch (e) {
|
|
729
|
+
return [];
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
async getActiveSessions(options) {
|
|
733
|
+
var _a;
|
|
734
|
+
this.ensureConnected();
|
|
735
|
+
const limit = (_a = options == null ? void 0 : options.limit) != null ? _a : 50;
|
|
736
|
+
try {
|
|
737
|
+
const res = await this.pool.request().query(`
|
|
738
|
+
SELECT TOP ${limit}
|
|
739
|
+
s.session_id AS pid,
|
|
740
|
+
s.login_name AS [user],
|
|
741
|
+
DB_NAME(s.database_id) AS [database],
|
|
742
|
+
s.program_name AS application_name,
|
|
743
|
+
s.host_name AS client_addr,
|
|
744
|
+
s.status AS state,
|
|
745
|
+
ISNULL(SUBSTRING(t.text, 1, 500), '') AS query,
|
|
746
|
+
s.last_request_start_time AS query_start,
|
|
747
|
+
ISNULL(CAST(DATEDIFF(SECOND, s.last_request_start_time, GETDATE()) AS VARCHAR) + 's', 'N/A') AS duration,
|
|
748
|
+
ISNULL(DATEDIFF(MILLISECOND, s.last_request_start_time, GETDATE()), 0) AS duration_ms,
|
|
749
|
+
r.wait_type,
|
|
750
|
+
r.last_wait_type,
|
|
751
|
+
CASE WHEN r.blocking_session_id > 0 THEN 1 ELSE 0 END AS is_blocked
|
|
752
|
+
FROM sys.dm_exec_sessions s
|
|
753
|
+
LEFT JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
|
|
754
|
+
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t
|
|
755
|
+
WHERE s.is_user_process = 1
|
|
756
|
+
ORDER BY
|
|
757
|
+
CASE s.status WHEN 'running' THEN 0 WHEN 'sleeping' THEN 1 ELSE 2 END,
|
|
758
|
+
s.last_request_start_time DESC
|
|
759
|
+
`);
|
|
760
|
+
return (res.recordset || []).map((r) => ({
|
|
761
|
+
pid: Number(r.pid || 0),
|
|
762
|
+
user: String(r.user || "unknown"),
|
|
763
|
+
database: String(r.database || ""),
|
|
764
|
+
applicationName: r.application_name ? String(r.application_name) : void 0,
|
|
765
|
+
clientAddr: r.client_addr ? String(r.client_addr) : void 0,
|
|
766
|
+
state: String(r.state || "unknown"),
|
|
767
|
+
query: String(r.query || ""),
|
|
768
|
+
queryStart: r.query_start ? new Date(String(r.query_start)) : void 0,
|
|
769
|
+
duration: String(r.duration || "N/A"),
|
|
770
|
+
durationMs: Number(r.duration_ms || 0),
|
|
771
|
+
waitEventType: r.wait_type ? String(r.wait_type) : void 0,
|
|
772
|
+
waitEvent: r.last_wait_type ? String(r.last_wait_type) : void 0,
|
|
773
|
+
blocked: Boolean(r.is_blocked)
|
|
774
|
+
}));
|
|
775
|
+
} catch (e) {
|
|
776
|
+
return [];
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
async getTableStats() {
|
|
780
|
+
this.ensureConnected();
|
|
781
|
+
try {
|
|
782
|
+
const res = await this.pool.request().query(`
|
|
783
|
+
SELECT
|
|
784
|
+
s.name AS schema_name,
|
|
785
|
+
t.name AS table_name,
|
|
786
|
+
SUM(p.rows) AS row_count,
|
|
787
|
+
SUM(a.total_pages) * 8 * 1024 AS total_size_bytes,
|
|
788
|
+
SUM(a.used_pages) * 8 * 1024 AS used_size_bytes,
|
|
789
|
+
SUM(CASE WHEN i.type IN (0, 1) THEN a.total_pages ELSE 0 END) * 8 * 1024 AS table_size_bytes,
|
|
790
|
+
SUM(CASE WHEN i.type > 1 THEN a.total_pages ELSE 0 END) * 8 * 1024 AS index_size_bytes,
|
|
791
|
+
STATS_DATE(t.object_id, 1) AS last_stats_update
|
|
792
|
+
FROM sys.tables t
|
|
793
|
+
JOIN sys.schemas s ON t.schema_id = s.schema_id
|
|
794
|
+
JOIN sys.indexes i ON t.object_id = i.object_id
|
|
795
|
+
JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
|
|
796
|
+
JOIN sys.allocation_units a ON p.partition_id = a.container_id
|
|
797
|
+
WHERE t.type = 'U'
|
|
798
|
+
GROUP BY s.name, t.name, t.object_id
|
|
799
|
+
ORDER BY SUM(a.total_pages) DESC
|
|
800
|
+
`);
|
|
801
|
+
return (res.recordset || []).map((r) => {
|
|
802
|
+
const tableSizeBytes = Number(r.table_size_bytes || 0);
|
|
803
|
+
const indexSizeBytes = Number(r.index_size_bytes || 0);
|
|
804
|
+
const totalSizeBytes = Number(r.total_size_bytes || 0);
|
|
805
|
+
return {
|
|
806
|
+
schemaName: String(r.schema_name || "dbo"),
|
|
807
|
+
tableName: String(r.table_name || ""),
|
|
808
|
+
rowCount: Number(r.row_count || 0),
|
|
809
|
+
tableSize: chunkPTIRB2JO_js.formatBytes(tableSizeBytes),
|
|
810
|
+
tableSizeBytes,
|
|
811
|
+
indexSize: chunkPTIRB2JO_js.formatBytes(indexSizeBytes),
|
|
812
|
+
indexSizeBytes,
|
|
813
|
+
totalSize: chunkPTIRB2JO_js.formatBytes(totalSizeBytes),
|
|
814
|
+
totalSizeBytes,
|
|
815
|
+
lastAnalyze: r.last_stats_update ? new Date(String(r.last_stats_update)) : void 0
|
|
816
|
+
};
|
|
817
|
+
});
|
|
818
|
+
} catch (e) {
|
|
819
|
+
return [];
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
async getIndexStats() {
|
|
823
|
+
this.ensureConnected();
|
|
824
|
+
try {
|
|
825
|
+
const res = await this.pool.request().query(`
|
|
826
|
+
SELECT
|
|
827
|
+
s.name AS schema_name,
|
|
828
|
+
t.name AS table_name,
|
|
829
|
+
i.name AS index_name,
|
|
830
|
+
i.type_desc AS index_type,
|
|
831
|
+
i.is_unique,
|
|
832
|
+
i.is_primary_key,
|
|
833
|
+
SUM(a.total_pages) * 8 * 1024 AS index_size_bytes,
|
|
834
|
+
ISNULL(u.user_seeks + u.user_scans + u.user_lookups, 0) AS scans
|
|
835
|
+
FROM sys.indexes i
|
|
836
|
+
JOIN sys.tables t ON i.object_id = t.object_id
|
|
837
|
+
JOIN sys.schemas s ON t.schema_id = s.schema_id
|
|
838
|
+
LEFT JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
|
|
839
|
+
LEFT JOIN sys.allocation_units a ON p.partition_id = a.container_id
|
|
840
|
+
LEFT JOIN sys.dm_db_index_usage_stats u ON i.object_id = u.object_id AND i.index_id = u.index_id AND u.database_id = DB_ID()
|
|
841
|
+
WHERE i.name IS NOT NULL AND t.type = 'U'
|
|
842
|
+
GROUP BY s.name, t.name, i.name, i.type_desc, i.is_unique, i.is_primary_key,
|
|
843
|
+
i.object_id, i.index_id, u.user_seeks, u.user_scans, u.user_lookups
|
|
844
|
+
ORDER BY SUM(a.total_pages) DESC
|
|
845
|
+
`);
|
|
846
|
+
const colRes = await this.pool.request().query(`
|
|
847
|
+
SELECT
|
|
848
|
+
s.name AS schema_name,
|
|
849
|
+
t.name AS table_name,
|
|
850
|
+
i.name AS index_name,
|
|
851
|
+
c.name AS column_name,
|
|
852
|
+
ic.key_ordinal
|
|
853
|
+
FROM sys.index_columns ic
|
|
854
|
+
JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
|
|
855
|
+
JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
|
|
856
|
+
JOIN sys.tables t ON i.object_id = t.object_id
|
|
857
|
+
JOIN sys.schemas s ON t.schema_id = s.schema_id
|
|
858
|
+
WHERE i.name IS NOT NULL AND t.type = 'U'
|
|
859
|
+
ORDER BY s.name, t.name, i.name, ic.key_ordinal
|
|
860
|
+
`);
|
|
861
|
+
const colMap = /* @__PURE__ */ new Map();
|
|
862
|
+
for (const c of colRes.recordset || []) {
|
|
863
|
+
const key = `${c.schema_name}.${c.table_name}.${c.index_name}`;
|
|
864
|
+
if (!colMap.has(key)) colMap.set(key, []);
|
|
865
|
+
colMap.get(key).push(String(c.column_name));
|
|
866
|
+
}
|
|
867
|
+
return (res.recordset || []).map((r) => {
|
|
868
|
+
const key = `${r.schema_name}.${r.table_name}.${r.index_name}`;
|
|
869
|
+
const idxSizeBytes = Number(r.index_size_bytes || 0);
|
|
870
|
+
return {
|
|
871
|
+
schemaName: String(r.schema_name || "dbo"),
|
|
872
|
+
tableName: String(r.table_name || ""),
|
|
873
|
+
indexName: String(r.index_name || ""),
|
|
874
|
+
indexType: String(r.index_type || ""),
|
|
875
|
+
columns: colMap.get(key) || [],
|
|
876
|
+
isUnique: Boolean(r.is_unique),
|
|
877
|
+
isPrimary: Boolean(r.is_primary_key),
|
|
878
|
+
indexSize: chunkPTIRB2JO_js.formatBytes(idxSizeBytes),
|
|
879
|
+
indexSizeBytes: idxSizeBytes,
|
|
880
|
+
scans: Number(r.scans || 0)
|
|
881
|
+
};
|
|
882
|
+
});
|
|
883
|
+
} catch (e) {
|
|
884
|
+
return [];
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
async getStorageStats() {
|
|
888
|
+
this.ensureConnected();
|
|
889
|
+
try {
|
|
890
|
+
const res = await this.pool.request().query(`
|
|
891
|
+
SELECT
|
|
892
|
+
name,
|
|
893
|
+
physical_name AS location,
|
|
894
|
+
CAST(size AS BIGINT) * 8 * 1024 AS size_bytes,
|
|
895
|
+
type_desc
|
|
896
|
+
FROM sys.database_files
|
|
897
|
+
ORDER BY size DESC
|
|
898
|
+
`);
|
|
899
|
+
return (res.recordset || []).map((r) => {
|
|
900
|
+
const sizeBytes = Number(r.size_bytes || 0);
|
|
901
|
+
return {
|
|
902
|
+
name: String(r.name || ""),
|
|
903
|
+
location: String(r.location || ""),
|
|
904
|
+
size: chunkPTIRB2JO_js.formatBytes(sizeBytes),
|
|
905
|
+
sizeBytes
|
|
906
|
+
};
|
|
907
|
+
});
|
|
908
|
+
} catch (e) {
|
|
909
|
+
return [];
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
};
|
|
913
|
+
|
|
914
|
+
exports.MSSQLProvider = MSSQLProvider;
|
|
915
|
+
//# sourceMappingURL=mssql-PMOU4D36.js.map
|
|
916
|
+
//# sourceMappingURL=mssql-PMOU4D36.js.map
|