@libredb/studio 0.9.7 → 0.9.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-34YQUUCM.mjs +319 -0
- package/dist/chunk-34YQUUCM.mjs.map +1 -0
- package/dist/chunk-4LVB3K53.mjs +37 -0
- package/dist/chunk-4LVB3K53.mjs.map +1 -0
- package/dist/chunk-6DRZXXNT.mjs +100 -0
- package/dist/chunk-6DRZXXNT.mjs.map +1 -0
- package/dist/chunk-CZVV3JJB.mjs +160 -0
- package/dist/chunk-CZVV3JJB.mjs.map +1 -0
- package/dist/chunk-D4WVWWWF.js +332 -0
- package/dist/chunk-D4WVWWWF.js.map +1 -0
- package/dist/chunk-DY3KXE44.mjs +3 -0
- package/dist/chunk-DY3KXE44.mjs.map +1 -0
- package/dist/chunk-DZ2UB3C6.mjs +6679 -0
- package/dist/chunk-DZ2UB3C6.mjs.map +1 -0
- package/dist/chunk-FYSE52VB.js +242 -0
- package/dist/chunk-FYSE52VB.js.map +1 -0
- package/dist/chunk-G4WYE6TI.js +4 -0
- package/dist/chunk-G4WYE6TI.js.map +1 -0
- package/dist/chunk-JOGLIOFO.js +1310 -0
- package/dist/chunk-JOGLIOFO.js.map +1 -0
- package/dist/chunk-JZO5KRZN.js +165 -0
- package/dist/chunk-JZO5KRZN.js.map +1 -0
- package/dist/chunk-KV356UXJ.js +253 -0
- package/dist/chunk-KV356UXJ.js.map +1 -0
- package/dist/chunk-PPODO6HX.mjs +237 -0
- package/dist/chunk-PPODO6HX.mjs.map +1 -0
- package/dist/chunk-PTIRB2JO.js +258 -0
- package/dist/chunk-PTIRB2JO.js.map +1 -0
- package/dist/chunk-Q6LRDBK7.js +42 -0
- package/dist/chunk-Q6LRDBK7.js.map +1 -0
- package/dist/chunk-QJP5FZRY.mjs +255 -0
- package/dist/chunk-QJP5FZRY.mjs.map +1 -0
- package/dist/chunk-R3POCJK6.mjs +248 -0
- package/dist/chunk-R3POCJK6.mjs.map +1 -0
- package/dist/chunk-RBVDMLFV.js +6747 -0
- package/dist/chunk-RBVDMLFV.js.map +1 -0
- package/dist/chunk-RCQB4FCE.js +186 -0
- package/dist/chunk-RCQB4FCE.js.map +1 -0
- package/dist/chunk-SR5DRGBX.mjs +174 -0
- package/dist/chunk-SR5DRGBX.mjs.map +1 -0
- package/dist/chunk-VLCRUZX7.js +102 -0
- package/dist/chunk-VLCRUZX7.js.map +1 -0
- package/dist/chunk-VWVRUCQO.mjs +1289 -0
- package/dist/chunk-VWVRUCQO.mjs.map +1 -0
- package/dist/components.d.mts +273 -0
- package/dist/components.d.ts +273 -0
- package/dist/components.js +59 -0
- package/dist/components.js.map +1 -0
- package/dist/components.mjs +6 -0
- package/dist/components.mjs.map +1 -0
- package/dist/custom-BNDOYC5P.js +134 -0
- package/dist/custom-BNDOYC5P.js.map +1 -0
- package/dist/custom-S2EKFMP3.mjs +132 -0
- package/dist/custom-S2EKFMP3.mjs.map +1 -0
- package/dist/gemini-4ASHNK4H.js +81 -0
- package/dist/gemini-4ASHNK4H.js.map +1 -0
- package/dist/gemini-C5RBLQEJ.mjs +79 -0
- package/dist/gemini-C5RBLQEJ.mjs.map +1 -0
- package/dist/index.d.mts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +10 -0
- package/dist/index.mjs.map +1 -0
- package/dist/mongodb-XMZEZA4A.mjs +748 -0
- package/dist/mongodb-XMZEZA4A.mjs.map +1 -0
- package/dist/mongodb-YQJJTLX3.js +750 -0
- package/dist/mongodb-YQJJTLX3.js.map +1 -0
- package/dist/mssql-PMOU4D36.js +916 -0
- package/dist/mssql-PMOU4D36.js.map +1 -0
- package/{src/lib/db/providers/sql/mssql.ts → dist/mssql-ZH5VP2C5.mjs} +268 -423
- package/dist/mssql-ZH5VP2C5.mjs.map +1 -0
- package/{src/lib/db/providers/sql/mysql.ts → dist/mysql-I3WJQXN2.mjs} +277 -428
- package/dist/mysql-I3WJQXN2.mjs.map +1 -0
- package/dist/mysql-Y3MSA5QY.js +833 -0
- package/dist/mysql-Y3MSA5QY.js.map +1 -0
- package/dist/ollama-26BYLVEV.mjs +115 -0
- package/dist/ollama-26BYLVEV.mjs.map +1 -0
- package/dist/ollama-HVWAGKQC.js +117 -0
- package/dist/ollama-HVWAGKQC.js.map +1 -0
- package/dist/openai-4U56KPG7.mjs +111 -0
- package/dist/openai-4U56KPG7.mjs.map +1 -0
- package/dist/openai-AK3R37BS.js +113 -0
- package/dist/openai-AK3R37BS.js.map +1 -0
- package/dist/oracle-L6VEAVXO.js +917 -0
- package/dist/oracle-L6VEAVXO.js.map +1 -0
- package/{src/lib/db/providers/sql/oracle.ts → dist/oracle-P2G7T4P4.mjs} +321 -454
- package/dist/oracle-P2G7T4P4.mjs.map +1 -0
- package/{src/lib/db/providers/sql/postgres.ts → dist/postgres-O5KOQUVP.mjs} +261 -471
- package/dist/postgres-O5KOQUVP.mjs.map +1 -0
- package/dist/postgres-RLCWNFFX.js +971 -0
- package/dist/postgres-RLCWNFFX.js.map +1 -0
- package/dist/providers.d.mts +149 -0
- package/dist/providers.d.ts +149 -0
- package/dist/providers.js +44 -0
- package/dist/providers.js.map +1 -0
- package/dist/providers.mjs +7 -0
- package/dist/providers.mjs.map +1 -0
- package/dist/redis-4WMQOVLX.mjs +435 -0
- package/dist/redis-4WMQOVLX.mjs.map +1 -0
- package/dist/redis-QVQ6YU62.js +441 -0
- package/dist/redis-QVQ6YU62.js.map +1 -0
- package/dist/sqlite-4I2P2OGQ.js +554 -0
- package/dist/sqlite-4I2P2OGQ.js.map +1 -0
- package/dist/sqlite-OA4YJX5S.mjs +531 -0
- package/dist/sqlite-OA4YJX5S.mjs.map +1 -0
- package/dist/types-BJvJfxSY.d.mts +141 -0
- package/dist/types-BJvJfxSY.d.ts +141 -0
- package/dist/types-ClAg_v5k.d.mts +343 -0
- package/dist/types-Der_X8E8.d.ts +343 -0
- package/dist/types.d.mts +2 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +3 -0
- package/dist/types.mjs.map +1 -0
- package/dist/workspace.d.mts +80 -0
- package/dist/workspace.d.ts +80 -0
- package/dist/workspace.js +4182 -0
- package/dist/workspace.js.map +1 -0
- package/dist/workspace.mjs +4155 -0
- package/dist/workspace.mjs.map +1 -0
- package/package.json +60 -5
- package/.claude/settings.local.json +0 -127
- package/.cursorrules +0 -426
- package/.devin/wiki.json +0 -143
- package/.dockerignore +0 -80
- package/.env.example +0 -159
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -49
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -29
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -57
- package/.github/workflows/ci.yml +0 -185
- package/.github/workflows/codeql.yml +0 -57
- package/.github/workflows/docker-build-push.yml +0 -118
- package/.github/workflows/helm-release.yml +0 -113
- package/CLAUDE.md +0 -265
- package/CODE_OF_CONDUCT.md +0 -124
- package/CONTRIBUTING.md +0 -154
- package/Dockerfile +0 -73
- package/SECURITY.md +0 -107
- package/artifacthub-repo.yml +0 -4
- package/bun.lock +0 -1714
- package/bunfig.toml +0 -3
- package/charts/libredb-studio/.helmignore +0 -11
- package/charts/libredb-studio/Chart.lock +0 -6
- package/charts/libredb-studio/Chart.yaml +0 -50
- package/charts/libredb-studio/README.md +0 -206
- package/charts/libredb-studio/templates/NOTES.txt +0 -59
- package/charts/libredb-studio/templates/_helpers.tpl +0 -135
- package/charts/libredb-studio/templates/configmap.yaml +0 -37
- package/charts/libredb-studio/templates/deployment.yaml +0 -184
- package/charts/libredb-studio/templates/hpa.yaml +0 -32
- package/charts/libredb-studio/templates/ingress.yaml +0 -41
- package/charts/libredb-studio/templates/networkpolicy.yaml +0 -50
- package/charts/libredb-studio/templates/pdb.yaml +0 -18
- package/charts/libredb-studio/templates/pvc.yaml +0 -23
- package/charts/libredb-studio/templates/secret.yaml +0 -30
- package/charts/libredb-studio/templates/seed-configmap.yaml +0 -11
- package/charts/libredb-studio/templates/service.yaml +0 -22
- package/charts/libredb-studio/templates/serviceaccount.yaml +0 -13
- package/charts/libredb-studio/values.schema.json +0 -246
- package/charts/libredb-studio/values.yaml +0 -286
- package/components.json +0 -22
- package/conductor/code_styleguides/typescript.md +0 -43
- package/conductor/product-guidelines.md +0 -43
- package/conductor/product.md +0 -3
- package/conductor/setup_state.json +0 -1
- package/conductor/tech-stack.md +0 -39
- package/conductor/tracks/enhance_postgres_monitoring_20251227/metadata.json +0 -8
- package/conductor/tracks/enhance_postgres_monitoring_20251227/plan.md +0 -44
- package/conductor/tracks/enhance_postgres_monitoring_20251227/spec.md +0 -31
- package/conductor/tracks.md +0 -8
- package/conductor/workflow.md +0 -333
- package/database-compose.yml +0 -55
- package/docker/postgres-init/01-extensions.sql +0 -10
- package/docker/postgres-init/02-sample-data.sql +0 -585
- package/docker/postgres.yml +0 -68
- package/docker-compose.yml +0 -38
- package/docs/AI_PLAN.md +0 -74
- package/docs/API_DOCS.md +0 -875
- package/docs/ARCHITECTURE.md +0 -218
- package/docs/DATABASE_PROVIDERS.md +0 -358
- package/docs/FEATURES.md +0 -116
- package/docs/HELM_CHART.md +0 -252
- package/docs/LOGIN_PAGE.md +0 -178
- package/docs/MONACO_EDITOR_PERFORMANCE.md +0 -315
- package/docs/OIDC_ARCH.md +0 -681
- package/docs/OIDC_SETUP.md +0 -322
- package/docs/POSTGRES_METRICS.md +0 -516
- package/docs/QUERY_OPTIMIZATION.md +0 -370
- package/docs/SEED_CONNECTIONS.md +0 -468
- package/docs/SQL_ALIAS_COMPLETION.md +0 -190
- package/docs/STORAGE_ARCHITECTURE.md +0 -565
- package/docs/STORAGE_QUICK_SETUP.md +0 -419
- package/docs/TECHNICAL_PLAN.md +0 -36
- package/docs/THEMING.md +0 -345
- package/docs/adding-a-new-database-provider.md +0 -642
- package/docs/backlogs/000-PLATFORM_DATA_SYNC_DATABASE.md +0 -360
- package/docs/backlogs/001-INLINE_DATA_EDITING.md +0 -118
- package/docs/backlogs/002-DATA_IMPORT.md +0 -215
- package/docs/backlogs/003-QUERY_TIME_MACHINE.md +0 -183
- package/docs/backlogs/004-AI_DATA_STORYTELLER.md +0 -292
- package/docs/backlogs/005-QUERY_PLAYGROUND.md +0 -352
- package/docs/backlogs/006-DATA_MASKING.md +0 -418
- package/docs/enterprise-features.md +0 -718
- package/docs/kubernetes-helm-chart-artifacthub-plan.md +0 -803
- package/docs/medium-koyeb-article-en.md +0 -215
- package/docs/plans/test-plans.md +0 -445
- package/docs/releases/RELEASE.V0.3.0.md +0 -22
- package/docs/releases/RELEASE.V0.4.0.md +0 -154
- package/docs/releases/RELEASE.V0.5.0.md +0 -252
- package/docs/releases/RELEASE_v0.5.6.md +0 -145
- package/docs/releases/RELEASE_v0.6.1.md +0 -303
- package/docs/releases/RELEASE_v0.6.7.md +0 -292
- package/docs/releases/RELEASE_v0.7.0.md +0 -332
- package/docs/releases/RELEASE_v0.8.0.md +0 -521
- package/docs/sampledb/titanic.sql +0 -1379
- package/docs/superpowers/plans/2026-03-25-seed-connections.md +0 -1362
- package/docs/superpowers/specs/2026-03-25-seed-connections-design.md +0 -590
- package/e2e/admin-dashboard.spec.ts +0 -64
- package/e2e/connection-management.spec.ts +0 -58
- package/e2e/export.spec.ts +0 -34
- package/e2e/login.spec.ts +0 -85
- package/e2e/query-execution.spec.ts +0 -35
- package/e2e/tab-management.spec.ts +0 -64
- package/eslint.config.mjs +0 -28
- package/fly.toml +0 -43
- package/next.config.ts +0 -32
- package/playwright.config.ts +0 -34
- package/postcss.config.mjs +0 -7
- package/public/favicon-32x32.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/file.svg +0 -1
- package/public/globe.svg +0 -1
- package/public/logo.svg +0 -32
- package/public/next.svg +0 -1
- package/public/screenshots/code-generator.png +0 -0
- package/public/screenshots/connection-modal.png +0 -0
- package/public/screenshots/data-profiler.png +0 -0
- package/public/screenshots/erd-diagram.png +0 -0
- package/public/screenshots/hero-editor.png +0 -0
- package/public/screenshots/nl2sql.png +0 -0
- package/public/vercel.svg +0 -1
- package/public/window.svg +0 -1
- package/render.yaml +0 -58
- package/scripts/merge-lcov.mjs +0 -239
- package/sonar-project.properties +0 -16
- package/src/app/admin/error.tsx +0 -46
- package/src/app/admin/page.tsx +0 -10
- package/src/app/api/admin/audit/route.ts +0 -52
- package/src/app/api/admin/fleet-health/route.ts +0 -81
- package/src/app/api/ai/autopilot/route.ts +0 -105
- package/src/app/api/ai/chat/route.ts +0 -132
- package/src/app/api/ai/describe-schema/route.ts +0 -52
- package/src/app/api/ai/explain/route.ts +0 -86
- package/src/app/api/ai/impact/route.ts +0 -97
- package/src/app/api/ai/index-advisor/route.ts +0 -98
- package/src/app/api/ai/nl2sql/route.ts +0 -87
- package/src/app/api/ai/query-safety/route.ts +0 -87
- package/src/app/api/auth/login/route.ts +0 -62
- package/src/app/api/auth/logout/route.ts +0 -25
- package/src/app/api/auth/me/route.ts +0 -10
- package/src/app/api/auth/oidc/callback/route.ts +0 -82
- package/src/app/api/auth/oidc/login/route.ts +0 -43
- package/src/app/api/connections/managed/route.ts +0 -35
- package/src/app/api/db/cancel/route.ts +0 -42
- package/src/app/api/db/disconnect/route.ts +0 -28
- package/src/app/api/db/health/route.ts +0 -49
- package/src/app/api/db/maintenance/route.ts +0 -72
- package/src/app/api/db/monitoring/route.ts +0 -62
- package/src/app/api/db/multi-query/route.ts +0 -116
- package/src/app/api/db/pool-stats/route.ts +0 -37
- package/src/app/api/db/profile/route.ts +0 -144
- package/src/app/api/db/provider-meta/route.ts +0 -49
- package/src/app/api/db/query/route.ts +0 -50
- package/src/app/api/db/schema/route.ts +0 -47
- package/src/app/api/db/schema-snapshot/route.ts +0 -42
- package/src/app/api/db/test-connection/route.ts +0 -55
- package/src/app/api/db/transaction/route.ts +0 -111
- package/src/app/api/storage/[collection]/route.ts +0 -67
- package/src/app/api/storage/config/route.ts +0 -17
- package/src/app/api/storage/migrate/route.ts +0 -45
- package/src/app/api/storage/route.ts +0 -32
- package/src/app/error.tsx +0 -49
- package/src/app/global-error.tsx +0 -55
- package/src/app/globals.css +0 -146
- package/src/app/icon.svg +0 -42
- package/src/app/layout.tsx +0 -34
- package/src/app/login/login-form.tsx +0 -301
- package/src/app/login/page.tsx +0 -11
- package/src/app/monitoring/page.tsx +0 -8
- package/src/app/not-found.tsx +0 -29
- package/src/app/page.tsx +0 -5
- package/src/components/AIAutopilotPanel.tsx +0 -238
- package/src/components/CodeGenerator.tsx +0 -271
- package/src/components/CommandPalette.tsx +0 -227
- package/src/components/ConnectionModal.tsx +0 -759
- package/src/components/CreateTableModal.tsx +0 -281
- package/src/components/DataCharts.tsx +0 -962
- package/src/components/DataImportModal.tsx +0 -582
- package/src/components/DataProfiler.tsx +0 -335
- package/src/components/DatabaseDocs.tsx +0 -251
- package/src/components/MaskingSettings.tsx +0 -414
- package/src/components/MobileNav.tsx +0 -50
- package/src/components/NL2SQLPanel.tsx +0 -281
- package/src/components/PivotTable.tsx +0 -257
- package/src/components/QueryEditor.tsx +0 -760
- package/src/components/QueryHistory.tsx +0 -344
- package/src/components/QuerySafetyDialog.tsx +0 -290
- package/src/components/ResultsGrid.tsx +0 -644
- package/src/components/SaveQueryModal.tsx +0 -104
- package/src/components/SavedQueries.tsx +0 -128
- package/src/components/SchemaDiagram.tsx +0 -473
- package/src/components/SchemaDiff.tsx +0 -473
- package/src/components/SnapshotTimeline.tsx +0 -116
- package/src/components/Studio.tsx +0 -639
- package/src/components/TestDataGenerator.tsx +0 -261
- package/src/components/VisualExplain.tsx +0 -820
- package/src/components/admin/AdminDashboard.tsx +0 -163
- package/src/components/admin/tabs/AuditTab.tsx +0 -531
- package/src/components/admin/tabs/MonitoringEmbed.tsx +0 -11
- package/src/components/admin/tabs/OperationsTab.tsx +0 -646
- package/src/components/admin/tabs/OverviewTab.tsx +0 -1328
- package/src/components/admin/tabs/SecurityTab.tsx +0 -284
- package/src/components/community-section.tsx +0 -92
- package/src/components/icons/db-icons.tsx +0 -84
- package/src/components/libredb-logo.tsx +0 -61
- package/src/components/monitoring/MonitoringDashboard.tsx +0 -345
- package/src/components/monitoring/tabs/MetricChart.tsx +0 -82
- package/src/components/monitoring/tabs/OverviewTab.tsx +0 -263
- package/src/components/monitoring/tabs/PerformanceTab.tsx +0 -254
- package/src/components/monitoring/tabs/PoolTab.tsx +0 -174
- package/src/components/monitoring/tabs/QueriesTab.tsx +0 -287
- package/src/components/monitoring/tabs/SessionsTab.tsx +0 -316
- package/src/components/monitoring/tabs/StorageTab.tsx +0 -335
- package/src/components/monitoring/tabs/TablesTab.tsx +0 -300
- package/src/components/results-grid/ResultCard.tsx +0 -111
- package/src/components/results-grid/RowDetailSheet.tsx +0 -178
- package/src/components/results-grid/StatsBar.tsx +0 -201
- package/src/components/results-grid/index.ts +0 -1
- package/src/components/results-grid/utils.ts +0 -23
- package/src/components/schema-explorer/ColumnList.tsx +0 -53
- package/src/components/schema-explorer/SchemaExplorer.tsx +0 -182
- package/src/components/schema-explorer/TableItem.tsx +0 -210
- package/src/components/schema-explorer/index.ts +0 -1
- package/src/components/sidebar/ConnectionItem.tsx +0 -105
- package/src/components/sidebar/ConnectionsList.tsx +0 -62
- package/src/components/sidebar/Sidebar.tsx +0 -130
- package/src/components/sidebar/index.ts +0 -2
- package/src/components/studio/BottomPanel.tsx +0 -286
- package/src/components/studio/QueryToolbar.tsx +0 -180
- package/src/components/studio/StudioDesktopHeader.tsx +0 -114
- package/src/components/studio/StudioMobileHeader.tsx +0 -340
- package/src/components/studio/StudioTabBar.tsx +0 -82
- package/src/components/studio/index.ts +0 -5
- package/src/components/ui/accordion.tsx +0 -66
- package/src/components/ui/alert-dialog.tsx +0 -157
- package/src/components/ui/alert.tsx +0 -66
- package/src/components/ui/aspect-ratio.tsx +0 -11
- package/src/components/ui/avatar.tsx +0 -53
- package/src/components/ui/badge.tsx +0 -46
- package/src/components/ui/breadcrumb.tsx +0 -109
- package/src/components/ui/button-group.tsx +0 -83
- package/src/components/ui/button.tsx +0 -60
- package/src/components/ui/calendar.tsx +0 -216
- package/src/components/ui/card.tsx +0 -92
- package/src/components/ui/carousel.tsx +0 -241
- package/src/components/ui/chart.tsx +0 -357
- package/src/components/ui/checkbox.tsx +0 -32
- package/src/components/ui/collapsible.tsx +0 -33
- package/src/components/ui/command.tsx +0 -184
- package/src/components/ui/context-menu.tsx +0 -252
- package/src/components/ui/dialog.tsx +0 -143
- package/src/components/ui/drawer.tsx +0 -135
- package/src/components/ui/dropdown-menu.tsx +0 -257
- package/src/components/ui/empty.tsx +0 -104
- package/src/components/ui/field.tsx +0 -248
- package/src/components/ui/form.tsx +0 -167
- package/src/components/ui/hover-card.tsx +0 -44
- package/src/components/ui/input-group.tsx +0 -170
- package/src/components/ui/input-otp.tsx +0 -77
- package/src/components/ui/input.tsx +0 -21
- package/src/components/ui/item.tsx +0 -193
- package/src/components/ui/kbd.tsx +0 -28
- package/src/components/ui/label.tsx +0 -24
- package/src/components/ui/menubar.tsx +0 -276
- package/src/components/ui/navigation-menu.tsx +0 -168
- package/src/components/ui/pagination.tsx +0 -127
- package/src/components/ui/popover.tsx +0 -48
- package/src/components/ui/progress.tsx +0 -31
- package/src/components/ui/radio-group.tsx +0 -45
- package/src/components/ui/resizable.tsx +0 -56
- package/src/components/ui/scroll-area.tsx +0 -58
- package/src/components/ui/select.tsx +0 -187
- package/src/components/ui/separator.tsx +0 -28
- package/src/components/ui/sheet.tsx +0 -139
- package/src/components/ui/sidebar.tsx +0 -726
- package/src/components/ui/skeleton.tsx +0 -13
- package/src/components/ui/slider.tsx +0 -63
- package/src/components/ui/sonner.tsx +0 -40
- package/src/components/ui/spinner.tsx +0 -16
- package/src/components/ui/switch.tsx +0 -31
- package/src/components/ui/table.tsx +0 -116
- package/src/components/ui/tabs.tsx +0 -66
- package/src/components/ui/textarea.tsx +0 -18
- package/src/components/ui/toggle-group.tsx +0 -83
- package/src/components/ui/toggle.tsx +0 -47
- package/src/components/ui/tooltip.tsx +0 -61
- package/src/exports/components.ts +0 -15
- package/src/exports/index.ts +0 -4
- package/src/exports/providers.ts +0 -4
- package/src/exports/types.ts +0 -26
- package/src/hooks/use-ai-chat.ts +0 -182
- package/src/hooks/use-all-connections.ts +0 -66
- package/src/hooks/use-api-call.ts +0 -71
- package/src/hooks/use-auth.ts +0 -51
- package/src/hooks/use-connection-form.ts +0 -349
- package/src/hooks/use-connection-manager.ts +0 -169
- package/src/hooks/use-connection-payload.ts +0 -15
- package/src/hooks/use-inline-editing.ts +0 -109
- package/src/hooks/use-mobile.ts +0 -20
- package/src/hooks/use-monitoring-data.ts +0 -270
- package/src/hooks/use-provider-metadata.ts +0 -62
- package/src/hooks/use-query-execution.ts +0 -478
- package/src/hooks/use-storage-sync.ts +0 -259
- package/src/hooks/use-tab-manager.ts +0 -231
- package/src/hooks/use-toast.ts +0 -20
- package/src/hooks/use-transaction-control.ts +0 -64
- package/src/lib/api/error-codes.ts +0 -30
- package/src/lib/api/errors.ts +0 -236
- package/src/lib/api/with-error-handler.ts +0 -41
- package/src/lib/audit.ts +0 -105
- package/src/lib/auth.ts +0 -87
- package/src/lib/connection-string-parser.ts +0 -172
- package/src/lib/data-masking.ts +0 -385
- package/src/lib/db/base-provider.ts +0 -325
- package/src/lib/db/errors.ts +0 -317
- package/src/lib/db/factory.ts +0 -324
- package/src/lib/db/index.ts +0 -123
- package/src/lib/db/providers/document/index.ts +0 -6
- package/src/lib/db/providers/document/mongodb.ts +0 -992
- package/src/lib/db/providers/keyvalue/redis.ts +0 -554
- package/src/lib/db/providers/sql/index.ts +0 -11
- package/src/lib/db/providers/sql/sql-base.ts +0 -174
- package/src/lib/db/providers/sql/sqlite.ts +0 -721
- package/src/lib/db/types.ts +0 -437
- package/src/lib/db/utils/pool-manager.ts +0 -287
- package/src/lib/db/utils/query-limiter.ts +0 -239
- package/src/lib/db-ui-config.ts +0 -86
- package/src/lib/editor/mongodb-completions.ts +0 -172
- package/src/lib/editor/sql-completions.ts +0 -280
- package/src/lib/llm/base-provider.ts +0 -117
- package/src/lib/llm/factory.ts +0 -102
- package/src/lib/llm/index.ts +0 -90
- package/src/lib/llm/providers/custom.ts +0 -181
- package/src/lib/llm/providers/gemini.ts +0 -126
- package/src/lib/llm/providers/ollama.ts +0 -154
- package/src/lib/llm/providers/openai.ts +0 -146
- package/src/lib/llm/types.ts +0 -173
- package/src/lib/llm/utils/config.ts +0 -187
- package/src/lib/llm/utils/retry.ts +0 -119
- package/src/lib/llm/utils/streaming.ts +0 -202
- package/src/lib/logger.ts +0 -127
- package/src/lib/monitoring-thresholds.ts +0 -44
- package/src/lib/oidc.ts +0 -262
- package/src/lib/query-generators.ts +0 -61
- package/src/lib/schema-diff/diff-engine.ts +0 -273
- package/src/lib/schema-diff/migration-generator.ts +0 -208
- package/src/lib/schema-diff/types.ts +0 -55
- package/src/lib/seed/config-loader.ts +0 -79
- package/src/lib/seed/connection-filter.ts +0 -49
- package/src/lib/seed/credential-resolver.ts +0 -62
- package/src/lib/seed/index.ts +0 -40
- package/src/lib/seed/resolve-connection.ts +0 -57
- package/src/lib/seed/types.ts +0 -69
- package/src/lib/sql/alias-extractor.ts +0 -267
- package/src/lib/sql/index.ts +0 -8
- package/src/lib/sql/statement-splitter.ts +0 -167
- package/src/lib/sql/types.ts +0 -40
- package/src/lib/ssh/tunnel.ts +0 -142
- package/src/lib/storage/factory.ts +0 -84
- package/src/lib/storage/index.ts +0 -14
- package/src/lib/storage/local-storage.ts +0 -99
- package/src/lib/storage/providers/postgres.ts +0 -225
- package/src/lib/storage/providers/sqlite.ts +0 -153
- package/src/lib/storage/storage-facade.ts +0 -272
- package/src/lib/storage/types.ts +0 -75
- package/src/lib/time-series-buffer.ts +0 -58
- package/src/lib/types.ts +0 -173
- package/src/lib/utils.ts +0 -6
- package/src/proxy.ts +0 -104
- package/src/types/db-drivers.d.ts +0 -23
- package/src/types/html2canvas.d.ts +0 -9
- package/tests/api/admin/audit.test.ts +0 -178
- package/tests/api/admin/fleet-health.test.ts +0 -183
- package/tests/api/ai/autopilot.test.ts +0 -174
- package/tests/api/ai/chat.test.ts +0 -250
- package/tests/api/ai/describe-schema.test.ts +0 -266
- package/tests/api/ai/explain.test.ts +0 -199
- package/tests/api/ai/impact.test.ts +0 -168
- package/tests/api/ai/index-advisor.test.ts +0 -171
- package/tests/api/ai/nl2sql.test.ts +0 -202
- package/tests/api/ai/query-safety.test.ts +0 -196
- package/tests/api/auth/login.test.ts +0 -170
- package/tests/api/auth/logout.test.ts +0 -140
- package/tests/api/auth/me.test.ts +0 -73
- package/tests/api/auth/oidc-callback.test.ts +0 -215
- package/tests/api/auth/oidc-login.test.ts +0 -127
- package/tests/api/db/cancel.test.ts +0 -198
- package/tests/api/db/disconnect.test.ts +0 -124
- package/tests/api/db/health.test.ts +0 -222
- package/tests/api/db/maintenance.test.ts +0 -263
- package/tests/api/db/monitoring.test.ts +0 -221
- package/tests/api/db/multi-query.test.ts +0 -316
- package/tests/api/db/pool-stats.test.ts +0 -135
- package/tests/api/db/profile.test.ts +0 -330
- package/tests/api/db/provider-meta.test.ts +0 -193
- package/tests/api/db/query.test.ts +0 -314
- package/tests/api/db/schema-snapshot.test.ts +0 -170
- package/tests/api/db/schema.test.ts +0 -191
- package/tests/api/db/test-connection.test.ts +0 -185
- package/tests/api/db/transaction.test.ts +0 -314
- package/tests/api/proxy.test.ts +0 -191
- package/tests/api/seed/managed-route.test.ts +0 -113
- package/tests/api/storage/config.test.ts +0 -42
- package/tests/api/storage/storage-routes.test.ts +0 -309
- package/tests/components/AIAutopilotPanel.test.tsx +0 -756
- package/tests/components/AdminPage.test.tsx +0 -33
- package/tests/components/CodeGenerator.test.tsx +0 -182
- package/tests/components/CommandPalette.test.tsx +0 -428
- package/tests/components/CommunitySection.test.tsx +0 -91
- package/tests/components/ConnectionModal.mobile.test.tsx +0 -284
- package/tests/components/ConnectionModal.test.tsx +0 -570
- package/tests/components/CreateTableModal.test.tsx +0 -383
- package/tests/components/DataCharts.test.tsx +0 -739
- package/tests/components/DataImportModal.test.tsx +0 -751
- package/tests/components/DataProfiler.test.tsx +0 -589
- package/tests/components/DatabaseDocs.test.tsx +0 -353
- package/tests/components/LoginPage.test.tsx +0 -163
- package/tests/components/LoginPageOIDC.test.tsx +0 -92
- package/tests/components/MaskingSettings.test.tsx +0 -498
- package/tests/components/MobileNav.test.tsx +0 -30
- package/tests/components/MonitoringPage.test.tsx +0 -32
- package/tests/components/NL2SQLPanel.test.tsx +0 -621
- package/tests/components/Page.test.tsx +0 -33
- package/tests/components/PivotTable.test.tsx +0 -350
- package/tests/components/QueryEditor.test.tsx +0 -1730
- package/tests/components/QueryHistory.test.tsx +0 -572
- package/tests/components/QuerySafetyDialog.test.tsx +0 -586
- package/tests/components/ResultsGrid.test.tsx +0 -804
- package/tests/components/RootLayout.test.tsx +0 -83
- package/tests/components/SaveQueryModal.test.tsx +0 -25
- package/tests/components/SavedQueries.test.tsx +0 -43
- package/tests/components/SchemaDiagram.test.tsx +0 -1034
- package/tests/components/SchemaDiff.test.tsx +0 -906
- package/tests/components/SnapshotTimeline.test.tsx +0 -174
- package/tests/components/Studio.test.tsx +0 -1030
- package/tests/components/TestDataGenerator.test.tsx +0 -291
- package/tests/components/VisualExplain.test.tsx +0 -704
- package/tests/components/admin/AdminDashboard.test.tsx +0 -205
- package/tests/components/admin/AuditTab.test.tsx +0 -220
- package/tests/components/admin/MonitoringEmbed.test.tsx +0 -58
- package/tests/components/admin/OperationsTab.test.tsx +0 -975
- package/tests/components/admin/OverviewTab.test.tsx +0 -254
- package/tests/components/admin/SecurityTab.test.tsx +0 -467
- package/tests/components/monitoring/MetricChart.test.tsx +0 -111
- package/tests/components/monitoring/MonitoringDashboard.test.tsx +0 -259
- package/tests/components/monitoring/OverviewTab.test.tsx +0 -78
- package/tests/components/monitoring/PerformanceTab.test.tsx +0 -87
- package/tests/components/monitoring/PoolTab.test.tsx +0 -42
- package/tests/components/monitoring/QueriesTab.test.tsx +0 -80
- package/tests/components/monitoring/SessionsTab.test.tsx +0 -154
- package/tests/components/monitoring/StorageTab.test.tsx +0 -127
- package/tests/components/monitoring/TablesTab.test.tsx +0 -153
- package/tests/components/results-grid/ResultCard.test.tsx +0 -105
- package/tests/components/results-grid/RowDetailSheet.test.tsx +0 -308
- package/tests/components/results-grid/StatsBar.test.tsx +0 -162
- package/tests/components/schema-explorer/ColumnList.test.tsx +0 -151
- package/tests/components/schema-explorer/SchemaExplorer.test.tsx +0 -461
- package/tests/components/schema-explorer/TableItem.test.tsx +0 -415
- package/tests/components/sidebar/ConnectionItem.test.tsx +0 -201
- package/tests/components/sidebar/ConnectionsList.test.tsx +0 -176
- package/tests/components/sidebar/Sidebar.test.tsx +0 -187
- package/tests/components/studio/BottomPanel.test.tsx +0 -383
- package/tests/components/studio/QueryToolbar.test.tsx +0 -321
- package/tests/components/studio/StudioDesktopHeader.test.tsx +0 -377
- package/tests/components/studio/StudioMobileHeader.test.tsx +0 -198
- package/tests/components/studio/StudioTabBar.test.tsx +0 -331
- package/tests/fixtures/connections.ts +0 -96
- package/tests/fixtures/masking-configs.ts +0 -86
- package/tests/fixtures/query-results.ts +0 -71
- package/tests/fixtures/schemas.ts +0 -64
- package/tests/fixtures/seed-connections/invalid-config.yaml +0 -7
- package/tests/fixtures/seed-connections/minimal-config.yaml +0 -8
- package/tests/fixtures/seed-connections/mixed-credentials.yaml +0 -23
- package/tests/fixtures/seed-connections/multi-role-config.yaml +0 -30
- package/tests/fixtures/seed-connections/valid-config.json +0 -15
- package/tests/fixtures/seed-connections/valid-config.yaml +0 -51
- package/tests/helpers/mock-fetch.ts +0 -59
- package/tests/helpers/mock-monaco.ts +0 -112
- package/tests/helpers/mock-navigation.ts +0 -28
- package/tests/helpers/mock-next.ts +0 -80
- package/tests/helpers/mock-provider.ts +0 -133
- package/tests/helpers/mock-sonner.ts +0 -29
- package/tests/helpers/render-with-providers.tsx +0 -19
- package/tests/hooks/use-ai-chat.test.ts +0 -600
- package/tests/hooks/use-auth.test.ts +0 -371
- package/tests/hooks/use-connection-form.test.ts +0 -743
- package/tests/hooks/use-connection-manager.test.ts +0 -466
- package/tests/hooks/use-inline-editing.test.ts +0 -321
- package/tests/hooks/use-mobile.test.ts +0 -177
- package/tests/hooks/use-monitoring-data.test.ts +0 -819
- package/tests/hooks/use-provider-metadata.test.ts +0 -228
- package/tests/hooks/use-query-execution.test.ts +0 -1212
- package/tests/hooks/use-tab-manager.test.ts +0 -756
- package/tests/hooks/use-toast.test.ts +0 -74
- package/tests/hooks/use-transaction-control.test.ts +0 -211
- package/tests/integration/db/mongodb-provider.test.ts +0 -698
- package/tests/integration/db/mssql-provider.test.ts +0 -840
- package/tests/integration/db/mysql-provider.test.ts +0 -872
- package/tests/integration/db/oracle-provider.test.ts +0 -843
- package/tests/integration/db/postgres-provider.test.ts +0 -1382
- package/tests/integration/db/redis-provider.test.ts +0 -526
- package/tests/integration/db/sqlite-provider.test.ts +0 -480
- package/tests/integration/seed/seed-pipeline.test.ts +0 -102
- package/tests/isolated/factory-singleton.test.ts +0 -150
- package/tests/isolated/use-storage-sync.test.ts +0 -389
- package/tests/run-components.sh +0 -196
- package/tests/setup-dom.ts +0 -58
- package/tests/setup.ts +0 -40
- package/tests/unit/api-errors.test.ts +0 -210
- package/tests/unit/code-generator-functions.test.ts +0 -271
- package/tests/unit/components/column-list.test.tsx +0 -190
- package/tests/unit/components/data-import-modal.test.tsx +0 -441
- package/tests/unit/components/studio-mobile-header.test.tsx +0 -327
- package/tests/unit/data-charts-functions.test.ts +0 -496
- package/tests/unit/data-import-functions.test.ts +0 -320
- package/tests/unit/data-import-utils.test.ts +0 -125
- package/tests/unit/db/base-provider.test.ts +0 -517
- package/tests/unit/db/errors.test.ts +0 -403
- package/tests/unit/db/factory.test.ts +0 -436
- package/tests/unit/db/pool-manager.test.ts +0 -440
- package/tests/unit/db/query-limiter.test.ts +0 -387
- package/tests/unit/db/sql-base.test.ts +0 -438
- package/tests/unit/lib/api/error-codes.test.ts +0 -39
- package/tests/unit/lib/audit.test.ts +0 -326
- package/tests/unit/lib/auth.test.ts +0 -146
- package/tests/unit/lib/connection-string-parser.test.ts +0 -424
- package/tests/unit/lib/data-masking.test.ts +0 -583
- package/tests/unit/lib/db-icons.test.tsx +0 -41
- package/tests/unit/lib/monitoring-thresholds.test.ts +0 -133
- package/tests/unit/lib/oidc.test.ts +0 -509
- package/tests/unit/lib/query-generators.test.ts +0 -127
- package/tests/unit/lib/storage/factory.test.ts +0 -71
- package/tests/unit/lib/storage/local-storage.test.ts +0 -114
- package/tests/unit/lib/storage/providers/postgres.test.ts +0 -312
- package/tests/unit/lib/storage/providers/sqlite.test.ts +0 -232
- package/tests/unit/lib/storage/storage-facade-extended.test.ts +0 -331
- package/tests/unit/lib/storage/storage-facade.test.ts +0 -184
- package/tests/unit/lib/storage.test.ts +0 -317
- package/tests/unit/lib/time-series-buffer.test.ts +0 -212
- package/tests/unit/lib/utils.test.ts +0 -24
- package/tests/unit/llm/base-provider.test.ts +0 -238
- package/tests/unit/llm/config.test.ts +0 -262
- package/tests/unit/llm/custom-provider.test.ts +0 -281
- package/tests/unit/llm/gemini-provider.test.ts +0 -248
- package/tests/unit/llm/llm-factory.test.ts +0 -155
- package/tests/unit/llm/ollama-provider.test.ts +0 -288
- package/tests/unit/llm/openai-provider.test.ts +0 -324
- package/tests/unit/llm/retry.test.ts +0 -180
- package/tests/unit/llm/streaming.test.ts +0 -355
- package/tests/unit/logger.test.ts +0 -198
- package/tests/unit/mongodb-completions.test.ts +0 -516
- package/tests/unit/pivot-table-functions.test.ts +0 -76
- package/tests/unit/query-cancelled-error.test.ts +0 -81
- package/tests/unit/schema-diff/diff-engine.test.ts +0 -367
- package/tests/unit/schema-diff/migration-generator.test.ts +0 -513
- package/tests/unit/seed/config-loader.test.ts +0 -73
- package/tests/unit/seed/connection-filter.test.ts +0 -91
- package/tests/unit/seed/credential-resolver.test.ts +0 -85
- package/tests/unit/seed/index.test.ts +0 -72
- package/tests/unit/seed/resolve-connection.test.ts +0 -74
- package/tests/unit/seed/types.test.ts +0 -129
- package/tests/unit/sql/alias-extractor.test.ts +0 -444
- package/tests/unit/sql/statement-splitter.test.ts +0 -348
- package/tests/unit/sql-completions.test.ts +0 -463
- package/tests/unit/ssh-tunnel.test.ts +0 -465
- package/tsconfig.json +0 -42
|
@@ -1,214 +1,132 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
type TableSchema,
|
|
11
|
-
type QueryResult,
|
|
12
|
-
type HealthInfo,
|
|
13
|
-
type MaintenanceType,
|
|
14
|
-
type MaintenanceResult,
|
|
15
|
-
type ProviderOptions,
|
|
16
|
-
type ProviderCapabilities,
|
|
17
|
-
type SlowQuery,
|
|
18
|
-
type ActiveSession,
|
|
19
|
-
type DatabaseOverview,
|
|
20
|
-
type PerformanceMetrics,
|
|
21
|
-
type SlowQueryStats,
|
|
22
|
-
type ActiveSessionDetails,
|
|
23
|
-
type TableStats,
|
|
24
|
-
type IndexStats,
|
|
25
|
-
type StorageStats,
|
|
26
|
-
} from '../../types';
|
|
27
|
-
import {
|
|
28
|
-
DatabaseConfigError,
|
|
29
|
-
ConnectionError,
|
|
30
|
-
QueryError,
|
|
31
|
-
mapDatabaseError,
|
|
32
|
-
} from '../../errors';
|
|
33
|
-
import { formatBytes } from '../../utils/pool-manager';
|
|
34
|
-
|
|
35
|
-
// ============================================================================
|
|
36
|
-
// Type Definitions
|
|
37
|
-
// ============================================================================
|
|
38
|
-
|
|
39
|
-
interface PgStatActivityRow {
|
|
40
|
-
datname?: string;
|
|
41
|
-
pid?: number;
|
|
42
|
-
usename?: string;
|
|
43
|
-
application_name?: string;
|
|
44
|
-
client_addr?: string;
|
|
45
|
-
backend_start?: string | Date;
|
|
46
|
-
state?: string;
|
|
47
|
-
query?: string;
|
|
48
|
-
[key: string]: unknown;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// ============================================================================
|
|
52
|
-
// PostgreSQL Provider
|
|
53
|
-
// ============================================================================
|
|
54
|
-
|
|
55
|
-
export class PostgresProvider extends SQLBaseProvider {
|
|
56
|
-
private pool: Pool | null = null;
|
|
57
|
-
|
|
58
|
-
// Transaction support: dedicated client held outside pool
|
|
59
|
-
private txClient: PoolClient | null = null;
|
|
60
|
-
private txActive = false;
|
|
61
|
-
private txTimeout: ReturnType<typeof setTimeout> | null = null;
|
|
62
|
-
private static readonly TX_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
|
|
63
|
-
|
|
64
|
-
constructor(config: DatabaseConnection, options: ProviderOptions = {}) {
|
|
1
|
+
import { SQLBaseProvider } 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';
|
|
5
|
+
import { Pool } from 'pg';
|
|
6
|
+
|
|
7
|
+
var _PostgresProvider = class _PostgresProvider extends SQLBaseProvider {
|
|
8
|
+
// 5 minutes
|
|
9
|
+
constructor(config, options = {}) {
|
|
65
10
|
super(config, options);
|
|
11
|
+
this.pool = null;
|
|
12
|
+
// Transaction support: dedicated client held outside pool
|
|
13
|
+
this.txClient = null;
|
|
14
|
+
this.txActive = false;
|
|
15
|
+
this.txTimeout = null;
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Query Execution
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Track running query PIDs for cancellation
|
|
20
|
+
this.runningQueryPids = /* @__PURE__ */ new Map();
|
|
66
21
|
this.validate();
|
|
67
22
|
}
|
|
68
|
-
|
|
69
23
|
// ============================================================================
|
|
70
24
|
// Provider Metadata
|
|
71
25
|
// ============================================================================
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
return {
|
|
75
|
-
...super.getCapabilities(),
|
|
26
|
+
getCapabilities() {
|
|
27
|
+
return __spreadProps(__spreadValues({}, super.getCapabilities()), {
|
|
76
28
|
defaultPort: 5432,
|
|
77
29
|
supportsExplain: true,
|
|
78
30
|
supportsConnectionString: true,
|
|
79
|
-
maintenanceOperations: [
|
|
80
|
-
};
|
|
31
|
+
maintenanceOperations: ["vacuum", "analyze", "reindex", "kill"]
|
|
32
|
+
});
|
|
81
33
|
}
|
|
82
|
-
|
|
83
34
|
// ============================================================================
|
|
84
35
|
// Validation
|
|
85
36
|
// ============================================================================
|
|
86
|
-
|
|
87
|
-
public validate(): void {
|
|
37
|
+
validate() {
|
|
88
38
|
super.validate();
|
|
89
|
-
|
|
90
39
|
if (!this.config.connectionString) {
|
|
91
40
|
if (!this.config.host) {
|
|
92
|
-
throw new DatabaseConfigError(
|
|
41
|
+
throw new DatabaseConfigError("Host is required for PostgreSQL", "postgres");
|
|
93
42
|
}
|
|
94
43
|
if (!this.config.database) {
|
|
95
|
-
throw new DatabaseConfigError(
|
|
44
|
+
throw new DatabaseConfigError("Database name is required for PostgreSQL", "postgres");
|
|
96
45
|
}
|
|
97
46
|
}
|
|
98
47
|
}
|
|
99
|
-
|
|
100
48
|
// ============================================================================
|
|
101
49
|
// Connection Management
|
|
102
50
|
// ============================================================================
|
|
103
|
-
|
|
104
|
-
public async connect(): Promise<void> {
|
|
51
|
+
async connect() {
|
|
105
52
|
if (this.pool) {
|
|
106
53
|
return;
|
|
107
54
|
}
|
|
108
|
-
|
|
109
55
|
try {
|
|
110
56
|
const poolConfig = this.buildPoolConfig();
|
|
111
57
|
this.pool = new Pool(poolConfig);
|
|
112
|
-
|
|
113
58
|
const client = await this.pool.connect();
|
|
114
59
|
client.release();
|
|
115
|
-
|
|
116
60
|
this.setConnected(true);
|
|
117
61
|
} catch (error) {
|
|
118
62
|
this.setError(error instanceof Error ? error : new Error(String(error)));
|
|
119
63
|
throw new ConnectionError(
|
|
120
64
|
`Failed to connect to PostgreSQL: ${error instanceof Error ? error.message : error}`,
|
|
121
|
-
|
|
65
|
+
"postgres",
|
|
122
66
|
this.config.host,
|
|
123
67
|
this.config.port
|
|
124
68
|
);
|
|
125
69
|
}
|
|
126
70
|
}
|
|
127
|
-
|
|
128
|
-
public async disconnect(): Promise<void> {
|
|
71
|
+
async disconnect() {
|
|
129
72
|
if (this.pool) {
|
|
130
73
|
await this.pool.end();
|
|
131
74
|
this.pool = null;
|
|
132
75
|
this.setConnected(false);
|
|
133
76
|
}
|
|
134
77
|
}
|
|
135
|
-
|
|
136
|
-
|
|
78
|
+
buildPoolConfig() {
|
|
79
|
+
var _a;
|
|
137
80
|
const sslConfig = this.buildSSLConfig();
|
|
138
|
-
|
|
139
|
-
const baseConfig: PgPoolConfig = {
|
|
81
|
+
const baseConfig = {
|
|
140
82
|
min: this.poolConfig.min,
|
|
141
83
|
max: this.poolConfig.max,
|
|
142
84
|
idleTimeoutMillis: this.poolConfig.idleTimeout,
|
|
143
85
|
connectionTimeoutMillis: this.poolConfig.acquireTimeout,
|
|
144
86
|
statement_timeout: this.queryTimeout,
|
|
145
|
-
ssl: sslConfig
|
|
87
|
+
ssl: sslConfig
|
|
146
88
|
};
|
|
147
|
-
|
|
148
89
|
if (this.config.connectionString) {
|
|
149
|
-
return {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
};
|
|
90
|
+
return __spreadProps(__spreadValues({}, baseConfig), {
|
|
91
|
+
connectionString: this.config.connectionString
|
|
92
|
+
});
|
|
153
93
|
}
|
|
154
|
-
|
|
155
|
-
return {
|
|
156
|
-
...baseConfig,
|
|
94
|
+
return __spreadProps(__spreadValues({}, baseConfig), {
|
|
157
95
|
host: this.config.host,
|
|
158
|
-
port: this.config.port
|
|
96
|
+
port: (_a = this.config.port) != null ? _a : 5432,
|
|
159
97
|
user: this.config.user,
|
|
160
98
|
password: this.config.password,
|
|
161
|
-
database: this.config.database
|
|
162
|
-
};
|
|
99
|
+
database: this.config.database
|
|
100
|
+
});
|
|
163
101
|
}
|
|
164
|
-
|
|
165
|
-
private buildSSLConfig(): PgPoolConfig['ssl'] {
|
|
102
|
+
buildSSLConfig() {
|
|
166
103
|
const connSSL = this.config.ssl;
|
|
167
|
-
|
|
168
|
-
// Explicit SSL config from connection takes priority
|
|
169
104
|
if (connSSL) {
|
|
170
|
-
if (connSSL.mode ===
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
rejectUnauthorized: connSSL.mode === 'verify-ca' || connSSL.mode === 'verify-full',
|
|
105
|
+
if (connSSL.mode === "disable") return false;
|
|
106
|
+
const ssl = {
|
|
107
|
+
rejectUnauthorized: connSSL.mode === "verify-ca" || connSSL.mode === "verify-full"
|
|
174
108
|
};
|
|
175
|
-
|
|
176
109
|
if (connSSL.caCert) ssl.ca = connSSL.caCert;
|
|
177
110
|
if (connSSL.clientCert) ssl.cert = connSSL.clientCert;
|
|
178
111
|
if (connSSL.clientKey) ssl.key = connSSL.clientKey;
|
|
179
|
-
|
|
180
|
-
return ssl as PgPoolConfig['ssl'];
|
|
112
|
+
return ssl;
|
|
181
113
|
}
|
|
182
|
-
|
|
183
|
-
// Auto-detect for cloud providers
|
|
184
114
|
if (this.shouldEnableSSL()) {
|
|
185
115
|
return { rejectUnauthorized: false };
|
|
186
116
|
}
|
|
187
|
-
|
|
188
|
-
// Provider options fallback
|
|
189
117
|
if (this.options.ssl === false) return false;
|
|
190
|
-
|
|
191
|
-
return undefined;
|
|
118
|
+
return void 0;
|
|
192
119
|
}
|
|
193
|
-
|
|
194
|
-
// ============================================================================
|
|
195
|
-
// Query Execution
|
|
196
|
-
// ============================================================================
|
|
197
|
-
|
|
198
|
-
// Track running query PIDs for cancellation
|
|
199
|
-
private runningQueryPids = new Map<string, number>();
|
|
200
|
-
|
|
201
|
-
public async query(sql: string, params?: unknown[], queryId?: string): Promise<QueryResult> {
|
|
120
|
+
async query(sql, params, queryId) {
|
|
202
121
|
this.ensureConnected();
|
|
203
|
-
|
|
204
122
|
return this.trackQuery(async () => {
|
|
123
|
+
var _a, _b, _c;
|
|
205
124
|
const { result, executionTime } = await this.measureExecution(async () => {
|
|
206
125
|
try {
|
|
207
|
-
const client = await this.pool
|
|
126
|
+
const client = await this.pool.connect();
|
|
208
127
|
try {
|
|
209
|
-
// Track PID for cancellation support
|
|
210
128
|
if (queryId) {
|
|
211
|
-
const pidRes = await client.query(
|
|
129
|
+
const pidRes = await client.query("SELECT pg_backend_pid() as pid");
|
|
212
130
|
this.runningQueryPids.set(queryId, pidRes.rows[0].pid);
|
|
213
131
|
}
|
|
214
132
|
const res = await client.query(sql, params);
|
|
@@ -219,58 +137,54 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
219
137
|
}
|
|
220
138
|
} catch (error) {
|
|
221
139
|
if (queryId) this.runningQueryPids.delete(queryId);
|
|
222
|
-
throw mapDatabaseError(error,
|
|
140
|
+
throw mapDatabaseError(error, "postgres", sql);
|
|
223
141
|
}
|
|
224
142
|
});
|
|
225
|
-
|
|
226
143
|
return {
|
|
227
144
|
rows: result.rows,
|
|
228
|
-
fields: result.fields
|
|
229
|
-
rowCount: result.rowCount
|
|
230
|
-
executionTime
|
|
145
|
+
fields: (_b = (_a = result.fields) == null ? void 0 : _a.map((f) => f.name)) != null ? _b : [],
|
|
146
|
+
rowCount: (_c = result.rowCount) != null ? _c : 0,
|
|
147
|
+
executionTime
|
|
231
148
|
};
|
|
232
149
|
});
|
|
233
150
|
}
|
|
234
|
-
|
|
235
|
-
|
|
151
|
+
async cancelQuery(queryId) {
|
|
152
|
+
var _a;
|
|
236
153
|
const pid = this.runningQueryPids.get(queryId);
|
|
237
154
|
if (!pid) return false;
|
|
238
|
-
|
|
239
155
|
try {
|
|
240
|
-
const client = await this.pool
|
|
156
|
+
const client = await this.pool.connect();
|
|
241
157
|
try {
|
|
242
|
-
const res = await client.query(
|
|
243
|
-
return res.rows[0]
|
|
158
|
+
const res = await client.query("SELECT pg_cancel_backend($1) as cancelled", [pid]);
|
|
159
|
+
return ((_a = res.rows[0]) == null ? void 0 : _a.cancelled) === true;
|
|
244
160
|
} finally {
|
|
245
161
|
client.release();
|
|
246
162
|
}
|
|
247
163
|
} catch (error) {
|
|
248
|
-
console.error(
|
|
164
|
+
console.error("[Postgres] Failed to cancel query:", error);
|
|
249
165
|
return false;
|
|
250
166
|
}
|
|
251
167
|
}
|
|
252
|
-
|
|
253
168
|
// ============================================================================
|
|
254
169
|
// Transaction Support
|
|
255
170
|
// ============================================================================
|
|
256
|
-
|
|
257
|
-
private clearTxTimeout(): void {
|
|
171
|
+
clearTxTimeout() {
|
|
258
172
|
if (this.txTimeout) {
|
|
259
173
|
clearTimeout(this.txTimeout);
|
|
260
174
|
this.txTimeout = null;
|
|
261
175
|
}
|
|
262
176
|
}
|
|
263
|
-
|
|
264
177
|
/**
|
|
265
178
|
* Force-expire an active transaction (auto-rollback).
|
|
266
179
|
* Called by the timeout timer, but also available for testing.
|
|
267
180
|
*/
|
|
268
|
-
|
|
181
|
+
async expireTransaction() {
|
|
269
182
|
if (this.txActive && this.txClient) {
|
|
270
|
-
console.warn(
|
|
183
|
+
console.warn("[Postgres] Transaction timed out, auto-rolling back");
|
|
271
184
|
try {
|
|
272
|
-
await this.txClient.query(
|
|
273
|
-
} catch
|
|
185
|
+
await this.txClient.query("ROLLBACK");
|
|
186
|
+
} catch (e) {
|
|
187
|
+
} finally {
|
|
274
188
|
this.txClient.release();
|
|
275
189
|
this.txClient = null;
|
|
276
190
|
this.txActive = false;
|
|
@@ -278,78 +192,67 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
278
192
|
}
|
|
279
193
|
}
|
|
280
194
|
}
|
|
281
|
-
|
|
282
|
-
public async beginTransaction(): Promise<void> {
|
|
195
|
+
async beginTransaction() {
|
|
283
196
|
this.ensureConnected();
|
|
284
|
-
if (this.txActive) throw new QueryError(
|
|
285
|
-
this.txClient = await this.pool
|
|
286
|
-
await this.txClient.query(
|
|
197
|
+
if (this.txActive) throw new QueryError("Transaction already active", "postgres");
|
|
198
|
+
this.txClient = await this.pool.connect();
|
|
199
|
+
await this.txClient.query("BEGIN");
|
|
287
200
|
this.txActive = true;
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
201
|
+
this.txTimeout = setTimeout(() => {
|
|
202
|
+
this.expireTransaction();
|
|
203
|
+
}, _PostgresProvider.TX_TIMEOUT_MS);
|
|
291
204
|
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
if (!this.txClient || !this.txActive) throw new QueryError('No active transaction', 'postgres');
|
|
205
|
+
async commitTransaction() {
|
|
206
|
+
if (!this.txClient || !this.txActive) throw new QueryError("No active transaction", "postgres");
|
|
295
207
|
this.clearTxTimeout();
|
|
296
208
|
try {
|
|
297
|
-
await this.txClient.query(
|
|
209
|
+
await this.txClient.query("COMMIT");
|
|
298
210
|
} finally {
|
|
299
211
|
this.txClient.release();
|
|
300
212
|
this.txClient = null;
|
|
301
213
|
this.txActive = false;
|
|
302
214
|
}
|
|
303
215
|
}
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
if (!this.txClient || !this.txActive) throw new QueryError('No active transaction', 'postgres');
|
|
216
|
+
async rollbackTransaction() {
|
|
217
|
+
if (!this.txClient || !this.txActive) throw new QueryError("No active transaction", "postgres");
|
|
307
218
|
this.clearTxTimeout();
|
|
308
219
|
try {
|
|
309
|
-
await this.txClient.query(
|
|
220
|
+
await this.txClient.query("ROLLBACK");
|
|
310
221
|
} finally {
|
|
311
222
|
this.txClient.release();
|
|
312
223
|
this.txClient = null;
|
|
313
224
|
this.txActive = false;
|
|
314
225
|
}
|
|
315
226
|
}
|
|
316
|
-
|
|
317
|
-
public isInTransaction(): boolean {
|
|
227
|
+
isInTransaction() {
|
|
318
228
|
return this.txActive;
|
|
319
229
|
}
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
if (!this.txClient || !this.txActive) throw new QueryError('No active transaction', 'postgres');
|
|
323
|
-
|
|
230
|
+
async queryInTransaction(sql, params) {
|
|
231
|
+
if (!this.txClient || !this.txActive) throw new QueryError("No active transaction", "postgres");
|
|
324
232
|
return this.trackQuery(async () => {
|
|
233
|
+
var _a, _b, _c;
|
|
325
234
|
const { result, executionTime } = await this.measureExecution(async () => {
|
|
326
235
|
try {
|
|
327
|
-
return await this.txClient
|
|
236
|
+
return await this.txClient.query(sql, params);
|
|
328
237
|
} catch (error) {
|
|
329
|
-
throw mapDatabaseError(error,
|
|
238
|
+
throw mapDatabaseError(error, "postgres", sql);
|
|
330
239
|
}
|
|
331
240
|
});
|
|
332
|
-
|
|
333
241
|
return {
|
|
334
242
|
rows: result.rows,
|
|
335
|
-
fields: result.fields
|
|
336
|
-
rowCount: result.rowCount
|
|
337
|
-
executionTime
|
|
243
|
+
fields: (_b = (_a = result.fields) == null ? void 0 : _a.map((f) => f.name)) != null ? _b : [],
|
|
244
|
+
rowCount: (_c = result.rowCount) != null ? _c : 0,
|
|
245
|
+
executionTime
|
|
338
246
|
};
|
|
339
247
|
});
|
|
340
248
|
}
|
|
341
|
-
|
|
342
249
|
// ============================================================================
|
|
343
250
|
// Schema Operations
|
|
344
251
|
// ============================================================================
|
|
345
|
-
|
|
346
|
-
public async getSchema(): Promise<TableSchema[]> {
|
|
252
|
+
async getSchema() {
|
|
347
253
|
this.ensureConnected();
|
|
348
|
-
|
|
349
|
-
const client = await this.pool!.connect();
|
|
254
|
+
const client = await this.pool.connect();
|
|
350
255
|
try {
|
|
351
|
-
// Optimized single query to fetch all schema information
|
|
352
|
-
// This replaces the N+1 pattern (1 + N*4 queries) with a single query
|
|
353
256
|
const result = await client.query(`
|
|
354
257
|
WITH tables_info AS (
|
|
355
258
|
SELECT
|
|
@@ -450,94 +353,57 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
450
353
|
LEFT JOIN index_info ii ON ii.table_schema = ti.table_schema AND ii.table_name = ti.table_name
|
|
451
354
|
ORDER BY ti.table_schema, ti.table_name ASC;
|
|
452
355
|
`);
|
|
453
|
-
|
|
454
|
-
interface SchemaRow {
|
|
455
|
-
table_schema: string;
|
|
456
|
-
table_name: string;
|
|
457
|
-
row_count: string;
|
|
458
|
-
total_size: string;
|
|
459
|
-
pk_columns: string[];
|
|
460
|
-
columns?: Array<{
|
|
461
|
-
name: string;
|
|
462
|
-
type: string;
|
|
463
|
-
nullable: boolean;
|
|
464
|
-
defaultValue?: string | null;
|
|
465
|
-
}>;
|
|
466
|
-
indexes?: Array<{
|
|
467
|
-
name: string;
|
|
468
|
-
columns: string[];
|
|
469
|
-
unique: boolean;
|
|
470
|
-
}>;
|
|
471
|
-
foreign_keys?: Array<{
|
|
472
|
-
columnName: string;
|
|
473
|
-
referencedSchema: string;
|
|
474
|
-
referencedTable: string;
|
|
475
|
-
referencedColumn: string;
|
|
476
|
-
}>;
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
return result.rows.map((row: SchemaRow) => {
|
|
356
|
+
return result.rows.map((row) => {
|
|
480
357
|
const schemaName = row.table_schema;
|
|
481
358
|
const tableName = row.table_name;
|
|
482
|
-
const displayName = schemaName ===
|
|
483
|
-
const rowCount = Math.max(0, parseInt(row.row_count ||
|
|
484
|
-
const sizeBytes = parseInt(row.total_size ||
|
|
485
|
-
const pkColumns
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
// Parse indexes
|
|
359
|
+
const displayName = schemaName === "public" ? tableName : `${schemaName}.${tableName}`;
|
|
360
|
+
const rowCount = Math.max(0, parseInt(row.row_count || "0"));
|
|
361
|
+
const sizeBytes = parseInt(row.total_size || "0");
|
|
362
|
+
const pkColumns = row.pk_columns || [];
|
|
363
|
+
const columns = (row.columns || []).map((col) => {
|
|
364
|
+
var _a;
|
|
365
|
+
return {
|
|
366
|
+
name: col.name,
|
|
367
|
+
type: col.type,
|
|
368
|
+
nullable: col.nullable,
|
|
369
|
+
isPrimary: pkColumns.includes(col.name),
|
|
370
|
+
defaultValue: (_a = col.defaultValue) != null ? _a : void 0
|
|
371
|
+
};
|
|
372
|
+
});
|
|
497
373
|
const indexes = (row.indexes || []).map((idx) => ({
|
|
498
374
|
name: idx.name,
|
|
499
375
|
columns: Array.isArray(idx.columns) ? idx.columns : [],
|
|
500
|
-
unique: idx.unique
|
|
376
|
+
unique: idx.unique
|
|
501
377
|
}));
|
|
502
|
-
|
|
503
|
-
// Parse foreign keys
|
|
504
378
|
const foreignKeys = (row.foreign_keys || []).map((fk) => ({
|
|
505
379
|
columnName: fk.columnName,
|
|
506
|
-
referencedTable: fk.referencedSchema ===
|
|
507
|
-
|
|
508
|
-
: `${fk.referencedSchema}.${fk.referencedTable}`,
|
|
509
|
-
referencedColumn: fk.referencedColumn,
|
|
380
|
+
referencedTable: fk.referencedSchema === "public" ? fk.referencedTable : `${fk.referencedSchema}.${fk.referencedTable}`,
|
|
381
|
+
referencedColumn: fk.referencedColumn
|
|
510
382
|
}));
|
|
511
|
-
|
|
512
383
|
return {
|
|
513
384
|
name: displayName,
|
|
514
385
|
rowCount,
|
|
515
386
|
size: formatBytes(sizeBytes),
|
|
516
387
|
columns,
|
|
517
388
|
indexes,
|
|
518
|
-
foreignKeys
|
|
389
|
+
foreignKeys
|
|
519
390
|
};
|
|
520
391
|
});
|
|
521
392
|
} finally {
|
|
522
393
|
client.release();
|
|
523
394
|
}
|
|
524
395
|
}
|
|
525
|
-
|
|
526
396
|
// ============================================================================
|
|
527
397
|
// Health & Monitoring
|
|
528
398
|
// ============================================================================
|
|
529
|
-
|
|
530
|
-
public async getHealth(): Promise<HealthInfo> {
|
|
399
|
+
async getHealth() {
|
|
531
400
|
this.ensureConnected();
|
|
532
|
-
|
|
533
|
-
const client = await this.pool!.connect();
|
|
401
|
+
const client = await this.pool.connect();
|
|
534
402
|
try {
|
|
535
|
-
const connRes = await client.query(
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
this.config.database,
|
|
403
|
+
const connRes = await client.query("SELECT count(*) FROM pg_stat_activity");
|
|
404
|
+
const sizeRes = await client.query("SELECT pg_size_pretty(pg_database_size($1))", [
|
|
405
|
+
this.config.database
|
|
539
406
|
]);
|
|
540
|
-
|
|
541
407
|
const cacheRes = await client.query(`
|
|
542
408
|
SELECT
|
|
543
409
|
sum(heap_blks_read) as heap_read,
|
|
@@ -548,8 +414,7 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
548
414
|
) as ratio
|
|
549
415
|
FROM pg_statio_user_tables;
|
|
550
416
|
`);
|
|
551
|
-
|
|
552
|
-
let slowQueries: SlowQuery[] = [];
|
|
417
|
+
let slowQueries = [];
|
|
553
418
|
try {
|
|
554
419
|
const slowRes = await client.query(`
|
|
555
420
|
SELECT
|
|
@@ -564,14 +429,13 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
564
429
|
slowQueries = slowRes.rows.map((r) => ({
|
|
565
430
|
query: r.query,
|
|
566
431
|
calls: r.calls,
|
|
567
|
-
avgTime: r.avgtime
|
|
432
|
+
avgTime: r.avgtime
|
|
568
433
|
}));
|
|
569
|
-
} catch {
|
|
434
|
+
} catch (e) {
|
|
570
435
|
slowQueries = [
|
|
571
|
-
{ query:
|
|
436
|
+
{ query: "pg_stat_statements extension not enabled", calls: 0, avgTime: "N/A" }
|
|
572
437
|
];
|
|
573
438
|
}
|
|
574
|
-
|
|
575
439
|
const sessionsRes = await client.query(`
|
|
576
440
|
SELECT
|
|
577
441
|
pid,
|
|
@@ -590,125 +454,100 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
590
454
|
ORDER BY xact_start DESC NULLS LAST
|
|
591
455
|
LIMIT 10;
|
|
592
456
|
`, [this.config.database]);
|
|
593
|
-
|
|
594
|
-
const activeSessions: ActiveSession[] = sessionsRes.rows.map((r) => ({
|
|
457
|
+
const activeSessions = sessionsRes.rows.map((r) => ({
|
|
595
458
|
pid: r.pid,
|
|
596
|
-
user: r.user ||
|
|
597
|
-
database: r.database ||
|
|
459
|
+
user: r.user || "unknown",
|
|
460
|
+
database: r.database || "",
|
|
598
461
|
state: r.state,
|
|
599
|
-
query: r.query ||
|
|
600
|
-
duration: r.duration
|
|
462
|
+
query: r.query || "",
|
|
463
|
+
duration: r.duration
|
|
601
464
|
}));
|
|
602
|
-
|
|
603
465
|
return {
|
|
604
466
|
activeConnections: parseInt(connRes.rows[0].count),
|
|
605
467
|
databaseSize: sizeRes.rows[0].pg_size_pretty,
|
|
606
468
|
cacheHitRatio: `${cacheRes.rows[0].ratio}%`,
|
|
607
469
|
slowQueries,
|
|
608
|
-
activeSessions
|
|
470
|
+
activeSessions
|
|
609
471
|
};
|
|
610
472
|
} finally {
|
|
611
473
|
client.release();
|
|
612
474
|
}
|
|
613
475
|
}
|
|
614
|
-
|
|
615
476
|
// ============================================================================
|
|
616
477
|
// Maintenance Operations
|
|
617
478
|
// ============================================================================
|
|
618
|
-
|
|
619
|
-
public async runMaintenance(
|
|
620
|
-
type: MaintenanceType,
|
|
621
|
-
target?: string
|
|
622
|
-
): Promise<MaintenanceResult> {
|
|
479
|
+
async runMaintenance(type, target) {
|
|
623
480
|
this.ensureConnected();
|
|
624
|
-
|
|
625
481
|
const { result, executionTime } = await this.measureExecution(async () => {
|
|
626
|
-
const client = await this.pool
|
|
482
|
+
const client = await this.pool.connect();
|
|
627
483
|
try {
|
|
628
|
-
let sql =
|
|
629
|
-
|
|
484
|
+
let sql = "";
|
|
630
485
|
switch (type) {
|
|
631
|
-
case
|
|
632
|
-
sql = target
|
|
633
|
-
? `VACUUM ANALYZE public.${this.escapeIdentifier(target)}`
|
|
634
|
-
: 'VACUUM ANALYZE';
|
|
486
|
+
case "vacuum":
|
|
487
|
+
sql = target ? `VACUUM ANALYZE public.${this.escapeIdentifier(target)}` : "VACUUM ANALYZE";
|
|
635
488
|
break;
|
|
636
|
-
case
|
|
637
|
-
sql = target
|
|
638
|
-
? `ANALYZE public.${this.escapeIdentifier(target)}`
|
|
639
|
-
: 'ANALYZE';
|
|
489
|
+
case "analyze":
|
|
490
|
+
sql = target ? `ANALYZE public.${this.escapeIdentifier(target)}` : "ANALYZE";
|
|
640
491
|
break;
|
|
641
|
-
case
|
|
642
|
-
sql = target
|
|
643
|
-
? `REINDEX TABLE public.${this.escapeIdentifier(target)}`
|
|
644
|
-
: `REINDEX DATABASE ${this.escapeIdentifier(this.config.database || '')}`;
|
|
492
|
+
case "reindex":
|
|
493
|
+
sql = target ? `REINDEX TABLE public.${this.escapeIdentifier(target)}` : `REINDEX DATABASE ${this.escapeIdentifier(this.config.database || "")}`;
|
|
645
494
|
break;
|
|
646
|
-
case
|
|
495
|
+
case "kill":
|
|
647
496
|
if (!target) {
|
|
648
|
-
throw new QueryError(
|
|
497
|
+
throw new QueryError("Target PID is required for kill operation", "postgres");
|
|
649
498
|
}
|
|
650
499
|
const pid = parseInt(target, 10);
|
|
651
500
|
if (isNaN(pid)) {
|
|
652
|
-
throw new QueryError(
|
|
501
|
+
throw new QueryError("Invalid PID for kill operation", "postgres");
|
|
653
502
|
}
|
|
654
503
|
sql = `SELECT pg_terminate_backend(${pid})`;
|
|
655
504
|
break;
|
|
656
505
|
default:
|
|
657
|
-
throw new QueryError(`Unsupported maintenance type: ${type}`,
|
|
506
|
+
throw new QueryError(`Unsupported maintenance type: ${type}`, "postgres");
|
|
658
507
|
}
|
|
659
|
-
|
|
660
508
|
await client.query(sql);
|
|
661
509
|
return { success: true };
|
|
662
510
|
} finally {
|
|
663
511
|
client.release();
|
|
664
512
|
}
|
|
665
513
|
});
|
|
666
|
-
|
|
667
514
|
return {
|
|
668
515
|
success: result.success,
|
|
669
516
|
executionTime,
|
|
670
|
-
message: `${type.toUpperCase()} completed successfully
|
|
517
|
+
message: `${type.toUpperCase()} completed successfully`
|
|
671
518
|
};
|
|
672
519
|
}
|
|
673
|
-
|
|
674
520
|
// ============================================================================
|
|
675
521
|
// Pool Statistics
|
|
676
522
|
// ============================================================================
|
|
677
|
-
|
|
678
|
-
public getPoolStats() {
|
|
523
|
+
getPoolStats() {
|
|
679
524
|
if (!this.pool) {
|
|
680
525
|
return { total: 0, idle: 0, active: 0, waiting: 0 };
|
|
681
526
|
}
|
|
682
|
-
|
|
683
527
|
return {
|
|
684
528
|
total: this.pool.totalCount,
|
|
685
529
|
idle: this.pool.idleCount,
|
|
686
530
|
active: this.pool.totalCount - this.pool.idleCount,
|
|
687
|
-
waiting: this.pool.waitingCount
|
|
531
|
+
waiting: this.pool.waitingCount
|
|
688
532
|
};
|
|
689
533
|
}
|
|
690
|
-
|
|
691
534
|
// ============================================================================
|
|
692
535
|
// Extended Monitoring Methods
|
|
693
536
|
// ============================================================================
|
|
694
|
-
|
|
695
537
|
/**
|
|
696
538
|
* Get database overview metrics
|
|
697
539
|
*/
|
|
698
|
-
|
|
540
|
+
async getOverview() {
|
|
541
|
+
var _a;
|
|
699
542
|
this.ensureConnected();
|
|
700
|
-
|
|
701
|
-
const client = await this.pool!.connect();
|
|
543
|
+
const client = await this.pool.connect();
|
|
702
544
|
try {
|
|
703
|
-
// Get version and uptime
|
|
704
545
|
const infoRes = await client.query(`
|
|
705
546
|
SELECT
|
|
706
547
|
version() as version,
|
|
707
548
|
pg_postmaster_start_time() as start_time,
|
|
708
549
|
EXTRACT(EPOCH FROM (now() - pg_postmaster_start_time()))::bigint as uptime_seconds
|
|
709
550
|
`);
|
|
710
|
-
|
|
711
|
-
// Get connection counts
|
|
712
551
|
const connRes = await client.query(`
|
|
713
552
|
SELECT
|
|
714
553
|
count(*) as active_connections,
|
|
@@ -716,56 +555,43 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
716
555
|
FROM pg_stat_activity
|
|
717
556
|
WHERE datname = $1
|
|
718
557
|
`, [this.config.database]);
|
|
719
|
-
|
|
720
|
-
// Get database size
|
|
721
558
|
const sizeRes = await client.query(`
|
|
722
559
|
SELECT
|
|
723
560
|
pg_size_pretty(pg_database_size($1)) as database_size,
|
|
724
561
|
pg_database_size($1) as database_size_bytes
|
|
725
562
|
`, [this.config.database]);
|
|
726
|
-
|
|
727
|
-
// Get table and index counts (all user schemas)
|
|
728
563
|
const countRes = await client.query(`
|
|
729
564
|
SELECT
|
|
730
565
|
(SELECT count(*) FROM pg_tables WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')) as table_count,
|
|
731
566
|
(SELECT count(*) FROM pg_indexes WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')) as index_count
|
|
732
567
|
`);
|
|
733
|
-
|
|
734
|
-
const uptimeSeconds = parseInt(infoRes.rows[0].uptime_seconds || '0');
|
|
568
|
+
const uptimeSeconds = parseInt(infoRes.rows[0].uptime_seconds || "0");
|
|
735
569
|
const days = Math.floor(uptimeSeconds / 86400);
|
|
736
|
-
const hours = Math.floor(
|
|
737
|
-
const minutes = Math.floor(
|
|
738
|
-
const uptime = days > 0
|
|
739
|
-
? `${days}d ${hours}h ${minutes}m`
|
|
740
|
-
: hours > 0
|
|
741
|
-
? `${hours}h ${minutes}m`
|
|
742
|
-
: `${minutes}m`;
|
|
743
|
-
|
|
570
|
+
const hours = Math.floor(uptimeSeconds % 86400 / 3600);
|
|
571
|
+
const minutes = Math.floor(uptimeSeconds % 3600 / 60);
|
|
572
|
+
const uptime = days > 0 ? `${days}d ${hours}h ${minutes}m` : hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`;
|
|
744
573
|
return {
|
|
745
|
-
version: infoRes.rows[0].version
|
|
574
|
+
version: ((_a = infoRes.rows[0].version) == null ? void 0 : _a.split(",")[0]) || "PostgreSQL",
|
|
746
575
|
uptime,
|
|
747
|
-
startTime: infoRes.rows[0].start_time ? new Date(infoRes.rows[0].start_time) :
|
|
748
|
-
activeConnections: parseInt(connRes.rows[0].active_connections ||
|
|
749
|
-
maxConnections: parseInt(connRes.rows[0].max_connections ||
|
|
750
|
-
databaseSize: sizeRes.rows[0].database_size ||
|
|
751
|
-
databaseSizeBytes: parseInt(sizeRes.rows[0].database_size_bytes ||
|
|
752
|
-
tableCount: parseInt(countRes.rows[0].table_count ||
|
|
753
|
-
indexCount: parseInt(countRes.rows[0].index_count ||
|
|
576
|
+
startTime: infoRes.rows[0].start_time ? new Date(infoRes.rows[0].start_time) : void 0,
|
|
577
|
+
activeConnections: parseInt(connRes.rows[0].active_connections || "0"),
|
|
578
|
+
maxConnections: parseInt(connRes.rows[0].max_connections || "100"),
|
|
579
|
+
databaseSize: sizeRes.rows[0].database_size || "0 bytes",
|
|
580
|
+
databaseSizeBytes: parseInt(sizeRes.rows[0].database_size_bytes || "0"),
|
|
581
|
+
tableCount: parseInt(countRes.rows[0].table_count || "0"),
|
|
582
|
+
indexCount: parseInt(countRes.rows[0].index_count || "0")
|
|
754
583
|
};
|
|
755
584
|
} finally {
|
|
756
585
|
client.release();
|
|
757
586
|
}
|
|
758
587
|
}
|
|
759
|
-
|
|
760
588
|
/**
|
|
761
589
|
* Get performance metrics
|
|
762
590
|
*/
|
|
763
|
-
|
|
591
|
+
async getPerformanceMetrics() {
|
|
764
592
|
this.ensureConnected();
|
|
765
|
-
|
|
766
|
-
const client = await this.pool!.connect();
|
|
593
|
+
const client = await this.pool.connect();
|
|
767
594
|
try {
|
|
768
|
-
// Get cache hit ratio
|
|
769
595
|
const cacheRes = await client.query(`
|
|
770
596
|
SELECT
|
|
771
597
|
COALESCE(
|
|
@@ -774,8 +600,6 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
774
600
|
) as cache_hit_ratio
|
|
775
601
|
FROM pg_statio_user_tables
|
|
776
602
|
`);
|
|
777
|
-
|
|
778
|
-
// Get transaction stats
|
|
779
603
|
const txRes = await client.query(`
|
|
780
604
|
SELECT
|
|
781
605
|
xact_commit,
|
|
@@ -786,9 +610,7 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
786
610
|
FROM pg_stat_database
|
|
787
611
|
WHERE datname = $1
|
|
788
612
|
`, [this.config.database]);
|
|
789
|
-
|
|
790
|
-
// Get checkpoint stats (optional - columns may not exist in older PG versions)
|
|
791
|
-
let checkpointWriteTime = '0';
|
|
613
|
+
let checkpointWriteTime = "0";
|
|
792
614
|
try {
|
|
793
615
|
const checkpointRes = await client.query(`
|
|
794
616
|
SELECT
|
|
@@ -797,44 +619,39 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
797
619
|
FROM pg_stat_bgwriter
|
|
798
620
|
`);
|
|
799
621
|
const checkpointRow = checkpointRes.rows[0] || {};
|
|
800
|
-
const writeTime = parseFloat(checkpointRow.checkpoint_write_time ||
|
|
801
|
-
const syncTime = parseFloat(checkpointRow.checkpoint_sync_time ||
|
|
802
|
-
checkpointWriteTime = `${((writeTime + syncTime) /
|
|
803
|
-
} catch {
|
|
804
|
-
|
|
805
|
-
checkpointWriteTime = 'N/A';
|
|
622
|
+
const writeTime = parseFloat(checkpointRow.checkpoint_write_time || "0");
|
|
623
|
+
const syncTime = parseFloat(checkpointRow.checkpoint_sync_time || "0");
|
|
624
|
+
checkpointWriteTime = `${((writeTime + syncTime) / 1e3).toFixed(1)}s`;
|
|
625
|
+
} catch (e) {
|
|
626
|
+
checkpointWriteTime = "N/A";
|
|
806
627
|
}
|
|
807
|
-
|
|
808
628
|
const txRow = txRes.rows[0] || {};
|
|
809
|
-
const blksHit = parseInt(txRow.blks_hit ||
|
|
810
|
-
const blksRead = parseInt(txRow.blks_read ||
|
|
811
|
-
const bufferPoolUsage = blksHit + blksRead > 0
|
|
812
|
-
? Math.round((blksHit / (blksHit + blksRead)) * 100)
|
|
813
|
-
: 100;
|
|
814
|
-
|
|
629
|
+
const blksHit = parseInt(txRow.blks_hit || "0");
|
|
630
|
+
const blksRead = parseInt(txRow.blks_read || "0");
|
|
631
|
+
const bufferPoolUsage = blksHit + blksRead > 0 ? Math.round(blksHit / (blksHit + blksRead) * 100) : 100;
|
|
815
632
|
return {
|
|
816
|
-
cacheHitRatio: parseFloat(cacheRes.rows[0].cache_hit_ratio ||
|
|
817
|
-
transactionsPerSecond:
|
|
818
|
-
|
|
633
|
+
cacheHitRatio: parseFloat(cacheRes.rows[0].cache_hit_ratio || "100"),
|
|
634
|
+
transactionsPerSecond: void 0,
|
|
635
|
+
// Would need time-based sampling
|
|
636
|
+
queriesPerSecond: void 0,
|
|
637
|
+
// Would need time-based sampling
|
|
819
638
|
bufferPoolUsage,
|
|
820
|
-
deadlocks: parseInt(txRow.deadlocks ||
|
|
821
|
-
checkpointWriteTime
|
|
639
|
+
deadlocks: parseInt(txRow.deadlocks || "0"),
|
|
640
|
+
checkpointWriteTime
|
|
822
641
|
};
|
|
823
642
|
} finally {
|
|
824
643
|
client.release();
|
|
825
644
|
}
|
|
826
645
|
}
|
|
827
|
-
|
|
828
646
|
/**
|
|
829
647
|
* Get slow query statistics from pg_stat_statements
|
|
830
648
|
*/
|
|
831
|
-
|
|
649
|
+
async getSlowQueries(options) {
|
|
650
|
+
var _a;
|
|
832
651
|
this.ensureConnected();
|
|
833
|
-
const limit = options
|
|
834
|
-
|
|
835
|
-
const client = await this.pool!.connect();
|
|
652
|
+
const limit = (_a = options == null ? void 0 : options.limit) != null ? _a : 10;
|
|
653
|
+
const client = await this.pool.connect();
|
|
836
654
|
try {
|
|
837
|
-
// Try pg_stat_statements first (requires extension)
|
|
838
655
|
try {
|
|
839
656
|
const res = await client.query(`
|
|
840
657
|
SELECT
|
|
@@ -854,22 +671,19 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
854
671
|
ORDER BY total_exec_time DESC
|
|
855
672
|
LIMIT $2
|
|
856
673
|
`, [this.config.database, limit]);
|
|
857
|
-
|
|
858
674
|
return res.rows.map((r) => ({
|
|
859
675
|
queryId: r.query_id,
|
|
860
|
-
query: r.query ||
|
|
861
|
-
calls: parseInt(r.calls ||
|
|
862
|
-
totalTime: parseFloat(r.total_time ||
|
|
863
|
-
avgTime: parseFloat(r.avg_time ||
|
|
864
|
-
minTime: parseFloat(r.min_time ||
|
|
865
|
-
maxTime: parseFloat(r.max_time ||
|
|
866
|
-
rows: parseInt(r.rows ||
|
|
867
|
-
sharedBlksHit: parseInt(r.shared_blks_hit ||
|
|
868
|
-
sharedBlksRead: parseInt(r.shared_blks_read ||
|
|
676
|
+
query: r.query || "",
|
|
677
|
+
calls: parseInt(r.calls || "0"),
|
|
678
|
+
totalTime: parseFloat(r.total_time || "0"),
|
|
679
|
+
avgTime: parseFloat(r.avg_time || "0"),
|
|
680
|
+
minTime: parseFloat(r.min_time || "0"),
|
|
681
|
+
maxTime: parseFloat(r.max_time || "0"),
|
|
682
|
+
rows: parseInt(r.rows || "0"),
|
|
683
|
+
sharedBlksHit: parseInt(r.shared_blks_hit || "0"),
|
|
684
|
+
sharedBlksRead: parseInt(r.shared_blks_read || "0")
|
|
869
685
|
}));
|
|
870
|
-
} catch {
|
|
871
|
-
// Fallback: use pg_stat_activity for currently running queries
|
|
872
|
-
// This doesn't provide historical stats, but shows active queries
|
|
686
|
+
} catch (e) {
|
|
873
687
|
const fallbackRes = await client.query(`
|
|
874
688
|
SELECT
|
|
875
689
|
pid::text as query_id,
|
|
@@ -888,33 +702,31 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
888
702
|
ORDER BY query_start ASC NULLS LAST
|
|
889
703
|
LIMIT $2
|
|
890
704
|
`, [this.config.database, limit]);
|
|
891
|
-
|
|
892
705
|
return fallbackRes.rows.map((r) => ({
|
|
893
706
|
queryId: r.query_id,
|
|
894
|
-
query: r.query ||
|
|
895
|
-
calls: parseInt(r.calls ||
|
|
896
|
-
totalTime: parseFloat(r.total_time ||
|
|
897
|
-
avgTime: parseFloat(r.avg_time ||
|
|
898
|
-
minTime:
|
|
899
|
-
maxTime:
|
|
900
|
-
rows: parseInt(r.rows ||
|
|
901
|
-
sharedBlksHit:
|
|
902
|
-
sharedBlksRead:
|
|
707
|
+
query: r.query || "",
|
|
708
|
+
calls: parseInt(r.calls || "1"),
|
|
709
|
+
totalTime: parseFloat(r.total_time || "0"),
|
|
710
|
+
avgTime: parseFloat(r.avg_time || "0"),
|
|
711
|
+
minTime: void 0,
|
|
712
|
+
maxTime: void 0,
|
|
713
|
+
rows: parseInt(r.rows || "0"),
|
|
714
|
+
sharedBlksHit: void 0,
|
|
715
|
+
sharedBlksRead: void 0
|
|
903
716
|
}));
|
|
904
717
|
}
|
|
905
718
|
} finally {
|
|
906
719
|
client.release();
|
|
907
720
|
}
|
|
908
721
|
}
|
|
909
|
-
|
|
910
722
|
/**
|
|
911
723
|
* Get active sessions with detailed information
|
|
912
724
|
*/
|
|
913
|
-
|
|
725
|
+
async getActiveSessions(options) {
|
|
726
|
+
var _a;
|
|
914
727
|
this.ensureConnected();
|
|
915
|
-
const limit = options
|
|
916
|
-
|
|
917
|
-
const client = await this.pool!.connect();
|
|
728
|
+
const limit = (_a = options == null ? void 0 : options.limit) != null ? _a : 50;
|
|
729
|
+
const client = await this.pool.connect();
|
|
918
730
|
try {
|
|
919
731
|
const res = await client.query(`
|
|
920
732
|
SELECT
|
|
@@ -950,42 +762,36 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
950
762
|
query_start DESC NULLS LAST
|
|
951
763
|
LIMIT $2
|
|
952
764
|
`, [this.config.database, limit]);
|
|
953
|
-
|
|
954
765
|
return res.rows.map((r) => ({
|
|
955
766
|
pid: r.pid,
|
|
956
|
-
user: r.user ||
|
|
957
|
-
database: r.database ||
|
|
958
|
-
applicationName: r.application_name ||
|
|
959
|
-
clientAddr: r.client_addr ||
|
|
767
|
+
user: r.user || "unknown",
|
|
768
|
+
database: r.database || "",
|
|
769
|
+
applicationName: r.application_name || void 0,
|
|
770
|
+
clientAddr: r.client_addr || void 0,
|
|
960
771
|
state: r.state,
|
|
961
|
-
query: r.query ||
|
|
962
|
-
queryStart: r.query_start ? new Date(r.query_start) :
|
|
772
|
+
query: r.query || "",
|
|
773
|
+
queryStart: r.query_start ? new Date(r.query_start) : void 0,
|
|
963
774
|
duration: r.duration,
|
|
964
|
-
durationMs: parseFloat(r.duration_ms ||
|
|
965
|
-
waitEventType: r.wait_event_type ||
|
|
966
|
-
waitEvent: r.wait_event ||
|
|
967
|
-
blocked: false
|
|
775
|
+
durationMs: parseFloat(r.duration_ms || "0"),
|
|
776
|
+
waitEventType: r.wait_event_type || void 0,
|
|
777
|
+
waitEvent: r.wait_event || void 0,
|
|
778
|
+
blocked: false
|
|
779
|
+
// Could be enhanced with pg_locks query
|
|
968
780
|
}));
|
|
969
781
|
} finally {
|
|
970
782
|
client.release();
|
|
971
783
|
}
|
|
972
784
|
}
|
|
973
|
-
|
|
974
785
|
/**
|
|
975
786
|
* Get table statistics
|
|
976
787
|
*/
|
|
977
|
-
|
|
788
|
+
async getTableStats(options) {
|
|
978
789
|
this.ensureConnected();
|
|
979
|
-
const schema = options
|
|
980
|
-
|
|
981
|
-
const client = await this.pool!.connect();
|
|
790
|
+
const schema = options == null ? void 0 : options.schema;
|
|
791
|
+
const client = await this.pool.connect();
|
|
982
792
|
try {
|
|
983
|
-
|
|
984
|
-
const whereClause = schema
|
|
985
|
-
? `WHERE schemaname = $1`
|
|
986
|
-
: `WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')`;
|
|
793
|
+
const whereClause = schema ? `WHERE schemaname = $1` : `WHERE schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')`;
|
|
987
794
|
const params = schema ? [schema] : [];
|
|
988
|
-
|
|
989
795
|
const res = await client.query(`
|
|
990
796
|
SELECT
|
|
991
797
|
schemaname as schema_name,
|
|
@@ -1012,47 +818,36 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
1012
818
|
${whereClause}
|
|
1013
819
|
ORDER BY pg_total_relation_size(schemaname || '.' || relname) DESC
|
|
1014
820
|
`, params);
|
|
1015
|
-
|
|
1016
821
|
return res.rows.map((r) => ({
|
|
1017
822
|
schemaName: r.schema_name,
|
|
1018
823
|
tableName: r.table_name,
|
|
1019
|
-
rowCount: parseInt(r.row_count ||
|
|
1020
|
-
liveRowCount: parseInt(r.live_row_count ||
|
|
1021
|
-
deadRowCount: parseInt(r.dead_row_count ||
|
|
1022
|
-
tableSize: r.table_size ||
|
|
1023
|
-
tableSizeBytes: parseInt(r.table_size_bytes ||
|
|
1024
|
-
indexSize: r.index_size ||
|
|
1025
|
-
indexSizeBytes: parseInt(r.index_size_bytes ||
|
|
1026
|
-
totalSize: r.total_size ||
|
|
1027
|
-
totalSizeBytes: parseInt(r.total_size_bytes ||
|
|
1028
|
-
lastVacuum: r.last_vacuum || r.last_autovacuum
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
lastAnalyze: r.last_analyze || r.last_autoanalyze
|
|
1032
|
-
? new Date(r.last_analyze || r.last_autoanalyze)
|
|
1033
|
-
: undefined,
|
|
1034
|
-
bloatRatio: parseFloat(r.bloat_ratio || '0'),
|
|
824
|
+
rowCount: parseInt(r.row_count || "0"),
|
|
825
|
+
liveRowCount: parseInt(r.live_row_count || "0"),
|
|
826
|
+
deadRowCount: parseInt(r.dead_row_count || "0"),
|
|
827
|
+
tableSize: r.table_size || "0 bytes",
|
|
828
|
+
tableSizeBytes: parseInt(r.table_size_bytes || "0"),
|
|
829
|
+
indexSize: r.index_size || "0 bytes",
|
|
830
|
+
indexSizeBytes: parseInt(r.index_size_bytes || "0"),
|
|
831
|
+
totalSize: r.total_size || "0 bytes",
|
|
832
|
+
totalSizeBytes: parseInt(r.total_size_bytes || "0"),
|
|
833
|
+
lastVacuum: r.last_vacuum || r.last_autovacuum ? new Date(r.last_vacuum || r.last_autovacuum) : void 0,
|
|
834
|
+
lastAnalyze: r.last_analyze || r.last_autoanalyze ? new Date(r.last_analyze || r.last_autoanalyze) : void 0,
|
|
835
|
+
bloatRatio: parseFloat(r.bloat_ratio || "0")
|
|
1035
836
|
}));
|
|
1036
837
|
} finally {
|
|
1037
838
|
client.release();
|
|
1038
839
|
}
|
|
1039
840
|
}
|
|
1040
|
-
|
|
1041
841
|
/**
|
|
1042
842
|
* Get index statistics
|
|
1043
843
|
*/
|
|
1044
|
-
|
|
844
|
+
async getIndexStats(options) {
|
|
1045
845
|
this.ensureConnected();
|
|
1046
|
-
const schema = options
|
|
1047
|
-
|
|
1048
|
-
const client = await this.pool!.connect();
|
|
846
|
+
const schema = options == null ? void 0 : options.schema;
|
|
847
|
+
const client = await this.pool.connect();
|
|
1049
848
|
try {
|
|
1050
|
-
|
|
1051
|
-
const whereClause = schema
|
|
1052
|
-
? `WHERE s.schemaname = $1`
|
|
1053
|
-
: `WHERE s.schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')`;
|
|
849
|
+
const whereClause = schema ? `WHERE s.schemaname = $1` : `WHERE s.schemaname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')`;
|
|
1054
850
|
const params = schema ? [schema] : [];
|
|
1055
|
-
|
|
1056
851
|
const res = await client.query(`
|
|
1057
852
|
SELECT
|
|
1058
853
|
s.schemaname as schema_name,
|
|
@@ -1087,7 +882,6 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
1087
882
|
ix.indisunique, ix.indisprimary, s.relid
|
|
1088
883
|
ORDER BY s.idx_scan DESC
|
|
1089
884
|
`, params);
|
|
1090
|
-
|
|
1091
885
|
return res.rows.map((r) => ({
|
|
1092
886
|
schemaName: r.schema_name,
|
|
1093
887
|
tableName: r.table_name,
|
|
@@ -1096,27 +890,23 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
1096
890
|
columns: Array.isArray(r.columns) ? r.columns : [],
|
|
1097
891
|
isUnique: r.is_unique || false,
|
|
1098
892
|
isPrimary: r.is_primary || false,
|
|
1099
|
-
indexSize: r.index_size ||
|
|
1100
|
-
indexSizeBytes: parseInt(r.index_size_bytes ||
|
|
1101
|
-
scans: parseInt(r.scans ||
|
|
1102
|
-
usageRatio: parseFloat(r.usage_ratio ||
|
|
893
|
+
indexSize: r.index_size || "0 bytes",
|
|
894
|
+
indexSizeBytes: parseInt(r.index_size_bytes || "0"),
|
|
895
|
+
scans: parseInt(r.scans || "0"),
|
|
896
|
+
usageRatio: parseFloat(r.usage_ratio || "0")
|
|
1103
897
|
}));
|
|
1104
898
|
} finally {
|
|
1105
899
|
client.release();
|
|
1106
900
|
}
|
|
1107
901
|
}
|
|
1108
|
-
|
|
1109
902
|
/**
|
|
1110
903
|
* Get storage statistics including tablespaces and WAL
|
|
1111
904
|
*/
|
|
1112
|
-
|
|
905
|
+
async getStorageStats() {
|
|
1113
906
|
this.ensureConnected();
|
|
1114
|
-
|
|
1115
|
-
const client = await this.pool!.connect();
|
|
907
|
+
const client = await this.pool.connect();
|
|
1116
908
|
try {
|
|
1117
|
-
const results
|
|
1118
|
-
|
|
1119
|
-
// Get tablespace info
|
|
909
|
+
const results = [];
|
|
1120
910
|
const tsRes = await client.query(`
|
|
1121
911
|
SELECT
|
|
1122
912
|
spcname as name,
|
|
@@ -1127,53 +917,53 @@ export class PostgresProvider extends SQLBaseProvider {
|
|
|
1127
917
|
FROM pg_tablespace
|
|
1128
918
|
WHERE spcname NOT LIKE 'pg_global'
|
|
1129
919
|
`);
|
|
1130
|
-
|
|
1131
920
|
for (const row of tsRes.rows) {
|
|
1132
921
|
results.push({
|
|
1133
922
|
name: row.name,
|
|
1134
|
-
location: row.location ||
|
|
1135
|
-
size: row.size ||
|
|
1136
|
-
sizeBytes: parseInt(row.size_bytes ||
|
|
1137
|
-
usagePercent:
|
|
923
|
+
location: row.location || "default",
|
|
924
|
+
size: row.size || "0 bytes",
|
|
925
|
+
sizeBytes: parseInt(row.size_bytes || "0"),
|
|
926
|
+
usagePercent: void 0
|
|
927
|
+
// Would need disk space info
|
|
1138
928
|
});
|
|
1139
929
|
}
|
|
1140
|
-
|
|
1141
|
-
// Get WAL info (if superuser or has permissions)
|
|
1142
930
|
try {
|
|
1143
931
|
const walRes = await client.query(`
|
|
1144
932
|
SELECT
|
|
1145
933
|
pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), '0/0')) as wal_size,
|
|
1146
934
|
pg_wal_lsn_diff(pg_current_wal_lsn(), '0/0') as wal_size_bytes
|
|
1147
935
|
`);
|
|
1148
|
-
|
|
1149
936
|
if (walRes.rows.length > 0) {
|
|
1150
937
|
results.push({
|
|
1151
|
-
name:
|
|
1152
|
-
location:
|
|
1153
|
-
size: walRes.rows[0].wal_size ||
|
|
1154
|
-
sizeBytes: parseInt(walRes.rows[0].wal_size_bytes ||
|
|
1155
|
-
walSize: walRes.rows[0].wal_size ||
|
|
1156
|
-
walSizeBytes: parseInt(walRes.rows[0].wal_size_bytes ||
|
|
938
|
+
name: "WAL",
|
|
939
|
+
location: "pg_wal",
|
|
940
|
+
size: walRes.rows[0].wal_size || "0 bytes",
|
|
941
|
+
sizeBytes: parseInt(walRes.rows[0].wal_size_bytes || "0"),
|
|
942
|
+
walSize: walRes.rows[0].wal_size || "0 bytes",
|
|
943
|
+
walSizeBytes: parseInt(walRes.rows[0].wal_size_bytes || "0")
|
|
1157
944
|
});
|
|
1158
945
|
}
|
|
1159
|
-
} catch {
|
|
1160
|
-
// WAL info requires superuser, ignore if not available
|
|
946
|
+
} catch (e) {
|
|
1161
947
|
}
|
|
1162
|
-
|
|
1163
948
|
return results;
|
|
1164
949
|
} finally {
|
|
1165
950
|
client.release();
|
|
1166
951
|
}
|
|
1167
952
|
}
|
|
1168
|
-
|
|
1169
|
-
public async getPgStatActivity(): Promise<PgStatActivityRow[]> {
|
|
953
|
+
async getPgStatActivity() {
|
|
1170
954
|
this.ensureConnected();
|
|
1171
|
-
const client = await this.pool
|
|
955
|
+
const client = await this.pool.connect();
|
|
1172
956
|
try {
|
|
1173
|
-
const res = await client.query(
|
|
1174
|
-
return res.rows
|
|
957
|
+
const res = await client.query("SELECT * FROM pg_stat_activity");
|
|
958
|
+
return res.rows;
|
|
1175
959
|
} finally {
|
|
1176
960
|
client.release();
|
|
1177
961
|
}
|
|
1178
962
|
}
|
|
1179
|
-
}
|
|
963
|
+
};
|
|
964
|
+
_PostgresProvider.TX_TIMEOUT_MS = 5 * 60 * 1e3;
|
|
965
|
+
var PostgresProvider = _PostgresProvider;
|
|
966
|
+
|
|
967
|
+
export { PostgresProvider };
|
|
968
|
+
//# sourceMappingURL=postgres-O5KOQUVP.mjs.map
|
|
969
|
+
//# sourceMappingURL=postgres-O5KOQUVP.mjs.map
|