@libredb/studio 0.9.7 → 0.9.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-34YQUUCM.mjs +319 -0
- package/dist/chunk-34YQUUCM.mjs.map +1 -0
- package/dist/chunk-4LVB3K53.mjs +37 -0
- package/dist/chunk-4LVB3K53.mjs.map +1 -0
- package/dist/chunk-6DRZXXNT.mjs +100 -0
- package/dist/chunk-6DRZXXNT.mjs.map +1 -0
- package/dist/chunk-CPF7XWV5.mjs +1289 -0
- package/dist/chunk-CPF7XWV5.mjs.map +1 -0
- package/dist/chunk-CZVV3JJB.mjs +160 -0
- package/dist/chunk-CZVV3JJB.mjs.map +1 -0
- package/dist/chunk-D4WVWWWF.js +332 -0
- package/dist/chunk-D4WVWWWF.js.map +1 -0
- package/dist/chunk-DY3KXE44.mjs +3 -0
- package/dist/chunk-DY3KXE44.mjs.map +1 -0
- package/dist/chunk-FYSE52VB.js +242 -0
- package/dist/chunk-FYSE52VB.js.map +1 -0
- package/dist/chunk-G3S66G64.mjs +6673 -0
- package/dist/chunk-G3S66G64.mjs.map +1 -0
- package/dist/chunk-G4WYE6TI.js +4 -0
- package/dist/chunk-G4WYE6TI.js.map +1 -0
- package/dist/chunk-HGPD6PWV.js +1310 -0
- package/dist/chunk-HGPD6PWV.js.map +1 -0
- package/dist/chunk-JZO5KRZN.js +165 -0
- package/dist/chunk-JZO5KRZN.js.map +1 -0
- package/dist/chunk-KV356UXJ.js +253 -0
- package/dist/chunk-KV356UXJ.js.map +1 -0
- package/dist/chunk-PPODO6HX.mjs +237 -0
- package/dist/chunk-PPODO6HX.mjs.map +1 -0
- package/dist/chunk-PTIRB2JO.js +258 -0
- package/dist/chunk-PTIRB2JO.js.map +1 -0
- package/dist/chunk-Q6LRDBK7.js +42 -0
- package/dist/chunk-Q6LRDBK7.js.map +1 -0
- package/dist/chunk-QJP5FZRY.mjs +255 -0
- package/dist/chunk-QJP5FZRY.mjs.map +1 -0
- package/dist/chunk-R3POCJK6.mjs +248 -0
- package/dist/chunk-R3POCJK6.mjs.map +1 -0
- package/dist/chunk-RCQB4FCE.js +186 -0
- package/dist/chunk-RCQB4FCE.js.map +1 -0
- package/dist/chunk-SR5DRGBX.mjs +174 -0
- package/dist/chunk-SR5DRGBX.mjs.map +1 -0
- package/dist/chunk-VLCRUZX7.js +102 -0
- package/dist/chunk-VLCRUZX7.js.map +1 -0
- package/dist/chunk-Y52UIFEX.js +6741 -0
- package/dist/chunk-Y52UIFEX.js.map +1 -0
- package/dist/components.d.mts +273 -0
- package/dist/components.d.ts +273 -0
- package/dist/components.js +59 -0
- package/dist/components.js.map +1 -0
- package/dist/components.mjs +6 -0
- package/dist/components.mjs.map +1 -0
- package/dist/custom-BNDOYC5P.js +134 -0
- package/dist/custom-BNDOYC5P.js.map +1 -0
- package/dist/custom-S2EKFMP3.mjs +132 -0
- package/dist/custom-S2EKFMP3.mjs.map +1 -0
- package/dist/gemini-4ASHNK4H.js +81 -0
- package/dist/gemini-4ASHNK4H.js.map +1 -0
- package/dist/gemini-C5RBLQEJ.mjs +79 -0
- package/dist/gemini-C5RBLQEJ.mjs.map +1 -0
- package/dist/index.d.mts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +10 -0
- package/dist/index.mjs.map +1 -0
- package/dist/mongodb-XMZEZA4A.mjs +748 -0
- package/dist/mongodb-XMZEZA4A.mjs.map +1 -0
- package/dist/mongodb-YQJJTLX3.js +750 -0
- package/dist/mongodb-YQJJTLX3.js.map +1 -0
- package/dist/mssql-PMOU4D36.js +916 -0
- package/dist/mssql-PMOU4D36.js.map +1 -0
- package/{src/lib/db/providers/sql/mssql.ts → dist/mssql-ZH5VP2C5.mjs} +268 -423
- package/dist/mssql-ZH5VP2C5.mjs.map +1 -0
- package/{src/lib/db/providers/sql/mysql.ts → dist/mysql-I3WJQXN2.mjs} +277 -428
- package/dist/mysql-I3WJQXN2.mjs.map +1 -0
- package/dist/mysql-Y3MSA5QY.js +833 -0
- package/dist/mysql-Y3MSA5QY.js.map +1 -0
- package/dist/ollama-26BYLVEV.mjs +115 -0
- package/dist/ollama-26BYLVEV.mjs.map +1 -0
- package/dist/ollama-HVWAGKQC.js +117 -0
- package/dist/ollama-HVWAGKQC.js.map +1 -0
- package/dist/openai-4U56KPG7.mjs +111 -0
- package/dist/openai-4U56KPG7.mjs.map +1 -0
- package/dist/openai-AK3R37BS.js +113 -0
- package/dist/openai-AK3R37BS.js.map +1 -0
- package/dist/oracle-L6VEAVXO.js +917 -0
- package/dist/oracle-L6VEAVXO.js.map +1 -0
- package/{src/lib/db/providers/sql/oracle.ts → dist/oracle-P2G7T4P4.mjs} +321 -454
- package/dist/oracle-P2G7T4P4.mjs.map +1 -0
- package/{src/lib/db/providers/sql/postgres.ts → dist/postgres-O5KOQUVP.mjs} +261 -471
- package/dist/postgres-O5KOQUVP.mjs.map +1 -0
- package/dist/postgres-RLCWNFFX.js +971 -0
- package/dist/postgres-RLCWNFFX.js.map +1 -0
- package/dist/providers.d.mts +149 -0
- package/dist/providers.d.ts +149 -0
- package/dist/providers.js +44 -0
- package/dist/providers.js.map +1 -0
- package/dist/providers.mjs +7 -0
- package/dist/providers.mjs.map +1 -0
- package/dist/redis-4WMQOVLX.mjs +435 -0
- package/dist/redis-4WMQOVLX.mjs.map +1 -0
- package/dist/redis-QVQ6YU62.js +441 -0
- package/dist/redis-QVQ6YU62.js.map +1 -0
- package/dist/sqlite-4I2P2OGQ.js +554 -0
- package/dist/sqlite-4I2P2OGQ.js.map +1 -0
- package/dist/sqlite-OA4YJX5S.mjs +531 -0
- package/dist/sqlite-OA4YJX5S.mjs.map +1 -0
- package/dist/types-BJvJfxSY.d.mts +141 -0
- package/dist/types-BJvJfxSY.d.ts +141 -0
- package/dist/types-ClAg_v5k.d.mts +343 -0
- package/dist/types-Der_X8E8.d.ts +343 -0
- package/dist/types.d.mts +2 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +3 -0
- package/dist/types.mjs.map +1 -0
- package/dist/workspace.d.mts +80 -0
- package/dist/workspace.d.ts +80 -0
- package/dist/workspace.js +4174 -0
- package/dist/workspace.js.map +1 -0
- package/dist/workspace.mjs +4147 -0
- package/dist/workspace.mjs.map +1 -0
- package/package.json +60 -5
- package/.claude/settings.local.json +0 -127
- package/.cursorrules +0 -426
- package/.devin/wiki.json +0 -143
- package/.dockerignore +0 -80
- package/.env.example +0 -159
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -49
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -29
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -57
- package/.github/workflows/ci.yml +0 -185
- package/.github/workflows/codeql.yml +0 -57
- package/.github/workflows/docker-build-push.yml +0 -118
- package/.github/workflows/helm-release.yml +0 -113
- package/CLAUDE.md +0 -265
- package/CODE_OF_CONDUCT.md +0 -124
- package/CONTRIBUTING.md +0 -154
- package/Dockerfile +0 -73
- package/SECURITY.md +0 -107
- package/artifacthub-repo.yml +0 -4
- package/bun.lock +0 -1714
- package/bunfig.toml +0 -3
- package/charts/libredb-studio/.helmignore +0 -11
- package/charts/libredb-studio/Chart.lock +0 -6
- package/charts/libredb-studio/Chart.yaml +0 -50
- package/charts/libredb-studio/README.md +0 -206
- package/charts/libredb-studio/templates/NOTES.txt +0 -59
- package/charts/libredb-studio/templates/_helpers.tpl +0 -135
- package/charts/libredb-studio/templates/configmap.yaml +0 -37
- package/charts/libredb-studio/templates/deployment.yaml +0 -184
- package/charts/libredb-studio/templates/hpa.yaml +0 -32
- package/charts/libredb-studio/templates/ingress.yaml +0 -41
- package/charts/libredb-studio/templates/networkpolicy.yaml +0 -50
- package/charts/libredb-studio/templates/pdb.yaml +0 -18
- package/charts/libredb-studio/templates/pvc.yaml +0 -23
- package/charts/libredb-studio/templates/secret.yaml +0 -30
- package/charts/libredb-studio/templates/seed-configmap.yaml +0 -11
- package/charts/libredb-studio/templates/service.yaml +0 -22
- package/charts/libredb-studio/templates/serviceaccount.yaml +0 -13
- package/charts/libredb-studio/values.schema.json +0 -246
- package/charts/libredb-studio/values.yaml +0 -286
- package/components.json +0 -22
- package/conductor/code_styleguides/typescript.md +0 -43
- package/conductor/product-guidelines.md +0 -43
- package/conductor/product.md +0 -3
- package/conductor/setup_state.json +0 -1
- package/conductor/tech-stack.md +0 -39
- package/conductor/tracks/enhance_postgres_monitoring_20251227/metadata.json +0 -8
- package/conductor/tracks/enhance_postgres_monitoring_20251227/plan.md +0 -44
- package/conductor/tracks/enhance_postgres_monitoring_20251227/spec.md +0 -31
- package/conductor/tracks.md +0 -8
- package/conductor/workflow.md +0 -333
- package/database-compose.yml +0 -55
- package/docker/postgres-init/01-extensions.sql +0 -10
- package/docker/postgres-init/02-sample-data.sql +0 -585
- package/docker/postgres.yml +0 -68
- package/docker-compose.yml +0 -38
- package/docs/AI_PLAN.md +0 -74
- package/docs/API_DOCS.md +0 -875
- package/docs/ARCHITECTURE.md +0 -218
- package/docs/DATABASE_PROVIDERS.md +0 -358
- package/docs/FEATURES.md +0 -116
- package/docs/HELM_CHART.md +0 -252
- package/docs/LOGIN_PAGE.md +0 -178
- package/docs/MONACO_EDITOR_PERFORMANCE.md +0 -315
- package/docs/OIDC_ARCH.md +0 -681
- package/docs/OIDC_SETUP.md +0 -322
- package/docs/POSTGRES_METRICS.md +0 -516
- package/docs/QUERY_OPTIMIZATION.md +0 -370
- package/docs/SEED_CONNECTIONS.md +0 -468
- package/docs/SQL_ALIAS_COMPLETION.md +0 -190
- package/docs/STORAGE_ARCHITECTURE.md +0 -565
- package/docs/STORAGE_QUICK_SETUP.md +0 -419
- package/docs/TECHNICAL_PLAN.md +0 -36
- package/docs/THEMING.md +0 -345
- package/docs/adding-a-new-database-provider.md +0 -642
- package/docs/backlogs/000-PLATFORM_DATA_SYNC_DATABASE.md +0 -360
- package/docs/backlogs/001-INLINE_DATA_EDITING.md +0 -118
- package/docs/backlogs/002-DATA_IMPORT.md +0 -215
- package/docs/backlogs/003-QUERY_TIME_MACHINE.md +0 -183
- package/docs/backlogs/004-AI_DATA_STORYTELLER.md +0 -292
- package/docs/backlogs/005-QUERY_PLAYGROUND.md +0 -352
- package/docs/backlogs/006-DATA_MASKING.md +0 -418
- package/docs/enterprise-features.md +0 -718
- package/docs/kubernetes-helm-chart-artifacthub-plan.md +0 -803
- package/docs/medium-koyeb-article-en.md +0 -215
- package/docs/plans/test-plans.md +0 -445
- package/docs/releases/RELEASE.V0.3.0.md +0 -22
- package/docs/releases/RELEASE.V0.4.0.md +0 -154
- package/docs/releases/RELEASE.V0.5.0.md +0 -252
- package/docs/releases/RELEASE_v0.5.6.md +0 -145
- package/docs/releases/RELEASE_v0.6.1.md +0 -303
- package/docs/releases/RELEASE_v0.6.7.md +0 -292
- package/docs/releases/RELEASE_v0.7.0.md +0 -332
- package/docs/releases/RELEASE_v0.8.0.md +0 -521
- package/docs/sampledb/titanic.sql +0 -1379
- package/docs/superpowers/plans/2026-03-25-seed-connections.md +0 -1362
- package/docs/superpowers/specs/2026-03-25-seed-connections-design.md +0 -590
- package/e2e/admin-dashboard.spec.ts +0 -64
- package/e2e/connection-management.spec.ts +0 -58
- package/e2e/export.spec.ts +0 -34
- package/e2e/login.spec.ts +0 -85
- package/e2e/query-execution.spec.ts +0 -35
- package/e2e/tab-management.spec.ts +0 -64
- package/eslint.config.mjs +0 -28
- package/fly.toml +0 -43
- package/next.config.ts +0 -32
- package/playwright.config.ts +0 -34
- package/postcss.config.mjs +0 -7
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/file.svg +0 -1
- package/public/globe.svg +0 -1
- package/public/logo.svg +0 -32
- package/public/next.svg +0 -1
- package/public/screenshots/code-generator.png +0 -0
- package/public/screenshots/connection-modal.png +0 -0
- package/public/screenshots/data-profiler.png +0 -0
- package/public/screenshots/erd-diagram.png +0 -0
- package/public/screenshots/hero-editor.png +0 -0
- package/public/screenshots/nl2sql.png +0 -0
- package/public/vercel.svg +0 -1
- package/public/window.svg +0 -1
- package/render.yaml +0 -58
- package/scripts/merge-lcov.mjs +0 -239
- package/sonar-project.properties +0 -16
- package/src/app/admin/error.tsx +0 -46
- package/src/app/admin/page.tsx +0 -10
- package/src/app/api/admin/audit/route.ts +0 -52
- package/src/app/api/admin/fleet-health/route.ts +0 -81
- package/src/app/api/ai/autopilot/route.ts +0 -105
- package/src/app/api/ai/chat/route.ts +0 -132
- package/src/app/api/ai/describe-schema/route.ts +0 -52
- package/src/app/api/ai/explain/route.ts +0 -86
- package/src/app/api/ai/impact/route.ts +0 -97
- package/src/app/api/ai/index-advisor/route.ts +0 -98
- package/src/app/api/ai/nl2sql/route.ts +0 -87
- package/src/app/api/ai/query-safety/route.ts +0 -87
- package/src/app/api/auth/login/route.ts +0 -62
- package/src/app/api/auth/logout/route.ts +0 -25
- package/src/app/api/auth/me/route.ts +0 -10
- package/src/app/api/auth/oidc/callback/route.ts +0 -82
- package/src/app/api/auth/oidc/login/route.ts +0 -43
- package/src/app/api/connections/managed/route.ts +0 -35
- package/src/app/api/db/cancel/route.ts +0 -42
- package/src/app/api/db/disconnect/route.ts +0 -28
- package/src/app/api/db/health/route.ts +0 -49
- package/src/app/api/db/maintenance/route.ts +0 -72
- package/src/app/api/db/monitoring/route.ts +0 -62
- package/src/app/api/db/multi-query/route.ts +0 -116
- package/src/app/api/db/pool-stats/route.ts +0 -37
- package/src/app/api/db/profile/route.ts +0 -144
- package/src/app/api/db/provider-meta/route.ts +0 -49
- package/src/app/api/db/query/route.ts +0 -50
- package/src/app/api/db/schema/route.ts +0 -47
- package/src/app/api/db/schema-snapshot/route.ts +0 -42
- package/src/app/api/db/test-connection/route.ts +0 -55
- package/src/app/api/db/transaction/route.ts +0 -111
- package/src/app/api/storage/[collection]/route.ts +0 -67
- package/src/app/api/storage/config/route.ts +0 -17
- package/src/app/api/storage/migrate/route.ts +0 -45
- package/src/app/api/storage/route.ts +0 -32
- package/src/app/error.tsx +0 -49
- package/src/app/global-error.tsx +0 -55
- package/src/app/globals.css +0 -146
- package/src/app/icon.svg +0 -42
- package/src/app/layout.tsx +0 -34
- package/src/app/login/login-form.tsx +0 -301
- package/src/app/login/page.tsx +0 -11
- package/src/app/monitoring/page.tsx +0 -8
- package/src/app/not-found.tsx +0 -29
- package/src/app/page.tsx +0 -5
- package/src/components/AIAutopilotPanel.tsx +0 -238
- package/src/components/CodeGenerator.tsx +0 -271
- package/src/components/CommandPalette.tsx +0 -227
- package/src/components/ConnectionModal.tsx +0 -759
- package/src/components/CreateTableModal.tsx +0 -281
- package/src/components/DataCharts.tsx +0 -962
- package/src/components/DataImportModal.tsx +0 -582
- package/src/components/DataProfiler.tsx +0 -335
- package/src/components/DatabaseDocs.tsx +0 -251
- package/src/components/MaskingSettings.tsx +0 -414
- package/src/components/MobileNav.tsx +0 -50
- package/src/components/NL2SQLPanel.tsx +0 -281
- package/src/components/PivotTable.tsx +0 -257
- package/src/components/QueryEditor.tsx +0 -760
- package/src/components/QueryHistory.tsx +0 -344
- package/src/components/QuerySafetyDialog.tsx +0 -290
- package/src/components/ResultsGrid.tsx +0 -644
- package/src/components/SaveQueryModal.tsx +0 -104
- package/src/components/SavedQueries.tsx +0 -128
- package/src/components/SchemaDiagram.tsx +0 -473
- package/src/components/SchemaDiff.tsx +0 -473
- package/src/components/SnapshotTimeline.tsx +0 -116
- package/src/components/Studio.tsx +0 -639
- package/src/components/TestDataGenerator.tsx +0 -261
- package/src/components/VisualExplain.tsx +0 -820
- package/src/components/admin/AdminDashboard.tsx +0 -163
- package/src/components/admin/tabs/AuditTab.tsx +0 -531
- package/src/components/admin/tabs/MonitoringEmbed.tsx +0 -11
- package/src/components/admin/tabs/OperationsTab.tsx +0 -646
- package/src/components/admin/tabs/OverviewTab.tsx +0 -1328
- package/src/components/admin/tabs/SecurityTab.tsx +0 -284
- package/src/components/community-section.tsx +0 -92
- package/src/components/icons/db-icons.tsx +0 -84
- package/src/components/libredb-logo.tsx +0 -61
- package/src/components/monitoring/MonitoringDashboard.tsx +0 -345
- package/src/components/monitoring/tabs/MetricChart.tsx +0 -82
- package/src/components/monitoring/tabs/OverviewTab.tsx +0 -263
- package/src/components/monitoring/tabs/PerformanceTab.tsx +0 -254
- package/src/components/monitoring/tabs/PoolTab.tsx +0 -174
- package/src/components/monitoring/tabs/QueriesTab.tsx +0 -287
- package/src/components/monitoring/tabs/SessionsTab.tsx +0 -316
- package/src/components/monitoring/tabs/StorageTab.tsx +0 -335
- package/src/components/monitoring/tabs/TablesTab.tsx +0 -300
- package/src/components/results-grid/ResultCard.tsx +0 -111
- package/src/components/results-grid/RowDetailSheet.tsx +0 -178
- package/src/components/results-grid/StatsBar.tsx +0 -201
- package/src/components/results-grid/index.ts +0 -1
- package/src/components/results-grid/utils.ts +0 -23
- package/src/components/schema-explorer/ColumnList.tsx +0 -53
- package/src/components/schema-explorer/SchemaExplorer.tsx +0 -182
- package/src/components/schema-explorer/TableItem.tsx +0 -210
- package/src/components/schema-explorer/index.ts +0 -1
- package/src/components/sidebar/ConnectionItem.tsx +0 -105
- package/src/components/sidebar/ConnectionsList.tsx +0 -62
- package/src/components/sidebar/Sidebar.tsx +0 -130
- package/src/components/sidebar/index.ts +0 -2
- package/src/components/studio/BottomPanel.tsx +0 -286
- package/src/components/studio/QueryToolbar.tsx +0 -180
- package/src/components/studio/StudioDesktopHeader.tsx +0 -114
- package/src/components/studio/StudioMobileHeader.tsx +0 -340
- package/src/components/studio/StudioTabBar.tsx +0 -82
- package/src/components/studio/index.ts +0 -5
- package/src/components/ui/accordion.tsx +0 -66
- package/src/components/ui/alert-dialog.tsx +0 -157
- package/src/components/ui/alert.tsx +0 -66
- package/src/components/ui/aspect-ratio.tsx +0 -11
- package/src/components/ui/avatar.tsx +0 -53
- package/src/components/ui/badge.tsx +0 -46
- package/src/components/ui/breadcrumb.tsx +0 -109
- package/src/components/ui/button-group.tsx +0 -83
- package/src/components/ui/button.tsx +0 -60
- package/src/components/ui/calendar.tsx +0 -216
- package/src/components/ui/card.tsx +0 -92
- package/src/components/ui/carousel.tsx +0 -241
- package/src/components/ui/chart.tsx +0 -357
- package/src/components/ui/checkbox.tsx +0 -32
- package/src/components/ui/collapsible.tsx +0 -33
- package/src/components/ui/command.tsx +0 -184
- package/src/components/ui/context-menu.tsx +0 -252
- package/src/components/ui/dialog.tsx +0 -143
- package/src/components/ui/drawer.tsx +0 -135
- package/src/components/ui/dropdown-menu.tsx +0 -257
- package/src/components/ui/empty.tsx +0 -104
- package/src/components/ui/field.tsx +0 -248
- package/src/components/ui/form.tsx +0 -167
- package/src/components/ui/hover-card.tsx +0 -44
- package/src/components/ui/input-group.tsx +0 -170
- package/src/components/ui/input-otp.tsx +0 -77
- package/src/components/ui/input.tsx +0 -21
- package/src/components/ui/item.tsx +0 -193
- package/src/components/ui/kbd.tsx +0 -28
- package/src/components/ui/label.tsx +0 -24
- package/src/components/ui/menubar.tsx +0 -276
- package/src/components/ui/navigation-menu.tsx +0 -168
- package/src/components/ui/pagination.tsx +0 -127
- package/src/components/ui/popover.tsx +0 -48
- package/src/components/ui/progress.tsx +0 -31
- package/src/components/ui/radio-group.tsx +0 -45
- package/src/components/ui/resizable.tsx +0 -56
- package/src/components/ui/scroll-area.tsx +0 -58
- package/src/components/ui/select.tsx +0 -187
- package/src/components/ui/separator.tsx +0 -28
- package/src/components/ui/sheet.tsx +0 -139
- package/src/components/ui/sidebar.tsx +0 -726
- package/src/components/ui/skeleton.tsx +0 -13
- package/src/components/ui/slider.tsx +0 -63
- package/src/components/ui/sonner.tsx +0 -40
- package/src/components/ui/spinner.tsx +0 -16
- package/src/components/ui/switch.tsx +0 -31
- package/src/components/ui/table.tsx +0 -116
- package/src/components/ui/tabs.tsx +0 -66
- package/src/components/ui/textarea.tsx +0 -18
- package/src/components/ui/toggle-group.tsx +0 -83
- package/src/components/ui/toggle.tsx +0 -47
- package/src/components/ui/tooltip.tsx +0 -61
- package/src/exports/components.ts +0 -15
- package/src/exports/index.ts +0 -4
- package/src/exports/providers.ts +0 -4
- package/src/exports/types.ts +0 -26
- package/src/hooks/use-ai-chat.ts +0 -182
- package/src/hooks/use-all-connections.ts +0 -66
- package/src/hooks/use-api-call.ts +0 -71
- package/src/hooks/use-auth.ts +0 -51
- package/src/hooks/use-connection-form.ts +0 -349
- package/src/hooks/use-connection-manager.ts +0 -169
- package/src/hooks/use-connection-payload.ts +0 -15
- package/src/hooks/use-inline-editing.ts +0 -109
- package/src/hooks/use-mobile.ts +0 -20
- package/src/hooks/use-monitoring-data.ts +0 -270
- package/src/hooks/use-provider-metadata.ts +0 -62
- package/src/hooks/use-query-execution.ts +0 -478
- package/src/hooks/use-storage-sync.ts +0 -259
- package/src/hooks/use-tab-manager.ts +0 -231
- package/src/hooks/use-toast.ts +0 -20
- package/src/hooks/use-transaction-control.ts +0 -64
- package/src/lib/api/error-codes.ts +0 -30
- package/src/lib/api/errors.ts +0 -236
- package/src/lib/api/with-error-handler.ts +0 -41
- package/src/lib/audit.ts +0 -105
- package/src/lib/auth.ts +0 -87
- package/src/lib/connection-string-parser.ts +0 -172
- package/src/lib/data-masking.ts +0 -385
- package/src/lib/db/base-provider.ts +0 -325
- package/src/lib/db/errors.ts +0 -317
- package/src/lib/db/factory.ts +0 -324
- package/src/lib/db/index.ts +0 -123
- package/src/lib/db/providers/document/index.ts +0 -6
- package/src/lib/db/providers/document/mongodb.ts +0 -992
- package/src/lib/db/providers/keyvalue/redis.ts +0 -554
- package/src/lib/db/providers/sql/index.ts +0 -11
- package/src/lib/db/providers/sql/sql-base.ts +0 -174
- package/src/lib/db/providers/sql/sqlite.ts +0 -721
- package/src/lib/db/types.ts +0 -437
- package/src/lib/db/utils/pool-manager.ts +0 -287
- package/src/lib/db/utils/query-limiter.ts +0 -239
- package/src/lib/db-ui-config.ts +0 -86
- package/src/lib/editor/mongodb-completions.ts +0 -172
- package/src/lib/editor/sql-completions.ts +0 -280
- package/src/lib/llm/base-provider.ts +0 -117
- package/src/lib/llm/factory.ts +0 -102
- package/src/lib/llm/index.ts +0 -90
- package/src/lib/llm/providers/custom.ts +0 -181
- package/src/lib/llm/providers/gemini.ts +0 -126
- package/src/lib/llm/providers/ollama.ts +0 -154
- package/src/lib/llm/providers/openai.ts +0 -146
- package/src/lib/llm/types.ts +0 -173
- package/src/lib/llm/utils/config.ts +0 -187
- package/src/lib/llm/utils/retry.ts +0 -119
- package/src/lib/llm/utils/streaming.ts +0 -202
- package/src/lib/logger.ts +0 -127
- package/src/lib/monitoring-thresholds.ts +0 -44
- package/src/lib/oidc.ts +0 -262
- package/src/lib/query-generators.ts +0 -61
- package/src/lib/schema-diff/diff-engine.ts +0 -273
- package/src/lib/schema-diff/migration-generator.ts +0 -208
- package/src/lib/schema-diff/types.ts +0 -55
- package/src/lib/seed/config-loader.ts +0 -79
- package/src/lib/seed/connection-filter.ts +0 -49
- package/src/lib/seed/credential-resolver.ts +0 -62
- package/src/lib/seed/index.ts +0 -40
- package/src/lib/seed/resolve-connection.ts +0 -57
- package/src/lib/seed/types.ts +0 -69
- package/src/lib/sql/alias-extractor.ts +0 -267
- package/src/lib/sql/index.ts +0 -8
- package/src/lib/sql/statement-splitter.ts +0 -167
- package/src/lib/sql/types.ts +0 -40
- package/src/lib/ssh/tunnel.ts +0 -142
- package/src/lib/storage/factory.ts +0 -84
- package/src/lib/storage/index.ts +0 -14
- package/src/lib/storage/local-storage.ts +0 -99
- package/src/lib/storage/providers/postgres.ts +0 -225
- package/src/lib/storage/providers/sqlite.ts +0 -153
- package/src/lib/storage/storage-facade.ts +0 -272
- package/src/lib/storage/types.ts +0 -75
- package/src/lib/time-series-buffer.ts +0 -58
- package/src/lib/types.ts +0 -173
- package/src/lib/utils.ts +0 -6
- package/src/proxy.ts +0 -104
- package/src/types/db-drivers.d.ts +0 -23
- package/src/types/html2canvas.d.ts +0 -9
- package/tests/api/admin/audit.test.ts +0 -178
- package/tests/api/admin/fleet-health.test.ts +0 -183
- package/tests/api/ai/autopilot.test.ts +0 -174
- package/tests/api/ai/chat.test.ts +0 -250
- package/tests/api/ai/describe-schema.test.ts +0 -266
- package/tests/api/ai/explain.test.ts +0 -199
- package/tests/api/ai/impact.test.ts +0 -168
- package/tests/api/ai/index-advisor.test.ts +0 -171
- package/tests/api/ai/nl2sql.test.ts +0 -202
- package/tests/api/ai/query-safety.test.ts +0 -196
- package/tests/api/auth/login.test.ts +0 -170
- package/tests/api/auth/logout.test.ts +0 -140
- package/tests/api/auth/me.test.ts +0 -73
- package/tests/api/auth/oidc-callback.test.ts +0 -215
- package/tests/api/auth/oidc-login.test.ts +0 -127
- package/tests/api/db/cancel.test.ts +0 -198
- package/tests/api/db/disconnect.test.ts +0 -124
- package/tests/api/db/health.test.ts +0 -222
- package/tests/api/db/maintenance.test.ts +0 -263
- package/tests/api/db/monitoring.test.ts +0 -221
- package/tests/api/db/multi-query.test.ts +0 -316
- package/tests/api/db/pool-stats.test.ts +0 -135
- package/tests/api/db/profile.test.ts +0 -330
- package/tests/api/db/provider-meta.test.ts +0 -193
- package/tests/api/db/query.test.ts +0 -314
- package/tests/api/db/schema-snapshot.test.ts +0 -170
- package/tests/api/db/schema.test.ts +0 -191
- package/tests/api/db/test-connection.test.ts +0 -185
- package/tests/api/db/transaction.test.ts +0 -314
- package/tests/api/proxy.test.ts +0 -191
- package/tests/api/seed/managed-route.test.ts +0 -113
- package/tests/api/storage/config.test.ts +0 -42
- package/tests/api/storage/storage-routes.test.ts +0 -309
- package/tests/components/AIAutopilotPanel.test.tsx +0 -756
- package/tests/components/AdminPage.test.tsx +0 -33
- package/tests/components/CodeGenerator.test.tsx +0 -182
- package/tests/components/CommandPalette.test.tsx +0 -428
- package/tests/components/CommunitySection.test.tsx +0 -91
- package/tests/components/ConnectionModal.mobile.test.tsx +0 -284
- package/tests/components/ConnectionModal.test.tsx +0 -570
- package/tests/components/CreateTableModal.test.tsx +0 -383
- package/tests/components/DataCharts.test.tsx +0 -739
- package/tests/components/DataImportModal.test.tsx +0 -751
- package/tests/components/DataProfiler.test.tsx +0 -589
- package/tests/components/DatabaseDocs.test.tsx +0 -353
- package/tests/components/LoginPage.test.tsx +0 -163
- package/tests/components/LoginPageOIDC.test.tsx +0 -92
- package/tests/components/MaskingSettings.test.tsx +0 -498
- package/tests/components/MobileNav.test.tsx +0 -30
- package/tests/components/MonitoringPage.test.tsx +0 -32
- package/tests/components/NL2SQLPanel.test.tsx +0 -621
- package/tests/components/Page.test.tsx +0 -33
- package/tests/components/PivotTable.test.tsx +0 -350
- package/tests/components/QueryEditor.test.tsx +0 -1730
- package/tests/components/QueryHistory.test.tsx +0 -572
- package/tests/components/QuerySafetyDialog.test.tsx +0 -586
- package/tests/components/ResultsGrid.test.tsx +0 -804
- package/tests/components/RootLayout.test.tsx +0 -83
- package/tests/components/SaveQueryModal.test.tsx +0 -25
- package/tests/components/SavedQueries.test.tsx +0 -43
- package/tests/components/SchemaDiagram.test.tsx +0 -1034
- package/tests/components/SchemaDiff.test.tsx +0 -906
- package/tests/components/SnapshotTimeline.test.tsx +0 -174
- package/tests/components/Studio.test.tsx +0 -1030
- package/tests/components/TestDataGenerator.test.tsx +0 -291
- package/tests/components/VisualExplain.test.tsx +0 -704
- package/tests/components/admin/AdminDashboard.test.tsx +0 -205
- package/tests/components/admin/AuditTab.test.tsx +0 -220
- package/tests/components/admin/MonitoringEmbed.test.tsx +0 -58
- package/tests/components/admin/OperationsTab.test.tsx +0 -975
- package/tests/components/admin/OverviewTab.test.tsx +0 -254
- package/tests/components/admin/SecurityTab.test.tsx +0 -467
- package/tests/components/monitoring/MetricChart.test.tsx +0 -111
- package/tests/components/monitoring/MonitoringDashboard.test.tsx +0 -259
- package/tests/components/monitoring/OverviewTab.test.tsx +0 -78
- package/tests/components/monitoring/PerformanceTab.test.tsx +0 -87
- package/tests/components/monitoring/PoolTab.test.tsx +0 -42
- package/tests/components/monitoring/QueriesTab.test.tsx +0 -80
- package/tests/components/monitoring/SessionsTab.test.tsx +0 -154
- package/tests/components/monitoring/StorageTab.test.tsx +0 -127
- package/tests/components/monitoring/TablesTab.test.tsx +0 -153
- package/tests/components/results-grid/ResultCard.test.tsx +0 -105
- package/tests/components/results-grid/RowDetailSheet.test.tsx +0 -308
- package/tests/components/results-grid/StatsBar.test.tsx +0 -162
- package/tests/components/schema-explorer/ColumnList.test.tsx +0 -151
- package/tests/components/schema-explorer/SchemaExplorer.test.tsx +0 -461
- package/tests/components/schema-explorer/TableItem.test.tsx +0 -415
- package/tests/components/sidebar/ConnectionItem.test.tsx +0 -201
- package/tests/components/sidebar/ConnectionsList.test.tsx +0 -176
- package/tests/components/sidebar/Sidebar.test.tsx +0 -187
- package/tests/components/studio/BottomPanel.test.tsx +0 -383
- package/tests/components/studio/QueryToolbar.test.tsx +0 -321
- package/tests/components/studio/StudioDesktopHeader.test.tsx +0 -377
- package/tests/components/studio/StudioMobileHeader.test.tsx +0 -198
- package/tests/components/studio/StudioTabBar.test.tsx +0 -331
- package/tests/fixtures/connections.ts +0 -96
- package/tests/fixtures/masking-configs.ts +0 -86
- package/tests/fixtures/query-results.ts +0 -71
- package/tests/fixtures/schemas.ts +0 -64
- package/tests/fixtures/seed-connections/invalid-config.yaml +0 -7
- package/tests/fixtures/seed-connections/minimal-config.yaml +0 -8
- package/tests/fixtures/seed-connections/mixed-credentials.yaml +0 -23
- package/tests/fixtures/seed-connections/multi-role-config.yaml +0 -30
- package/tests/fixtures/seed-connections/valid-config.json +0 -15
- package/tests/fixtures/seed-connections/valid-config.yaml +0 -51
- package/tests/helpers/mock-fetch.ts +0 -59
- package/tests/helpers/mock-monaco.ts +0 -112
- package/tests/helpers/mock-navigation.ts +0 -28
- package/tests/helpers/mock-next.ts +0 -80
- package/tests/helpers/mock-provider.ts +0 -133
- package/tests/helpers/mock-sonner.ts +0 -29
- package/tests/helpers/render-with-providers.tsx +0 -19
- package/tests/hooks/use-ai-chat.test.ts +0 -600
- package/tests/hooks/use-auth.test.ts +0 -371
- package/tests/hooks/use-connection-form.test.ts +0 -743
- package/tests/hooks/use-connection-manager.test.ts +0 -466
- package/tests/hooks/use-inline-editing.test.ts +0 -321
- package/tests/hooks/use-mobile.test.ts +0 -177
- package/tests/hooks/use-monitoring-data.test.ts +0 -819
- package/tests/hooks/use-provider-metadata.test.ts +0 -228
- package/tests/hooks/use-query-execution.test.ts +0 -1212
- package/tests/hooks/use-tab-manager.test.ts +0 -756
- package/tests/hooks/use-toast.test.ts +0 -74
- package/tests/hooks/use-transaction-control.test.ts +0 -211
- package/tests/integration/db/mongodb-provider.test.ts +0 -698
- package/tests/integration/db/mssql-provider.test.ts +0 -840
- package/tests/integration/db/mysql-provider.test.ts +0 -872
- package/tests/integration/db/oracle-provider.test.ts +0 -843
- package/tests/integration/db/postgres-provider.test.ts +0 -1382
- package/tests/integration/db/redis-provider.test.ts +0 -526
- package/tests/integration/db/sqlite-provider.test.ts +0 -480
- package/tests/integration/seed/seed-pipeline.test.ts +0 -102
- package/tests/isolated/factory-singleton.test.ts +0 -150
- package/tests/isolated/use-storage-sync.test.ts +0 -389
- package/tests/run-components.sh +0 -196
- package/tests/setup-dom.ts +0 -58
- package/tests/setup.ts +0 -40
- package/tests/unit/api-errors.test.ts +0 -210
- package/tests/unit/code-generator-functions.test.ts +0 -271
- package/tests/unit/components/column-list.test.tsx +0 -190
- package/tests/unit/components/data-import-modal.test.tsx +0 -441
- package/tests/unit/components/studio-mobile-header.test.tsx +0 -327
- package/tests/unit/data-charts-functions.test.ts +0 -496
- package/tests/unit/data-import-functions.test.ts +0 -320
- package/tests/unit/data-import-utils.test.ts +0 -125
- package/tests/unit/db/base-provider.test.ts +0 -517
- package/tests/unit/db/errors.test.ts +0 -403
- package/tests/unit/db/factory.test.ts +0 -436
- package/tests/unit/db/pool-manager.test.ts +0 -440
- package/tests/unit/db/query-limiter.test.ts +0 -387
- package/tests/unit/db/sql-base.test.ts +0 -438
- package/tests/unit/lib/api/error-codes.test.ts +0 -39
- package/tests/unit/lib/audit.test.ts +0 -326
- package/tests/unit/lib/auth.test.ts +0 -146
- package/tests/unit/lib/connection-string-parser.test.ts +0 -424
- package/tests/unit/lib/data-masking.test.ts +0 -583
- package/tests/unit/lib/db-icons.test.tsx +0 -41
- package/tests/unit/lib/monitoring-thresholds.test.ts +0 -133
- package/tests/unit/lib/oidc.test.ts +0 -509
- package/tests/unit/lib/query-generators.test.ts +0 -127
- package/tests/unit/lib/storage/factory.test.ts +0 -71
- package/tests/unit/lib/storage/local-storage.test.ts +0 -114
- package/tests/unit/lib/storage/providers/postgres.test.ts +0 -312
- package/tests/unit/lib/storage/providers/sqlite.test.ts +0 -232
- package/tests/unit/lib/storage/storage-facade-extended.test.ts +0 -331
- package/tests/unit/lib/storage/storage-facade.test.ts +0 -184
- package/tests/unit/lib/storage.test.ts +0 -317
- package/tests/unit/lib/time-series-buffer.test.ts +0 -212
- package/tests/unit/lib/utils.test.ts +0 -24
- package/tests/unit/llm/base-provider.test.ts +0 -238
- package/tests/unit/llm/config.test.ts +0 -262
- package/tests/unit/llm/custom-provider.test.ts +0 -281
- package/tests/unit/llm/gemini-provider.test.ts +0 -248
- package/tests/unit/llm/llm-factory.test.ts +0 -155
- package/tests/unit/llm/ollama-provider.test.ts +0 -288
- package/tests/unit/llm/openai-provider.test.ts +0 -324
- package/tests/unit/llm/retry.test.ts +0 -180
- package/tests/unit/llm/streaming.test.ts +0 -355
- package/tests/unit/logger.test.ts +0 -198
- package/tests/unit/mongodb-completions.test.ts +0 -516
- package/tests/unit/pivot-table-functions.test.ts +0 -76
- package/tests/unit/query-cancelled-error.test.ts +0 -81
- package/tests/unit/schema-diff/diff-engine.test.ts +0 -367
- package/tests/unit/schema-diff/migration-generator.test.ts +0 -513
- package/tests/unit/seed/config-loader.test.ts +0 -73
- package/tests/unit/seed/connection-filter.test.ts +0 -91
- package/tests/unit/seed/credential-resolver.test.ts +0 -85
- package/tests/unit/seed/index.test.ts +0 -72
- package/tests/unit/seed/resolve-connection.test.ts +0 -74
- package/tests/unit/seed/types.test.ts +0 -129
- package/tests/unit/sql/alias-extractor.test.ts +0 -444
- package/tests/unit/sql/statement-splitter.test.ts +0 -348
- package/tests/unit/sql-completions.test.ts +0 -463
- package/tests/unit/ssh-tunnel.test.ts +0 -465
- package/tsconfig.json +0 -42
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/db/providers/sql/mssql.ts"],"names":[],"mappings":"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","file":"mssql-ZH5VP2C5.mjs","sourcesContent":["/**\n * Microsoft SQL Server Database Provider\n * Full MSSQL support with connection pooling (SQL Authentication)\n */\n\nimport mssql from 'mssql';\nimport { SQLBaseProvider } from './sql-base';\nimport {\n type DatabaseConnection,\n type TableSchema,\n type QueryResult,\n type HealthInfo,\n type MaintenanceType,\n type MaintenanceResult,\n type ProviderOptions,\n type ProviderCapabilities,\n type ProviderLabels,\n type SlowQuery,\n type ActiveSession,\n type DatabaseOverview,\n type PerformanceMetrics,\n type SlowQueryStats,\n type ActiveSessionDetails,\n type TableStats,\n type IndexStats,\n type StorageStats,\n type PreparedQuery,\n type QueryPrepareOptions,\n} from '../../types';\nimport {\n DatabaseConfigError,\n ConnectionError,\n QueryError,\n mapDatabaseError,\n} from '../../errors';\nimport { formatBytes } from '../../utils/pool-manager';\nimport {\n analyzeQuery,\n DEFAULT_QUERY_LIMIT,\n MAX_UNLIMITED_ROWS,\n} from '../../utils/query-limiter';\n\n// ============================================================================\n// MSSQL Provider\n// ============================================================================\n\nexport class MSSQLProvider extends SQLBaseProvider {\n private pool: mssql.ConnectionPool | null = null;\n\n // Transaction support\n private txTransaction: mssql.Transaction | null = null;\n private txActive = false;\n\n // Track running requests for cancellation\n private runningRequests = new Map<string, mssql.Request>();\n\n constructor(config: DatabaseConnection, options: ProviderOptions = {}) {\n super(config, options);\n this.validate();\n }\n\n // ============================================================================\n // Provider Metadata\n // ============================================================================\n\n public override getCapabilities(): ProviderCapabilities {\n return {\n ...super.getCapabilities(),\n defaultPort: 1433,\n supportsExplain: true,\n supportsConnectionString: true,\n maintenanceOperations: ['analyze', 'check', 'optimize', 'kill'],\n };\n }\n\n public override getLabels(): ProviderLabels {\n return {\n ...super.getLabels(),\n analyzeAction: 'Update Statistics',\n vacuumAction: 'Rebuild Indexes',\n analyzeGlobalLabel: 'Update Stats',\n analyzeGlobalTitle: 'Update Statistics',\n analyzeGlobalDesc: 'Updates query optimizer statistics for all tables to improve query performance.',\n vacuumGlobalLabel: 'Rebuild Indexes',\n vacuumGlobalTitle: 'Rebuild All Indexes',\n vacuumGlobalDesc: 'Rebuilds all indexes to reclaim space and reduce fragmentation.',\n };\n }\n\n // ============================================================================\n // SQL Dialect Overrides\n // ============================================================================\n\n protected override escapeIdentifier(identifier: string): string {\n const escaped = identifier.replace(/\\]/g, ']]');\n return `[${escaped}]`;\n }\n\n // ============================================================================\n // Validation\n // ============================================================================\n\n public validate(): void {\n super.validate();\n\n if (!this.config.connectionString) {\n if (!this.config.host) {\n throw new DatabaseConfigError('Host is required for SQL Server', 'mssql');\n }\n if (!this.config.database) {\n throw new DatabaseConfigError('Database name is required for SQL Server', 'mssql');\n }\n }\n }\n\n // ============================================================================\n // Connection Management\n // ============================================================================\n\n private buildConfig(): mssql.config {\n const host = this.config.host || 'localhost';\n const port = this.config.port || 1433;\n const isAzure = host.endsWith('.database.windows.net');\n\n const sslConfig = this.config.ssl;\n // SQL Server 2022+ enforces encryption by default; always encrypt and trust self-signed certs for non-Azure\n let encrypt = true;\n let trustServerCertificate = !isAzure;\n\n if (sslConfig) {\n if (sslConfig.mode === 'disable') {\n encrypt = false;\n } else {\n encrypt = true;\n trustServerCertificate = sslConfig.mode === 'require';\n }\n }\n\n const config: mssql.config = {\n user: this.config.user,\n password: this.config.password,\n server: host,\n port,\n database: this.config.database,\n pool: {\n min: this.poolConfig.min,\n max: this.poolConfig.max,\n idleTimeoutMillis: this.poolConfig.idleTimeout,\n },\n options: {\n encrypt,\n trustServerCertificate,\n connectTimeout: this.poolConfig.acquireTimeout,\n requestTimeout: this.queryTimeout,\n },\n };\n\n // Named instance support\n if (this.config.instanceName) {\n config.options = {\n ...config.options,\n instanceName: this.config.instanceName,\n };\n // When using instance name, port is auto-negotiated via SQL Server Browser\n delete (config as Record<string, unknown>).port;\n }\n\n return config;\n }\n\n public async connect(): Promise<void> {\n if (this.pool) {\n return;\n }\n\n try {\n const config = this.buildConfig();\n this.pool = new mssql.ConnectionPool(config);\n await this.pool.connect();\n\n // Test the connection\n await this.pool.request().query('SELECT 1 AS test');\n\n this.setConnected(true);\n } catch (error) {\n this.setError(error instanceof Error ? error : new Error(String(error)));\n throw new ConnectionError(\n `Failed to connect to SQL Server: ${error instanceof Error ? error.message : error}`,\n 'mssql',\n this.config.host,\n this.config.port\n );\n }\n }\n\n public async disconnect(): Promise<void> {\n if (this.pool) {\n try {\n await this.pool.close();\n } catch {\n // Force close on error\n }\n this.pool = null;\n this.setConnected(false);\n }\n }\n\n // ============================================================================\n // Query Execution\n // ============================================================================\n\n public async query(sql: string, params?: unknown[], queryId?: string): Promise<QueryResult> {\n this.ensureConnected();\n\n return this.trackQuery(async () => {\n const { result, executionTime } = await this.measureExecution(async () => {\n try {\n const request = this.pool!.request();\n\n if (queryId) {\n this.runningRequests.set(queryId, request);\n }\n\n // Add parameters\n if (params && params.length > 0) {\n params.forEach((p, i) => {\n request.input(`p${i + 1}`, p);\n });\n }\n\n const res = await request.query(sql);\n return res;\n } catch (error) {\n throw mapDatabaseError(error, 'mssql', sql);\n } finally {\n if (queryId) this.runningRequests.delete(queryId);\n }\n });\n\n const recordset = result.recordset || [];\n const fields = recordset.columns\n ? Object.keys(recordset.columns)\n : recordset.length > 0\n ? Object.keys(recordset[0])\n : [];\n\n return {\n rows: recordset as Record<string, unknown>[],\n fields,\n rowCount: result.rowsAffected?.[0] ?? recordset.length,\n executionTime,\n };\n });\n }\n\n public async cancelQuery(queryId: string): Promise<boolean> {\n const request = this.runningRequests.get(queryId);\n if (!request) return false;\n\n try {\n request.cancel();\n return true;\n } catch (error) {\n console.error('[MSSQL] Failed to cancel query:', error);\n return false;\n }\n }\n\n // ============================================================================\n // Query Preparation (MSSQL TOP / OFFSET FETCH)\n // ============================================================================\n\n public override prepareQuery(query: string, options: QueryPrepareOptions = {}): PreparedQuery {\n const { limit = DEFAULT_QUERY_LIMIT, offset = 0, unlimited = false } = options;\n const effectiveLimit = unlimited ? MAX_UNLIMITED_ROWS : limit;\n const queryInfo = analyzeQuery(query);\n\n if (queryInfo.type === 'SELECT' && !queryInfo.hasLimit) {\n let modifiedSql = query.trim();\n const hasSemicolon = modifiedSql.endsWith(';');\n if (hasSemicolon) modifiedSql = modifiedSql.slice(0, -1).trim();\n\n if (offset > 0) {\n // OFFSET FETCH requires ORDER BY\n const hasOrderBy = /\\bORDER\\s+BY\\b/i.test(modifiedSql);\n if (!hasOrderBy) {\n modifiedSql = `${modifiedSql} ORDER BY (SELECT NULL)`;\n }\n modifiedSql = `${modifiedSql} OFFSET ${offset} ROWS FETCH NEXT ${effectiveLimit} ROWS ONLY`;\n } else {\n // Inject TOP N after SELECT\n modifiedSql = modifiedSql.replace(\n /^(\\s*SELECT\\s+)(DISTINCT\\s+)?/i,\n `$1$2TOP ${effectiveLimit} `\n );\n }\n\n if (hasSemicolon) modifiedSql += ';';\n\n return {\n query: modifiedSql,\n wasLimited: true,\n limit: effectiveLimit,\n offset,\n };\n }\n\n return { query, wasLimited: false, limit: effectiveLimit, offset };\n }\n\n // ============================================================================\n // Transaction Support\n // ============================================================================\n\n public async beginTransaction(): Promise<void> {\n this.ensureConnected();\n if (this.txActive) throw new QueryError('Transaction already active', 'mssql');\n this.txTransaction = new mssql.Transaction(this.pool!);\n await this.txTransaction.begin();\n this.txActive = true;\n }\n\n public async commitTransaction(): Promise<void> {\n if (!this.txTransaction || !this.txActive) throw new QueryError('No active transaction', 'mssql');\n try {\n await this.txTransaction.commit();\n } finally {\n this.txTransaction = null;\n this.txActive = false;\n }\n }\n\n public async rollbackTransaction(): Promise<void> {\n if (!this.txTransaction || !this.txActive) throw new QueryError('No active transaction', 'mssql');\n try {\n await this.txTransaction.rollback();\n } finally {\n this.txTransaction = null;\n this.txActive = false;\n }\n }\n\n public isInTransaction(): boolean {\n return this.txActive;\n }\n\n public async queryInTransaction(sql: string, params?: unknown[]): Promise<QueryResult> {\n if (!this.txTransaction || !this.txActive) throw new QueryError('No active transaction', 'mssql');\n\n return this.trackQuery(async () => {\n const { result, executionTime } = await this.measureExecution(async () => {\n try {\n const request = new mssql.Request(this.txTransaction!);\n if (params && params.length > 0) {\n params.forEach((p, i) => {\n request.input(`p${i + 1}`, p);\n });\n }\n return await request.query(sql);\n } catch (error) {\n throw mapDatabaseError(error, 'mssql', sql);\n }\n });\n\n const recordset = result.recordset || [];\n const fields = recordset.length > 0 ? Object.keys(recordset[0]) : [];\n\n return {\n rows: recordset as Record<string, unknown>[],\n fields,\n rowCount: result.rowsAffected?.[0] ?? recordset.length,\n executionTime,\n };\n });\n }\n\n // ============================================================================\n // Schema Operations\n // ============================================================================\n\n public async getSchema(): Promise<TableSchema[]> {\n this.ensureConnected();\n\n try {\n // Get tables\n const tablesRes = await this.pool!.request().query(`\n SELECT\n s.name AS schema_name,\n t.name AS table_name,\n SUM(p.rows) AS row_count\n FROM sys.tables t\n JOIN sys.schemas s ON t.schema_id = s.schema_id\n LEFT JOIN sys.partitions p ON t.object_id = p.object_id AND p.index_id IN (0, 1)\n WHERE t.type = 'U'\n GROUP BY s.name, t.name\n ORDER BY s.name, t.name\n `);\n const tables = tablesRes.recordset || [];\n\n // Get columns\n const colsRes = await this.pool!.request().query(`\n SELECT\n TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE,\n IS_NULLABLE, COLUMN_DEFAULT, ORDINAL_POSITION\n FROM INFORMATION_SCHEMA.COLUMNS\n ORDER BY TABLE_SCHEMA, TABLE_NAME, ORDINAL_POSITION\n `);\n const allCols = colsRes.recordset || [];\n\n // Get primary keys\n const pkRes = await this.pool!.request().query(`\n SELECT\n s.name AS schema_name,\n t.name AS table_name,\n c.name AS column_name\n FROM sys.indexes i\n JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id\n JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id\n JOIN sys.tables t ON i.object_id = t.object_id\n JOIN sys.schemas s ON t.schema_id = s.schema_id\n WHERE i.is_primary_key = 1\n `);\n const pkMap = new Map<string, Set<string>>();\n for (const row of pkRes.recordset || []) {\n const key = `${row.schema_name}.${row.table_name}`;\n if (!pkMap.has(key)) pkMap.set(key, new Set());\n pkMap.get(key)!.add(row.column_name);\n }\n\n // Get foreign keys\n const fkRes = await this.pool!.request().query(`\n SELECT\n OBJECT_SCHEMA_NAME(fk.parent_object_id) AS schema_name,\n OBJECT_NAME(fk.parent_object_id) AS table_name,\n COL_NAME(fkc.parent_object_id, fkc.parent_column_id) AS column_name,\n OBJECT_NAME(fk.referenced_object_id) AS ref_table,\n COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) AS ref_column\n FROM sys.foreign_keys fk\n JOIN sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id\n `);\n const fksByTable = new Map<string, Array<{ columnName: string; referencedTable: string; referencedColumn: string }>>();\n for (const row of fkRes.recordset || []) {\n const key = `${row.schema_name}.${row.table_name}`;\n if (!fksByTable.has(key)) fksByTable.set(key, []);\n fksByTable.get(key)!.push({\n columnName: row.column_name,\n referencedTable: row.ref_table,\n referencedColumn: row.ref_column,\n });\n }\n\n // Get indexes\n const idxRes = await this.pool!.request().query(`\n SELECT\n s.name AS schema_name,\n t.name AS table_name,\n i.name AS index_name,\n i.is_unique,\n c.name AS column_name,\n ic.key_ordinal\n FROM sys.indexes i\n JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id\n JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id\n JOIN sys.tables t ON i.object_id = t.object_id\n JOIN sys.schemas s ON t.schema_id = s.schema_id\n WHERE i.name IS NOT NULL AND i.is_primary_key = 0\n ORDER BY s.name, t.name, i.name, ic.key_ordinal\n `);\n\n const idxByTable = new Map<string, Map<string, { unique: boolean; columns: string[] }>>();\n for (const row of idxRes.recordset || []) {\n const key = `${row.schema_name}.${row.table_name}`;\n if (!idxByTable.has(key)) idxByTable.set(key, new Map());\n const tableIdxs = idxByTable.get(key)!;\n if (!tableIdxs.has(row.index_name)) {\n tableIdxs.set(row.index_name, { unique: row.is_unique, columns: [] });\n }\n tableIdxs.get(row.index_name)!.columns.push(row.column_name);\n }\n\n // Group columns by table\n const colsByTable = new Map<string, typeof allCols>();\n for (const c of allCols) {\n const key = `${c.TABLE_SCHEMA}.${c.TABLE_NAME}`;\n if (!colsByTable.has(key)) colsByTable.set(key, []);\n colsByTable.get(key)!.push(c);\n }\n\n return tables.map((t: Record<string, unknown>) => {\n const schemaName = String(t.schema_name || 'dbo');\n const tableName = String(t.table_name || '');\n const key = `${schemaName}.${tableName}`;\n const displayName = schemaName === 'dbo' ? tableName : `${schemaName}.${tableName}`;\n const pks = pkMap.get(key) || new Set();\n\n const columns = (colsByTable.get(key) || []).map((c: Record<string, unknown>) => ({\n name: String(c.COLUMN_NAME || ''),\n type: String(c.DATA_TYPE || ''),\n nullable: String(c.IS_NULLABLE || '') === 'YES',\n isPrimary: pks.has(String(c.COLUMN_NAME || '')),\n defaultValue: c.COLUMN_DEFAULT ? String(c.COLUMN_DEFAULT) : undefined,\n }));\n\n const foreignKeys = fksByTable.get(key) || [];\n\n const tableIdxs = idxByTable.get(key) || new Map();\n const indexes = Array.from(tableIdxs.entries()).map(([name, info]) => ({\n name,\n columns: info.columns,\n unique: info.unique,\n }));\n\n return {\n name: displayName,\n rowCount: Number(t.row_count || 0),\n columns,\n indexes,\n foreignKeys,\n };\n });\n } catch (error) {\n throw mapDatabaseError(error, 'mssql');\n }\n }\n\n // ============================================================================\n // Health & Monitoring\n // ============================================================================\n\n public async getHealth(): Promise<HealthInfo> {\n this.ensureConnected();\n\n try {\n let activeConnections = 0;\n let databaseSize = 'N/A';\n let cacheHitRatio = 'N/A';\n const slowQueries: SlowQuery[] = [];\n const activeSessions: ActiveSession[] = [];\n\n // Active connections\n try {\n const connRes = await this.pool!.request().query(\n `SELECT COUNT(*) AS cnt FROM sys.dm_exec_sessions WHERE is_user_process = 1`\n );\n activeConnections = connRes.recordset[0]?.cnt || 0;\n } catch { /* DMV may require permissions */ }\n\n // Database size\n try {\n const sizeRes = await this.pool!.request().query(`\n SELECT\n CAST(SUM(size) * 8.0 / 1024 AS DECIMAL(10,2)) AS size_mb\n FROM sys.database_files\n `);\n const mb = Number(sizeRes.recordset[0]?.size_mb || 0);\n databaseSize = mb > 1024 ? `${(mb / 1024).toFixed(2)} GB` : `${mb} MB`;\n } catch { /* ignore */ }\n\n // Cache hit ratio\n try {\n const cacheRes = await this.pool!.request().query(`\n SELECT\n CAST(\n (a.cntr_value * 1.0 / NULLIF(b.cntr_value, 0)) * 100\n AS DECIMAL(5,2)\n ) AS hit_ratio\n FROM sys.dm_os_performance_counters a\n CROSS JOIN sys.dm_os_performance_counters b\n WHERE a.counter_name = 'Buffer cache hit ratio'\n AND a.object_name LIKE '%Buffer Manager%'\n AND b.counter_name = 'Buffer cache hit ratio base'\n AND b.object_name LIKE '%Buffer Manager%'\n `);\n cacheHitRatio = `${cacheRes.recordset[0]?.hit_ratio || 0}%`;\n } catch { /* ignore */ }\n\n // Slow queries\n try {\n const slowRes = await this.pool!.request().query(`\n SELECT TOP 5\n SUBSTRING(qt.text, 1, 100) AS query,\n qs.execution_count AS calls,\n CAST(qs.total_elapsed_time / NULLIF(qs.execution_count, 0) / 1000.0 AS DECIMAL(10,2)) AS avg_time_ms\n FROM sys.dm_exec_query_stats qs\n CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt\n WHERE qs.execution_count > 0\n ORDER BY qs.total_elapsed_time DESC\n `);\n for (const row of slowRes.recordset || []) {\n slowQueries.push({\n query: String(row.query || ''),\n calls: Number(row.calls || 0),\n avgTime: `${row.avg_time_ms}ms`,\n });\n }\n } catch { /* DMV permissions */ }\n\n // Active sessions\n try {\n const sessRes = await this.pool!.request().query(`\n SELECT TOP 10\n s.session_id AS pid,\n s.login_name AS [user],\n DB_NAME(s.database_id) AS [database],\n s.status AS state,\n ISNULL(SUBSTRING(t.text, 1, 100), '') AS query,\n ISNULL(CAST(DATEDIFF(SECOND, s.last_request_start_time, GETDATE()) AS VARCHAR) + 's', 'N/A') AS duration\n FROM sys.dm_exec_sessions s\n LEFT JOIN sys.dm_exec_requests r ON s.session_id = r.session_id\n OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t\n WHERE s.is_user_process = 1\n ORDER BY s.last_request_start_time DESC\n `);\n for (const row of sessRes.recordset || []) {\n activeSessions.push({\n pid: Number(row.pid || 0),\n user: String(row.user || 'unknown'),\n database: String(row.database || ''),\n state: String(row.state || 'unknown'),\n query: String(row.query || ''),\n duration: String(row.duration || 'N/A'),\n });\n }\n } catch { /* ignore */ }\n\n return { activeConnections, databaseSize, cacheHitRatio, slowQueries, activeSessions };\n } catch (error) {\n throw mapDatabaseError(error, 'mssql');\n }\n }\n\n // ============================================================================\n // Maintenance Operations\n // ============================================================================\n\n public async runMaintenance(type: MaintenanceType, target?: string): Promise<MaintenanceResult> {\n this.ensureConnected();\n\n const { result, executionTime } = await this.measureExecution(async () => {\n try {\n let sql = '';\n\n switch (type) {\n case 'analyze':\n if (target) {\n sql = `UPDATE STATISTICS [${target.replace(/\\]/g, ']]')}]`;\n } else {\n sql = `EXEC sp_updatestats`;\n }\n break;\n case 'check':\n sql = `DBCC CHECKDB WITH NO_INFOMSGS`;\n break;\n case 'optimize':\n if (target) {\n sql = `ALTER INDEX ALL ON [${target.replace(/\\]/g, ']]')}] REBUILD`;\n } else {\n // Rebuild all indexes on all tables\n sql = `\n DECLARE @sql NVARCHAR(MAX) = '';\n SELECT @sql = @sql + 'ALTER INDEX ALL ON [' + s.name + '].[' + t.name + '] REBUILD;'\n FROM sys.tables t\n JOIN sys.schemas s ON t.schema_id = s.schema_id\n WHERE t.type = 'U';\n EXEC sp_executesql @sql;\n `;\n }\n break;\n case 'kill':\n if (!target) {\n throw new QueryError('Target SPID is required for kill operation', 'mssql');\n }\n const spid = parseInt(target, 10);\n if (isNaN(spid)) {\n throw new QueryError('Invalid SPID for kill operation', 'mssql');\n }\n sql = `KILL ${spid}`;\n break;\n default:\n throw new QueryError(`Unsupported maintenance type: ${type}`, 'mssql');\n }\n\n await this.pool!.request().query(sql);\n return { success: true };\n } catch (error) {\n throw mapDatabaseError(error, 'mssql');\n }\n });\n\n return {\n success: result.success,\n executionTime,\n message: `${type.toUpperCase()} completed successfully`,\n };\n }\n\n // ============================================================================\n // Pool Statistics\n // ============================================================================\n\n public getPoolStats() {\n if (!this.pool) {\n return { total: 0, idle: 0, active: 0, waiting: 0 };\n }\n\n return {\n total: this.pool.size,\n idle: this.pool.available,\n active: this.pool.size - this.pool.available,\n waiting: this.pool.pending,\n };\n }\n\n // ============================================================================\n // Extended Monitoring Methods\n // ============================================================================\n\n public async getOverview(): Promise<DatabaseOverview> {\n this.ensureConnected();\n\n try {\n let version = 'SQL Server';\n let uptime = 'N/A';\n let startTime: Date | undefined;\n let activeConnections = 0;\n let maxConnections = 0;\n let databaseSize = '0 bytes';\n let databaseSizeBytes = 0;\n let tableCount = 0;\n let indexCount = 0;\n\n // Version\n try {\n const vRes = await this.pool!.request().query(`SELECT @@VERSION AS version`);\n version = String(vRes.recordset[0]?.version || '').split('\\n')[0];\n } catch { /* ignore */ }\n\n // Uptime\n try {\n const upRes = await this.pool!.request().query(`\n SELECT sqlserver_start_time,\n DATEDIFF(SECOND, sqlserver_start_time, GETDATE()) AS uptime_seconds\n FROM sys.dm_os_sys_info\n `);\n if (upRes.recordset[0]) {\n const secs = Number(upRes.recordset[0].uptime_seconds || 0);\n const days = Math.floor(secs / 86400);\n const hours = Math.floor((secs % 86400) / 3600);\n const minutes = Math.floor((secs % 3600) / 60);\n uptime = days > 0 ? `${days}d ${hours}h ${minutes}m` : hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`;\n startTime = new Date(upRes.recordset[0].sqlserver_start_time);\n }\n } catch { /* ignore */ }\n\n // Connections\n try {\n const connRes = await this.pool!.request().query(`\n SELECT\n COUNT(*) AS active_connections,\n (SELECT CAST(value_in_use AS INT) FROM sys.configurations WHERE name = 'user connections') AS max_connections\n FROM sys.dm_exec_sessions\n WHERE is_user_process = 1\n `);\n activeConnections = Number(connRes.recordset[0]?.active_connections || 0);\n maxConnections = Number(connRes.recordset[0]?.max_connections || 32767);\n if (maxConnections === 0) maxConnections = 32767; // 0 means unlimited\n } catch { /* ignore */ }\n\n // Database size\n try {\n const sizeRes = await this.pool!.request().query(`\n SELECT SUM(CAST(size AS BIGINT)) * 8 * 1024 AS size_bytes FROM sys.database_files\n `);\n databaseSizeBytes = Number(sizeRes.recordset[0]?.size_bytes || 0);\n databaseSize = formatBytes(databaseSizeBytes);\n } catch { /* ignore */ }\n\n // Table/index counts\n try {\n const cntRes = await this.pool!.request().query(`\n SELECT\n (SELECT COUNT(*) FROM sys.tables WHERE type = 'U') AS table_count,\n (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\n `);\n tableCount = Number(cntRes.recordset[0]?.table_count || 0);\n indexCount = Number(cntRes.recordset[0]?.index_count || 0);\n } catch { /* ignore */ }\n\n return {\n version, uptime, startTime, activeConnections, maxConnections,\n databaseSize, databaseSizeBytes, tableCount, indexCount,\n };\n } catch (error) {\n throw mapDatabaseError(error, 'mssql');\n }\n }\n\n public async getPerformanceMetrics(): Promise<PerformanceMetrics> {\n this.ensureConnected();\n\n try {\n let cacheHitRatio = 100;\n let bufferPoolUsage: number | undefined;\n\n try {\n const cacheRes = await this.pool!.request().query(`\n SELECT\n CAST(\n (a.cntr_value * 1.0 / NULLIF(b.cntr_value, 0)) * 100\n AS DECIMAL(5,2)\n ) AS hit_ratio\n FROM sys.dm_os_performance_counters a\n CROSS JOIN sys.dm_os_performance_counters b\n WHERE a.counter_name = 'Buffer cache hit ratio'\n AND a.object_name LIKE '%Buffer Manager%'\n AND b.counter_name = 'Buffer cache hit ratio base'\n AND b.object_name LIKE '%Buffer Manager%'\n `);\n cacheHitRatio = Number(cacheRes.recordset[0]?.hit_ratio || 100);\n bufferPoolUsage = cacheHitRatio;\n } catch { /* ignore */ }\n\n return {\n cacheHitRatio,\n bufferPoolUsage,\n };\n } catch (error) {\n throw mapDatabaseError(error, 'mssql');\n }\n }\n\n public async getSlowQueries(options?: { limit?: number }): Promise<SlowQueryStats[]> {\n this.ensureConnected();\n const limit = options?.limit ?? 10;\n\n try {\n const res = await this.pool!.request().query(`\n SELECT TOP ${limit}\n CAST(qs.query_hash AS VARCHAR(50)) AS query_id,\n SUBSTRING(qt.text, 1, 500) AS query,\n qs.execution_count AS calls,\n CAST(qs.total_elapsed_time / 1000.0 AS DECIMAL(18,2)) AS total_time,\n CAST(qs.total_elapsed_time / NULLIF(qs.execution_count, 0) / 1000.0 AS DECIMAL(18,2)) AS avg_time,\n CAST(qs.min_elapsed_time / 1000.0 AS DECIMAL(18,2)) AS min_time,\n CAST(qs.max_elapsed_time / 1000.0 AS DECIMAL(18,2)) AS max_time,\n qs.total_rows AS row_cnt,\n qs.total_logical_reads AS logical_reads,\n qs.total_physical_reads AS physical_reads\n FROM sys.dm_exec_query_stats qs\n CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt\n WHERE qs.execution_count > 0\n ORDER BY qs.total_elapsed_time DESC\n `);\n\n return (res.recordset || []).map((r: Record<string, unknown>) => ({\n queryId: String(r.query_id || ''),\n query: String(r.query || ''),\n calls: Number(r.calls || 0),\n totalTime: Number(r.total_time || 0),\n avgTime: Number(r.avg_time || 0),\n minTime: Number(r.min_time || 0),\n maxTime: Number(r.max_time || 0),\n rows: Number(r.row_cnt || 0),\n sharedBlksHit: Number(r.logical_reads || 0),\n sharedBlksRead: Number(r.physical_reads || 0),\n }));\n } catch {\n return [];\n }\n }\n\n public async getActiveSessions(options?: { limit?: number }): Promise<ActiveSessionDetails[]> {\n this.ensureConnected();\n const limit = options?.limit ?? 50;\n\n try {\n const res = await this.pool!.request().query(`\n SELECT TOP ${limit}\n s.session_id AS pid,\n s.login_name AS [user],\n DB_NAME(s.database_id) AS [database],\n s.program_name AS application_name,\n s.host_name AS client_addr,\n s.status AS state,\n ISNULL(SUBSTRING(t.text, 1, 500), '') AS query,\n s.last_request_start_time AS query_start,\n ISNULL(CAST(DATEDIFF(SECOND, s.last_request_start_time, GETDATE()) AS VARCHAR) + 's', 'N/A') AS duration,\n ISNULL(DATEDIFF(MILLISECOND, s.last_request_start_time, GETDATE()), 0) AS duration_ms,\n r.wait_type,\n r.last_wait_type,\n CASE WHEN r.blocking_session_id > 0 THEN 1 ELSE 0 END AS is_blocked\n FROM sys.dm_exec_sessions s\n LEFT JOIN sys.dm_exec_requests r ON s.session_id = r.session_id\n OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t\n WHERE s.is_user_process = 1\n ORDER BY\n CASE s.status WHEN 'running' THEN 0 WHEN 'sleeping' THEN 1 ELSE 2 END,\n s.last_request_start_time DESC\n `);\n\n return (res.recordset || []).map((r: Record<string, unknown>) => ({\n pid: Number(r.pid || 0),\n user: String(r.user || 'unknown'),\n database: String(r.database || ''),\n applicationName: r.application_name ? String(r.application_name) : undefined,\n clientAddr: r.client_addr ? String(r.client_addr) : undefined,\n state: String(r.state || 'unknown'),\n query: String(r.query || ''),\n queryStart: r.query_start ? new Date(String(r.query_start)) : undefined,\n duration: String(r.duration || 'N/A'),\n durationMs: Number(r.duration_ms || 0),\n waitEventType: r.wait_type ? String(r.wait_type) : undefined,\n waitEvent: r.last_wait_type ? String(r.last_wait_type) : undefined,\n blocked: Boolean(r.is_blocked),\n }));\n } catch {\n return [];\n }\n }\n\n public async getTableStats(): Promise<TableStats[]> {\n this.ensureConnected();\n\n try {\n const res = await this.pool!.request().query(`\n SELECT\n s.name AS schema_name,\n t.name AS table_name,\n SUM(p.rows) AS row_count,\n SUM(a.total_pages) * 8 * 1024 AS total_size_bytes,\n SUM(a.used_pages) * 8 * 1024 AS used_size_bytes,\n SUM(CASE WHEN i.type IN (0, 1) THEN a.total_pages ELSE 0 END) * 8 * 1024 AS table_size_bytes,\n SUM(CASE WHEN i.type > 1 THEN a.total_pages ELSE 0 END) * 8 * 1024 AS index_size_bytes,\n STATS_DATE(t.object_id, 1) AS last_stats_update\n FROM sys.tables t\n JOIN sys.schemas s ON t.schema_id = s.schema_id\n JOIN sys.indexes i ON t.object_id = i.object_id\n JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id\n JOIN sys.allocation_units a ON p.partition_id = a.container_id\n WHERE t.type = 'U'\n GROUP BY s.name, t.name, t.object_id\n ORDER BY SUM(a.total_pages) DESC\n `);\n\n return (res.recordset || []).map((r: Record<string, unknown>) => {\n const tableSizeBytes = Number(r.table_size_bytes || 0);\n const indexSizeBytes = Number(r.index_size_bytes || 0);\n const totalSizeBytes = Number(r.total_size_bytes || 0);\n return {\n schemaName: String(r.schema_name || 'dbo'),\n tableName: String(r.table_name || ''),\n rowCount: Number(r.row_count || 0),\n tableSize: formatBytes(tableSizeBytes),\n tableSizeBytes,\n indexSize: formatBytes(indexSizeBytes),\n indexSizeBytes,\n totalSize: formatBytes(totalSizeBytes),\n totalSizeBytes,\n lastAnalyze: r.last_stats_update ? new Date(String(r.last_stats_update)) : undefined,\n };\n });\n } catch {\n return [];\n }\n }\n\n public async getIndexStats(): Promise<IndexStats[]> {\n this.ensureConnected();\n\n try {\n const res = await this.pool!.request().query(`\n SELECT\n s.name AS schema_name,\n t.name AS table_name,\n i.name AS index_name,\n i.type_desc AS index_type,\n i.is_unique,\n i.is_primary_key,\n SUM(a.total_pages) * 8 * 1024 AS index_size_bytes,\n ISNULL(u.user_seeks + u.user_scans + u.user_lookups, 0) AS scans\n FROM sys.indexes i\n JOIN sys.tables t ON i.object_id = t.object_id\n JOIN sys.schemas s ON t.schema_id = s.schema_id\n LEFT JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id\n LEFT JOIN sys.allocation_units a ON p.partition_id = a.container_id\n 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()\n WHERE i.name IS NOT NULL AND t.type = 'U'\n GROUP BY s.name, t.name, i.name, i.type_desc, i.is_unique, i.is_primary_key,\n i.object_id, i.index_id, u.user_seeks, u.user_scans, u.user_lookups\n ORDER BY SUM(a.total_pages) DESC\n `);\n\n // Get columns for each index\n const colRes = await this.pool!.request().query(`\n SELECT\n s.name AS schema_name,\n t.name AS table_name,\n i.name AS index_name,\n c.name AS column_name,\n ic.key_ordinal\n FROM sys.index_columns ic\n JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id\n JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id\n JOIN sys.tables t ON i.object_id = t.object_id\n JOIN sys.schemas s ON t.schema_id = s.schema_id\n WHERE i.name IS NOT NULL AND t.type = 'U'\n ORDER BY s.name, t.name, i.name, ic.key_ordinal\n `);\n\n const colMap = new Map<string, string[]>();\n for (const c of colRes.recordset || []) {\n const key = `${c.schema_name}.${c.table_name}.${c.index_name}`;\n if (!colMap.has(key)) colMap.set(key, []);\n colMap.get(key)!.push(String(c.column_name));\n }\n\n return (res.recordset || []).map((r: Record<string, unknown>) => {\n const key = `${r.schema_name}.${r.table_name}.${r.index_name}`;\n const idxSizeBytes = Number(r.index_size_bytes || 0);\n return {\n schemaName: String(r.schema_name || 'dbo'),\n tableName: String(r.table_name || ''),\n indexName: String(r.index_name || ''),\n indexType: String(r.index_type || ''),\n columns: colMap.get(key) || [],\n isUnique: Boolean(r.is_unique),\n isPrimary: Boolean(r.is_primary_key),\n indexSize: formatBytes(idxSizeBytes),\n indexSizeBytes: idxSizeBytes,\n scans: Number(r.scans || 0),\n };\n });\n } catch {\n return [];\n }\n }\n\n public async getStorageStats(): Promise<StorageStats[]> {\n this.ensureConnected();\n\n try {\n const res = await this.pool!.request().query(`\n SELECT\n name,\n physical_name AS location,\n CAST(size AS BIGINT) * 8 * 1024 AS size_bytes,\n type_desc\n FROM sys.database_files\n ORDER BY size DESC\n `);\n\n return (res.recordset || []).map((r: Record<string, unknown>) => {\n const sizeBytes = Number(r.size_bytes || 0);\n return {\n name: String(r.name || ''),\n location: String(r.location || ''),\n size: formatBytes(sizeBytes),\n sizeBytes,\n };\n });\n } catch {\n return [];\n }\n }\n}\n"]}
|