@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,131 +1,73 @@
|
|
|
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 oracledb from 'oracledb';
|
|
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
|
-
// Oracle Provider
|
|
45
|
-
// ============================================================================
|
|
46
|
-
|
|
47
|
-
export class OracleProvider extends SQLBaseProvider {
|
|
48
|
-
private pool: oracledb.Pool | null = null;
|
|
49
|
-
|
|
50
|
-
// Transaction support: dedicated connection held outside pool
|
|
51
|
-
private txConn: oracledb.Connection | null = null;
|
|
52
|
-
private txActive = false;
|
|
53
|
-
|
|
54
|
-
// Track running connections for cancellation
|
|
55
|
-
private runningConns = new Map<string, oracledb.Connection>();
|
|
56
6
|
|
|
57
|
-
|
|
7
|
+
var OracleProvider = class extends SQLBaseProvider {
|
|
8
|
+
constructor(config, options = {}) {
|
|
58
9
|
super(config, options);
|
|
59
|
-
|
|
60
|
-
|
|
10
|
+
this.pool = null;
|
|
11
|
+
// Transaction support: dedicated connection held outside pool
|
|
12
|
+
this.txConn = null;
|
|
13
|
+
this.txActive = false;
|
|
14
|
+
// Track running connections for cancellation
|
|
15
|
+
this.runningConns = /* @__PURE__ */ new Map();
|
|
16
|
+
oracledb.initOracleClient = void 0;
|
|
61
17
|
oracledb.outFormat = oracledb.OUT_FORMAT_OBJECT;
|
|
62
18
|
oracledb.autoCommit = true;
|
|
63
19
|
this.validate();
|
|
64
20
|
}
|
|
65
|
-
|
|
66
21
|
// ============================================================================
|
|
67
22
|
// Provider Metadata
|
|
68
23
|
// ============================================================================
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return {
|
|
72
|
-
...super.getCapabilities(),
|
|
24
|
+
getCapabilities() {
|
|
25
|
+
return __spreadProps(__spreadValues({}, super.getCapabilities()), {
|
|
73
26
|
defaultPort: 1521,
|
|
74
27
|
supportsExplain: true,
|
|
75
28
|
supportsConnectionString: true,
|
|
76
|
-
maintenanceOperations: [
|
|
77
|
-
};
|
|
29
|
+
maintenanceOperations: ["analyze", "optimize", "kill"]
|
|
30
|
+
});
|
|
78
31
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
vacuumGlobalDesc: 'Rebuilds all indexes to reclaim space and improve performance.',
|
|
91
|
-
};
|
|
32
|
+
getLabels() {
|
|
33
|
+
return __spreadProps(__spreadValues({}, super.getLabels()), {
|
|
34
|
+
analyzeAction: "Gather Statistics",
|
|
35
|
+
vacuumAction: "Rebuild Indexes",
|
|
36
|
+
analyzeGlobalLabel: "Gather Stats",
|
|
37
|
+
analyzeGlobalTitle: "Gather Statistics",
|
|
38
|
+
analyzeGlobalDesc: "Collects optimizer statistics for all tables to improve query performance.",
|
|
39
|
+
vacuumGlobalLabel: "Rebuild Indexes",
|
|
40
|
+
vacuumGlobalTitle: "Rebuild All Indexes",
|
|
41
|
+
vacuumGlobalDesc: "Rebuilds all indexes to reclaim space and improve performance."
|
|
42
|
+
});
|
|
92
43
|
}
|
|
93
|
-
|
|
94
44
|
// ============================================================================
|
|
95
45
|
// Validation
|
|
96
46
|
// ============================================================================
|
|
97
|
-
|
|
98
|
-
public validate(): void {
|
|
47
|
+
validate() {
|
|
99
48
|
super.validate();
|
|
100
|
-
|
|
101
49
|
if (!this.config.connectionString) {
|
|
102
50
|
if (!this.config.host) {
|
|
103
|
-
throw new DatabaseConfigError(
|
|
51
|
+
throw new DatabaseConfigError("Host is required for Oracle", "oracle");
|
|
104
52
|
}
|
|
105
53
|
}
|
|
106
54
|
}
|
|
107
|
-
|
|
108
55
|
// ============================================================================
|
|
109
56
|
// Connection Management
|
|
110
57
|
// ============================================================================
|
|
111
|
-
|
|
112
|
-
private getConnectString(): string {
|
|
58
|
+
getConnectString() {
|
|
113
59
|
if (this.config.connectionString) {
|
|
114
60
|
return this.config.connectionString;
|
|
115
61
|
}
|
|
116
|
-
|
|
117
|
-
const host = this.config.host || 'localhost';
|
|
62
|
+
const host = this.config.host || "localhost";
|
|
118
63
|
const port = this.config.port || 1521;
|
|
119
|
-
const serviceName = this.config.serviceName || this.config.database ||
|
|
120
|
-
|
|
64
|
+
const serviceName = this.config.serviceName || this.config.database || "ORCL";
|
|
121
65
|
return `${host}:${port}/${serviceName}`;
|
|
122
66
|
}
|
|
123
|
-
|
|
124
|
-
public async connect(): Promise<void> {
|
|
67
|
+
async connect() {
|
|
125
68
|
if (this.pool) {
|
|
126
69
|
return;
|
|
127
70
|
}
|
|
128
|
-
|
|
129
71
|
try {
|
|
130
72
|
this.pool = await oracledb.createPool({
|
|
131
73
|
user: this.config.user,
|
|
@@ -133,143 +75,121 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
133
75
|
connectString: this.getConnectString(),
|
|
134
76
|
poolMin: this.poolConfig.min,
|
|
135
77
|
poolMax: this.poolConfig.max,
|
|
136
|
-
poolTimeout: Math.floor(this.poolConfig.idleTimeout /
|
|
78
|
+
poolTimeout: Math.floor(this.poolConfig.idleTimeout / 1e3)
|
|
137
79
|
});
|
|
138
|
-
|
|
139
|
-
// Test the connection
|
|
140
80
|
const conn = await this.pool.getConnection();
|
|
141
81
|
await conn.close();
|
|
142
|
-
|
|
143
82
|
this.setConnected(true);
|
|
144
83
|
} catch (error) {
|
|
145
84
|
this.setError(error instanceof Error ? error : new Error(String(error)));
|
|
146
85
|
throw new ConnectionError(
|
|
147
86
|
`Failed to connect to Oracle: ${error instanceof Error ? error.message : error}`,
|
|
148
|
-
|
|
87
|
+
"oracle",
|
|
149
88
|
this.config.host,
|
|
150
89
|
this.config.port
|
|
151
90
|
);
|
|
152
91
|
}
|
|
153
92
|
}
|
|
154
|
-
|
|
155
|
-
public async disconnect(): Promise<void> {
|
|
93
|
+
async disconnect() {
|
|
156
94
|
if (this.pool) {
|
|
157
95
|
try {
|
|
158
96
|
await this.pool.close(0);
|
|
159
|
-
} catch {
|
|
160
|
-
// Force close on error
|
|
97
|
+
} catch (e) {
|
|
161
98
|
}
|
|
162
99
|
this.pool = null;
|
|
163
100
|
this.setConnected(false);
|
|
164
101
|
}
|
|
165
102
|
}
|
|
166
|
-
|
|
167
103
|
// ============================================================================
|
|
168
104
|
// Query Execution
|
|
169
105
|
// ============================================================================
|
|
170
|
-
|
|
171
|
-
public async query(sql: string, params?: unknown[], queryId?: string): Promise<QueryResult> {
|
|
106
|
+
async query(sql, params, queryId) {
|
|
172
107
|
this.ensureConnected();
|
|
173
|
-
|
|
174
108
|
return this.trackQuery(async () => {
|
|
109
|
+
var _a, _b;
|
|
175
110
|
const { result, executionTime } = await this.measureExecution(async () => {
|
|
176
|
-
let conn
|
|
111
|
+
let conn;
|
|
177
112
|
try {
|
|
178
|
-
conn = await this.pool
|
|
179
|
-
|
|
113
|
+
conn = await this.pool.getConnection();
|
|
180
114
|
if (queryId) {
|
|
181
115
|
this.runningConns.set(queryId, conn);
|
|
182
116
|
}
|
|
183
|
-
|
|
184
117
|
const bindParams = params || [];
|
|
185
118
|
const res = await conn.execute(sql, bindParams, {
|
|
186
119
|
outFormat: oracledb.OUT_FORMAT_OBJECT,
|
|
187
|
-
autoCommit: true
|
|
120
|
+
autoCommit: true
|
|
188
121
|
});
|
|
189
|
-
|
|
190
122
|
return res;
|
|
191
123
|
} catch (error) {
|
|
192
|
-
throw mapDatabaseError(error,
|
|
124
|
+
throw mapDatabaseError(error, "oracle", sql);
|
|
193
125
|
} finally {
|
|
194
126
|
if (queryId) this.runningConns.delete(queryId);
|
|
195
127
|
if (conn) {
|
|
196
|
-
try {
|
|
128
|
+
try {
|
|
129
|
+
await conn.close();
|
|
130
|
+
} catch (e) {
|
|
131
|
+
}
|
|
197
132
|
}
|
|
198
133
|
}
|
|
199
134
|
});
|
|
200
|
-
|
|
201
|
-
const
|
|
202
|
-
const fields = result.metaData?.map((m: { name: string }) => m.name) ?? [];
|
|
203
|
-
|
|
135
|
+
const rows = result.rows || [];
|
|
136
|
+
const fields = (_b = (_a = result.metaData) == null ? void 0 : _a.map((m) => m.name)) != null ? _b : [];
|
|
204
137
|
return {
|
|
205
138
|
rows,
|
|
206
139
|
fields,
|
|
207
140
|
rowCount: rows.length,
|
|
208
|
-
executionTime
|
|
141
|
+
executionTime
|
|
209
142
|
};
|
|
210
143
|
});
|
|
211
144
|
}
|
|
212
|
-
|
|
213
|
-
public async cancelQuery(queryId: string): Promise<boolean> {
|
|
145
|
+
async cancelQuery(queryId) {
|
|
214
146
|
const conn = this.runningConns.get(queryId);
|
|
215
147
|
if (!conn) return false;
|
|
216
|
-
|
|
217
148
|
try {
|
|
218
149
|
await conn.break();
|
|
219
150
|
return true;
|
|
220
151
|
} catch (error) {
|
|
221
|
-
console.error(
|
|
152
|
+
console.error("[Oracle] Failed to cancel query:", error);
|
|
222
153
|
return false;
|
|
223
154
|
}
|
|
224
155
|
}
|
|
225
|
-
|
|
226
156
|
// ============================================================================
|
|
227
157
|
// Query Preparation (Oracle FETCH FIRST instead of LIMIT)
|
|
228
158
|
// ============================================================================
|
|
229
|
-
|
|
230
|
-
public override prepareQuery(query: string, options: QueryPrepareOptions = {}): PreparedQuery {
|
|
159
|
+
prepareQuery(query, options = {}) {
|
|
231
160
|
const { limit = DEFAULT_QUERY_LIMIT, offset = 0, unlimited = false } = options;
|
|
232
161
|
const effectiveLimit = unlimited ? MAX_UNLIMITED_ROWS : limit;
|
|
233
162
|
const queryInfo = analyzeQuery(query);
|
|
234
|
-
|
|
235
|
-
if (queryInfo.type === 'SELECT' && !queryInfo.hasLimit) {
|
|
163
|
+
if (queryInfo.type === "SELECT" && !queryInfo.hasLimit) {
|
|
236
164
|
let modifiedSql = query.trim();
|
|
237
|
-
const hasSemicolon = modifiedSql.endsWith(
|
|
165
|
+
const hasSemicolon = modifiedSql.endsWith(";");
|
|
238
166
|
if (hasSemicolon) modifiedSql = modifiedSql.slice(0, -1).trim();
|
|
239
|
-
|
|
240
167
|
if (offset > 0) {
|
|
241
168
|
modifiedSql = `${modifiedSql} OFFSET ${offset} ROWS FETCH NEXT ${effectiveLimit} ROWS ONLY`;
|
|
242
169
|
} else {
|
|
243
170
|
modifiedSql = `${modifiedSql} FETCH FIRST ${effectiveLimit} ROWS ONLY`;
|
|
244
171
|
}
|
|
245
|
-
|
|
246
|
-
if (hasSemicolon) modifiedSql += ';';
|
|
247
|
-
|
|
172
|
+
if (hasSemicolon) modifiedSql += ";";
|
|
248
173
|
return {
|
|
249
174
|
query: modifiedSql,
|
|
250
175
|
wasLimited: true,
|
|
251
176
|
limit: effectiveLimit,
|
|
252
|
-
offset
|
|
177
|
+
offset
|
|
253
178
|
};
|
|
254
179
|
}
|
|
255
|
-
|
|
256
180
|
return { query, wasLimited: false, limit: effectiveLimit, offset };
|
|
257
181
|
}
|
|
258
|
-
|
|
259
182
|
// ============================================================================
|
|
260
183
|
// Transaction Support
|
|
261
184
|
// ============================================================================
|
|
262
|
-
|
|
263
|
-
public async beginTransaction(): Promise<void> {
|
|
185
|
+
async beginTransaction() {
|
|
264
186
|
this.ensureConnected();
|
|
265
|
-
if (this.txActive) throw new QueryError(
|
|
266
|
-
this.txConn = await this.pool
|
|
267
|
-
// Oracle auto-starts a transaction; we just hold the connection
|
|
187
|
+
if (this.txActive) throw new QueryError("Transaction already active", "oracle");
|
|
188
|
+
this.txConn = await this.pool.getConnection();
|
|
268
189
|
this.txActive = true;
|
|
269
190
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
if (!this.txConn || !this.txActive) throw new QueryError('No active transaction', 'oracle');
|
|
191
|
+
async commitTransaction() {
|
|
192
|
+
if (!this.txConn || !this.txActive) throw new QueryError("No active transaction", "oracle");
|
|
273
193
|
try {
|
|
274
194
|
await this.txConn.commit();
|
|
275
195
|
} finally {
|
|
@@ -278,9 +198,8 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
278
198
|
this.txActive = false;
|
|
279
199
|
}
|
|
280
200
|
}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
if (!this.txConn || !this.txActive) throw new QueryError('No active transaction', 'oracle');
|
|
201
|
+
async rollbackTransaction() {
|
|
202
|
+
if (!this.txConn || !this.txActive) throw new QueryError("No active transaction", "oracle");
|
|
284
203
|
try {
|
|
285
204
|
await this.txConn.rollback();
|
|
286
205
|
} finally {
|
|
@@ -289,59 +208,49 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
289
208
|
this.txActive = false;
|
|
290
209
|
}
|
|
291
210
|
}
|
|
292
|
-
|
|
293
|
-
public isInTransaction(): boolean {
|
|
211
|
+
isInTransaction() {
|
|
294
212
|
return this.txActive;
|
|
295
213
|
}
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
if (!this.txConn || !this.txActive) throw new QueryError('No active transaction', 'oracle');
|
|
299
|
-
|
|
214
|
+
async queryInTransaction(sql, params) {
|
|
215
|
+
if (!this.txConn || !this.txActive) throw new QueryError("No active transaction", "oracle");
|
|
300
216
|
return this.trackQuery(async () => {
|
|
217
|
+
var _a, _b;
|
|
301
218
|
const { result, executionTime } = await this.measureExecution(async () => {
|
|
302
219
|
try {
|
|
303
|
-
return await this.txConn
|
|
220
|
+
return await this.txConn.execute(sql, params || [], {
|
|
304
221
|
outFormat: oracledb.OUT_FORMAT_OBJECT,
|
|
305
|
-
autoCommit: false
|
|
222
|
+
autoCommit: false
|
|
306
223
|
});
|
|
307
224
|
} catch (error) {
|
|
308
|
-
throw mapDatabaseError(error,
|
|
225
|
+
throw mapDatabaseError(error, "oracle", sql);
|
|
309
226
|
}
|
|
310
227
|
});
|
|
311
|
-
|
|
312
|
-
const
|
|
313
|
-
const fields = result.metaData?.map((m: { name: string }) => m.name) ?? [];
|
|
314
|
-
|
|
228
|
+
const rows = result.rows || [];
|
|
229
|
+
const fields = (_b = (_a = result.metaData) == null ? void 0 : _a.map((m) => m.name)) != null ? _b : [];
|
|
315
230
|
return {
|
|
316
231
|
rows,
|
|
317
232
|
fields,
|
|
318
233
|
rowCount: rows.length,
|
|
319
|
-
executionTime
|
|
234
|
+
executionTime
|
|
320
235
|
};
|
|
321
236
|
});
|
|
322
237
|
}
|
|
323
|
-
|
|
324
238
|
// ============================================================================
|
|
325
239
|
// Schema Operations
|
|
326
240
|
// ============================================================================
|
|
327
|
-
|
|
328
|
-
|
|
241
|
+
async getSchema() {
|
|
242
|
+
var _a;
|
|
329
243
|
this.ensureConnected();
|
|
330
|
-
|
|
331
|
-
let conn: oracledb.Connection | undefined;
|
|
244
|
+
let conn;
|
|
332
245
|
try {
|
|
333
|
-
conn = await this.pool
|
|
334
|
-
const owner = this.config.user
|
|
335
|
-
|
|
336
|
-
// Get tables
|
|
246
|
+
conn = await this.pool.getConnection();
|
|
247
|
+
const owner = ((_a = this.config.user) == null ? void 0 : _a.toUpperCase()) || "";
|
|
337
248
|
const tablesRes = await conn.execute(
|
|
338
249
|
`SELECT TABLE_NAME, NUM_ROWS FROM ALL_TABLES WHERE OWNER = :1 ORDER BY TABLE_NAME`,
|
|
339
250
|
[owner],
|
|
340
251
|
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
341
252
|
);
|
|
342
|
-
const tables =
|
|
343
|
-
|
|
344
|
-
// Get columns
|
|
253
|
+
const tables = tablesRes.rows || [];
|
|
345
254
|
const colsRes = await conn.execute(
|
|
346
255
|
`SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, NULLABLE, DATA_DEFAULT, COLUMN_ID
|
|
347
256
|
FROM ALL_TAB_COLUMNS WHERE OWNER = :1
|
|
@@ -349,9 +258,7 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
349
258
|
[owner],
|
|
350
259
|
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
351
260
|
);
|
|
352
|
-
const allCols =
|
|
353
|
-
|
|
354
|
-
// Get primary keys
|
|
261
|
+
const allCols = colsRes.rows || [];
|
|
355
262
|
const pkRes = await conn.execute(
|
|
356
263
|
`SELECT ac.TABLE_NAME, acc.COLUMN_NAME
|
|
357
264
|
FROM ALL_CONSTRAINTS ac
|
|
@@ -360,16 +267,14 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
360
267
|
[owner],
|
|
361
268
|
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
362
269
|
);
|
|
363
|
-
const pkRows =
|
|
364
|
-
const pkMap = new Map
|
|
270
|
+
const pkRows = pkRes.rows || [];
|
|
271
|
+
const pkMap = /* @__PURE__ */ new Map();
|
|
365
272
|
for (const row of pkRows) {
|
|
366
|
-
const tbl = String(row.TABLE_NAME ||
|
|
367
|
-
const col = String(row.COLUMN_NAME ||
|
|
368
|
-
if (!pkMap.has(tbl)) pkMap.set(tbl, new Set());
|
|
369
|
-
pkMap.get(tbl)
|
|
273
|
+
const tbl = String(row.TABLE_NAME || "");
|
|
274
|
+
const col = String(row.COLUMN_NAME || "");
|
|
275
|
+
if (!pkMap.has(tbl)) pkMap.set(tbl, /* @__PURE__ */ new Set());
|
|
276
|
+
pkMap.get(tbl).add(col);
|
|
370
277
|
}
|
|
371
|
-
|
|
372
|
-
// Get foreign keys
|
|
373
278
|
const fkRes = await conn.execute(
|
|
374
279
|
`SELECT ac.TABLE_NAME,
|
|
375
280
|
acc.COLUMN_NAME,
|
|
@@ -383,9 +288,7 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
383
288
|
[owner],
|
|
384
289
|
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
385
290
|
);
|
|
386
|
-
const fkRows =
|
|
387
|
-
|
|
388
|
-
// Get indexes
|
|
291
|
+
const fkRows = fkRes.rows || [];
|
|
389
292
|
const idxRes = await conn.execute(
|
|
390
293
|
`SELECT ai.TABLE_NAME, ai.INDEX_NAME, ai.UNIQUENESS, aic.COLUMN_NAME, aic.COLUMN_POSITION
|
|
391
294
|
FROM ALL_INDEXES ai
|
|
@@ -395,115 +298,101 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
395
298
|
[owner],
|
|
396
299
|
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
397
300
|
);
|
|
398
|
-
const idxRows =
|
|
399
|
-
|
|
400
|
-
// Group columns, indexes, foreign keys by table
|
|
401
|
-
const colsByTable = new Map<string, Record<string, unknown>[]>();
|
|
301
|
+
const idxRows = idxRes.rows || [];
|
|
302
|
+
const colsByTable = /* @__PURE__ */ new Map();
|
|
402
303
|
for (const c of allCols) {
|
|
403
|
-
const tbl = String(c.TABLE_NAME ||
|
|
304
|
+
const tbl = String(c.TABLE_NAME || "");
|
|
404
305
|
if (!colsByTable.has(tbl)) colsByTable.set(tbl, []);
|
|
405
|
-
colsByTable.get(tbl)
|
|
306
|
+
colsByTable.get(tbl).push(c);
|
|
406
307
|
}
|
|
407
|
-
|
|
408
|
-
const fksByTable = new Map<string, Record<string, unknown>[]>();
|
|
308
|
+
const fksByTable = /* @__PURE__ */ new Map();
|
|
409
309
|
for (const fk of fkRows) {
|
|
410
|
-
const tbl = String(fk.TABLE_NAME ||
|
|
310
|
+
const tbl = String(fk.TABLE_NAME || "");
|
|
411
311
|
if (!fksByTable.has(tbl)) fksByTable.set(tbl, []);
|
|
412
|
-
fksByTable.get(tbl)
|
|
312
|
+
fksByTable.get(tbl).push(fk);
|
|
413
313
|
}
|
|
414
|
-
|
|
415
|
-
const idxByTable = new Map<string, Map<string, { unique: boolean; columns: string[] }>>();
|
|
314
|
+
const idxByTable = /* @__PURE__ */ new Map();
|
|
416
315
|
for (const idx of idxRows) {
|
|
417
|
-
const tbl = String(idx.TABLE_NAME ||
|
|
418
|
-
const idxName = String(idx.INDEX_NAME ||
|
|
419
|
-
if (!idxByTable.has(tbl)) idxByTable.set(tbl, new Map());
|
|
420
|
-
const tableIdxs = idxByTable.get(tbl)
|
|
316
|
+
const tbl = String(idx.TABLE_NAME || "");
|
|
317
|
+
const idxName = String(idx.INDEX_NAME || "");
|
|
318
|
+
if (!idxByTable.has(tbl)) idxByTable.set(tbl, /* @__PURE__ */ new Map());
|
|
319
|
+
const tableIdxs = idxByTable.get(tbl);
|
|
421
320
|
if (!tableIdxs.has(idxName)) {
|
|
422
321
|
tableIdxs.set(idxName, {
|
|
423
|
-
unique: String(idx.UNIQUENESS ||
|
|
424
|
-
columns: []
|
|
322
|
+
unique: String(idx.UNIQUENESS || "") === "UNIQUE",
|
|
323
|
+
columns: []
|
|
425
324
|
});
|
|
426
325
|
}
|
|
427
|
-
tableIdxs.get(idxName)
|
|
326
|
+
tableIdxs.get(idxName).columns.push(String(idx.COLUMN_NAME || ""));
|
|
428
327
|
}
|
|
429
|
-
|
|
430
328
|
return tables.map((t) => {
|
|
431
|
-
const tableName = String(t.TABLE_NAME ||
|
|
432
|
-
const pks = pkMap.get(tableName) || new Set();
|
|
433
|
-
|
|
329
|
+
const tableName = String(t.TABLE_NAME || "");
|
|
330
|
+
const pks = pkMap.get(tableName) || /* @__PURE__ */ new Set();
|
|
434
331
|
const columns = (colsByTable.get(tableName) || []).map((c) => ({
|
|
435
|
-
name: String(c.COLUMN_NAME ||
|
|
436
|
-
type: String(c.DATA_TYPE ||
|
|
437
|
-
nullable: String(c.NULLABLE ||
|
|
438
|
-
isPrimary: pks.has(String(c.COLUMN_NAME ||
|
|
439
|
-
defaultValue: c.DATA_DEFAULT ? String(c.DATA_DEFAULT).trim() :
|
|
332
|
+
name: String(c.COLUMN_NAME || ""),
|
|
333
|
+
type: String(c.DATA_TYPE || ""),
|
|
334
|
+
nullable: String(c.NULLABLE || "") === "Y",
|
|
335
|
+
isPrimary: pks.has(String(c.COLUMN_NAME || "")),
|
|
336
|
+
defaultValue: c.DATA_DEFAULT ? String(c.DATA_DEFAULT).trim() : void 0
|
|
440
337
|
}));
|
|
441
|
-
|
|
442
338
|
const foreignKeys = (fksByTable.get(tableName) || []).map((fk) => ({
|
|
443
|
-
columnName: String(fk.COLUMN_NAME ||
|
|
444
|
-
referencedTable: String(fk.REF_TABLE ||
|
|
445
|
-
referencedColumn: String(fk.REF_COLUMN ||
|
|
339
|
+
columnName: String(fk.COLUMN_NAME || ""),
|
|
340
|
+
referencedTable: String(fk.REF_TABLE || ""),
|
|
341
|
+
referencedColumn: String(fk.REF_COLUMN || "")
|
|
446
342
|
}));
|
|
447
|
-
|
|
448
|
-
const tableIdxs = idxByTable.get(tableName) || new Map();
|
|
343
|
+
const tableIdxs = idxByTable.get(tableName) || /* @__PURE__ */ new Map();
|
|
449
344
|
const indexes = Array.from(tableIdxs.entries()).map(([name, info]) => ({
|
|
450
345
|
name,
|
|
451
346
|
columns: info.columns,
|
|
452
|
-
unique: info.unique
|
|
347
|
+
unique: info.unique
|
|
453
348
|
}));
|
|
454
|
-
|
|
455
349
|
return {
|
|
456
350
|
name: tableName,
|
|
457
351
|
rowCount: Number(t.NUM_ROWS || 0),
|
|
458
352
|
columns,
|
|
459
353
|
indexes,
|
|
460
|
-
foreignKeys
|
|
354
|
+
foreignKeys
|
|
461
355
|
};
|
|
462
356
|
});
|
|
463
357
|
} finally {
|
|
464
358
|
if (conn) await conn.close();
|
|
465
359
|
}
|
|
466
360
|
}
|
|
467
|
-
|
|
468
361
|
// ============================================================================
|
|
469
362
|
// Health & Monitoring
|
|
470
363
|
// ============================================================================
|
|
471
|
-
|
|
472
|
-
|
|
364
|
+
async getHealth() {
|
|
365
|
+
var _a, _b, _c;
|
|
473
366
|
this.ensureConnected();
|
|
474
|
-
|
|
475
|
-
let conn: oracledb.Connection | undefined;
|
|
367
|
+
let conn;
|
|
476
368
|
try {
|
|
477
|
-
conn = await this.pool
|
|
478
|
-
|
|
369
|
+
conn = await this.pool.getConnection();
|
|
479
370
|
let activeConnections = 0;
|
|
480
|
-
let databaseSize =
|
|
481
|
-
let cacheHitRatio =
|
|
482
|
-
const slowQueries
|
|
483
|
-
const activeSessions
|
|
484
|
-
|
|
485
|
-
// Active connections
|
|
371
|
+
let databaseSize = "N/A";
|
|
372
|
+
let cacheHitRatio = "N/A";
|
|
373
|
+
const slowQueries = [];
|
|
374
|
+
const activeSessions = [];
|
|
486
375
|
try {
|
|
487
376
|
const connRes = await conn.execute(
|
|
488
377
|
`SELECT COUNT(*) AS CNT FROM V$SESSION WHERE STATUS = 'ACTIVE'`,
|
|
489
|
-
[],
|
|
378
|
+
[],
|
|
379
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
490
380
|
);
|
|
491
|
-
const rows =
|
|
492
|
-
activeConnections = Number(rows[0]
|
|
493
|
-
} catch {
|
|
494
|
-
|
|
495
|
-
// Database size
|
|
381
|
+
const rows = connRes.rows || [];
|
|
382
|
+
activeConnections = Number(((_a = rows[0]) == null ? void 0 : _a.CNT) || 0);
|
|
383
|
+
} catch (e) {
|
|
384
|
+
}
|
|
496
385
|
try {
|
|
497
386
|
const sizeRes = await conn.execute(
|
|
498
387
|
`SELECT ROUND(SUM(BYTES) / 1024 / 1024, 2) AS SIZE_MB FROM USER_SEGMENTS`,
|
|
499
|
-
[],
|
|
388
|
+
[],
|
|
389
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
500
390
|
);
|
|
501
|
-
const sizeRows =
|
|
502
|
-
const mb = Number(sizeRows[0]
|
|
391
|
+
const sizeRows = sizeRes.rows || [];
|
|
392
|
+
const mb = Number(((_b = sizeRows[0]) == null ? void 0 : _b.SIZE_MB) || 0);
|
|
503
393
|
databaseSize = mb > 1024 ? `${(mb / 1024).toFixed(2)} GB` : `${mb} MB`;
|
|
504
|
-
} catch {
|
|
505
|
-
|
|
506
|
-
// Cache hit ratio
|
|
394
|
+
} catch (e) {
|
|
395
|
+
}
|
|
507
396
|
try {
|
|
508
397
|
const cacheRes = await conn.execute(
|
|
509
398
|
`SELECT ROUND(
|
|
@@ -512,13 +401,13 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
512
401
|
)) * 100, 2) AS HIT_RATIO
|
|
513
402
|
FROM V$SYSSTAT
|
|
514
403
|
WHERE NAME IN ('db block gets', 'consistent gets', 'physical reads')`,
|
|
515
|
-
[],
|
|
404
|
+
[],
|
|
405
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
516
406
|
);
|
|
517
|
-
const cacheRows =
|
|
518
|
-
cacheHitRatio = `${cacheRows[0]
|
|
519
|
-
} catch {
|
|
520
|
-
|
|
521
|
-
// Slow queries
|
|
407
|
+
const cacheRows = cacheRes.rows || [];
|
|
408
|
+
cacheHitRatio = `${((_c = cacheRows[0]) == null ? void 0 : _c.HIT_RATIO) || 0}%`;
|
|
409
|
+
} catch (e) {
|
|
410
|
+
}
|
|
522
411
|
try {
|
|
523
412
|
const slowRes = await conn.execute(
|
|
524
413
|
`SELECT * FROM (
|
|
@@ -529,18 +418,18 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
529
418
|
WHERE EXECUTIONS > 0
|
|
530
419
|
ORDER BY ELAPSED_TIME DESC
|
|
531
420
|
) WHERE ROWNUM <= 5`,
|
|
532
|
-
[],
|
|
421
|
+
[],
|
|
422
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
533
423
|
);
|
|
534
|
-
for (const row of
|
|
424
|
+
for (const row of slowRes.rows || []) {
|
|
535
425
|
slowQueries.push({
|
|
536
|
-
query: String(row.QUERY ||
|
|
426
|
+
query: String(row.QUERY || ""),
|
|
537
427
|
calls: Number(row.CALLS || 0),
|
|
538
|
-
avgTime: String(row.AVGTIME ||
|
|
428
|
+
avgTime: String(row.AVGTIME || "N/A")
|
|
539
429
|
});
|
|
540
430
|
}
|
|
541
|
-
} catch {
|
|
542
|
-
|
|
543
|
-
// Active sessions
|
|
431
|
+
} catch (e) {
|
|
432
|
+
}
|
|
544
433
|
try {
|
|
545
434
|
const sessRes = await conn.execute(
|
|
546
435
|
`SELECT * FROM (
|
|
@@ -551,74 +440,71 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
551
440
|
WHERE TYPE = 'USER' AND STATUS = 'ACTIVE'
|
|
552
441
|
ORDER BY LOGON_TIME DESC
|
|
553
442
|
) WHERE ROWNUM <= 10`,
|
|
554
|
-
[],
|
|
443
|
+
[],
|
|
444
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
555
445
|
);
|
|
556
|
-
for (const row of
|
|
446
|
+
for (const row of sessRes.rows || []) {
|
|
557
447
|
activeSessions.push({
|
|
558
|
-
pid: String(row.SID ||
|
|
559
|
-
user: String(row.USERNAME ||
|
|
560
|
-
database: String(row.DATABASE ||
|
|
561
|
-
state: String(row.STATUS ||
|
|
562
|
-
query: String(row.QUERY ||
|
|
563
|
-
duration: String(row.DURATION ||
|
|
448
|
+
pid: String(row.SID || ""),
|
|
449
|
+
user: String(row.USERNAME || "unknown"),
|
|
450
|
+
database: String(row.DATABASE || ""),
|
|
451
|
+
state: String(row.STATUS || "unknown"),
|
|
452
|
+
query: String(row.QUERY || ""),
|
|
453
|
+
duration: String(row.DURATION || "N/A")
|
|
564
454
|
});
|
|
565
455
|
}
|
|
566
|
-
} catch {
|
|
567
|
-
|
|
456
|
+
} catch (e) {
|
|
457
|
+
}
|
|
568
458
|
return { activeConnections, databaseSize, cacheHitRatio, slowQueries, activeSessions };
|
|
569
459
|
} finally {
|
|
570
460
|
if (conn) await conn.close();
|
|
571
461
|
}
|
|
572
462
|
}
|
|
573
|
-
|
|
574
463
|
// ============================================================================
|
|
575
464
|
// Maintenance Operations
|
|
576
465
|
// ============================================================================
|
|
577
|
-
|
|
578
|
-
public async runMaintenance(type: MaintenanceType, target?: string): Promise<MaintenanceResult> {
|
|
466
|
+
async runMaintenance(type, target) {
|
|
579
467
|
this.ensureConnected();
|
|
580
|
-
|
|
581
468
|
const { result, executionTime } = await this.measureExecution(async () => {
|
|
582
|
-
let conn
|
|
469
|
+
let conn;
|
|
583
470
|
try {
|
|
584
|
-
conn = await this.pool
|
|
585
|
-
let sql =
|
|
586
|
-
|
|
471
|
+
conn = await this.pool.getConnection();
|
|
472
|
+
let sql = "";
|
|
587
473
|
switch (type) {
|
|
588
|
-
case
|
|
474
|
+
case "analyze":
|
|
589
475
|
if (target) {
|
|
590
476
|
sql = `BEGIN DBMS_STATS.GATHER_TABLE_STATS(USER, '${target.replace(/'/g, "''")}'); END;`;
|
|
591
477
|
} else {
|
|
592
478
|
sql = `BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(USER); END;`;
|
|
593
479
|
}
|
|
594
480
|
break;
|
|
595
|
-
case
|
|
481
|
+
case "optimize":
|
|
596
482
|
if (target) {
|
|
597
483
|
sql = `ALTER INDEX "${target.replace(/"/g, '""')}" REBUILD`;
|
|
598
484
|
} else {
|
|
599
|
-
// Rebuild all indexes for user
|
|
600
485
|
const idxRes = await conn.execute(
|
|
601
486
|
`SELECT INDEX_NAME FROM USER_INDEXES WHERE INDEX_TYPE = 'NORMAL'`,
|
|
602
|
-
[],
|
|
487
|
+
[],
|
|
488
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
603
489
|
);
|
|
604
|
-
for (const row of
|
|
490
|
+
for (const row of idxRes.rows || []) {
|
|
605
491
|
try {
|
|
606
492
|
await conn.execute(`ALTER INDEX "${String(row.INDEX_NAME)}" REBUILD`);
|
|
607
|
-
} catch {
|
|
493
|
+
} catch (e) {
|
|
494
|
+
}
|
|
608
495
|
}
|
|
609
496
|
return { success: true };
|
|
610
497
|
}
|
|
611
498
|
break;
|
|
612
|
-
case
|
|
499
|
+
case "kill":
|
|
613
500
|
if (!target) {
|
|
614
|
-
throw new QueryError(
|
|
501
|
+
throw new QueryError("Target SID,SERIAL# is required for kill operation", "oracle");
|
|
615
502
|
}
|
|
616
503
|
sql = `ALTER SYSTEM KILL SESSION '${target.replace(/'/g, "''")}'`;
|
|
617
504
|
break;
|
|
618
505
|
default:
|
|
619
|
-
throw new QueryError(`Unsupported maintenance type: ${type}`,
|
|
506
|
+
throw new QueryError(`Unsupported maintenance type: ${type}`, "oracle");
|
|
620
507
|
}
|
|
621
|
-
|
|
622
508
|
if (sql) {
|
|
623
509
|
await conn.execute(sql);
|
|
624
510
|
}
|
|
@@ -627,136 +513,133 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
627
513
|
if (conn) await conn.close();
|
|
628
514
|
}
|
|
629
515
|
});
|
|
630
|
-
|
|
631
516
|
return {
|
|
632
517
|
success: result.success,
|
|
633
518
|
executionTime,
|
|
634
|
-
message: `${type.toUpperCase()} completed successfully
|
|
519
|
+
message: `${type.toUpperCase()} completed successfully`
|
|
635
520
|
};
|
|
636
521
|
}
|
|
637
|
-
|
|
638
522
|
// ============================================================================
|
|
639
523
|
// Pool Statistics
|
|
640
524
|
// ============================================================================
|
|
641
|
-
|
|
642
|
-
public getPoolStats() {
|
|
525
|
+
getPoolStats() {
|
|
643
526
|
if (!this.pool) {
|
|
644
527
|
return { total: 0, idle: 0, active: 0, waiting: 0 };
|
|
645
528
|
}
|
|
646
|
-
|
|
647
529
|
return {
|
|
648
530
|
total: this.pool.connectionsOpen,
|
|
649
531
|
idle: this.pool.connectionsOpen - this.pool.connectionsInUse,
|
|
650
532
|
active: this.pool.connectionsInUse,
|
|
651
|
-
waiting: 0
|
|
533
|
+
waiting: 0
|
|
652
534
|
};
|
|
653
535
|
}
|
|
654
|
-
|
|
655
536
|
// ============================================================================
|
|
656
537
|
// Extended Monitoring Methods
|
|
657
538
|
// ============================================================================
|
|
658
|
-
|
|
659
|
-
|
|
539
|
+
async getOverview() {
|
|
540
|
+
var _a, _b, _c, _d, _e, _f;
|
|
660
541
|
this.ensureConnected();
|
|
661
|
-
|
|
662
|
-
let conn: oracledb.Connection | undefined;
|
|
542
|
+
let conn;
|
|
663
543
|
try {
|
|
664
|
-
conn = await this.pool
|
|
665
|
-
|
|
666
|
-
let
|
|
667
|
-
let
|
|
668
|
-
let startTime: Date | undefined;
|
|
544
|
+
conn = await this.pool.getConnection();
|
|
545
|
+
let version = "Oracle";
|
|
546
|
+
let uptime = "N/A";
|
|
547
|
+
let startTime;
|
|
669
548
|
let activeConnections = 0;
|
|
670
549
|
let maxConnections = 0;
|
|
671
|
-
let databaseSize =
|
|
550
|
+
let databaseSize = "0 bytes";
|
|
672
551
|
let databaseSizeBytes = 0;
|
|
673
552
|
let tableCount = 0;
|
|
674
553
|
let indexCount = 0;
|
|
675
|
-
|
|
676
|
-
// Version and uptime
|
|
677
554
|
try {
|
|
678
555
|
const vRes = await conn.execute(
|
|
679
556
|
`SELECT BANNER FROM V$VERSION WHERE ROWNUM = 1`,
|
|
680
|
-
[],
|
|
557
|
+
[],
|
|
558
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
681
559
|
);
|
|
682
|
-
const vRows =
|
|
683
|
-
if (vRows[0]
|
|
684
|
-
} catch {
|
|
685
|
-
|
|
560
|
+
const vRows = vRes.rows || [];
|
|
561
|
+
if ((_a = vRows[0]) == null ? void 0 : _a.BANNER) version = String(vRows[0].BANNER);
|
|
562
|
+
} catch (e) {
|
|
563
|
+
}
|
|
686
564
|
try {
|
|
687
565
|
const upRes = await conn.execute(
|
|
688
566
|
`SELECT STARTUP_TIME, (SYSDATE - STARTUP_TIME) * 86400 AS UPTIME_SECS FROM V$INSTANCE`,
|
|
689
|
-
[],
|
|
567
|
+
[],
|
|
568
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
690
569
|
);
|
|
691
|
-
const upRows =
|
|
570
|
+
const upRows = upRes.rows || [];
|
|
692
571
|
if (upRows[0]) {
|
|
693
572
|
const secs = Number(upRows[0].UPTIME_SECS || 0);
|
|
694
573
|
const days = Math.floor(secs / 86400);
|
|
695
|
-
const hours = Math.floor(
|
|
696
|
-
const minutes = Math.floor(
|
|
574
|
+
const hours = Math.floor(secs % 86400 / 3600);
|
|
575
|
+
const minutes = Math.floor(secs % 3600 / 60);
|
|
697
576
|
uptime = days > 0 ? `${days}d ${hours}h ${minutes}m` : hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`;
|
|
698
577
|
if (upRows[0].STARTUP_TIME) startTime = new Date(String(upRows[0].STARTUP_TIME));
|
|
699
578
|
}
|
|
700
|
-
} catch {
|
|
701
|
-
|
|
702
|
-
// Connections
|
|
579
|
+
} catch (e) {
|
|
580
|
+
}
|
|
703
581
|
try {
|
|
704
582
|
const sessRes = await conn.execute(
|
|
705
583
|
`SELECT COUNT(*) AS CNT FROM V$SESSION WHERE TYPE = 'USER'`,
|
|
706
|
-
[],
|
|
584
|
+
[],
|
|
585
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
707
586
|
);
|
|
708
|
-
activeConnections = Number(((sessRes.rows || [])
|
|
709
|
-
|
|
587
|
+
activeConnections = Number(((_b = (sessRes.rows || [])[0]) == null ? void 0 : _b.CNT) || 0);
|
|
710
588
|
const maxRes = await conn.execute(
|
|
711
589
|
`SELECT VALUE FROM V$PARAMETER WHERE NAME = 'sessions'`,
|
|
712
|
-
[],
|
|
590
|
+
[],
|
|
591
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
713
592
|
);
|
|
714
|
-
maxConnections = Number(((maxRes.rows || [])
|
|
715
|
-
} catch {
|
|
716
|
-
|
|
717
|
-
// Database size
|
|
593
|
+
maxConnections = Number(((_c = (maxRes.rows || [])[0]) == null ? void 0 : _c.VALUE) || 0);
|
|
594
|
+
} catch (e) {
|
|
595
|
+
}
|
|
718
596
|
try {
|
|
719
597
|
const sizeRes = await conn.execute(
|
|
720
598
|
`SELECT SUM(BYTES) AS TOTAL FROM USER_SEGMENTS`,
|
|
721
|
-
[],
|
|
599
|
+
[],
|
|
600
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
722
601
|
);
|
|
723
|
-
databaseSizeBytes = Number(((sizeRes.rows || [])
|
|
602
|
+
databaseSizeBytes = Number(((_d = (sizeRes.rows || [])[0]) == null ? void 0 : _d.TOTAL) || 0);
|
|
724
603
|
databaseSize = formatBytes(databaseSizeBytes);
|
|
725
|
-
} catch {
|
|
726
|
-
|
|
727
|
-
// Table and index counts
|
|
604
|
+
} catch (e) {
|
|
605
|
+
}
|
|
728
606
|
try {
|
|
729
607
|
const cntRes = await conn.execute(
|
|
730
608
|
`SELECT
|
|
731
609
|
(SELECT COUNT(*) FROM USER_TABLES) AS TABLE_COUNT,
|
|
732
610
|
(SELECT COUNT(*) FROM USER_INDEXES) AS INDEX_COUNT
|
|
733
611
|
FROM DUAL`,
|
|
734
|
-
[],
|
|
612
|
+
[],
|
|
613
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
735
614
|
);
|
|
736
|
-
const cntRows =
|
|
737
|
-
tableCount = Number(cntRows[0]
|
|
738
|
-
indexCount = Number(cntRows[0]
|
|
739
|
-
} catch {
|
|
740
|
-
|
|
615
|
+
const cntRows = cntRes.rows || [];
|
|
616
|
+
tableCount = Number(((_e = cntRows[0]) == null ? void 0 : _e.TABLE_COUNT) || 0);
|
|
617
|
+
indexCount = Number(((_f = cntRows[0]) == null ? void 0 : _f.INDEX_COUNT) || 0);
|
|
618
|
+
} catch (e) {
|
|
619
|
+
}
|
|
741
620
|
return {
|
|
742
|
-
version,
|
|
743
|
-
|
|
621
|
+
version,
|
|
622
|
+
uptime,
|
|
623
|
+
startTime,
|
|
624
|
+
activeConnections,
|
|
625
|
+
maxConnections,
|
|
626
|
+
databaseSize,
|
|
627
|
+
databaseSizeBytes,
|
|
628
|
+
tableCount,
|
|
629
|
+
indexCount
|
|
744
630
|
};
|
|
745
631
|
} finally {
|
|
746
632
|
if (conn) await conn.close();
|
|
747
633
|
}
|
|
748
634
|
}
|
|
749
|
-
|
|
750
|
-
|
|
635
|
+
async getPerformanceMetrics() {
|
|
636
|
+
var _a;
|
|
751
637
|
this.ensureConnected();
|
|
752
|
-
|
|
753
|
-
let conn: oracledb.Connection | undefined;
|
|
638
|
+
let conn;
|
|
754
639
|
try {
|
|
755
|
-
conn = await this.pool
|
|
756
|
-
|
|
640
|
+
conn = await this.pool.getConnection();
|
|
757
641
|
let cacheHitRatio = 100;
|
|
758
|
-
let bufferPoolUsage
|
|
759
|
-
|
|
642
|
+
let bufferPoolUsage;
|
|
760
643
|
try {
|
|
761
644
|
const cacheRes = await conn.execute(
|
|
762
645
|
`SELECT ROUND(
|
|
@@ -765,30 +648,29 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
765
648
|
)) * 100, 2) AS HIT_RATIO
|
|
766
649
|
FROM V$SYSSTAT
|
|
767
650
|
WHERE NAME IN ('db block gets', 'consistent gets', 'physical reads')`,
|
|
768
|
-
[],
|
|
651
|
+
[],
|
|
652
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
769
653
|
);
|
|
770
|
-
const rows =
|
|
771
|
-
cacheHitRatio = Number(rows[0]
|
|
654
|
+
const rows = cacheRes.rows || [];
|
|
655
|
+
cacheHitRatio = Number(((_a = rows[0]) == null ? void 0 : _a.HIT_RATIO) || 100);
|
|
772
656
|
bufferPoolUsage = cacheHitRatio;
|
|
773
|
-
} catch {
|
|
774
|
-
|
|
657
|
+
} catch (e) {
|
|
658
|
+
}
|
|
775
659
|
return {
|
|
776
660
|
cacheHitRatio,
|
|
777
|
-
bufferPoolUsage
|
|
661
|
+
bufferPoolUsage
|
|
778
662
|
};
|
|
779
663
|
} finally {
|
|
780
664
|
if (conn) await conn.close();
|
|
781
665
|
}
|
|
782
666
|
}
|
|
783
|
-
|
|
784
|
-
|
|
667
|
+
async getSlowQueries(options) {
|
|
668
|
+
var _a;
|
|
785
669
|
this.ensureConnected();
|
|
786
|
-
const limit = options
|
|
787
|
-
|
|
788
|
-
let conn: oracledb.Connection | undefined;
|
|
670
|
+
const limit = (_a = options == null ? void 0 : options.limit) != null ? _a : 10;
|
|
671
|
+
let conn;
|
|
789
672
|
try {
|
|
790
|
-
conn = await this.pool
|
|
791
|
-
|
|
673
|
+
conn = await this.pool.getConnection();
|
|
792
674
|
const res = await conn.execute(
|
|
793
675
|
`SELECT * FROM (
|
|
794
676
|
SELECT SQL_ID AS QUERY_ID,
|
|
@@ -803,34 +685,32 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
803
685
|
WHERE EXECUTIONS > 0
|
|
804
686
|
ORDER BY ELAPSED_TIME DESC
|
|
805
687
|
) WHERE ROWNUM <= ${limit}`,
|
|
806
|
-
[],
|
|
688
|
+
[],
|
|
689
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
807
690
|
);
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
query: String(r.QUERY || ''),
|
|
691
|
+
return (res.rows || []).map((r) => ({
|
|
692
|
+
queryId: String(r.QUERY_ID || ""),
|
|
693
|
+
query: String(r.QUERY || ""),
|
|
812
694
|
calls: Number(r.CALLS || 0),
|
|
813
695
|
totalTime: Number(r.TOTAL_TIME || 0),
|
|
814
696
|
avgTime: Number(r.AVG_TIME || 0),
|
|
815
697
|
rows: Number(r.ROW_CNT || 0),
|
|
816
698
|
sharedBlksHit: Number(r.BUF_GETS || 0),
|
|
817
|
-
sharedBlksRead: Number(r.DISK_READS || 0)
|
|
699
|
+
sharedBlksRead: Number(r.DISK_READS || 0)
|
|
818
700
|
}));
|
|
819
|
-
} catch {
|
|
701
|
+
} catch (e) {
|
|
820
702
|
return [];
|
|
821
703
|
} finally {
|
|
822
704
|
if (conn) await conn.close();
|
|
823
705
|
}
|
|
824
706
|
}
|
|
825
|
-
|
|
826
|
-
|
|
707
|
+
async getActiveSessions(options) {
|
|
708
|
+
var _a;
|
|
827
709
|
this.ensureConnected();
|
|
828
|
-
const limit = options
|
|
829
|
-
|
|
830
|
-
let conn: oracledb.Connection | undefined;
|
|
710
|
+
const limit = (_a = options == null ? void 0 : options.limit) != null ? _a : 50;
|
|
711
|
+
let conn;
|
|
831
712
|
try {
|
|
832
|
-
conn = await this.pool
|
|
833
|
-
|
|
713
|
+
conn = await this.pool.getConnection();
|
|
834
714
|
const res = await conn.execute(
|
|
835
715
|
`SELECT * FROM (
|
|
836
716
|
SELECT s.SID, s.SERIAL#, s.USERNAME, s.SCHEMANAME, s.PROGRAM,
|
|
@@ -844,46 +724,41 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
844
724
|
WHERE s.TYPE = 'USER'
|
|
845
725
|
ORDER BY CASE s.STATUS WHEN 'ACTIVE' THEN 0 ELSE 1 END, s.LOGON_TIME DESC
|
|
846
726
|
) WHERE ROWNUM <= ${limit}`,
|
|
847
|
-
[],
|
|
727
|
+
[],
|
|
728
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
848
729
|
);
|
|
849
|
-
|
|
850
|
-
return ((res.rows || []) as Record<string, unknown>[]).map((r) => {
|
|
730
|
+
return (res.rows || []).map((r) => {
|
|
851
731
|
const secs = Number(r.DURATION_SECS || 0);
|
|
852
|
-
const durationStr = secs > 3600 ? `${Math.floor(secs / 3600)}h ${Math.floor(
|
|
853
|
-
: secs > 60 ? `${Math.floor(secs / 60)}m ${secs % 60}s`
|
|
854
|
-
: `${secs}s`;
|
|
855
|
-
|
|
732
|
+
const durationStr = secs > 3600 ? `${Math.floor(secs / 3600)}h ${Math.floor(secs % 3600 / 60)}m` : secs > 60 ? `${Math.floor(secs / 60)}m ${secs % 60}s` : `${secs}s`;
|
|
856
733
|
return {
|
|
857
|
-
pid: `${r.SID},${r[
|
|
858
|
-
user: String(r.USERNAME ||
|
|
859
|
-
database: String(r.SCHEMANAME ||
|
|
860
|
-
applicationName: String(r.PROGRAM ||
|
|
861
|
-
clientAddr: String(r.MACHINE ||
|
|
862
|
-
state: String(r.STATUS ||
|
|
863
|
-
query: String(r.QUERY || r.SQL_ID ||
|
|
864
|
-
queryStart: r.LOGON_TIME ? new Date(String(r.LOGON_TIME)) :
|
|
734
|
+
pid: `${r.SID},${r["SERIAL#"]}`,
|
|
735
|
+
user: String(r.USERNAME || "unknown"),
|
|
736
|
+
database: String(r.SCHEMANAME || ""),
|
|
737
|
+
applicationName: String(r.PROGRAM || ""),
|
|
738
|
+
clientAddr: String(r.MACHINE || ""),
|
|
739
|
+
state: String(r.STATUS || "unknown"),
|
|
740
|
+
query: String(r.QUERY || r.SQL_ID || ""),
|
|
741
|
+
queryStart: r.LOGON_TIME ? new Date(String(r.LOGON_TIME)) : void 0,
|
|
865
742
|
duration: durationStr,
|
|
866
|
-
durationMs: secs *
|
|
867
|
-
waitEventType: r.WAIT_CLASS ? String(r.WAIT_CLASS) :
|
|
868
|
-
waitEvent: r.EVENT ? String(r.EVENT) :
|
|
869
|
-
blocked: false
|
|
743
|
+
durationMs: secs * 1e3,
|
|
744
|
+
waitEventType: r.WAIT_CLASS ? String(r.WAIT_CLASS) : void 0,
|
|
745
|
+
waitEvent: r.EVENT ? String(r.EVENT) : void 0,
|
|
746
|
+
blocked: false
|
|
870
747
|
};
|
|
871
748
|
});
|
|
872
|
-
} catch {
|
|
749
|
+
} catch (e) {
|
|
873
750
|
return [];
|
|
874
751
|
} finally {
|
|
875
752
|
if (conn) await conn.close();
|
|
876
753
|
}
|
|
877
754
|
}
|
|
878
|
-
|
|
879
|
-
|
|
755
|
+
async getTableStats() {
|
|
756
|
+
var _a;
|
|
880
757
|
this.ensureConnected();
|
|
881
|
-
|
|
882
|
-
let conn: oracledb.Connection | undefined;
|
|
758
|
+
let conn;
|
|
883
759
|
try {
|
|
884
|
-
conn = await this.pool
|
|
885
|
-
const owner = this.config.user
|
|
886
|
-
|
|
760
|
+
conn = await this.pool.getConnection();
|
|
761
|
+
const owner = ((_a = this.config.user) == null ? void 0 : _a.toUpperCase()) || "";
|
|
887
762
|
const res = await conn.execute(
|
|
888
763
|
`SELECT t.TABLE_NAME,
|
|
889
764
|
NVL(t.NUM_ROWS, 0) AS ROW_COUNT,
|
|
@@ -903,13 +778,12 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
903
778
|
[owner],
|
|
904
779
|
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
905
780
|
);
|
|
906
|
-
|
|
907
|
-
return ((res.rows || []) as Record<string, unknown>[]).map((r) => {
|
|
781
|
+
return (res.rows || []).map((r) => {
|
|
908
782
|
const tableSizeBytes = Number(r.TABLE_SIZE_BYTES || 0);
|
|
909
783
|
const indexSizeBytes = Number(r.INDEX_SIZE_BYTES || 0);
|
|
910
784
|
return {
|
|
911
785
|
schemaName: owner,
|
|
912
|
-
tableName: String(r.TABLE_NAME ||
|
|
786
|
+
tableName: String(r.TABLE_NAME || ""),
|
|
913
787
|
rowCount: Number(r.ROW_COUNT || 0),
|
|
914
788
|
tableSize: formatBytes(tableSizeBytes),
|
|
915
789
|
tableSizeBytes,
|
|
@@ -917,24 +791,22 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
917
791
|
indexSizeBytes,
|
|
918
792
|
totalSize: formatBytes(tableSizeBytes + indexSizeBytes),
|
|
919
793
|
totalSizeBytes: tableSizeBytes + indexSizeBytes,
|
|
920
|
-
lastAnalyze: r.LAST_ANALYZED ? new Date(String(r.LAST_ANALYZED)) :
|
|
794
|
+
lastAnalyze: r.LAST_ANALYZED ? new Date(String(r.LAST_ANALYZED)) : void 0
|
|
921
795
|
};
|
|
922
796
|
});
|
|
923
|
-
} catch {
|
|
797
|
+
} catch (e) {
|
|
924
798
|
return [];
|
|
925
799
|
} finally {
|
|
926
800
|
if (conn) await conn.close();
|
|
927
801
|
}
|
|
928
802
|
}
|
|
929
|
-
|
|
930
|
-
|
|
803
|
+
async getIndexStats() {
|
|
804
|
+
var _a;
|
|
931
805
|
this.ensureConnected();
|
|
932
|
-
|
|
933
|
-
let conn: oracledb.Connection | undefined;
|
|
806
|
+
let conn;
|
|
934
807
|
try {
|
|
935
|
-
conn = await this.pool
|
|
936
|
-
const owner = this.config.user
|
|
937
|
-
|
|
808
|
+
conn = await this.pool.getConnection();
|
|
809
|
+
const owner = ((_a = this.config.user) == null ? void 0 : _a.toUpperCase()) || "";
|
|
938
810
|
const res = await conn.execute(
|
|
939
811
|
`SELECT ai.TABLE_NAME, ai.INDEX_NAME, ai.INDEX_TYPE, ai.UNIQUENESS,
|
|
940
812
|
NVL(us.BYTES, 0) AS INDEX_SIZE_BYTES,
|
|
@@ -946,8 +818,6 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
946
818
|
[owner],
|
|
947
819
|
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
948
820
|
);
|
|
949
|
-
|
|
950
|
-
// Get columns for each index
|
|
951
821
|
const colRes = await conn.execute(
|
|
952
822
|
`SELECT INDEX_NAME, COLUMN_NAME, COLUMN_POSITION
|
|
953
823
|
FROM ALL_IND_COLUMNS WHERE INDEX_OWNER = :1
|
|
@@ -955,46 +825,40 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
955
825
|
[owner],
|
|
956
826
|
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
957
827
|
);
|
|
958
|
-
|
|
959
|
-
const
|
|
960
|
-
|
|
961
|
-
const idxName = String(c.INDEX_NAME || '');
|
|
828
|
+
const colMap = /* @__PURE__ */ new Map();
|
|
829
|
+
for (const c of colRes.rows || []) {
|
|
830
|
+
const idxName = String(c.INDEX_NAME || "");
|
|
962
831
|
if (!colMap.has(idxName)) colMap.set(idxName, []);
|
|
963
|
-
colMap.get(idxName)
|
|
832
|
+
colMap.get(idxName).push(String(c.COLUMN_NAME || ""));
|
|
964
833
|
}
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
const idxName = String(r.INDEX_NAME || '');
|
|
834
|
+
return (res.rows || []).map((r) => {
|
|
835
|
+
const idxName = String(r.INDEX_NAME || "");
|
|
968
836
|
const idxSizeBytes = Number(r.INDEX_SIZE_BYTES || 0);
|
|
969
837
|
return {
|
|
970
838
|
schemaName: owner,
|
|
971
|
-
tableName: String(r.TABLE_NAME ||
|
|
839
|
+
tableName: String(r.TABLE_NAME || ""),
|
|
972
840
|
indexName: idxName,
|
|
973
|
-
indexType: String(r.INDEX_TYPE ||
|
|
841
|
+
indexType: String(r.INDEX_TYPE || ""),
|
|
974
842
|
columns: colMap.get(idxName) || [],
|
|
975
|
-
isUnique: String(r.UNIQUENESS ||
|
|
843
|
+
isUnique: String(r.UNIQUENESS || "") === "UNIQUE",
|
|
976
844
|
isPrimary: false,
|
|
977
845
|
indexSize: formatBytes(idxSizeBytes),
|
|
978
846
|
indexSizeBytes: idxSizeBytes,
|
|
979
|
-
scans: 0
|
|
847
|
+
scans: 0
|
|
980
848
|
};
|
|
981
849
|
});
|
|
982
|
-
} catch {
|
|
850
|
+
} catch (e) {
|
|
983
851
|
return [];
|
|
984
852
|
} finally {
|
|
985
853
|
if (conn) await conn.close();
|
|
986
854
|
}
|
|
987
855
|
}
|
|
988
|
-
|
|
989
|
-
public async getStorageStats(): Promise<StorageStats[]> {
|
|
856
|
+
async getStorageStats() {
|
|
990
857
|
this.ensureConnected();
|
|
991
|
-
|
|
992
|
-
let conn: oracledb.Connection | undefined;
|
|
858
|
+
let conn;
|
|
993
859
|
try {
|
|
994
|
-
conn = await this.pool
|
|
995
|
-
const results
|
|
996
|
-
|
|
997
|
-
// Try DBA tablespaces first, fallback to USER
|
|
860
|
+
conn = await this.pool.getConnection();
|
|
861
|
+
const results = [];
|
|
998
862
|
try {
|
|
999
863
|
const tsRes = await conn.execute(
|
|
1000
864
|
`SELECT TABLESPACE_NAME AS NAME,
|
|
@@ -1002,19 +866,18 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
1002
866
|
FROM DBA_DATA_FILES
|
|
1003
867
|
GROUP BY TABLESPACE_NAME
|
|
1004
868
|
ORDER BY SUM(BYTES) DESC`,
|
|
1005
|
-
[],
|
|
869
|
+
[],
|
|
870
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
1006
871
|
);
|
|
1007
|
-
|
|
1008
|
-
for (const row of (tsRes.rows || []) as Record<string, unknown>[]) {
|
|
872
|
+
for (const row of tsRes.rows || []) {
|
|
1009
873
|
const sizeBytes = Number(row.SIZE_BYTES || 0);
|
|
1010
874
|
results.push({
|
|
1011
|
-
name: String(row.NAME ||
|
|
875
|
+
name: String(row.NAME || ""),
|
|
1012
876
|
size: formatBytes(sizeBytes),
|
|
1013
|
-
sizeBytes
|
|
877
|
+
sizeBytes
|
|
1014
878
|
});
|
|
1015
879
|
}
|
|
1016
|
-
} catch {
|
|
1017
|
-
// Fallback: user segments
|
|
880
|
+
} catch (e) {
|
|
1018
881
|
try {
|
|
1019
882
|
const segRes = await conn.execute(
|
|
1020
883
|
`SELECT TABLESPACE_NAME AS NAME,
|
|
@@ -1022,23 +885,27 @@ export class OracleProvider extends SQLBaseProvider {
|
|
|
1022
885
|
FROM USER_SEGMENTS
|
|
1023
886
|
GROUP BY TABLESPACE_NAME
|
|
1024
887
|
ORDER BY SUM(BYTES) DESC`,
|
|
1025
|
-
[],
|
|
888
|
+
[],
|
|
889
|
+
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
|
|
1026
890
|
);
|
|
1027
|
-
|
|
1028
|
-
for (const row of (segRes.rows || []) as Record<string, unknown>[]) {
|
|
891
|
+
for (const row of segRes.rows || []) {
|
|
1029
892
|
const sizeBytes = Number(row.SIZE_BYTES || 0);
|
|
1030
893
|
results.push({
|
|
1031
|
-
name: String(row.NAME ||
|
|
894
|
+
name: String(row.NAME || ""),
|
|
1032
895
|
size: formatBytes(sizeBytes),
|
|
1033
|
-
sizeBytes
|
|
896
|
+
sizeBytes
|
|
1034
897
|
});
|
|
1035
898
|
}
|
|
1036
|
-
} catch {
|
|
899
|
+
} catch (e2) {
|
|
900
|
+
}
|
|
1037
901
|
}
|
|
1038
|
-
|
|
1039
902
|
return results;
|
|
1040
903
|
} finally {
|
|
1041
904
|
if (conn) await conn.close();
|
|
1042
905
|
}
|
|
1043
906
|
}
|
|
1044
|
-
}
|
|
907
|
+
};
|
|
908
|
+
|
|
909
|
+
export { OracleProvider };
|
|
910
|
+
//# sourceMappingURL=oracle-P2G7T4P4.mjs.map
|
|
911
|
+
//# sourceMappingURL=oracle-P2G7T4P4.mjs.map
|