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