Compare commits

...
104 Commits
Author SHA1 Message Date
Khushboo Vashi dc801e362e Update version for release v9.11 2025-12-08 15:15:10 +05:30
Anil Sahoo 55a332be5b Fix an issue with the type casting of default string function/procedure arguments in the debugger tool. #9036 2025-12-08 14:24:00 +05:30
Akshay Joshi 51bd866a3a 1) Updated urllib3 version.
2) Updated release note.
2025-12-08 11:30:36 +05:30
Akshay Joshi d5a909f14c Plain SQL restore runs with '\restrict' option to prevent harmful psql meta-commands. #9368 2025-12-08 11:02:10 +05:30
Libor M. 5129905307 Czech translation for version 9.11 2025-12-08 11:01:08 +05:30
Khushboo Vashi 6f5c69a4c8 Specify the correct hostname placeholder for the Password Exec command. 2025-12-05 14:40:47 +05:30
Aditya Toshniwal dd51290d06 Upgrade React version to latest as upstream has fixed a security bug 2025-12-04 18:21:58 +05:30
Aditya Toshniwal d46bce2d7b Fixed an issue where copying highlighted text in the query tool data output cell editor would copy the complete string. #9372
Fixed an issue where copying a single cell should not add quoting. #9373
2025-12-04 16:58:39 +05:30
Khushboo Vashi e50d839ac0 Updated message catalogs for v9.11 2025-12-04 15:50:27 +05:30
Khushboo Vashi d26888c65c Update release notes. 2025-12-03 12:08:17 +05:30
Tobi 2ef67a5fa2 Ensure the proper handling of extra volume mount configurations in the Helm deployment template by correcting the configuration value references. #9408 2025-12-03 12:06:13 +05:30
Akshay Joshi c6406dbaa4 Fixed Javascript test cases. 2025-12-02 16:37:10 +05:30
Jun f55fcf7baf fix: copyright updater skips folders like 'modules' 2025-12-02 12:05:47 +05:30
Akshay Joshi 71719db3ab sphinx==9.0.0 required Python version >= 3.11. Back to version 7.4.7 2025-12-02 11:55:26 +05:30
Akshay Joshi 086fa9bf87 psycopg[c] v3.3.0 requires Python version 3.10 and above. 2025-12-02 11:32:17 +05:30
Akshay Joshi dc7873c2b2 Update Python and JavaScript dependecies. 2025-12-01 19:13:04 +05:30
Koren Peretz 56040aa116 Use -i instead of -I in the helm deployment YAML for best minimal practice. 2025-12-01 16:27:46 +05:30
Dave Page 9c8df1ad3b React string cleanup. 2025-12-01 16:18:27 +05:30
Dave Page e7db3510e1 Javascript string cleanup (#9405)
* Javascript string cleanup

* Further JS string fixes.
2025-12-01 10:17:30 +00:00
Guiorgy 0132ce2001 fixed .git copy destination inside Dockerfile 2025-12-01 12:17:22 +05:30
Dave Page 70e4435b04 Python string cleanup
* Python string cleanup
* Fix line lengths
* Further Python string fixes.
2025-12-01 11:06:21 +05:30
Dave Page ec3b508ba6 Cleanup a bunch of documentation issues. 2025-11-28 15:40:48 +00:00
Khushboo Vashi 7885ed7f87 Update release notes. 2025-11-27 11:03:40 +05:30
Koren Peretz d1b25c99cc Fix the Helm chart server definition and change the app version. #9393 2025-11-27 10:59:28 +05:30
Guiorgy c7909958da Optimised Dockerfile.
* Move the installation of dependencies to the top of the stage.
* Upgrade all system packages.
* Combine copy layers where possible.
2025-11-26 14:20:06 +05:30
Aditya Toshniwal 8c153be335 Fixed an issue where connection is failing via Query Tool/PSQL Tool workspaces. #9354 2025-11-25 12:05:22 +05:30
Akshay Joshi 65860fc12c Updated Python and JavaScript dependencies. 2025-11-24 18:25:11 +05:30
Akshay Joshi fc04e2eb1a Remove __gpg_sign_cmd as it is failing on Fedora 43 due to some obsolete options. 2025-11-24 13:58:18 +05:30
Guiorgy d481507569 Removed the RUN rm -rf layer from the Dockerfile app-builder stage; exclusions are now handled by updating .dockerignore. 2025-11-24 11:37:49 +05:30
Guiorgy 6d01a247db Ensure LF line endings on text files. 2025-11-21 12:16:35 +05:30
Nicolas Boulard 27779370d8 Add conditional TLS support for the Ingress in the Helm chart. #9345 2025-11-21 12:08:22 +05:30
Akshay Joshi 482549b951 Updated release note. 2025-11-19 12:35:17 +05:30
Rohit Bhati f06668aed9 Add support of DEPENDS/NO DEPENDS ON EXTENSION for INDEX. #6388 2025-11-19 12:32:35 +05:30
Guiorgy 4129d38410 Fix pkg_resources deprecation warning by migrating Docker base image to python:3-alpine from alpine:latest. #9155 2025-11-19 10:59:27 +05:30
Akshay Joshi c03b55042c Updated Python and Javascript dependencies. 2025-11-18 16:33:36 +05:30
Akshay Joshi f22aa1597f Updated release note 2025-11-18 16:21:13 +05:30
Rohit Bhati 467e496599 Add support of DEPENDS/NO DEPENDS ON EXTENSION for MATERIALIZED VIEW. #6390 2025-11-18 16:14:00 +05:30
Khushboo Vashi 7b85a09603 Fix Debian builds by executing sudo apt update. 2025-11-18 12:48:13 +05:30
Khushboo Vashi 57f88cf5af Improved Debian build process by ensuring package lists are refreshed during the build workflow. 2025-11-18 12:18:14 +05:30
Anil Sahoo d6b2379fbe Fixed an issue where EXPLAIN should run on query under cursor if no text is selected. #9297 2025-11-18 12:17:46 +05:30
Dave Page 39c2f397f7 Create .coderabbit.yaml 2025-11-14 10:46:12 +00:00
Khushboo Vashi 63ee81202b Updated version for v9.10. 2025-11-13 12:28:13 +05:30
Anil Sahoo 14dec7e5ed Add support for showing the column data type beside column name in the object explorer. #8968 2025-11-12 19:50:28 +05:30
Akshay Joshi 5e472ec42a Updated Python and Javascript dependencies. 2025-11-12 18:14:25 +05:30
Akshay Joshi 60c56b3285 Fixed API test case for restore. 2025-11-10 13:26:42 +05:30
Akshay Joshi f251fdfdb1 Updated version for release v9.10 2025-11-10 11:40:12 +05:30
Khushboo Vashi 09d2b7eeb0 1) Fixed LDAP authentication flow vulnerable to TLS certificate verification bypass (CVE-2025-12765). #9324
2) Fixed LDAP injection vulnerability in LDAP authentication flow (CVE-2025-12764). #9325
2025-11-10 11:27:56 +05:30
Yogesh Mahajan e374edc692 Fixed Command injection vulnerability allowing arbitrary command execution on Windows (CVE-2025-12763). #9323 2025-11-10 11:27:56 +05:30
Akshay Joshi 1d397395f7 Fixed remote code execution vulnerability when restoring PLAIN-format SQL dumps in server mode (CVE-2025-12762). #9320 2025-11-10 11:27:55 +05:30
Libor M. ed52a44b17 Updated Czech translation. 2025-11-10 11:13:33 +05:30
Muhammad Aqeel 06fb5a45c1 pgAdmin4 debian packages were not having release build number and platform distribution name. 2025-11-07 17:33:14 +05:30
Khushboo Vashi d1805c5640 Ensure that the Password Change and Application Restore features comply with FIPS standards. 2025-11-07 17:32:51 +05:30
Domenico Sgarbossa c04b9198c8 Updated Italian translation 2025-11-07 10:09:26 +05:30
Aditya Toshniwal ec63acc4c5 Updated message catalogs for v9.10 2025-11-06 15:55:36 +05:30
Aditya Toshniwal f906326003 Fixed an issue where the last used storage directory was reset to blank, leading to access denied errors during backup or restore operations. #9281 2025-11-06 15:43:06 +05:30
Aditya Toshniwal 39b6f40482 Fix following issues:
1. Debian builds are failing after commiting changes for #9240.
2. Object explorer context menu shows "No objects selected" on preferences change.
2025-11-04 16:49:12 +05:30
Akshay Joshi e6f6a90d2f Updated Python and JavaScript dependencies. 2025-11-03 18:39:10 +05:30
Akshay Joshi d80cc6f8f9 Updated release note. 2025-10-31 18:20:00 +05:30
Rohit Bhati 38ebb43bac Add support of DEPENDS/NO DEPENDS ON EXTENSION for PROCEDURE. #6391 2025-10-31 18:17:04 +05:30
Pravesh Sharma 48b4a8d448 Fixed an issue where the Select All option on the columns tab of import/export data was not working in languages other than English. #9233 2025-10-31 16:25:51 +05:30
Koren Peretz d9b3f950ad Fixed indentation issue in the extraEnvVars field, preserved the serverDefinitions template, corrected a typo in README.md, and increased resource allocations in the Helm chart. 2025-10-31 12:40:47 +05:30
Aditya Toshniwal 986ba41ba9 Added the ability to search for tables and automatically bring them into view in the ERD tool. #4306 2025-10-31 12:19:27 +05:30
Pravesh Sharma 08379d6ae0 Fixed an issue where the 2FA window redirected to the login page after session expiration. #9132 2025-10-31 11:17:04 +05:30
Yogesh Mahajan 7251c1f628 Fix github actions for pg17 for windows platform broken due to changes in github runner image. 2025-10-31 11:05:05 +05:30
LiZixin 061450c8d7 Fixed an issue where the Debian build process failed with a "Sphinx module not found" error when using a Python virtual environment. #9240 2025-10-31 10:38:04 +05:30
Akshay Joshi b62212b8e5 Fixed an issue that prevented assigning multiple users to an RLS policy. #9304 2025-10-30 18:54:20 +05:30
Anil Sahoo 282a956f4f Reverted changes in Python tests for EPAS/PG YAML files that were added to support Subscription RESQL test cases and adjust streaming values for PG v16+. 2025-10-30 12:50:33 +05:30
Aditya Toshniwal 00dbe58125 Add support for formatting .pgerd ERD project file. #8912 2025-10-29 16:22:37 +05:30
Aditya Toshniwal abdcd983f6 Add support for setting image download resolution in the ERD tool. #6698 2025-10-29 14:57:20 +05:30
Akshay Joshi c7a6056ee3 Fixed an issue where Schema Diff does not ignore Tablespace for indexes. #9117 2025-10-28 16:31:39 +05:30
Akshay Joshi 55c5e86fe0 1) Updated version of Authlib, psycopg[c], typer[all] and selenium.
2) Updated release note.
2025-10-28 11:45:57 +05:30
Royston Shufflebotham 8d55e9a445 Add support for displaying detailed Citus query plans instead of 'Custom Scan' placeholder. #7885 2025-10-28 10:47:55 +05:30
Akshay Joshi c1da777fba 1) Updated Russian translation.
2) Updated electron version.
3) Updated release note
2025-10-27 11:26:08 +05:30
AKY 9e35c32ef2 Updated Korean translation 2025-10-27 11:17:45 +05:30
Aditya Toshniwal 37a164cccb - Rebase pgadmin-org/react-data-grid fork to latest.
- Fixed an issue where data output column resize is not sticking in Safari. #8504
2025-10-27 10:45:36 +05:30
Aditya Toshniwal c20d035f1b Update Python and JS packages. 2025-10-24 08:37:55 +05:30
Aditya Toshniwal 9a44fee646 Update release notes. 2025-10-24 08:29:01 +05:30
Aditya Toshniwal 0a14db01be Migrate pgAdmin UI to use React 19. #8676 2025-10-24 08:26:10 +05:30
Anil Sahoo 53a994ba1e Fixed an issue where Python tests for EPAS github actions were failing due to a port mismatch with RESQL test case files for Subscription. 2025-10-22 18:14:12 +05:30
Aditya Toshniwal 91ad54d17b Fixed an issue where query tool shortcut would trigger the callback twice. #9157 2025-10-14 14:33:17 +05:30
Akshay Joshi ea5ee74205 Update version for release v9.9 2025-10-13 20:51:55 +05:30
Anil Sahoo 5f22b4e2d2 Fixed following issues related to auto-update:
1. Fixed the issue where auto-update was not working for macOS x64 arch machines as pgadmin4 zip file name has x86_64 in it.
2. Improved error handling in the /upgrade_check API by replacing the static “Failed to check for update” message for Windows users with a dynamic error message.
3. Fixed the CSS issue affecting the close icon in the warning notifier.
4. Removed trailing periods from helper texts and notifier messages in the app’s auto-update workflow. #9133
2025-10-13 17:25:14 +05:30
Rohit Bhati 758bbc7272 Enable depends on extension option on for functions. 2025-10-13 11:39:37 +05:30
rlbxku1r 618e03b65f Update Japanese translation for v9.9 2025-10-13 11:38:35 +05:30
Akshay Joshi e9b97d61f8 1) Pin pywinpty due to https://github.com/andfoy/pywinpty/issues/545
2) Remove scram_client_key and scram_server_key from the connection string parameter
   as it is not meant to be specified directly by users or client applications.
2025-10-10 13:07:32 +05:30
Domenico Sgarbossa 83377d4a50 Italian translation updated for v9.9 2025-10-10 13:06:34 +05:30
Aditya Toshniwal c03d21899b Updated message catalogs for v9.9 2025-10-10 10:07:42 +05:30
Koren Peretz d03a0cdce6 Add support for initializing the pgAdmin4 Kubernetes Helm chart. #9225 2025-10-08 14:41:00 +05:30
Akshay Joshi f3567518d3 Added option to skip the password dialog when using an identity file. #6996
1. Don't ask for the SSH Tunnel or Database server password if it is already saved.
2. Modified the generic error message from the SSH Tunnel library.
2025-10-07 13:13:37 +05:30
Akshay Joshi b30520adc0 Updated Python and Javascript dependencies. 2025-10-06 17:33:12 +05:30
Yogesh Mahajan c6af61afd3 Implement pre and post scenario SQL execution in subscription ResQL tests to manage publication lifecycle. #8932 2025-10-03 12:12:15 +05:30
Akshay Joshi 04024c7f61 Updated Python and Javascript dependencies. 2025-10-01 15:27:23 +05:30
Rohit Bhati 9e6ab295df Add support of DEPENDS/NO DEPENDS ON EXTENSION for ALTER FUNCTION. #6385 2025-10-01 13:49:03 +05:30
Akshay Joshi 5c9acc1c3d 1) Added PG 18 in the github runner.
2) Added PG 18 in the docker container file.
2025-09-29 13:40:03 +05:30
Anil Sahoo c75bba03c2 1) Added 'failover' parameter support in CREATE and ALTER SUBSCRIPTION for PostgreSQL v17+. #8932
2) Added 'two_phase' parameter support for ALTER SUBSCRIPTION for PostgreSQL v18+.
3) Updated versioned_template_loader.py to prioritize v18+ templates.
4) Updated the default value of the streaming parameter in CREATE SUBSCRIPTION to 'parallel' in PG v18 (previously false).
2025-09-29 12:52:47 +05:30
Aditya Toshniwal 93bbadb994 Fixed an issue where the query tool displayed 'default' instead of 'null' for null text data in the data output. #9098 2025-09-29 12:37:25 +05:30
Akshay Joshi 42ff67c845 Updated Python and Javascript dependencies. 2025-09-25 15:50:14 +05:30
Yogesh Mahajan 5376d88444 Update the PATH variable with the newly installed EPAS directory to use the correct pg_config. 2025-09-24 15:55:10 +05:30
Yogesh Mahajan f733d124bd Update the PATH variable with the newly installed PostgreSQL directory to use the correct pg_config. 2025-09-24 14:55:56 +05:30
Aditya Toshniwal 7ff3c4bbeb Fixed an issue where shortcuts are not working as expected on multiple keyboard layouts. #9157 2025-09-17 11:34:15 +05:30
Aditya Toshniwal e5590797c0 Fixed an issue where saving the newly changed preferences was not reflecting on the preferences tab. #9158 2025-09-16 14:09:11 +05:30
Akshay Joshi 8576a5e7e6 Updated Javascript dependencies. 2025-09-15 09:45:05 +02:00
Akshay Joshi 3e66b6f7be 1) Added "MULTIRANGE_TYPE_NAME" option while creating a Range Type. #6394
2) Added "SUBSCRIPT" option while creating an External Type. #6395
2025-09-11 14:27:27 +05:30
Akshay Joshi 2fd2a144f1 Updated Python and Javascript dependecies. 2025-09-08 16:34:56 +05:30
664 changed files with 54956 additions and 42822 deletions

No files matched your search

+186
View File
@@ -0,0 +1,186 @@
language: en-US
tone_instructions: ''
early_access: false
enable_free_tier: true
reviews:
profile: chill
request_changes_workflow: false
high_level_summary: true
high_level_summary_placeholder: '@coderabbitai summary'
high_level_summary_in_walkthrough: false
auto_title_placeholder: '@coderabbitai'
auto_title_instructions: ''
review_status: true
commit_status: true
fail_commit_status: false
collapse_walkthrough: false
changed_files_summary: true
sequence_diagrams: true
estimate_code_review_effort: true
assess_linked_issues: true
related_issues: true
related_prs: true
suggested_labels: true
labeling_instructions: []
auto_apply_labels: false
suggested_reviewers: true
auto_assign_reviewers: false
in_progress_fortune: true
poem: false
path_filters: []
path_instructions: []
abort_on_close: true
disable_cache: false
auto_review:
enabled: true
auto_incremental_review: true
ignore_title_keywords: []
labels: []
drafts: false
base_branches: []
ignore_usernames: []
finishing_touches:
docstrings:
enabled: true
unit_tests:
enabled: true
pre_merge_checks:
docstrings:
mode: warning
threshold: 80
title:
mode: warning
requirements: ''
description:
mode: warning
issue_assessment:
mode: warning
custom_checks: []
tools:
ast-grep:
rule_dirs: []
util_dirs: []
essential_rules: true
packages: []
shellcheck:
enabled: true
ruff:
enabled: true
markdownlint:
enabled: true
github-checks:
enabled: true
timeout_ms: 900000
languagetool:
enabled: true
enabled_rules: []
disabled_rules: []
enabled_categories: []
disabled_categories: []
enabled_only: false
level: default
biome:
enabled: true
hadolint:
enabled: true
swiftlint:
enabled: true
phpstan:
enabled: true
level: default
phpmd:
enabled: true
phpcs:
enabled: true
golangci-lint:
enabled: true
yamllint:
enabled: true
gitleaks:
enabled: true
checkov:
enabled: true
detekt:
enabled: true
eslint:
enabled: true
flake8:
enabled: true
rubocop:
enabled: true
buf:
enabled: true
regal:
enabled: true
actionlint:
enabled: true
pmd:
enabled: true
clang:
enabled: true
cppcheck:
enabled: true
semgrep:
enabled: true
circleci:
enabled: true
clippy:
enabled: true
sqlfluff:
enabled: true
prismaLint:
enabled: true
pylint:
enabled: true
oxc:
enabled: true
shopifyThemeCheck:
enabled: true
luacheck:
enabled: true
brakeman:
enabled: true
dotenvLint:
enabled: true
htmlhint:
enabled: true
checkmake:
enabled: true
osvScanner:
enabled: true
chat:
art: true
auto_reply: true
integrations:
jira:
usage: auto
linear:
usage: auto
knowledge_base:
opt_out: false
web_search:
enabled: true
code_guidelines:
enabled: true
filePatterns: []
learnings:
scope: auto
issues:
scope: auto
jira:
usage: auto
project_keys: []
linear:
usage: auto
team_keys: []
pull_requests:
scope: auto
mcp:
usage: auto
disabled_servers: []
code_generation:
docstrings:
language: en-US
path_instructions: []
unit_tests:
path_instructions: []
+1
View File
@@ -1,4 +1,5 @@
web/node_modules
web/config_*.py
web/*.log
web/regression
web/**/tests/
+2
View File
@@ -0,0 +1,2 @@
# Auto detect text files and normalize end of lines to LF (\n)
* text=auto eol=lf
+1 -1
View File
@@ -20,7 +20,7 @@ jobs:
strategy:
fail-fast: false
matrix:
pgver: [13, 14, 15, 16, 17]
pgver: [13, 14, 15, 16, 17, 18]
runs-on: ubuntu-22.04
@@ -73,6 +73,14 @@ jobs:
IF %ERRORLEVEL% EQU 3010 cmd /c "exit /b 0"
shell: cmd
- name: Add pg_config path to PATH
shell: pwsh
run: |
$pgPath = "C:\\EPAS\\${{ matrix.pgver }}\\bin"
Write-Output $pgPath
Add-Content -Path $env:GITHUB_PATH -Value $pgPath
pg_config --version
- name: Create the tablespace directory on Linux
if: ${{ matrix.os == 'ubuntu-22.04' }}
run: |
+11 -2
View File
@@ -21,7 +21,7 @@ jobs:
fail-fast: false
matrix:
os: [macos-latest, ubuntu-22.04, windows-latest]
pgver: [13, 14, 15, 16, 17]
pgver: [13, 14, 15, 16, 17, 18]
runs-on: ${{ matrix.os }}
@@ -64,6 +64,7 @@ jobs:
brew install postgresql@${{ matrix.pgver }}
echo "/opt/homebrew/opt/postgresql@${{ matrix.pgver }}/bin" >> $GITHUB_PATH
- name: Uninstall PostgreSQL if already present on windows
if: ${{ matrix.os == 'windows-latest' }}
run: |
@@ -78,13 +79,21 @@ jobs:
run: |
FOR /f "delims=" %%F IN ('python tools\get_sb_package.py "https://www.postgresql.org/applications-v2.xml" "postgresql_${{ matrix.pgver }}" "windows-x64"') DO SET INSTALLER_EXE=%%F
ECHO Running %INSTALLER_EXE%...
%INSTALLER_EXE% --prefix C:\PostgreSQL\${{ matrix.pgver }} --datadir C:\PostgreSQL\${{ matrix.pgver }}\data --serverport 59${{ matrix.pgver }} --superpassword postgres --install_runtimes 0 --mode unattended --unattendedmodeui none --disable-components pgAdmin,stackbuilder --enable-components server,commandlinetools"
%INSTALLER_EXE% --prefix C:\PostgreSQL_custom\${{ matrix.pgver }} --datadir C:\PostgreSQL_custom\${{ matrix.pgver }}\data --serverport 59${{ matrix.pgver }} --superpassword postgres --install_runtimes 0 --mode unattended --unattendedmodeui none --disable-components pgAdmin,stackbuilder --enable-components server,commandlinetools"
choco install -y mitkerberos
REM Ignore error 3010 (reboot required)
IF %ERRORLEVEL% EQU 3010 cmd /c "exit /b 0"
shell: cmd
- name: Add pg_config path to PATH
shell: pwsh
run: |
$pgPath = "C:\\PostgreSQL_custom\\${{ matrix.pgver }}\\bin"
Write-Output $pgPath
Add-Content -Path $env:GITHUB_PATH -Value $pgPath
pg_config --version
- name: Create the tablespace directory on Linux
if: ${{ matrix.os == 'ubuntu-22.04' }}
run: |
+42 -53
View File
@@ -31,17 +31,11 @@ RUN apk add --no-cache \
yarn \
zlib-dev
COPY .git .git
COPY .git /pgadmin4/.git
# Create the /pgadmin4 directory and copy the source into it. Explicitly
# remove the node_modules directory as we'll recreate a clean version, as well
# as various other files we don't want
COPY web /pgadmin4/web
RUN rm -rf /pgadmin4/web/*.log \
/pgadmin4/web/config_*.py \
/pgadmin4/web/node_modules \
/pgadmin4/web/regression \
`find /pgadmin4/web -type d -name tests` \
`find /pgadmin4/web -type f -name .DS_Store`
WORKDIR /pgadmin4/web
@@ -68,14 +62,12 @@ RUN export CPPFLAGS="-DPNG_ARM_NEON_OPT=0" && \
# Next, create the base environment for Python
#########################################################################
FROM alpine:latest AS env-builder
FROM python:3-alpine AS env-builder
# Install dependencies
COPY requirements.txt /
RUN apk add --no-cache \
make \
python3 \
py3-pip && \
make && \
apk add --no-cache --virtual build-deps \
build-base \
openssl-dev \
@@ -86,8 +78,7 @@ RUN apk add --no-cache \
cargo \
zlib-dev \
libjpeg-turbo-dev \
libpng-dev \
python3-dev && \
libpng-dev && \
python3 -m venv --system-site-packages --without-pip /venv && \
/venv/bin/python3 -m pip install --no-cache-dir -r requirements.txt && \
apk del --no-cache build-deps
@@ -120,21 +111,16 @@ RUN rm -rf /pgadmin4/docs/en_US/_build/html/_static/*.png
# Create additional builders to get all of the PostgreSQL utilities
#########################################################################
FROM postgres:12-alpine AS pg12-builder
FROM postgres:13-alpine AS pg13-builder
FROM postgres:14-alpine AS pg14-builder
FROM postgres:15-alpine AS pg15-builder
FROM postgres:16-alpine AS pg16-builder
FROM postgres:17-alpine AS pg17-builder
FROM postgres:18-alpine AS pg18-builder
FROM alpine:latest AS tool-builder
# Copy the PG binaries
COPY --from=pg12-builder /usr/local/bin/pg_dump /usr/local/pgsql/pgsql-12/
COPY --from=pg12-builder /usr/local/bin/pg_dumpall /usr/local/pgsql/pgsql-12/
COPY --from=pg12-builder /usr/local/bin/pg_restore /usr/local/pgsql/pgsql-12/
COPY --from=pg12-builder /usr/local/bin/psql /usr/local/pgsql/pgsql-12/
COPY --from=pg13-builder /usr/local/bin/pg_dump /usr/local/pgsql/pgsql-13/
COPY --from=pg13-builder /usr/local/bin/pg_dumpall /usr/local/pgsql/pgsql-13/
COPY --from=pg13-builder /usr/local/bin/pg_restore /usr/local/pgsql/pgsql-13/
@@ -160,44 +146,21 @@ COPY --from=pg17-builder /usr/local/bin/pg_dumpall /usr/local/pgsql/pgsql-17/
COPY --from=pg17-builder /usr/local/bin/pg_restore /usr/local/pgsql/pgsql-17/
COPY --from=pg17-builder /usr/local/bin/psql /usr/local/pgsql/pgsql-17/
COPY --from=pg18-builder /usr/local/bin/pg_dump /usr/local/pgsql/pgsql-18/
COPY --from=pg18-builder /usr/local/bin/pg_dumpall /usr/local/pgsql/pgsql-18/
COPY --from=pg18-builder /usr/local/bin/pg_restore /usr/local/pgsql/pgsql-18/
COPY --from=pg18-builder /usr/local/bin/psql /usr/local/pgsql/pgsql-18/
#########################################################################
# Assemble everything into the final container.
#########################################################################
FROM alpine:latest
FROM python:3-alpine
# Copy in the Python packages
COPY --from=env-builder /venv /venv
# Copy in the tools
COPY --from=tool-builder /usr/local/pgsql /usr/local/
COPY --from=pg17-builder /usr/local/lib/libpq.so.5.17 /usr/lib/
COPY --from=pg17-builder /usr/lib/libzstd.so.1.5.7 /usr/lib/
COPY --from=pg17-builder /usr/lib/liblz4.so.1.10.0 /usr/lib/
RUN ln -s libpq.so.5.17 /usr/lib/libpq.so.5 && \
ln -s libpq.so.5.17 /usr/lib/libpq.so && \
ln -s libzstd.so.1.5.7 /usr/lib/libzstd.so.1 && \
ln -s liblz4.so.1.10.0 /usr/lib/liblz4.so.1
WORKDIR /pgadmin4
ENV PYTHONPATH=/pgadmin4
# Copy in the code and docs
COPY --from=app-builder /pgadmin4/web /pgadmin4
COPY --from=docs-builder /pgadmin4/docs/en_US/_build/html/ /pgadmin4/docs
COPY pkg/docker/run_pgadmin.py /pgadmin4
COPY pkg/docker/gunicorn_config.py /pgadmin4
COPY pkg/docker/entrypoint.sh /entrypoint.sh
# License files
COPY LICENSE /pgadmin4/LICENSE
# Install runtime dependencies and configure everything in one RUN step
RUN apk add --no-cache \
python3 \
# Install runtime dependencies
RUN apk update && apk upgrade && \
apk add \
bash \
py3-pip \
postfix \
krb5-libs \
libjpeg-turbo \
@@ -207,7 +170,33 @@ RUN apk add --no-cache \
libedit \
libldap \
libcap && \
/venv/bin/python3 -m pip install --no-cache-dir gunicorn==23.0.0 && \
rm -rf /var/cache/apk/*
# Copy in the Python packages
COPY --from=env-builder /venv /venv
# Copy in the tools
COPY --from=tool-builder /usr/local/pgsql /usr/local/
COPY --from=pg18-builder /usr/local/lib/libpq.so.5.18 /usr/lib/liblz4.so.1.10.0 /usr/lib/
RUN ln -s libpq.so.5.18 /usr/lib/libpq.so.5 && \
ln -s libpq.so.5.18 /usr/lib/libpq.so && \
ln -s liblz4.so.1.10.0 /usr/lib/liblz4.so.1
WORKDIR /pgadmin4
ENV PYTHONPATH=/pgadmin4
# Copy in the code and docs
COPY --from=app-builder /pgadmin4/web /pgadmin4
COPY --from=docs-builder /pgadmin4/docs/en_US/_build/html/ /pgadmin4/docs
COPY pkg/docker/run_pgadmin.py pkg/docker/gunicorn_config.py /pgadmin4/
COPY pkg/docker/entrypoint.sh /entrypoint.sh
# License files
COPY LICENSE /pgadmin4/LICENSE
# Configure everything in one RUN step
RUN /venv/bin/python3 -m pip install --no-cache-dir gunicorn==23.0.0 && \
find / -type d -name '__pycache__' -exec rm -rf {} + && \
useradd -r -u 5050 -g root -s /sbin/nologin pgadmin && \
mkdir -p /run/pgadmin /var/lib/pgadmin && \
@@ -217,7 +206,7 @@ RUN apk add --no-cache \
chown pgadmin:root /pgadmin4/config_distro.py && \
chmod g=u /pgadmin4/config_distro.py && \
chmod g=u /etc/passwd && \
setcap CAP_NET_BIND_SERVICE=+eip /usr/bin/python3.12 && \
setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/python3.[0-9][0-9] && \
echo "pgadmin ALL = NOPASSWD: /usr/sbin/postfix start" > /etc/sudoers.d/postfix && \
echo "pgadminr ALL = NOPASSWD: /usr/sbin/postfix start" >> /etc/sudoers.d/postfix
+33 -33
View File
@@ -77,13 +77,13 @@ tab to provide options related to data or pgAdmin objects that correspond to *pg
* Move switches in the **Sections** field box to select a portion of the object
that will be backed up.
* Move the switch next to *Pre-data* towards right position to include all
* Move the switch next to *Pre-data* to the *Yes* position to include all
data definition items not included in the data or post-data item lists.
* Move the switch next to *Data* towards right position to backup actual table
* Move the switch next to *Data* to the *Yes* position to backup actual table
data, large-object contents, and sequence values.
* Move the switch next to *Post-data* towards right position to include
* Move the switch next to *Post-data* to the *Yes* position to include
definitions of indexes, triggers, rules, and constraints other than
validated check constraints.
@@ -94,13 +94,13 @@ tab to provide options related to data or pgAdmin objects that correspond to *pg
* Move switches in the **Type of objects** field box to specify details about
the type of objects that will be backed up.
* Move the switch next to *Only data* towards right position to limit the back
* Move the switch next to *Only data* to the *Yes* position to limit the back
up to data.
* Move the switch next to *Only schemas* to limit the back up to schema-level
database objects.
* Move the switch next to *Blobs* towards left position to exclude large
* Move the switch next to *Blobs* to the *No* position to exclude large
objects in the backup.
.. image:: images/backup_do_not_save.png
@@ -110,36 +110,36 @@ tab to provide options related to data or pgAdmin objects that correspond to *pg
* Move switches in the **Do not save** field box to select the objects that will
not be included in the backup.
* Move the switch next to *Owner* towards right position to exclude commands
* Move the switch next to *Owner* to the *Yes* position to exclude commands
that set object ownership.
* Move the switch next to *Privileges* towards right position to exclude
* Move the switch next to *Privileges* to the *Yes* position to exclude
commands that create access privileges.
* Move the switch next to *Tablespaces* towards right position to exclude
* Move the switch next to *Tablespaces* to the *Yes* position to exclude
tablespaces.
* Move the switch next to *Unlogged table data* towards right position to
* Move the switch next to *Unlogged table data* to the *Yes* position to
exclude the contents of unlogged tables.
* Move the switch next to *Comments* towards right position to exclude
* Move the switch next to *Comments* to the *Yes* position to exclude
commands that set the comments. **Note:** This option is visible only for
database server greater than or equal to 11.
* Move the switch next to *Publications* towards right position to exclude
* Move the switch next to *Publications* to the *Yes* position to exclude
publications.
* Move the switch next to *Subscriptions* towards right position to exclude
* Move the switch next to *Subscriptions* to the *Yes* position to exclude
subscriptions.
* Move the switch next to *Security labels* towards right position to exclude
* Move the switch next to *Security labels* to the *Yes* position to exclude
Security labels.
* Move the switch next to *Toast compressions* towards right position to exclude
* Move the switch next to *Toast compressions* to the *Yes* position to exclude
Toast compressions. **Note:** This option is visible only for
database server greater than or equal to 14.
* Move the switch next to *Table access methods* towards right position to exclude
* Move the switch next to *Table access methods* to the *Yes* position to exclude
Table access methods. **Note:** This option is visible only for
database server greater than or equal to 15.
@@ -150,7 +150,7 @@ tab to provide options related to data or pgAdmin objects that correspond to *pg
Click the *Query Options* tab to continue. Use these additional fields to specify
the type of statements that should be included in the backup.
* Move the switch next to *Use INSERT commands* towards right position to
* Move the switch next to *Use INSERT commands* to the *Yes* position to
dump the data in the form of INSERT statements rather than using a COPY
command. Please note: this may make restoration from backup slow.
@@ -165,16 +165,16 @@ the type of statements that should be included in the backup.
**Note:** This option is visible only for database server greater than or
equal to 12.
* Move the switch next to *Include CREATE DATABASE statement* towards right
* Move the switch next to *Include CREATE DATABASE statement* to the *Yes*
position to include a command in the backup that creates a new database
when restoring the backup.
* Move the switch next to *Include DROP DATABASE statement* towards right
* Move the switch next to *Include DROP DATABASE statement* to the *Yes*
position to include a command in the backup that will drop any existing
database object with the same name before recreating the object during a
backup.
* Move the switch next to *Include IF EXISTS clause* towards right
* Move the switch next to *Include IF EXISTS clause* to the *Yes*
position to add an IF EXISTS clause to drop databases and other objects.
This option is not valid unless *Include DROP DATABASE statement* is also set.
@@ -185,17 +185,17 @@ the type of statements that should be included in the backup.
Click the *Table Options* tab to continue. Use the fields in the *Table Options*
tab related to tables that should be included in the backup.
* Move the switch next to *Use Column INSERTS* towards right position to dump
* Move the switch next to *Use Column INSERTS* to the *Yes* position to dump
the data in the form of INSERT statements and include explicit column
names. Please note: this may make restoration from backup slow.
* Move the switch next to *Load via partition root* towards right position,
* Move the switch next to *Load via partition root* to the *Yes* position,
so when dumping a COPY or INSERT statement for a partitioned table, target
the root of the partitioning hierarchy which contains it rather than the
partition itself. **Note:** This option is visible only for database server
greater than or equal to 11.
* Move the switch next to *Enable row security* towards right position to
* Move the switch next to *Enable row security* to the *Yes* position to
set row_security to on instead, allowing the user to dump the parts of the
contents of the table that they have access to. This option is relevant
only when dumping the contents of a table which has row security.
@@ -235,10 +235,10 @@ tab to provide other backup options.
that should be excluded from the backup.
* Move the switch next to *Triggers* (active when creating a data-only backup)
towards right position to include commands that will disable triggers on the
to the *Yes* position to include commands that will disable triggers on the
target table while the data is being loaded.
* Move the switch next to *$ quoting* towards right position to enable dollar
* Move the switch next to *$ quoting* to the *Yes* position to enable dollar
quoting within function bodies; if disabled, the function body will be
quoted using SQL standard string syntax.
@@ -249,13 +249,13 @@ tab to provide other backup options.
* Move switches in the **Miscellaneous** field box to specify miscellaneous
backup options.
* Move the switch next to *Verbose messages* towards left position to instruct
* Move the switch next to *Verbose messages* to the *No* position to instruct
*pg_dump* to exclude verbose messages.
* Move the switch next to *Force double quotes on identifiers* towards right
* Move the switch next to *Force double quotes on identifiers* to the *Yes*
position to force the quoting of all identifiers.
* Move the switch next to *Use SET SESSION AUTHORIZATION* towards right
* Move the switch next to *Use SET SESSION AUTHORIZATION* to the *Yes*
position to include a statement that will use a SET SESSION AUTHORIZATION
command to determine object ownership (instead of an ALTER OWNER command).
@@ -265,9 +265,9 @@ tab to provide other backup options.
* Use the *Extra float digits* field to use the specified value when dumping
floating-point data, instead of the maximum available precision.
* Use the *Lock wait timeout* field to do not wait forever to acquire shared
table locks at the beginning of the dump. Instead, fail if unable to lock a
table within the specified timeout.
* Use the *Lock wait timeout* field to specify a timeout rather than waiting
indefinitely to acquire shared table locks at the beginning of the dump.
If unable to lock a table within the specified timeout, the operation will fail.
Click the *Objects* tab to continue.
@@ -287,6 +287,6 @@ command:
* Click the *Cancel* button to exit without saving work.
pgAdmin will run the backup process in background. You can view all the background
process with there running status and logs on the :ref:`Processes <processes>`
tab
pgAdmin will run the backup process in the background. You can view all the background
processes with their running status and logs on the :ref:`Processes <processes>`
tab.
+3 -3
View File
@@ -34,6 +34,6 @@ statements that should be included in the backup.
Click the *Backup* button to build and execute a command based on your
selections; click the *Cancel* button to exit without saving work.
pgAdmin will run the backup process in background. You can view all the background
process with there running status and logs on the :ref:`Processes <processes>`
tab
pgAdmin will run the backup process in the background. You can view all the background
processes with their running status and logs on the :ref:`Processes <processes>`
tab.
+28 -28
View File
@@ -34,7 +34,7 @@ tab to provide options related to data or pgAdmin objects that correspond to *pg
* Move switches in the **Type of objects** field box to specify details about
the type of objects that will be backed up.
* Move the switch next to *Only data* towards right position to limit the back
* Move the switch next to *Only data* to the *Yes* position to limit the back
up to data.
* Move the switch next to *Only schemas* to limit the back up to schema-level
@@ -52,39 +52,39 @@ tab to provide options related to data or pgAdmin objects that correspond to *pg
* Move switches in the **Do not save** field box to select the objects that will
not be included in the backup.
* Move the switch next to *Owner* towards right position to exclude commands
* Move the switch next to *Owner* to the *Yes* position to exclude commands
that set object ownership.
* Move the switch next to *Role passwords* towards right position to exclude
* Move the switch next to *Role passwords* to the *Yes* position to exclude
passwords for roles.
* Move the switch next to *Privileges* towards right position to exclude
* Move the switch next to *Privileges* to the *Yes* position to exclude
commands that create access privileges.
* Move the switch next to *Tablespaces* towards right position to exclude
* Move the switch next to *Tablespaces* to the *Yes* position to exclude
tablespaces.
* Move the switch next to *Unlogged table data* towards right position to
* Move the switch next to *Unlogged table data* to the *Yes* position to
exclude the contents of unlogged tables.
* Move the switch next to *Comments* towards right position to exclude
* Move the switch next to *Comments* to the *Yes* position to exclude
commands that set the comments. **Note:** This option is visible only for
database server greater than or equal to 11.
* Move the switch next to *Publications* towards right position to exclude
* Move the switch next to *Publications* to the *Yes* position to exclude
publications.
* Move the switch next to *Subscriptions* towards right position to exclude
* Move the switch next to *Subscriptions* to the *Yes* position to exclude
subscriptions.
* Move the switch next to *Security labels* towards right position to exclude
* Move the switch next to *Security labels* to the *Yes* position to exclude
Security labels.
* Move the switch next to *Toast compressions* towards right position to exclude
* Move the switch next to *Toast compressions* to the *Yes* position to exclude
Toast compressions. **Note:** This option is visible only for
database server greater than or equal to 14.
* Move the switch next to *Table access methods* towards right position to exclude
* Move the switch next to *Table access methods* to the *Yes* position to exclude
Table access methods. **Note:** This option is visible only for
database server greater than or equal to 15.
@@ -95,7 +95,7 @@ tab to provide options related to data or pgAdmin objects that correspond to *pg
Click the *Query Options* tab to continue. Use these additional fields to specify
the type of statements that should be included in the backup.
* Move the switch next to *Use INSERT commands* towards right position to
* Move the switch next to *Use INSERT commands* to the *Yes* position to
dump the data in the form of INSERT statements rather than using a COPY
command. Please note: this may make restoration from backup slow.
@@ -110,12 +110,12 @@ the type of statements that should be included in the backup.
**Note:** This option is visible only for database server greater than or
equal to 12.
* Move the switch next to *Include DROP DATABASE statement* towards right
* Move the switch next to *Include DROP DATABASE statement* to the *Yes*
position to include a command in the backup that will drop any existing
database object with the same name before recreating the object during a
backup.
* Move the switch next to *Include IF EXISTS clause* towards right
* Move the switch next to *Include IF EXISTS clause* to the *Yes*
position to add an IF EXISTS clause to drop databases and other objects.
This option is not valid unless *Include DROP DATABASE statement* is also set.
@@ -126,11 +126,11 @@ the type of statements that should be included in the backup.
Click the *Table Options* tab to continue. Use the fields in the *Table Options*
tab related to tables that should be included in the backup.
* Move the switch next to *Use Column INSERTS* towards right position to dump
* Move the switch next to *Use Column INSERTS* to the *Yes* position to dump
the data in the form of INSERT statements and include explicit column
names. Please note: this may make restoration from backup slow.
* Move the switch next to *Load via partition root* towards right position,
* Move the switch next to *Load via partition root* to the *Yes* position,
so when dumping a COPY or INSERT statement for a partitioned table, target
the root of the partitioning hierarchy which contains it rather than the
partition itself. **Note:** This option is visible only for database server
@@ -147,10 +147,10 @@ tab to provide other backup options.
that should be excluded from the backup.
* Move the switch next to *Triggers* (active when creating a data-only backup)
towards right position to include commands that will disable triggers on the
to the *Yes* position to include commands that will disable triggers on the
target table while the data is being loaded.
* Move the switch next to *$ quoting* towards right position to enable dollar
* Move the switch next to *$ quoting* to the *Yes* position to enable dollar
quoting within function bodies; if disabled, the function body will be
quoted using SQL standard string syntax.
@@ -161,13 +161,13 @@ tab to provide other backup options.
* Move switches in the **Miscellaneous** field box to specify miscellaneous
backup options.
* Move the switch next to *Verbose messages* towards left position to instruct
* Move the switch next to *Verbose messages* to the *No* position to instruct
*pg_dumpall* to exclude verbose messages.
* Move the switch next to *Force double quotes on identifiers* towards right
* Move the switch next to *Force double quotes on identifiers* to the *Yes*
position to force the quoting of all identifiers.
* Move the switch next to *Use SET SESSION AUTHORIZATION* towards right
* Move the switch next to *Use SET SESSION AUTHORIZATION* to the *Yes*
position to include a statement that will use a SET SESSION AUTHORIZATION
command to determine object ownership (instead of an ALTER OWNER command).
@@ -177,9 +177,9 @@ tab to provide other backup options.
* Use the *Extra float digits* field to use the specified value when dumping
floating-point data, instead of the maximum available precision.
* Use the *Lock wait timeout* field to do not wait forever to acquire shared
table locks at the beginning of the dump. Instead, fail if unable to lock a
table within the specified timeout.
* Use the *Lock wait timeout* field to specify a timeout rather than waiting
indefinitely to acquire shared table locks at the beginning of the dump.
If unable to lock a table within the specified timeout, the operation will fail.
When you’ve specified the details that will be incorporated into the pg_dumpall
command:
@@ -189,6 +189,6 @@ command:
* Click the *Cancel* button to exit without saving work.
pgAdmin will run the backup process in background. You can view all the background
process with there running status and logs on the :ref:`Processes <processes>`
tab
pgAdmin will run the backup process in the background. You can view all the background
processes with their running status and logs on the :ref:`Processes <processes>`
tab.
+2 -2
View File
@@ -91,8 +91,8 @@ button to deploy the instance on Amazon RDS.
Once you click on the finish, one background process will start which will
deploy the instance in the cloud and monitor the progress of the deployment.
You can view all the background process with there running status and logs
on the :ref:`Processes <processes>` tab
You can view all the background processes with their running status and logs
on the :ref:`Processes <processes>` tab.
The Server will be added to the tree with the cloud deployment icon. Once the
deployment is done, the server details will be updated.
+2 -2
View File
@@ -107,8 +107,8 @@ button to deploy the instance on Azure Database.
Once you click on the finish, one background process will start which will
deploy the instance in the cloud and monitor the progress of the deployment.
You can view all the background process with there running status and logs
on the :ref:`Processes <processes>` tab
You can view all the background processes with their running status and logs
on the :ref:`Processes <processes>` tab.
.. image:: images/cloud_azure_bg_process_watcher.png
:alt: Cloud Deployment
+2 -2
View File
@@ -103,8 +103,8 @@ button to deploy the instance on EDB BigAnimal.
Once you click on the finish, one background process will start which will
deploy the instance in the cloud and monitor the progress of the deployment.
You can view all the background process with there running status and logs
on the :ref:`Processes <processes>` tab
You can view all the background processes with their running status and logs
on the :ref:`Processes <processes>` tab.
The Server will be added to the tree with the cloud deployment icon. Once the
deployment is done, the server details will be updated.
+2 -2
View File
@@ -105,8 +105,8 @@ button to deploy the instance on Azure PostgreSQL.
Once you click on the finish, one background process will start which will
deploy the instance in the cloud and monitor the progress of the deployment.
You can view all the background process with there running status and logs
on the :ref:`Processes <processes>` tab
You can view all the background processes with their running status and logs
on the :ref:`Processes <processes>` tab.
The Server will be added to the tree with the cloud deployment icon. Once the
+4 -4
View File
@@ -57,7 +57,7 @@ settings:
deterministic comparisons. By default, this option is set to true. In a
deterministic comparison, strings that are not byte-wise equal are considered
unequal, even if they are considered logically equal in the comparison.
* Use the *Rules* field to specify a rules for customizing the behavior of the collation.
* Use the *Rules* field to specify rules for customizing the behavior of the collation.
It includes considerations such as character ordering, case sensitivity, and accent
sensitivity.
* Use the *Version* field to specify version string to store with the collation object.
@@ -65,8 +65,8 @@ settings:
Click the *SQL* tab to continue.
Your entries in the *Collation* dialog generate a SQL command (see an example b
elow). Use the *SQL* tab for review; revisit or switch tabs to make any changes
Your entries in the *Collation* dialog generate a SQL command (see an example
below). Use the *SQL* tab for review; revisit or switch tabs to make any changes
to the SQL command.
Example
@@ -80,7 +80,7 @@ the *Collation* dialog:
:align: center
The example shown demonstrates creating a collation named *french* that uses the
rules specified for the locale, *fr-BI-x-icu. The collation is owned by
rules specified for the locale, *fr-BI-x-icu*. The collation is owned by
*postgres*.
* Click the *Info* button (i) to access online help. For more information about
+1 -1
View File
@@ -144,7 +144,7 @@ the *Add* icon (+) to add each security label selection:
* Specify a security label provider in the *Provider* field. The named provider
must be loaded and must consent to the proposed labeling operation.
* Specify a a security label in the *Security Label* field. The meaning of a
* Specify a security label in the *Security Label* field. The meaning of a
given label is at the discretion of the label provider. PostgreSQL places no
restrictions on whether or how a label provider must interpret security
labels; it merely provides a mechanism for storing them.
+1
View File
@@ -53,6 +53,7 @@ The default binary paths set in the container are as follows:
.. code-block:: bash
DEFAULT_BINARY_PATHS = {
'pg-18': '/usr/local/pgsql-18',
'pg-17': '/usr/local/pgsql-17',
'pg-16': '/usr/local/pgsql-16',
'pg-15': '/usr/local/pgsql-15',
+4 -4
View File
@@ -63,7 +63,7 @@ Use the *Definition* tab to set properties for the database:
* Specify a connection limit in the *Connection Limit* field to configure the
maximum number of connection requests. The default value (*-1*) allows
unlimited connections to the database.
* If the *templates?* is set to true, then database will be a template database.
* If *Template?* is set to *Yes*, the database will be a template database.
Click the *Security* tab to continue.
@@ -89,7 +89,7 @@ database. Click the *Add* icon (+) to add each security label selection:
* Specify a security label provider in the *Provider* field. The named provider
must be loaded and must consent to the proposed labeling operation.
* Specify a a security label in the *Security Label* field. The meaning of a
* Specify a security label in the *Security Label* field. The meaning of a
given label is at the discretion of the label provider. PostgreSQL places no
restrictions on whether or how a label provider must interpret security
labels; it merely provides a mechanism for storing them.
@@ -125,8 +125,8 @@ Use the *Advanced* tab to set advanced parameters for the database.
* Use *Schema restriction* field to provide a SQL restriction that will be used
against the pg_namespace table to limit the schemas that you see.
For example, you might enter: *public* so that only *public* are shown in
the pgAdmin browser.Separate entries with a comma or tab as you type.
For example, you might enter: *public* so that only *public* is shown in
the pgAdmin browser. Separate entries with a comma or tab as you type.
Click the *SQL* tab to continue.
+1 -1
View File
@@ -89,7 +89,7 @@ Use the *Security Labels* panel to assign security labels. Click the *Add* icon
* Specify a security label provider in the *Provider* field. The named provider
must be loaded and must consent to the proposed labeling operation.
* Specify a a security label in the *Security Label* field. The meaning of a
* Specify a security label in the *Security Label* field. The meaning of a
given label is at the discretion of the label provider. PostgreSQL places no
restrictions on whether or how a label provider must interpret security
labels; it merely provides a mechanism for storing them.
+21 -21
View File
@@ -49,7 +49,7 @@ To modify the displayed data:
* To change a numeric value within the grid, double-click the value to select
the field. Modify the content in the square in which it is displayed.
* To change a non-numeric value within the grid, double-click the content to
access the edit bubble. After modifying the contentof the edit bubble, click
access the edit bubble. After modifying the content of the edit bubble, click
the *Ok* button to display your changes in the data grid, or *Cancel* to
exit the edit bubble without saving.
@@ -62,7 +62,7 @@ table. As soon as you store the data, the row is assigned a row number, and a
fresh empty line is added to the data grid.
To write a SQL NULL to the table, simply leave the field empty. When you store
the new row, the will server fill in the default value for that column. If you
the new row, the server will fill in the default value for that column. If you
store a change to an existing row, the value NULL will explicitly be written.
To write an empty string to the table, enter the special string '' (two single
@@ -110,9 +110,9 @@ properties of the geometries directly in map, just click the specific geometry:
**JSON Data Editor**
A built in json editor is provided for *JSON/JSONB Data*.Double clicking on json/jsonb
data type cell in data grid will open JSON Editor.Editor provides different mode to
view and edit json data.
A built-in JSON editor is provided for *JSON/JSONB Data*. Double-clicking on a JSON/JSONB
data type cell in the data grid will open the JSON Editor. The editor provides different modes to
view and edit JSON data.
.. image:: images/json_editor_modes.png
@@ -120,21 +120,21 @@ view and edit json data.
:align: center
*Code Mode*:
Provides way to format & compact json data.Also provides ability to repair json data
by fixing quotes and escape characters, removing comments and JSONP notation and
turn JavaScript objects into JSON.
Provides a way to format and compact JSON data. Also provides the ability to repair JSON data
by fixing quotes and escape characters, removing comments and JSONP notation, and
turning JavaScript objects into JSON.
*Tree Mode*:
Enabled to change, add, move, remove, and duplicate fields and values.Provides ability
to searh & hilight data.
Enables changing, adding, moving, removing, and duplicating fields and values. Provides the ability
to search and highlight data.
*Form Mode*:
Allows only to edit values in json data there by providing ability to keep data structure
Allows editing only the values in JSON data, thereby providing the ability to keep the data structure
unchanged while editing.
*Preview Mode*:
Provides ability to check data before saving and also shows size of current json data.
Format and compact json data as well.
Provides the ability to check data before saving and also shows the size of the current JSON data.
Allows formatting and compacting JSON data as well.
*Editor Toolbar*
@@ -170,18 +170,18 @@ Tree/Form mode:
+----------------------+----------------------------------------------------------------------------------------+---------------------------+
| *Transform* | Click to *Transform* to filter data using JSME query language. | Code, Preview, Tree |
+----------------------+----------------------------------------------------------------------------------------+---------------------------+
| *Undo* | Click to *Undo* to undo last action performed on data . | Code, Preview, Tree, From |
| *Undo* | Click to *Undo* to undo last action performed on data. | Code, Preview, Tree, Form |
+----------------------+----------------------------------------------------------------------------------------+---------------------------+
| *Redo* | Click to *Redo* to repat last action performed on data . | Code, Preview, Tree, From |
| *Redo* | Click to *Redo* to repeat last action performed on data. | Code, Preview, Tree, Form |
+----------------------+----------------------------------------------------------------------------------------+---------------------------+
| *Mode* | Click to *Mode* dropdown to change dipaly mode of editor.Different modes avaialble | Code, Tree, From, Preview |
| | are Code, Preview, Tree, From. | |
| *Mode* | Click the *Mode* dropdown to change the display mode of the editor. Different modes | Code, Tree, Form, Preview |
| | available are Code, Preview, Tree, and Form. | |
+----------------------+----------------------------------------------------------------------------------------+---------------------------+
| *Expand All* | Click to *Expand All* to expand json data. | Tree, From |
| *Expand All* | Click *Expand All* to expand JSON data. | Tree, Form |
+----------------------+----------------------------------------------------------------------------------------+---------------------------+
| *Collapse All* | Click to *Redo* to collapse json data. | Tree, From |
| *Collapse All* | Click *Collapse All* to collapse JSON data. | Tree, Form |
+----------------------+----------------------------------------------------------------------------------------+---------------------------+
| *Search Box* | Enter partial/complete string to search in data. | Tree, From |
| *Search Box* | Enter partial/complete string to search in data. | Tree, Form |
+----------------------+----------------------------------------------------------------------------------------+---------------------------+
@@ -235,6 +235,6 @@ A View/Edit Data tab can be converted to a Query Tool Tab just by editing the qu
:alt: Promote View/Edit Data tab to Query Tool tab warning
:align: center
You can disable the dialog by selecting the "Don't Ask again" checkbox. If you wish to resume the confirmation dialog, you can do it from "Prefrences -> Query Tool -> Editor -> Show View/Edit Data Promotion Warning?"
You can disable the dialog by selecting the "Don't Ask again" checkbox. If you wish to resume the confirmation dialog, you can do it from "Preferences -> Query Tool -> Editor -> Show View/Edit Data Promotion Warning?"
Once you chose to continue, you won't be able to use the features of View/Edit mode like the filter and sorting options, limit, etc. It is a one-way conversion. It will be a query tool now.
+16 -10
View File
@@ -72,7 +72,7 @@ Export Options
| | You can select the option *With DROP Table* if you wish to have DROP Table DDL statements before | |
| | each CREATE Table DDL. You can see the option by clicking the down arrow beside the SQL button. | |
+----------------------+---------------------------------------------------------------------------------------------------+----------------+
| *Download image* | Click the *Download image* icon to save the ERD diagram in a image formate | Option/Alt + |
| *Download image* | Click the *Download image* icon to save the ERD diagram in an image format. | Option/Alt + |
| | | Ctrl + I |
+----------------------+---------------------------------------------------------------------------------------------------+----------------+
@@ -86,6 +86,9 @@ Editing Options
+----------------------+---------------------------------------------------------------------------------------------------+----------------+
| Icon | Behavior | Shortcut |
+======================+===================================================================================================+================+
| *Search table* | Click to search for a table in the diagram. Selecting a table from the search results will bring | Option/Alt + |
| | it into view and highlight it. | Ctrl + F |
+----------------------+---------------------------------------------------------------------------------------------------+----------------+
| *Add table* | Click this button to add a new table to the diagram. On clicking, this will open a table dialog | Option/Alt + |
| | where you can put the table details. | Ctrl + A |
+----------------------+---------------------------------------------------------------------------------------------------+----------------+
@@ -109,11 +112,14 @@ Table Relationship Options
+----------------------+---------------------------------------------------------------------------------------------------+----------------+
| Icon | Behavior | Shortcut |
+======================+===================================================================================================+================+
| *1M* | Click this button to open a one-to-many relationship dialog to add a relationship between the | Option/Alt + |
| *1-1* | Click this button to open a one-to-one relationship dialog to add a relationship between the | Option/Alt + |
| | two tables. The selected table becomes the referencing table. | Ctrl + B |
+----------------------+---------------------------------------------------------------------------------------------------+----------------+
| *1-M* | Click this button to open a one-to-many relationship dialog to add a relationship between the | Option/Alt + |
| | two tables. The selected table becomes the referencing table and will have the *many* endpoint of | Ctrl + O |
| | the link. | |
+----------------------+---------------------------------------------------------------------------------------------------+----------------+
| *MM* | Click this button to open a many-to-many relationship dialog to add a relationship between the | Option/Alt + |
| *M-M* | Click this button to open a many-to-many relationship dialog to add a relationship between the | Option/Alt + |
| | two tables. This option will create a new table based on the selected columns for the two relating| Ctrl + M |
| | tables and link them. | |
+----------------------+---------------------------------------------------------------------------------------------------+----------------+
@@ -129,7 +135,7 @@ Node Color Options
| Icon | Behavior |
+======================+==========================================================================================================+
| *Fill Color* | Use Fill Color to change the background color of a table node. This is helpful if you want to |
| | identify a of group tables. Once set, all the newly added tables will take the same color. |
| | identify a group of tables. Once set, all the newly added tables will take the same color. |
+----------------------+----------------------------------------------------------------------------------------------------------+
| *Text Color* | Use Text Color to change the text color of a table node based on the fill color to make text |
| | easily readable. |
@@ -148,7 +154,7 @@ Utility Options
| *Add/Edit note* | Click this button to make notes on tables nodes while designing the database. | Option/Alt + |
| | | Ctrl + N |
+-------------------------+------------------------------------------------------------------------------------------------+----------------+
| *Auto align* | Click this button to auto align all tables and links to make it look more cleaner. | Option/Alt + |
| *Auto align* | Click this button to auto-align all tables and links to make them look cleaner. | Option/Alt + |
| | | Ctrl + L |
+-------------------------+------------------------------------------------------------------------------------------------+----------------+
| *Show details* | Click this button to toggle the column details visibility. It allows you to show few or more | Option/Alt + |
@@ -188,7 +194,7 @@ Table Dialog
The table dialog allows you to:
* Change the table structure details.
* It can be used edit an existing table or add a new one.
* It can be used to edit an existing table or add a new one.
* Refer :ref:`table dialog <table_dialog>` for information on different fields.
Table Node
@@ -200,11 +206,11 @@ Table Node
The table node shows table details in a graphical representation:
* The top bar has a *details toggle button* that is used to toggle column details visibility. There is also a *note button* that is visible only if there is some note added. you can click on this button to quickly change the note.
* The top bar has a *details toggle button* that is used to toggle column details visibility. There is also a *note button* that is visible only if there is some note added. You can click on this button to quickly change the note.
* The first row shows the schema name of the table. Eg. *public* in above image.
* The second row shows the table name. Eg. *users* in above image.
* All other rows below the table name are the columns of the table along with data type. If the column is a primary key then it will have lock key icon eg. id is the primary key in above image. Otherwise, it will have column icon.
* you can click on the node and drag to move on the canvas.
* You can click on the node and drag to move on the canvas.
* Upon double click on the table node or by clicking the edit button from the toolbar, the table dialog opens where you can change the table details. Refer :ref:`table dialog <table_dialog>` for information on different fields.
The One to One Link Dialog
@@ -219,7 +225,7 @@ The one to one link dialog allows you to:
* Add a one to one relationship between two tables.
* *Local Table* is the table that references a table and has the *one* end point.
* *Local Column* the column that references.
* *Select Constraint* To implement one to one relationship, the *Local Column* must have primaty key or unique constraint. The default is a unique constraint. Please note that this field is visible only when the selected *Local Column* does not have either of the mentioned constraints.
* *Select Constraint* To implement a one-to-one relationship, the *Local Column* must have a primary key or unique constraint. The default is a unique constraint. Please note that this field is visible only when the selected *Local Column* does not have either of the mentioned constraints.
* *Referenced Table* is the table that is being referred and has the *one* end point.
* *Referenced Column* the column that is being referred.
@@ -266,7 +272,7 @@ The table link shows relationship between tables:
* The single line endpoint of the link shows the column that is being referred.
* The three line endpoint of the link shows the column that refers.
* If one of the columns that is being referred or that refers is removed from the table then the link will get dropped.
* you can click on the link and drag to move on the canvas.
* You can click on the link and drag to move on the canvas.
The Table Notes
+1 -1
View File
@@ -67,7 +67,7 @@ in the *Delete Row* popup.
Click the *SQL* tab to continue.
Your entries in the *Event Trigger* dialog generate a generate a SQL command.
Your entries in the *Event Trigger* dialog generate a SQL command.
Use the *SQL* tab for review; revisit or switch tabs to make any changes to the
SQL command.
+2 -2
View File
@@ -58,8 +58,8 @@ Click the *Query* tab to continue.
Use the fields in the *Query* tab to write the query that will be exported:
* Use the *Export Data Query* field to specifies A SELECT, VALUES, INSERT, UPDATE,
DELETE, or MERGE command whose results are to be copied .
* Use the *Export Data Query* field to specify a SELECT, VALUES, INSERT, UPDATE,
DELETE, or MERGE command whose results are to be copied.
* Use *Force Quote columns* field to forces quoting to be used for all non-NULL
values in each specified column. NULL output is never quoted. This is a creatable
+1 -1
View File
@@ -23,7 +23,7 @@ Use the fields in the *General* tab to identify an extension:
* Use the drop-down listbox in the *Name* field to select the extension. Each
extension must have a unique name.
* Move the switch next to *Cascade?* towards right position to automatically
* Move the switch next to *Cascade?* to the *Yes* position to automatically
install any extensions that this extension depends on that are not already
installed.
* Store notes about the extension in the *Comment* field.
+1 -1
View File
@@ -131,7 +131,7 @@ function. Click the *Add* icon (+) to add each security label selection:
* Specify a security label provider in the *Provider* field. The named provider
must be loaded and must consent to the proposed labeling operation.
* Specify a a security label in the *Security Label* field. The meaning of a
* Specify a security label in the *Security Label* field. The meaning of a
given label is at the discretion of the label provider. PostgreSQL places no
restrictions on whether or how a label provider must interpret security
labels; it merely provides a mechanism for storing them.
+7 -4
View File
@@ -41,6 +41,9 @@ Use the fields in the *Definition* tab to define the function:
will change to an input text field.
* Use the drop-down listbox next to *Language* to select the implementation
language. The default is *sql*.
* Use the drop-down listbox next to *Depends on extensions* to select the extension that this function
depends on (for example, plpgsql). If set, dropping the extension will automatically drop the
function as well.
* Use the fields in the *Arguments* to define an argument. Click the *Add*
icon (+) to set parameters and values for the argument:
@@ -153,7 +156,7 @@ function. Click the *Add* icon (+) to add each security label selection:
* Specify a security label provider in the *Provider* field. The named provider
must be loaded and must consent to the proposed labeling operation.
* Specify a a security label in the *Security Label* field. The meaning of a
* Specify a security label in the *Security Label* field. The meaning of a
given label is at the discretion of the label provider. PostgreSQL places no
restrictions on whether or how a label provider must interpret security
labels; it merely provides a mechanism for storing them.
@@ -164,7 +167,7 @@ in the *Delete Row* popup.
Click the *SQL* tab to continue.
Your entries in the *Function* dialog generate a generate a SQL command (see an
Your entries in the *Function* dialog generate a SQL command (see an
example below). Use the *SQL* tab for review; revisit or switch tabs to make any
changes to the SQL command.
@@ -178,8 +181,8 @@ the *Function* dialog:
:alt: Function dialog sql tab
:align: center
The example demonstrates creating an *plpgsql* function named *hire_salesmen*. The
function have three columns (p_ename, p_sal and p_comm).
The example demonstrates creating a *plpgsql* function named *hire_salesmen*. The
function has three columns (p_ename, p_sal and p_comm).
* Click the *Info* button (i) to access online help.
* Click the *Save* button to save work.
+1 -1
View File
@@ -46,7 +46,7 @@ Use the fields in the *Privileges Selection* window to grant
privileges. If you grant a privilege WITH GRANT OPTION, the Grantee will have
the right to grant privileges on the object to others. If WITH GRANT OPTION is
subsequently revoked, any role who received access to that object from that
Grantee (directly or through a chain of grants) will lose thier privileges on
Grantee (directly or through a chain of grants) will lose their privileges on
the object.
* Click the *Add* icon (+) to assign a set of privileges.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 340 KiB

After

Width:  |  Height:  |  Size: 679 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 189 KiB

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 KiB

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 72 KiB

+9 -6
View File
@@ -48,6 +48,9 @@ Use the fields in the *Definition* tab to define the index:
* Select *brin* to create a BRIN index. A BRIN index may improve
performance when managing minimum and maximum values and ranges.
* Use the drop-down listbox next to *Depends on extensions* to select the extension
that this index depends on (for example, edbspl). If set, dropping the extension
will automatically drop the index as well.
* Use the *Fill Factor* field to specify a fill factor for the index. The fill
factor specifies how full the selected method will try to fill each index
page.
@@ -57,16 +60,16 @@ Use the fields in the *Definition* tab to define the index:
for each entry of a BRIN index.
* Select *Buffering* to specify whether the buffering build technique is used to build the index. The default is
*Auto*
* Move the switch next to *Deduplicate items?* towards the *right position* to control usage of the B-tree
* Move the switch next to *Deduplicate items?* to the *Yes* position to control usage of the B-tree
deduplication technique. The default is *Yes*. This option is available only on PostgreSQL 13 and above.
* Move the switch next to *Fast update?* towards the *right position* to control usage of the fast update technique.
* Move the switch next to *Fast update?* to the *Yes* position to control usage of the fast update technique.
The default is *Yes*.
* Move the switch next to *Autosummarize* towards the *right position* to define whether a summarization run is
* Move the switch next to *Autosummarize* to the *Yes* position to define whether a summarization run is
queued for the previous page range whenever an insertion is detected on the next one. The default is *No*
* Move the switch next to *Unique?* towards the *right position* to check for duplicate values
* Move the switch next to *Unique?* to the *Yes* position to check for duplicate values
in the table when the index is created and when data is added. The default is *No*.
* Move the switch next to *NULLs not distinct?* towards the *right position* to treat null values as not distinct.
The default is*No*. This option is available only on PostgreSQL 15 and above.
* Move the switch next to *NULLs not distinct?* to the *Yes* position to treat null values as not distinct.
The default is *No*. This option is available only on PostgreSQL 15 and above.
* Move the *Clustered?* switch to the *Yes* position to instruct the server to
cluster the table.
* Move the *Concurrent build?* switch to the *Yes* position to build the index
+1 -1
View File
@@ -64,7 +64,7 @@ function. Click the *Add* icon (+) to add each security label selection:
* Specify a security label provider in the *Provider* field. The named provider
must be loaded and must consent to the proposed labeling operation.
* Specify a a security label in the *Security Label* field. The meaning of a
* Specify a security label in the *Security Label* field. The meaning of a
given label is at the discretion of the label provider. PostgreSQL places no
restrictions on whether or how a label provider must interpret security
labels; it merely provides a mechanism for storing them.
+2
View File
@@ -87,6 +87,8 @@ There are 3 ways to configure LDAP:
"LDAP_KEY_FILE","Specifies the path to the server private key file. This parameter
is applicable only if you are using *ldaps* as connection protocol or you have
set *LDAP_USE_STARTTLS* parameter to *True*."
"LDAP_CERT_VALIDATE", "Set this parameter to *False* if you want to bypass
the TLS certificate validation. By default it is set to True."
"LDAP_IGNORE_MALFORMED_SCHEMA", "Some flaky LDAP servers returns malformed schema.
If this parameter set to *True*, no exception will be raised and schema is thrown away
but authentication will be done. This parameter should remain False, as recommended."
+13 -13
View File
@@ -29,31 +29,31 @@ maintenance:
* Move the *ANALYZE* switch to the *Yes* position to issue ANALYZE commands
whenever the content of a table has changed sufficiently.
* Move the *DISABLE PAGE SKIPPING* switch to the *Yes* position to disables
* Move the *DISABLE PAGE SKIPPING* switch to the *Yes* position to disable
all page-skipping behavior.
* Move the *SKIP LOCKED* switch to the *Yes* position to specifies that
* Move the *SKIP LOCKED* switch to the *Yes* position to specify that
VACUUM should not wait for any conflicting locks to be released when
beginning work on a relation. This option is available from v12 onwards.
* Move the *TRUNCATE* switch to the *Yes* position to specifies that VACUUM
* Move the *TRUNCATE* switch to the *Yes* position to specify that VACUUM
should attempt to truncate off any empty pages at the end of the table and
allow the disk space for the truncated pages to be returned to the operating
system. This option is available from v12 onwards.
* Move the *PROCESS TOAST* switch to the *Yes* position to specifies that
* Move the *PROCESS TOAST* switch to the *Yes* position to specify that
VACUUM should attempt to process the corresponding TOAST table for each
relation, if one exists. This option is available from v14 onwards.
* Move the *PROCESS MAIN* switch to the *Yes* position to specifies that
* Move the *PROCESS MAIN* switch to the *Yes* position to specify that
VACUUM should attempt to process the main relation. This option is available
from v16 onwards.
* Move the *SKIP DATABASE STATS* switch to the *Yes* position to specifies
* Move the *SKIP DATABASE STATS* switch to the *Yes* position to specify
that VACUUM should skip updating the database-wide statistics about oldest
unfrozen XIDs. This option is available from v16 onwards.
* Move the *ONLY DATABASE STATS* switch to the *Yes* position to specifies
* Move the *ONLY DATABASE STATS* switch to the *Yes* position to specify
that VACUUM should do nothing except update the database-wide statistics
about oldest unfrozen XIDs . This option is available from v16 onwards.
@@ -64,7 +64,7 @@ maintenance:
of VACUUM in parallel using integer background workers. This option is
available from v13 onwards.
* Use the *BUFFER USAGE LIMIT* field to specifies the Buffer Access Strategy
* Use the *BUFFER USAGE LIMIT* field to specify the Buffer Access Strategy
ring buffer size for VACUUM. This size is used to calculate the number of
shared buffers which will be reused as part of this strategy. This option
is available from v16 onwards
@@ -78,11 +78,11 @@ maintenance:
This enables the query optimizer to select the fastest query plan for optimal
performance.
* Move the *SKIP LOCKED* switch to the *Yes* position to specifies that
* Move the *SKIP LOCKED* switch to the *Yes* position to specify that
ANALYZE should not wait for any conflicting locks to be released when
beginning work on a relation. This option is available from v12 onwards.
* Use the *BUFFER USAGE LIMIT* field to specifies the Buffer Access Strategy
* Use the *BUFFER USAGE LIMIT* field to specify the Buffer Access Strategy
ring buffer size for ANALYZE. This size is used to calculate the number of
shared buffers which will be reused as part of this strategy. This option
is available from v16 onwards
@@ -103,7 +103,7 @@ maintenance:
without taking any locks that prevent concurrent inserts, updates, or
deletes on the table. This option is available from v12 onwards.
* Use the *TABLESPACE* field to specifies that indexes will be rebuilt on
* Use the *TABLESPACE* field to specify that indexes will be rebuilt on
a new tablespace. This option is available from v14 onwards.
.. image:: images/maintenance_cluster.png
@@ -118,6 +118,6 @@ switch to the *No* position; by default, status messages are included.
When you've completed the dialog, click *OK* to start the background process;
to exit the dialog without performing maintenance operations, click *Cancel*.
pgAdmin will run the maintenance process in background. You can view all the background
process with there running status and logs on the :ref:`Processes <processes>`
pgAdmin will run the maintenance process in the background. You can view all the background
processes with their running status and logs on the :ref:`Processes <processes>`
tab.
+8 -5
View File
@@ -10,7 +10,7 @@ the REFRESH MATERIALIZED VIEW command to update the content of a materialized
view.
The *Materialized View* dialog organizes the development of a materialized_view
through the following dialog tabs: *General*, *Definition*, *Storage*,
through the following dialog tabs: *General*, *Definition*, *Code*,
*Parameter*, and *Security*. The *SQL* tab displays the SQL code generated by
dialog selections.
@@ -31,10 +31,10 @@ Use the fields in the *General* tab to identify the materialized view:
Click the *Definition* tab to continue.
.. image:: images/materialized_view_definition.png
:alt: Materialized view dialog storage tab
:alt: Materialized view dialog definition tab
:align: center
Use the fields in the *Storage* tab to maintain the materialized view:
Use the fields in the *Definition* tab to maintain the materialized view:
* Move the *With Data* switch to the *Yes* position to specify the materialized
view should be populated at creation time. If not, the materialized view
@@ -47,11 +47,14 @@ Use the fields in the *Storage* tab to maintain the materialized view:
* Use the *Fill Factor* field to specify a fill factor for the materialized
view. The fill factor for a table is a percentage between 10 and 100. 100
(complete packing) is the default.
* Use the drop-down listbox next to *Depends on extensions* to select the extension that this materialized view
depends on (for example, edbspl). If set, dropping the extension will automatically drop the
materialized view as well.
Click the *Code* tab to continue.
.. image:: images/materialized_view_code.png
:alt: Materialized view dialog definition tab
:alt: Materialized view dialog code tab
:align: center
Use the text editor field in the *Code* tab to provide the query that will
@@ -101,7 +104,7 @@ selection:
* Specify a security label provider in the *Provider* field. The named provider
must be loaded and must consent to the proposed labeling operation.
* Specify a a security label in the *Security Label* field. The meaning of a
* Specify a security label in the *Security Label* field. The meaning of a
given label is at the discretion of the label provider. PostgreSQL places no
restrictions on whether or how a label provider must interpret security
labels; it merely provides a mechanism for storing them.
+14 -5
View File
@@ -60,6 +60,9 @@ Use the fields on the *Display* panel to specify general display preferences:
all the shared servers from the object explorer. **Note:** This option is visible only when
pgAdmin is running in server mode.
* When the *Show column data type?* switch is turned off, then the data types
of the columns will not be displayed alongside their column names.
* When the *Show empty object collections?* switch is turned off, then all object
collections which are empty will be hidden from browser tree.
@@ -101,7 +104,7 @@ related settings:
:align: center
* Use *Enable object breadcrumbs?* to enable or disable object breadcrumbs
displayed on on object mouse hover.
displayed on object mouse hover.
* Use *Show comment with object breadcrumbs?* to enable or disable the
comment visibility which comes displayed with object breadcrumbs.
@@ -139,11 +142,11 @@ Use field on *Tab settings* panel to specify the tab related properties.
* Use *Debugger tab title placeholder* field to customize the Debugger tab title.
* When the *Dynamic tab size* If set to True, the tabs will take full size as per the title, it will also applicable for already opened tabs
* When the *Dynamic tab size* switch is set to *True*, the tabs will take full size as per the title. This will also apply to already opened tabs.
* Use the *PSQL tool tab title placeholder* field to customize the PSQL tool tab title.
* When the *Open in new browser tab* filed is selected for Query tool, Schema Diff or Debugger, it will
* When the *Open in new browser tab* field is selected for Query tool, Schema Diff or Debugger, it will
open in a new browser tab when invoked.
* Use the *Query tool tab title placeholder* field to customize the query tool tab title.
@@ -172,7 +175,7 @@ Expand the *Dashboards* node to specify your dashboard display preferences.
:alt: Preferences dashboard refresh options
:align: center
Use the fields on the *Refresh rates* panel to specify your refersh rates
Use the fields on the *Refresh rates* panel to specify your refresh rate
preferences for the graphs on the *Dashboard* tab:
* Use the *Average load statistics refresh rate* field to specify the number of
@@ -254,6 +257,12 @@ Use the fields on the *Options* panel to manage ERD preferences.
* Use *Cardinality Notation* to change the cardinality notation format
used to present relationship links.
* Use *Format ERD Project File?* if you want to format the .pgerd ERD
project file. It's a JSON file which will be formatted.
* Use *Image Download Resolution* to change the ERD image download
resolution. Higher values will use higher memory and slower rendering.
* When the *SQL With DROP Table* switch is set to *True*, the SQL
generated by the ERD Tool will add DROP table DDL before each CREATE
table DDL.
@@ -451,7 +460,7 @@ monitored databases:
locations used by PostgreSQL.
**Note:** Use the 'Validate path' button to check the existence of the utility
programs (pg_dump, pg_dumpall, pg_restore and psql) and there respective versions.
programs (pg_dump, pg_dumpall, pg_restore and psql) and their respective versions.
.. image:: images/preferences_paths_help.png
:alt: Preferences binary path help section
+4 -1
View File
@@ -36,6 +36,9 @@ Use the fields in the *Definition* tab to define the procedure:
* Use the drop-down listbox next to *Language* to select a language. The default
is *edbspl*.
* Use the drop-down listbox next to *Depends on extensions* to select the extension that this procedure
depends on (for example, edbspl). If set, dropping the extension will automatically drop the
procedure as well.
* Use the fields in the *Arguments* section to define an argument. Click *Add* to set
parameters and values for the argument:
* Use the drop-down listbox next to *Data type* to select a data type.
@@ -132,7 +135,7 @@ procedure. Click *Add* to add each security label selection:
* Specify a security label provider in the *Provider* field. The named provider
must be loaded and must consent to the proposed labeling operation.
* Specify a a security label in the *Security Label* field. The meaning of a
* Specify a security label in the *Security Label* field. The meaning of a
given label is at the discretion of the label provider. PostgreSQL places no
restrictions on whether or how a label provider must interpret security
labels; it merely provides a mechanism for storing them.
+2
View File
@@ -275,6 +275,8 @@ the drop down on the right side of *Explain Analyze* button in the toolbar.
Please note that pgAdmin generates the *Explain [Analyze]* plan in JSON format.
**Note**: If multiple queries are present and none is selected, *Explain [Analyze]* runs the query located at the cursor position.
On successful generation of *Explain* plan, it will create three tabs/panels
under the Explain panel.
+3
View File
@@ -12,6 +12,9 @@ notes for it.
:maxdepth: 1
release_notes_9_11
release_notes_9_10
release_notes_9_9
release_notes_9_8
release_notes_9_7
release_notes_9_6
+47
View File
@@ -0,0 +1,47 @@
************
Version 9.10
************
Release date: 2025-11-13
This release contains a number of bug fixes and new features since the release of pgAdmin 4 v9.9.
Supported Database Servers
**************************
**PostgreSQL**: 13, 14, 15, 16, 17 and 18
**EDB Advanced Server**: 13, 14, 15, 16, 17 and 18
Bundled PostgreSQL Utilities
****************************
**psql**, **pg_dump**, **pg_dumpall**, **pg_restore**: 18.0
New features
************
| `Issue #4306 <https://github.com/pgadmin-org/pgadmin4/issues/4306>`_ - Added the ability to search for tables and automatically bring them into view in the ERD tool.
| `Issue #6391 <https://github.com/pgadmin-org/pgadmin4/issues/6391>`_ - Add support of DEPENDS/NO DEPENDS ON EXTENSION for PROCEDURE.
| `Issue #6698 <https://github.com/pgadmin-org/pgadmin4/issues/6698>`_ - Add support for setting image download resolution in the ERD tool.
| `Issue #7885 <https://github.com/pgadmin-org/pgadmin4/issues/7885>`_ - Add support for displaying detailed Citus query plans instead of 'Custom Scan' placeholder.
| `Issue #8912 <https://github.com/pgadmin-org/pgadmin4/issues/8912>`_ - Add support for formatting .pgerd ERD project file.
Housekeeping
************
| `Issue #8676 <https://github.com/pgadmin-org/pgadmin4/issues/8676>`_ - Migrate pgAdmin UI to use React 19.
Bug fixes
*********
| `Issue #8504 <https://github.com/pgadmin-org/pgadmin4/issues/8504>`_ - Fixed an issue where data output column resize is not sticking in Safari.
| `Issue #9117 <https://github.com/pgadmin-org/pgadmin4/issues/9117>`_ - Fixed an issue where Schema Diff does not ignore Tablespace for indexes.
| `Issue #9132 <https://github.com/pgadmin-org/pgadmin4/issues/9132>`_ - Fixed an issue where the 2FA window redirected to the login page after session expiration.
| `Issue #9233 <https://github.com/pgadmin-org/pgadmin4/issues/9233>`_ - Fixed an issue where the Select All option on the columns tab of import/export data was not working in languages other than English.
| `Issue #9240 <https://github.com/pgadmin-org/pgadmin4/issues/9240>`_ - Fixed an issue where the Debian build process failed with a "Sphinx module not found" error when using a Python virtual environment.
| `Issue #9281 <https://github.com/pgadmin-org/pgadmin4/issues/9281>`_ - Fixed an issue where the last used storage directory was reset to blank, leading to access denied errors during backup or restore operations.
| `Issue #9304 <https://github.com/pgadmin-org/pgadmin4/issues/9304>`_ - Fixed an issue that prevented assigning multiple users to an RLS policy.
| `Issue #9320 <https://github.com/pgadmin-org/pgadmin4/issues/9320>`_ - Fixed remote code execution vulnerability when restoring PLAIN-format SQL dumps in server mode (CVE-2025-12762).
| `Issue #9323 <https://github.com/pgadmin-org/pgadmin4/issues/9323>`_ - Fixed Command injection vulnerability allowing arbitrary command execution on Windows (CVE-2025-12763).
| `Issue #9324 <https://github.com/pgadmin-org/pgadmin4/issues/9324>`_ - Fixed LDAP authentication flow vulnerable to TLS certificate verification bypass (CVE-2025-12765).
| `Issue #9325 <https://github.com/pgadmin-org/pgadmin4/issues/9325>`_ - Fixed LDAP injection vulnerability in LDAP authentication flow (CVE-2025-12764).
+45
View File
@@ -0,0 +1,45 @@
************
Version 9.11
************
Release date: 2025-12-11
This release contains a number of bug fixes and new features since the release of pgAdmin 4 v9.10.
Supported Database Servers
**************************
**PostgreSQL**: 13, 14, 15, 16, 17 and 18
**EDB Advanced Server**: 13, 14, 15, 16, 17 and 18
Bundled PostgreSQL Utilities
****************************
**psql**, **pg_dump**, **pg_dumpall**, **pg_restore**: 18.0
New features
************
| `Issue #6388 <https://github.com/pgadmin-org/pgadmin4/issues/6388>`_ - Add support of DEPENDS/NO DEPENDS ON EXTENSION for INDEX.
| `Issue #6390 <https://github.com/pgadmin-org/pgadmin4/issues/6390>`_ - Add support of DEPENDS/NO DEPENDS ON EXTENSION for MATERIALIZED VIEW.
| `Issue #8968 <https://github.com/pgadmin-org/pgadmin4/issues/8968>`_ - Add support for showing the column data type beside column name in the object explorer.
| `Issue #9263 <https://github.com/pgadmin-org/pgadmin4/issues/9263>`_ - Added Ubuntu 25.10 and Fedora 43
| `Issue #9345 <https://github.com/pgadmin-org/pgadmin4/issues/9345>`_ - Add conditional TLS support for the Ingress in the Helm chart.
Housekeeping
************
Bug fixes
*********
| `Issue #9036 <https://github.com/pgadmin-org/pgadmin4/issues/9036>`_ - Fixed an issue on type casting of default string function/procedure arguments in debugger tool.
| `Issue #9155 <https://github.com/pgadmin-org/pgadmin4/issues/9155>`_ - Fix pkg_resources deprecation warning by migrating Docker base image to python:3-alpine from alpine:latest.
| `Issue #9297 <https://github.com/pgadmin-org/pgadmin4/issues/9297>`_ - Fixed an issue where EXPLAIN should run on query under cursor if no text is selected.
| `Issue #9351 <https://github.com/pgadmin-org/pgadmin4/issues/9351>`_ - Fixed an issue where opening file in Query Tool does not retain file name in tab.
| `Issue #9354 <https://github.com/pgadmin-org/pgadmin4/issues/9354>`_ - Fixed an issue where connection is failing via Query Tool/PSQL Tool workspaces.
| `Issue #9368 <https://github.com/pgadmin-org/pgadmin4/issues/9368>`_ - Plain SQL restore runs with '\restrict' option to prevent harmful psql meta-commands (CVE-2025-13780).
| `Issue #9372 <https://github.com/pgadmin-org/pgadmin4/issues/9372>`_ - Fixed an issue where copying highlighted text in the query tool data output cell editor would copy the complete string.
| `Issue #9373 <https://github.com/pgadmin-org/pgadmin4/issues/9373>`_ - Fixed an issue where copying a single cell should not add quoting.
| `Issue #9393 <https://github.com/pgadmin-org/pgadmin4/issues/9393>`_ - Fix the Helm chart server definition and change the app version.
| `Issue #9399 <https://github.com/pgadmin-org/pgadmin4/issues/9399>`_ - Specify the correct hostname placeholder for the Password Exec command.
| `Issue #9408 <https://github.com/pgadmin-org/pgadmin4/issues/9408>`_ - Ensure the proper handling of extra volume mount configurations in the Helm deployment template by correcting the configuration value references.
-1
View File
@@ -37,4 +37,3 @@ Bug fixes
| `Issue #9095 <https://github.com/pgadmin-org/pgadmin4/issues/9095>`_ - Fixed an issue where pgAdmin config migration was failing while upgrading to v9.7.
| `Issue #9114 <https://github.com/pgadmin-org/pgadmin4/issues/9114>`_ - Fixed Cross-Origin Opener Policy (COOP) vulnerability in the OAuth 2.0 authentication flow (CVE-2025-9636).
| `Issue #9116 <https://github.com/pgadmin-org/pgadmin4/issues/9116>`_ - Fixed an issue where editor shortcuts fail when using Option key combinations on macOS, due to macOS treating Option+Key as a different key input.
| `Issue #9125 <https://github.com/pgadmin-org/pgadmin4/issues/9125>`_ - Fixed an issue where the pgAdmin configuration database wasn't being created on a fresh install when an external database was used for the configuration.
+40
View File
@@ -0,0 +1,40 @@
***********
Version 9.9
***********
Release date: 2025-10-16
This release contains a number of bug fixes and new features since the release of pgAdmin 4 v9.8.
Supported Database Servers
**************************
**PostgreSQL**: 13, 14, 15, 16, 17 and 18
**EDB Advanced Server**: 13, 14, 15, 16 and 17
Bundled PostgreSQL Utilities
****************************
**psql**, **pg_dump**, **pg_dumpall**, **pg_restore**: 17.5
New features
************
| `Issue #6385 <https://github.com/pgadmin-org/pgadmin4/issues/6385>`_ - Add support of DEPENDS/NO DEPENDS ON EXTENSION for ALTER FUNCTION.
| `Issue #6394 <https://github.com/pgadmin-org/pgadmin4/issues/6394>`_ - Added "MULTIRANGE_TYPE_NAME" option while creating a Range Type.
| `Issue #6395 <https://github.com/pgadmin-org/pgadmin4/issues/6395>`_ - Added "SUBSCRIPT" option while creating a External Type.
| `Issue #6996 <https://github.com/pgadmin-org/pgadmin4/issues/6996>`_ - Added option to skip the password dialog when using an identity file.
| `Issue #8932 <https://github.com/pgadmin-org/pgadmin4/issues/8932>`_ - Added 'failover' and 'two_phase' parameter support in CREATE/ALTER SUBSCRIPTION for PostgreSQL v17+.
| `Issue #9225 <https://github.com/pgadmin-org/pgadmin4/issues/9225>`_ - Add support for initializing the pgAdmin4 Kubernetes Helm chart.
Housekeeping
************
Bug fixes
*********
| `Issue #9098 <https://github.com/pgadmin-org/pgadmin4/issues/9098>`_ - Fixed an issue where the query tool displayed 'default' instead of 'null' for null text data in the data output.
| `Issue #9125 <https://github.com/pgadmin-org/pgadmin4/issues/9125>`_ - Fixed an issue where the pgAdmin configuration database wasn't being created on a fresh install when an external database was used for the configuration.
| `Issue #9157 <https://github.com/pgadmin-org/pgadmin4/issues/9157>`_ - Fixed an issue where shortcuts are not working as expected on multiple keyboard layouts.
| `Issue #9158 <https://github.com/pgadmin-org/pgadmin4/issues/9158>`_ - Fixed an issue where saving the newly changed preferences was not reflecting on the preferences tab.
+29 -25
View File
@@ -29,6 +29,10 @@ restore process:
copy of the backed-up object.
* Select *Plain* to restore a plain SQL backup. When selecting this option
all the other options will not be applicable.
**Note:** The plain SQL restore process is executed in the backend using
the psql command with the \restrict option. The purpose of \restrict is to
enhance security by preventing dangerous commands embedded in a plain text
dump file from being executed on a PostgreSQL server.
* Select *Directory* to restore from a compressed directory-format archive.
* Enter the complete path to the backup file in the *Filename* field.
@@ -50,13 +54,13 @@ tab to provide options related to data or pgAdmin objects that correspond to *pg
* Move switches in the **Sections** field box to specify the content that will be
restored:
* Move the switch next to *Pre-data* towards right position to restore all
* Move the switch next to *Pre-data* to the *Yes* position to restore all
data definition items not included in the data or post-data item lists.
* Move the switch next to *Data* towards right position to restore actual
* Move the switch next to *Data* to the *Yes* position to restore actual
table data, large-object contents, and sequence values.
* Move the switch next to *Post-data* towards right position position to restore
* Move the switch next to *Post-data* to the *Yes* position to restore
definitions of indexes, triggers, rules, and constraints (other than
validated check constraints).
@@ -67,7 +71,7 @@ tab to provide options related to data or pgAdmin objects that correspond to *pg
* Move switches in the **Type of objects** field box to specify the objects that
will be restored:
* Move the switch next to *Only data* towards right position to limit the
* Move the switch next to *Only data* to the *Yes* position to limit the
restoration to data.
* Move the switch next to *Only schema* to limit the restoration to
@@ -80,29 +84,29 @@ tab to provide options related to data or pgAdmin objects that correspond to *pg
* Move switches in the **Do not save** box to specify which objects will not
be restored:
* Move the switch next to *Owner* towards right position to exclude commands
* Move the switch next to *Owner* to the *Yes* position to exclude commands
that set object ownership.
* Move the switch next to *Privileges* towards right position to exclude
* Move the switch next to *Privileges* to the *Yes* position to exclude
commands that create access privileges.
* Move the switch next to *Tablespaces* towards right position to exclude
* Move the switch next to *Tablespaces* to the *Yes* position to exclude
tablespaces.
* Move the switch next to *Comments* towards right position to exclude
* Move the switch next to *Comments* to the *Yes* position to exclude
commands that set the comments. **Note:** This option is visible only for
database server greater than or equal to 11.
* Move the switch next to *Publications* towards right position to exclude
* Move the switch next to *Publications* to the *Yes* position to exclude
publications.
* Move the switch next to *Subscriptions* towards right position to exclude
* Move the switch next to *Subscriptions* to the *Yes* position to exclude
subscriptions.
* Move the switch next to *Security labels* towards right position to exclude
* Move the switch next to *Security labels* to the *Yes* position to exclude
Security labels.
* Move the switch next to *Table access methods* towards right position to exclude
* Move the switch next to *Table access methods* to the *Yes* position to exclude
Table access methods. **Note:** This option is visible only for
database server greater than or equal to 15.
@@ -114,17 +118,17 @@ Click the *Query Options* tab to continue. Use these additional fields to specif
the type of statements that should be included in the restore:
* Move the switch next to *Include CREATE DATABASE statement* towards right position
* Move the switch next to *Include CREATE DATABASE statement* to the *Yes* position
to include a command that creates a new database before performing the restore.
* Move the switch next to *Clean before restore* towards right position to
* Move the switch next to *Clean before restore* to the *Yes* position to
drop each existing database object (and data) before restoring.
* Move the switch next to *Include IF EXISTS clause* towards right
* Move the switch next to *Include IF EXISTS clause* to the *Yes*
position to add an IF EXISTS clause to drop databases and other objects.
This option is not valid unless *Clean before restore* is also set.
* Move the switch next to *Single transaction* towards right position to
* Move the switch next to *Single transaction* to the *Yes* position to
execute the restore as a single transaction (that is, wrap the emitted
commands in *BEGIN/COMMIT*). This ensures that either all the commands
complete successfully, or no changes are applied. This option implies
@@ -137,12 +141,12 @@ the type of statements that should be included in the restore:
Click the *Table Options* tab to continue. Use the fields in the *Table Options*
tab related to tables that should be included in the backup.
* Move the switch next to *Enable row security* towards right position to
* Move the switch next to *Enable row security* to the *Yes* position to
set row_security to on instead, allowing the user to dump the parts of the
contents of the table that they have access to. This option is relevant
only when dumping the contents of a table which has row security.
* Move the switch next to *No data for failed tables* towards right position
* Move the switch next to *No data for failed tables* to the *Yes* position
to ignore data that fails a trigger.
Click the *Options* tab to continue. Use the fields in the *Options*
@@ -156,20 +160,20 @@ tab to provide other restore options.
should be excluded from the restore:
* Move the switch next to *Triggers* (active when creating a data-only
restore) towards right position to include commands that will disable
restore) to the *Yes* position to include commands that will disable
triggers on the target table while the data is being loaded.
* Move switches in the **Miscellaneous/Behavior** box to specify
miscellaneous restore options:
* Move the switch next to *Verbose messages* towards left to instruct
* Move the switch next to *Verbose messages* to the *No* position to instruct
*pg_restore* to exclude verbose messages.
* Move the switch next to *Use SET SESSION AUTHORIZATION* towards right position
* Move the switch next to *Use SET SESSION AUTHORIZATION* to the *Yes* position
to include a statement that will use a SET SESSION AUTHORIZATION
command to determine object ownership (instead of an ALTER OWNER command).
* Move the switch next to *Exit on error* towards right position to instruct
* Move the switch next to *Exit on error* to the *Yes* position to instruct
*pg_restore* to exit restore if there is an error in sending SQL commands.
The default is to continue and to display a count of errors at the end of
the restore.
@@ -182,6 +186,6 @@ command, click the *Restore* button to start the process, or click the *Cancel*
button to exit without saving your work. A popup will confirm if the restore is
successful.
pgAdmin will run the restore process in background. You can view all the background
process with there running status and logs on the :ref:`Processes <processes>`
tab
pgAdmin will run the restore process in the background. You can view all the background
processes with their running status and logs on the :ref:`Processes <processes>`
tab.
+1 -1
View File
@@ -105,7 +105,7 @@ Use the *Security* tab to define security labels applied to the role. Click the
* Specify a security label provider in the *Provider* field. The named provider
must be loaded and must consent to the proposed labeling operation.
* Specify a a security label in the *Security Label* field. The meaning of a
* Specify a security label in the *Security Label* field. The meaning of a
given label is at the discretion of the label provider. PostgreSQL places no
restrictions on whether or how a label provider must interpret security
labels; it merely provides a mechanism for storing them.
+1 -1
View File
@@ -49,7 +49,7 @@ panel:
* Specify a security label provider in the *Provider* field. The named provider
must be loaded and must consent to the proposed labeling operation.
* Specify a a security label in the *Security Label* field. The meaning of a
* Specify a security label in the *Security Label* field. The meaning of a
given label is at the discretion of the label provider. PostgreSQL places no
restrictions on whether or how a label provider must interpret security
labels; it merely provides a mechanism for storing them.
+4 -4
View File
@@ -79,13 +79,13 @@ same or different (and within the same server or from different servers).
Use the drop-down near to *Compare* button to ignore owner, whitespace, tablespace and grants.
* Ignore Owner – Select to ignores the owner while comparing the objects.
* Ignore Owner – Select to ignore the owner while comparing the objects.
* Ignore Whitespace – Select to ignores the whitespace while comparing the string objects. Whitespace includes space, tabs, and CRLF.
* Ignore Whitespace – Select to ignore the whitespace while comparing the string objects. Whitespace includes space, tabs, and CRLF.
* Ignore Tablespace – Select to ignores the tablespace while comparing the objects.
* Ignore Tablespace – Select to ignore the tablespace while comparing the objects.
* Ignore Grant/Revoke – Select to ignores the grant and revoke command while comparing the objects.
* Ignore Grant/Revoke – Select to ignore the grant and revoke command while comparing the objects.
After you select servers, and databases, click on the
*Compare* button to obtain the *Comparison Result*.
+4 -4
View File
@@ -55,11 +55,11 @@ Use the fields in the *Definition* tab to define the sequence:
to be preallocated and stored in memory for faster access. The minimum value
is 1 (only one value can be generated at a time, i.e., no cache), and this is
also the default.
* Move the switch next to *Cycled* towards the *right position* to allow the sequence to wrap
* Move the switch next to *Cycled* to the *Yes* position to allow the sequence to wrap
around when the MAXVALUE or the MINVALUE has been reached by an ascending or
descending sequence respectively. If the limit is reached, the next number
generated will be the MINVALUE or MAXVALUE, respectively. The default is *No*.
* Move the switch next to *Unlogged?* towards the *right position* to make the sequence Unlogged.
* Move the switch next to *Unlogged?* to the *Yes* position to make the sequence Unlogged.
The default is *No*. This option is available only on PostgreSQL 15 and above.
* The *OWNED BY* option causes the sequence to be associated with a specific
table column, such that if that column (or its whole table) is dropped, the
@@ -93,7 +93,7 @@ sequence. Click the *Add* icon (+) to add each security label selection:
* Specify a security label provider in the *Provider* field. The named provider
must be loaded and must consent to the proposed labeling operation.
* Specify a a security label in the *Security Label* field. The meaning of a
* Specify a security label in the *Security Label* field. The meaning of a
given label is at the discretion of the label provider. PostgreSQL places no
restrictions on whether or how a label provider must interpret security
labels; it merely provides a mechanism for storing them.
@@ -104,7 +104,7 @@ in the *Delete Row* popup.
Click the *SQL* tab to continue.
Your entries in the *Sequence* dialog generate a generate a SQL command (see an
Your entries in the *Sequence* dialog generate a SQL command (see an
example below). Use the *SQL* tab for review; revisit or switch tabs to make any
changes to the SQL command.
+3
View File
@@ -177,6 +177,9 @@ not be able to connect directly.
*Identity file* field to specify the location of the key file.
* If the SSH host is expecting a password of the user name or an identity file
if being used, use the *Password* field to specify the password.
* Check the box next to *Prompt for password?* to to have pgAdmin prompt for
a password if the identity file includes one. This setting applies only when
using an identity file, which may or may not require a password.
* Check the box next to *Save password?* to instruct pgAdmin to save the
password for future use. Use
:ref:`Clear SSH Tunnel Password <clear_saved_passwords>` to remove the saved
+1
View File
@@ -106,6 +106,7 @@ Use the *With* tab to define some parameters for a subscription:
* Move the *Run as owner?* switch to *true* position to specify all replication actions are performed as the subscription owner. If *false*, replication workers will perform actions on each table as the owner of that table. The default is *false*. This option is available only on PostgreSQL 16 and above.
* Use the *Password required?* to specify whether connections to the publisher made as a result of this subscription must use password authentication. This setting is ignored when the subscription is owned by a superuser. The default is true. Only superusers can set this value to *false*. This option is available only on PostgreSQL 16 and above.
* Use the *Origin* to specify whether the subscription will request the publisher to only send changes that don't have an origin or send changes regardless of origin. The default is *any*. This option is available only on PostgreSQL 16 and above.
* Use the *Failover* to specify whether the replication slots associated with the subscription are enabled to be synced to the standbys so that logical replication can be resumed from the new primary after failover. The default is false. This option is available only on PostgreSQL 17 and above.
Click the *SQL* tab to continue.
+10 -10
View File
@@ -421,20 +421,20 @@ not-null constraints; after saving the new or modified table, any changes to
the original table will not be applied to the new table.
* Use the drop-down listbox next to *Relation* to select a reference table.
* Move the switch next to *With default values?* towards the *right position* to copy default
* Move the switch next to *With default values?* to the *Yes* position to copy default
values.
* Move the switch next to *With constraints?* towards the *right position* to copy table and
* Move the switch next to *With constraints?* to the *Yes* position to copy table and
column constraints.
* Move the switch next to *With indexes?* towards the *right position* to copy indexes.
* Move the switch next to *With storage?* towards the *right position* to copy storage settings.
* Move the switch next to *With comments?* towards the *right position* to copy comments.
* Move the switch next to *With compression?* towards the *right position* to copy
* Move the switch next to *With indexes?* to the *Yes* position to copy indexes.
* Move the switch next to *With storage?* to the *Yes* position to copy storage settings.
* Move the switch next to *With comments?* to the *Yes* position to copy comments.
* Move the switch next to *With compression?* to the *Yes* position to copy
compression method. This option is available only on PostgreSQL 14 and above.
* Move the switch next to *With generated?* towards the *right position* to copy
* Move the switch next to *With generated?* to the *Yes* position to copy
generation expressions of copied column. This option is available only on PostgreSQL 12 and above.
* Move the switch next to *With identity?* towards the *right position* to copy
* Move the switch next to *With identity?* to the *Yes* position to copy
any identity specifications of copied column.
* Move the switch next to *With statistics?* towards the *right position* to copy
* Move the switch next to *With statistics?* to the *Yes* position to copy
extended statistics.
With PostgreSQL 10 forward, the *Partition* tab will be visible.
@@ -531,7 +531,7 @@ function. Click the *Add* icon (+) to add each security label selection:
* Specify a security label provider in the *Provider* field. The named provider
must be loaded and must consent to the proposed labeling operation.
* Specify a a security label in the *Security Label* field. The meaning of a
* Specify a security label in the *Security Label* field. The meaning of a
given label is at the discretion of the label provider. PostgreSQL places no
restrictions on whether or how a label provider must interpret security
labels; it merely provides a mechanism for storing them.
+1 -1
View File
@@ -75,7 +75,7 @@ tablespace. Click the *Add* icon (+) to add each security label selection:
* Specify a security label provider in the *Provider* field. The named provider
must be loaded and must consent to the proposed labeling operation.
* Specify a a security label in the *Security Label* field. The meaning of a
* Specify a security label in the *Security Label* field. The meaning of a
given label is at the discretion of the label provider. PostgreSQL places no
restrictions on whether or how a label provider must interpret security
labels; it merely provides a mechanism for storing them.
+1 -1
View File
@@ -139,7 +139,7 @@ function. Click the *Add* icon (+) to add each security label selection:
* Specify a security label provider in the *Provider* field. The named provider
must be loaded and must consent to the proposed labeling operation.
* Specify a a security label in the *Security Label* field. The meaning of a
* Specify a security label in the *Security Label* field. The meaning of a
given label is at the discretion of the label provider. PostgreSQL places no
restrictions on whether or how a label provider must interpret security
labels; it merely provides a mechanism for storing them.
+8 -5
View File
@@ -109,17 +109,17 @@ On the *Optional-1* tab:
to select a type_modifier_output_function. It is allowed to omit the
type_modifier_output_function, in which case the default display format is the
stored typmod integer value enclosed in parentheses.
* Use the drop-down listbox next to the optional *Analyze function* field to
select a function for performing type-specific statistics collection for
columns of the data type.
* Use the drop-down listbox next to the optional *Subscript function* field to
select a function for allows the data type to be subscripted in SQL commands.
* Use the optional *Internal length* to specify a value for internal
representation.
* Move the *Variable?* switch to specify the internal representation is of
variable length (VARIABLE). The default is a fixed length positive integer.
* Specify a default value in the optional *Default* field in cases where a
column of the data type defaults to something other than the null value.
Specify the default with the DEFAULT key word. (A default can be overridden
by an explicit DEFAULT clause attached to a particular column.)
* Use the drop-down listbox next to the optional *Analyze function* field to
select a function for performing type-specific statistics collection for
columns of the data type.
* Use the drop-down listbox next to the optional *Category type* field to help
control which implicit cast will be applied in ambiguous situations.
* Move the *Preferred?* switch to *Yes* to specify the selected category type is
@@ -162,6 +162,9 @@ disabled.
values to a canonical form.
* Use the drop-down listbox next to *Sub-type diff function* to select a
user-defined subtype_diff function.
* Specify the optional *Multirange type name* parameter to specify the
name of the corresponding multirange type. If not specified, this name is
chosen automatically.
If you select *Shell* in the *Type* field, the *Definition* tab displays the
*Shell* panel:
+1 -1
View File
@@ -86,7 +86,7 @@ Click the *Add* icon (+) to add each security label selection:
* Specify a security label provider in the *Provider* field. The named provider
must be loaded and must consent to the proposed labeling operation.
* Specify a a security label in the *Security Label* field. The meaning of a
* Specify a security label in the *Security Label* field. The meaning of a
given label is at the discretion of the label provider. PostgreSQL places no
restrictions on whether or how a label provider must interpret security
labels; it merely provides a mechanism for storing them.
+6 -4
View File
@@ -7,6 +7,8 @@ set -e
trap 'ERRCODE=$? && if [ ${ERRCODE} -ne 0 ]; then echo "The command \"${BASH_COMMAND}\" failed in \"${FUNCNAME}\" with exit code ${ERRCODE}."; fi' EXIT
OS_ARCH=$(dpkg-architecture -qDEB_HOST_ARCH)
DISTRO=$(lsb_release -cs)
RELEASE=1
# Stop creating pyc files.
export PYTHONDONTWRITEBYTECODE=1
@@ -58,7 +60,7 @@ EOF
# Build the Debian package for the server
chmod -R u+rwX,go+rX,go-w "${SERVERROOT}"
fakeroot dpkg-deb --build "${SERVERROOT}" "${DISTROOT}/${APP_NAME}-server_${APP_LONG_VERSION}_${OS_ARCH}.deb"
fakeroot dpkg-deb --build "${SERVERROOT}" "${DISTROOT}/${APP_NAME}-server_${APP_LONG_VERSION}-${RELEASE}.${DISTRO}_${OS_ARCH}.deb"
#
# Desktop package
@@ -102,7 +104,7 @@ EOF
# Build the Debian package for the desktop
chmod -R u+rwX,go+rX,go-w "${DESKTOPROOT}"
fakeroot dpkg-deb --build "${DESKTOPROOT}" "${DISTROOT}/${APP_NAME}-desktop_${APP_LONG_VERSION}_${OS_ARCH}.deb"
fakeroot dpkg-deb --build "${DESKTOPROOT}" "${DISTROOT}/${APP_NAME}-desktop_${APP_LONG_VERSION}-${RELEASE}.${DISTRO}_${OS_ARCH}.deb"
#
# Web package
@@ -132,7 +134,7 @@ cp "${SOURCEDIR}/pkg/debian/pgadmin4.conf" "${WEBROOT}/etc/apache2/conf-availabl
# Build the Debian package for the web
chmod -R u+rwX,go+rX,go-w "${WEBROOT}"
fakeroot dpkg-deb --build "${WEBROOT}" "${DISTROOT}/${APP_NAME}-web_${APP_LONG_VERSION}_all.deb"
fakeroot dpkg-deb --build "${WEBROOT}" "${DISTROOT}/${APP_NAME}-web_${APP_LONG_VERSION}-${RELEASE}.${DISTRO}_all.deb"
#
# Meta package
@@ -154,7 +156,7 @@ Description: Installs all required components to run pgAdmin in desktop and web
EOF
# Build the Debian meta package
fakeroot dpkg-deb --build "${METAROOT}" "${DISTROOT}/${APP_NAME}_${APP_LONG_VERSION}_all.deb"
fakeroot dpkg-deb --build "${METAROOT}" "${DISTROOT}/${APP_NAME}_${APP_LONG_VERSION}-${RELEASE}.${DISTRO}_all.deb"
# Get the libpq package
pushd "${DISTROOT}" 1> /dev/null
+2 -1
View File
@@ -48,7 +48,8 @@ CA_FILE = '/etc/ssl/certs/ca-certificates.crt'
LOG_FILE = '/dev/null'
HELP_PATH = '../../docs'
DEFAULT_BINARY_PATHS = {
'pg': '/usr/local/pgsql-17',
'pg': '/usr/local/pgsql-18',
'pg-18': '/usr/local/pgsql-18',
'pg-17': '/usr/local/pgsql-17',
'pg-16': '/usr/local/pgsql-16',
'pg-15': '/usr/local/pgsql-15',
+11
View File
@@ -0,0 +1,11 @@
apiVersion: v2
name: pgadmin4-helm
version: 9.11.0
appVersion: 9.11.0
description: pgAdmin is the most popular and feature rich Open Source administration and development platform for PostgreSQL, the most advanced Open Source database in the world.
home: https://pgadmin.org
sources: ["https://github.com/pgadmin-org/pgadmin4/tree/master/helm"]
maintainers:
- name: Koren Peretz
url: https://github.com/KorenP1
icon: data:image/png;base64,AAABAAEAiooAAAEAIACANAEAFgAAACgAAACKAAAAFAEAAAEAIAAAAAAAkCkBACMuAAAjLgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAABk2cxNJRpMXeTaTKtk2gy05NoMu6TaDL7k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv2TaDLulGgy2JNoMrGTaDJ/lWYzPKpVVQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjmM5EpJpMXyTaDLdk2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMuWTaDKJk2wxGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJJtJAeSaTF8lGgy8pNoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy+JRoMYyJYjsNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkmg0MZRoMtiTaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDLkk2g0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACSaDJbk2gy95NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/JRnMXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJRpMmuTaDL+k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDGHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk2kzWpNoMv2TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gy/5NoMv+TaDL/k2gLine truncated
+42
View File
@@ -0,0 +1,42 @@
# PgAdmin4 K8S Helm Chart
Its been a struggle to deploy pgadmin4 container on different restricted k8s distributions for example openshift, gke or vanilla k8s pod security standards.
This helm chart follows best security measures and practices and compatible with all different security contexts and restrictions.
Further explanation about the security implementation can be read here: https://korenp1.github.io
The helm chart also implements most pgadmin4 features, for instance, config_local.py, predefined server definitions or preferences.
The majority of features and values are covered in the helm chart but always can be more customable or tpl'able, open for contributions.
### Package && Push
The chart should dump its version and appVersion in the Chart.yaml file every release and pushed to docker.io/dpage repository.
`helm package . && helm push pgadmin4-helm-<VERSION>.tgz oci://docker.io/dpage`
### Installation Example:
`helm install mypgadmin4 oci://docker.io/dpage/pgadmin4-helm --set ingress.enabled=true`
### Important Values
| Value | Description | Default |
| --------- | ----------- | ------- |
| `containerPort` | Internal PgAdmin4 Port | `5050` |
| `image.registry` | Image registry | `"docker.io"` |
| `image.repository` | Image Repository | `"dpage/pgadmin4"` |
| `image.tag` | Image tag (If empty, will use .Chart.AppVersion) | `""` |
| `auth.email` | Admin Email | `"admin@pgadmin.org"` |
| `auth.password` | Admin password (If both auth.password and auth.existingSecret are empty, the password will be randomly generated) | `""` |
| `auth.existingSecret` | Existing secret name for admin password (If both auth.password and auth.existingSecret are empty, the password will be randomly generated) | `""` |
| `extraEnvVars` | Extra environment variables | `[]` |
| `config_local.enabled` | Whether to mount config_local.py file | `false` |
| `config_local.data` | config_local.py configuration content | `""` |
| `config_local.existingSecret` | Existing secret name containing config_local.py file | `""` |
| `serverDefinitions.enabled` | Whether to mount servers.json | `false` |
| `serverDefinitions.data` | Server definitions to import | `{}` |
| `preferences.enabled` | Whether to mount preferences.json | `false` |
| `preferences.data` | Preferences to load | `{}` |
| `resources.*` | Allocated requests and limits resources | `{"requests": {...}, "limits": {...}}` |
| `persistence.enabled` | PVC resource creation | `true` |
| `service.type` | Service type | `"ClusterIP"` |
| `service.loadBalancerIP` | Load balancer IP (Only if service.type is LoadBalancer) | `""` |
| `ingress.enabled` | Ingress resource creation | `false` |
| `ingress.hostname` | Ingress resource hostname | `"pgadmin4.local"` |
| `ingress.tlsSecret` | Ingress tls secret name | `""` |
+11
View File
@@ -0,0 +1,11 @@
Thanks for using PgAdmin4 Helm Chart :)
Image: {{ template "pgadmin4.image" . }}
Credentials:
Email: {{ .Values.auth.email }}
Password: {{ printf "kubectl get secret %s -n %s -o jsonpath='{.data.%s}' | base64 -d" (include "pgadmin4.fullname" .) .Release.Namespace .Values.auth.passwordKey }}
Ingress: {{ ternary (tpl .Values.ingress.hostname .) "DISABLED" .Values.ingress.enabled }}
GOOD LUCK!
+49
View File
@@ -0,0 +1,49 @@
{{- define "pgadmin4.fullname" -}}
{{- tpl .Values.fullname . -}}
{{- end -}}
{{- define "pgadmin4.image" -}}
{{- printf "%s/%s:%s" (default .Values.image.registry .Values.global.imageRegistry) .Values.image.repository (default .Chart.AppVersion .Values.image.tag | toString) -}}
{{- end -}}
{{- define "pgadmin4.serviceAccountName" -}}
{{- default (ternary (include "pgadmin4.fullname" .) "default" .Values.serviceAccount.create) .Values.serviceAccount.name -}}
{{- end -}}
{{- define "renderSecurityContext" -}}
{{- $securityContext := omit .securityContext "enabled" -}}
{{- if or (eq .context.Values.global.compatibility.openshift.adaptSecurityContext "force") (and (eq .context.Values.global.compatibility.openshift.adaptSecurityContext "auto") (ternary "true" "" (.context.Capabilities.APIVersions.Has "security.openshift.io/v1"))) -}}
{{- $securityContext = omit $securityContext "fsGroup" "runAsUser" "runAsGroup" -}}
{{- if not $securityContext.seLinuxOptions }}
{{- $securityContext = omit $securityContext "seLinuxOptions" -}}
{{- end -}}
{{- end -}}
{{- if $securityContext.privileged }}
{{- $securityContext = omit $securityContext "capabilities" -}}
{{- end -}}
{{- if not .context.Values.global.compatibility.appArmor.enabled }}
{{- $securityContext = omit $securityContext "appArmorProfile" -}}
{{- end -}}
{{- $securityContext | toYaml -}}
{{- end -}}
{{- define "tpl.preserve.variable" -}}
{{- $obj := . }}
{{- if kindIs "map" $obj }}
{{- range $k, $v := $obj }}
{{- if kindIs "string" $v }}
{{- if regexMatch "^[0-9]+$" $v }}
{{- $_ := set $obj $k (atoi $v) }}
{{- else if regexMatch "(?i)^(true|false)$" $v }}
{{- $_ := set $obj $k (eq (lower $v) "true") }}
{{- end }}
{{- else }}
{{- include "tpl.preserve.variable" $v }}
{{- end }}
{{- end }}
{{- else if kindIs "slice" $obj }}
{{- range $i, $v := $obj }}
{{- include "tpl.preserve.variable" $v }}
{{- end }}
{{- end }}
{{- end }}
@@ -0,0 +1,14 @@
{{- if .Values.preferences.enabled }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ template "pgadmin4.fullname" . }}-preferences
{{- with .Values.commonLabels }}
labels: {{ . | toYaml | nindent 4 }}
{{- end }}
{{- with .Values.commonAnnotations }}
annotations: {{ . | toYaml | nindent 4 }}
{{- end }}
data:
preferences.json: | {{ dict "preferences" .Values.preferences.data | toPrettyJson | nindent 4 }}
{{- end }}
@@ -0,0 +1,16 @@
{{- if .Values.serverDefinitions.enabled }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ template "pgadmin4.fullname" . }}-server-definitions
{{- with .Values.commonLabels }}
labels: {{ . | toYaml | nindent 4 }}
{{- end }}
{{- with .Values.commonAnnotations }}
annotations: {{ . | toYaml | nindent 4 }}
{{- end }}
data:
{{- $variableToPreserveTPL := tpl (dict "Servers" .Values.serverDefinitions.data | toYaml) . | fromYaml }}
{{- include "tpl.preserve.variable" $variableToPreserveTPL }}
servers.json: | {{ $variableToPreserveTPL | toPrettyJson | nindent 4 }}
{{- end }}
+237
View File
@@ -0,0 +1,237 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ template "pgadmin4.fullname" . }}
{{- with .Values.commonLabels }}
labels: {{ . | toYaml | nindent 4 }}
{{- end }}
{{- with .Values.commonAnnotations }}
annotations: {{ . | toYaml | nindent 4 }}
{{- end }}
spec:
replicas: {{ .Values.replicas }}
selector:
matchLabels:
app: {{ default "pgadmin4" .Values.commonLabels.app }}
{{- with omit .Values.commonLabels "app" }}
{{- . | toYaml | nindent 6 }}
{{- end }}
template:
metadata:
labels:
app: {{ default "pgadmin4" .Values.commonLabels.app }}
{{- with omit .Values.commonLabels "app" }}
{{- . | toYaml | nindent 8 }}
{{- end }}
{{- if or (not (empty .Values.commonAnnotations)) (not .Values.existingSecret) .Values.preferences.enabled .Values.serverDefinitions.enabled }}
annotations:
{{- with .Values.commonAnnotations }}
{{- . | toYaml | nindent 8 }}
{{- end }}
{{- if not .Values.existingSecret }}
checksum/secret: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
{{- end }}
{{- if and .Values.config_local.enabled (empty .Values.config_local.existingSecret) }}
checksum/secret-config: {{ include (print $.Template.BasePath "/secret-config.yaml") . | sha256sum }}
{{- end }}
{{- if .Values.serverDefinitions.enabled }}
checksum/configmap-server-definitions: {{ include (print $.Template.BasePath "/configmap-serverDefinitions.yaml") . | sha256sum }}
{{- end }}
{{- if .Values.preferences.enabled }}
checksum/configmap-preferences: {{ include (print $.Template.BasePath "/configmap-preferences.yaml") . | sha256sum }}
{{- end }}
{{- end }}
spec:
{{- if or .Values.global.imagePullSecrets .Values.image.pullSecrets }}
imagePullSecrets: {{- concat .Values.global.imagePullSecrets .Values.image.pullSecrets | toYaml | nindent 8 }}
{{- end }}
serviceAccountName: {{ template "pgadmin4.serviceAccountName" . }}
automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }}
{{- if .Values.podSecurityContext.enabled }}
securityContext: {{- include "renderSecurityContext" (dict "securityContext" .Values.podSecurityContext "context" .) | nindent 8 }}
enableServiceLinks: {{ .Values.enableServiceLinks }}
{{- end }}
volumes:
- name: empty-dir
emptyDir: {}
{{- if .Values.persistence.enabled }}
- name: data
persistentVolumeClaim:
claimName: {{ template "pgadmin4.fullname" . }}
{{- end }}
{{- if .Values.config_local.enabled }}
- name: config-local
secret:
secretName: {{ default (printf "%s-config" (include "pgadmin4.fullname" .)) .Values.config_local.existingSecret }}
items:
- key: {{ .Values.config_local.configKey }}
path: {{ .Values.config_local.configKey }}
{{- end }}
{{- if .Values.serverDefinitions.enabled }}
- name: server-definitions
configMap:
name: {{ template "pgadmin4.fullname" . }}-server-definitions
items:
- key: servers.json
path: servers.json
{{- end }}
{{- if .Values.preferences.enabled }}
- name: preferences
configMap:
name: {{ template "pgadmin4.fullname" . }}-preferences
items:
- key: preferences.json
path: preferences.json
{{- end }}
{{- with .Values.extraVolumes }}
{{- . | toYaml | nindent 8 }}
{{- end }}
containers:
- name: pgadmin4
{{- if .Values.containerSecurityContext.enabled }}
securityContext: {{- include "renderSecurityContext" (dict "securityContext" .Values.containerSecurityContext "context" .) | nindent 12 }}
{{- end }}
image: {{ template "pgadmin4.image" . }}
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
protocol: TCP
containerPort: {{ .Values.containerPort }}
resources:
requests:
cpu: {{ .Values.resources.requests.cpu }}
memory: {{ .Values.resources.requests.memory }}
limits:
cpu: {{ .Values.resources.limits.cpu }}
memory: {{ .Values.resources.limits.memory }}
env:
- name: PGADMIN_DEFAULT_EMAIL
value: {{ .Values.auth.email }}
- name: PGADMIN_DEFAULT_PASSWORD
valueFrom:
secretKeyRef:
name: {{ default (include "pgadmin4.fullname" .) .Values.auth.existingSecret }}
key: {{ .Values.auth.passwordKey }}
- name: PGADMIN_LISTEN_PORT
value: {{ .Values.containerPort | quote }}
- name: PGADMIN_DISABLE_POSTFIX
value: {{ .Values.disablePostfix | quote }}
{{- with .Values.extraEnvVars }}
{{- tpl (. | toYaml) $ | nindent 12 }}
{{- end }}
volumeMounts:
- mountPath: /var/lib/pgadmin
{{- if .Values.persistence.enabled }}
name: data
{{- else }}
name: empty-dir
subPath: data
{{- end }}
- name: empty-dir
mountPath: /pgadmin4/config_distro.py
subPath: config_distro.py
- name: empty-dir
mountPath: /usr/bin/python3
subPath: python3
- name: empty-dir
mountPath: /tmp
subPath: tmp
- name: empty-dir
mountPath: /var/log/pgadmin
subPath: logs
{{- if .Values.config_local.enabled }}
- name: config-local
mountPath: /pgadmin4/config_local.py
subPath: {{ .Values.config_local.configKey }}
{{- end }}
{{- if .Values.serverDefinitions.enabled }}
- name: server-definitions
mountPath: /pgadmin4/servers.json
subPath: servers.json
{{- end }}
{{- if .Values.preferences.enabled }}
- name: preferences
mountPath: /pgadmin4/preferences.json
subPath: preferences.json
{{- end }}
{{- with .Values.extraVolumeMounts }}
{{- . | toYaml | nindent 12 }}
{{- end }}
{{- if .Values.startupProbe.enabled }}
startupProbe: {{- omit .Values.startupProbe "enabled" | toYaml | nindent 12 }}
{{- end }}
{{- if .Values.readinessProbe.enabled }}
readinessProbe: {{- omit .Values.readinessProbe "enabled" | toYaml | nindent 12 }}
{{- end }}
{{- if .Values.livenessProbe.enabled }}
livenessProbe: {{- omit .Values.livenessProbe "enabled" | toYaml | nindent 12 }}
{{- end }}
initContainers:
- name: modify-config-distro-py-permissions
image: {{ template "pgadmin4.image" . }}
imagePullPolicy: {{ .Values.image.pullPolicy }}
command: ["sh", "-x", "-c"]
args: ['cp /pgadmin4/config_distro.py . && chmod 777 config_distro.py']
workingDir: /emptyDir
volumeMounts:
- name: empty-dir
mountPath: /emptyDir
resources:
requests:
cpu: 50m
memory: 64Mi
limits:
cpu: 50m
memory: 64Mi
securityContext:
seLinuxOptions: {}
runAsUser: 1001
runAsGroup: 1001
runAsNonRoot: true
privileged: false
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
seccompProfile:
type: RuntimeDefault
{{- if .Values.global.compatibility.appArmor.enabled }}
appArmorProfile:
type: RuntimeDefault
{{- end }}
windowsOptions:
hostProcess: false
- name: unset-python3-cli-net-cap
image: {{ template "pgadmin4.image" . }}
imagePullPolicy: {{ .Values.image.pullPolicy }}
command: ["sh", "-x", "-c"]
args: ['ls /usr/bin/python3.* | sort -V -r | head -n 1 | xargs -i cp {} python3']
workingDir: /emptyDir
volumeMounts:
- name: empty-dir
mountPath: /emptyDir
resources:
requests:
cpu: 50m
memory: 64Mi
limits:
cpu: 50m
memory: 64Mi
securityContext:
seLinuxOptions: {}
runAsUser: 1001
runAsGroup: 1001
runAsNonRoot: true
privileged: false
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
seccompProfile:
type: RuntimeDefault
{{- if .Values.global.compatibility.appArmor.enabled }}
appArmorProfile:
type: RuntimeDefault
{{- end }}
windowsOptions:
hostProcess: false
+4
View File
@@ -0,0 +1,4 @@
{{- range .Values.extraDeploy }}
---
{{ tpl (. | toYaml) $ }}
{{- end }}
+30
View File
@@ -0,0 +1,30 @@
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ template "pgadmin4.fullname" . }}
{{- with .Values.commonLabels }}
labels: {{ . | toYaml | nindent 4 }}
{{- end }}
{{- if or .Values.ingress.annotations .Values.commonAnnotations }}
annotations: {{ merge .Values.ingress.annotations .Values.commonAnnotations | toYaml | nindent 4 }}
{{- end }}
spec:
rules:
- host: {{ tpl .Values.ingress.hostname . }}
http:
paths:
- backend:
service:
name: {{ template "pgadmin4.fullname" . }}
port:
name: http
path: /
pathType: Prefix
{{- if .Values.ingress.tlsSecret }}
tls:
- hosts:
- {{ tpl .Values.ingress.hostname . }}
secretName: {{ .Values.ingress.tlsSecret }}
{{- end }}
{{- end }}
+20
View File
@@ -0,0 +1,20 @@
{{- if .Values.persistence.enabled }}
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ template "pgadmin4.fullname" . }}
{{- with .Values.commonLabels }}
labels: {{ . | toYaml | nindent 4 }}
{{- end }}
{{- with .Values.commonAnnotations }}
annotations: {{ . | toYaml | nindent 4 }}
{{- end }}
spec:
{{- if or .Values.global.defaultStorageClass .Values.persistence.storageClass }}
storageClassName: {{ default .Values.global.defaultStorageClass .Values.persistence.storageClass }}
{{- end }}
resources:
requests:
storage: {{ .Values.persistence.size }}
accessModes: {{ .Values.persistence.accessModes }}
{{- end }}
+15
View File
@@ -0,0 +1,15 @@
{{- if and .Values.config_local.enabled (empty .Values.config_local.existingSecret) }}
apiVersion: v1
kind: Secret
metadata:
name: {{ template "pgadmin4.fullname" . }}-config
{{- with .Values.commonLabels }}
labels: {{ . | toYaml | nindent 4 }}
{{- end }}
{{- with .Values.commonAnnotations }}
annotations: {{ . | toYaml | nindent 4 }}
{{- end }}
type: Opaque
stringData:
{{ .Values.config_local.configKey }}: | {{ tpl .Values.config_local.data . | nindent 4 }}
{{- end }}
+15
View File
@@ -0,0 +1,15 @@
{{- if empty .Values.auth.existingSecret }}
apiVersion: v1
kind: Secret
metadata:
name: {{ template "pgadmin4.fullname" . }}
{{- with .Values.commonLabels }}
labels: {{ . | toYaml | nindent 4 }}
{{- end }}
{{- with .Values.commonAnnotations }}
annotations: {{ . | toYaml | nindent 4 }}
{{- end }}
type: Opaque
stringData:
{{ .Values.auth.passwordKey }}: {{ coalesce .Values.auth.password (dig "data" .Values.auth.passwordKey "" (lookup "v1" "Secret" .Release.Namespace (include "pgadmin4.fullname" .)) | b64dec) (randAlphaNum 12) | quote }}
{{- end }}
+25
View File
@@ -0,0 +1,25 @@
apiVersion: v1
kind: Service
metadata:
name: {{ template "pgadmin4.fullname" . }}
{{- with .Values.commonLabels }}
labels: {{ . | toYaml | nindent 4 }}
{{- end }}
{{- if or .Values.service.annotations .Values.commonAnnotations }}
annotations: {{ merge .Values.service.annotations .Values.commonAnnotations | toYaml | nindent 4 }}
{{- end }}
spec:
type: {{ .Values.service.type }}
{{- if and (eq .Values.service.type "LoadBalancer") (not (empty .Values.service.loadBalancerIP)) }}
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
{{- end }}
selector:
app: {{ default "pgadmin4" .Values.commonLabels.app }}
{{- with omit .Values.commonLabels "app" }}
{{- . | toYaml | nindent 4 }}
{{- end }}
ports:
- name: http
protocol: TCP
targetPort: http
port: {{ .Values.service.port }}
+13
View File
@@ -0,0 +1,13 @@
{{- if .Values.serviceAccount.create }}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ template "pgadmin4.serviceAccountName" . }}
{{- with .Values.commonLabels }}
labels: {{ . | toYaml | nindent 4 }}
{{- end }}
{{- with .Values.commonAnnotations }}
annotations: {{ . | toYaml | nindent 4 }}
{{- end }}
automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }}
{{- end }}
+157
View File
@@ -0,0 +1,157 @@
global:
imageRegistry: ""
defaultStorageClass: ""
imagePullSecrets: []
compatibility:
openshift:
adaptSecurityContext: auto
appArmor:
enabled: false
fullname: pgadmin4
image:
registry: docker.io
repository: dpage/pgadmin4
tag: ""
pullPolicy: IfNotPresent
pullSecrets: []
commonLabels:
app: pgadmin4
commonAnnotations: {}
extraDeploy: []
replicas: 1
containerPort: 5050
disablePostfix: true
enableServiceLinks: false
auth:
email: admin@pgadmin.org
password: ""
existingSecret: ""
passwordKey: password
extraEnvVars: []
# - name: PGADMIN_CONFIG_LOGIN_BANNER
# value: '"Welcome to pgAdmin4 :)"'
extraVolumes: []
extraVolumeMounts: []
config_local:
enabled: false
existingSecret: ""
configKey: config_local.py
data: ""
# data: |
# DEBUG = True
# JSON_LOGGER = True
# AUTHENTICATION_SOURCES = ['oauth2', 'internal']
serverDefinitions:
enabled: false
data: {}
# "1":
# Name: Minimally Defined Server
# Group: Servers
# Port: 5432
# Username: postgres
# Host: myHost
# MaintenanceDB: postgres
# ConnectionParameters:
# sslmode: prefer
# connect_timeout: 10
preferences:
enabled: false
data: {}
# misc:user_interface:theme: dark
# file_manager:options:file_upload_size: 500
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 500m
memory: 1Gi
persistence:
enabled: true
size: 1Gi
storageClass: ""
accessModes: ["ReadWriteOnce"]
service:
type: ClusterIP
port: 80
annotations: {}
loadBalancerIP: ""
serviceAccount:
create: true
name: ""
automountServiceAccountToken: false
ingress:
enabled: false
hostname: pgadmin4.local
annotations: {}
# If set, enables TLS configuration in the Ingress resource.
tlsSecret: ""
startupProbe:
enabled: false
httpGet:
path: /misc/ping
port: http
initialDelaySeconds: null
periodSeconds: null
timeoutSeconds: null
failureThreshold: null
readinessProbe:
enabled: true
httpGet:
path: /misc/ping
port: http
initialDelaySeconds: null
periodSeconds: null
timeoutSeconds: null
failureThreshold: null
livenessProbe:
enabled: false
httpGet:
path: /misc/ping
port: http
initialDelaySeconds: null
periodSeconds: null
timeoutSeconds: null
failureThreshold: null
podSecurityContext:
enabled: true
fsGroupChangePolicy: Always
sysctls: []
supplementalGroups: []
fsGroup: 1001
containerSecurityContext:
enabled: true
seLinuxOptions: {}
runAsUser: 1001
runAsGroup: 1001
runAsNonRoot: true
privileged: false
readOnlyRootFilesystem: true
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
seccompProfile:
type: RuntimeDefault
appArmorProfile:
type: RuntimeDefault
windowsOptions:
hostProcess: false
+10 -3
View File
@@ -22,7 +22,13 @@ _setup_env() {
# Setting up the correct Python version for Ubuntu 18 and EL-8, which have
# new Python versions installed parallel to the old ones.
OS_VERSION=$(grep "^VERSION_ID=" /etc/os-release | awk -F "=" '{ print $2 }' | sed 's/"//g' | awk -F "." '{ print $1 }')
SYSTEM_PYTHON_PATH='/usr/bin/python3'
if [ -n "$VIRTUAL_ENV" ]; then
SYSTEM_PYTHON_PATH="$VIRTUAL_ENV/bin/python3"
echo "Detected virtual environment: $VIRTUAL_ENV"
else
SYSTEM_PYTHON_PATH='/usr/bin/python3'
echo "Not in a virtual environment, using system Python path."
fi
PYTHON_BINARY=$("${SYSTEM_PYTHON_PATH}" -c "import sys; print('python%d.%.d' % (sys.version_info.major, sys.version_info.minor))")
PYTHON_BINARY_WITHOUT_DOTS='python3'
if [ "$2" == 'redhat' ] && [ "${OS_VERSION}" == "8" ]; then
@@ -203,9 +209,10 @@ _build_docs() {
cd "${SERVERROOT}" && mkdir -p "usr/${APP_NAME}/share/docs/en_US/html"
cd "${SOURCEDIR}/docs/en_US" || exit
python3 build_code_snippet.py
SYS_PYTHONPATH=$("${SYSTEM_PYTHON_PATH}" -c "import sys; print(':'.join([p for p in sys.path if p]))")
SYS_PYTHON_PACKS=$("${SYSTEM_PYTHON_PATH}" -c "import sys; print(':'.join([p for p in sys.path if p]))")
# shellcheck disable=SC2153
PYTHONPATH=$PYTHONPATH:${SYS_PYTHONPATH} python3 -msphinx . "${SERVERROOT}/usr/${APP_NAME}/share/docs/en_US/html"
PYTHONPATH=$PYTHONPATH:${SYS_PYTHON_PACKS} python3 -msphinx . "${SERVERROOT}/usr/${APP_NAME}/share/docs/en_US/html"
}
_copy_code() {
+10 -10
View File
@@ -1,5 +1,11 @@
# shellcheck shell=bash
# uname -m returns "x86_64" on Intel, but we need "x64"
ARCH="x64"
if [ "$(uname -m)" == "arm64" ]; then
ARCH="arm64"
fi
_setup_env() {
FUNCS_DIR=$(cd "$(dirname "$0")" && pwd)/../..
APP_RELEASE=$(grep "^APP_RELEASE" "${FUNCS_DIR}/web/version.py" | cut -d"=" -f2 | sed 's/ //g')
@@ -11,7 +17,7 @@ _setup_env() {
APP_LONG_VERSION=${APP_LONG_VERSION}-${APP_SUFFIX}
fi
BUNDLE_DIR="${BUILD_ROOT}/${APP_NAME}.app"
DMG_NAME="${DIST_ROOT}"/$(echo "${APP_NAME}" | sed 's/ //g' | awk '{print tolower($0)}')-"${APP_LONG_VERSION}-$(uname -m).dmg"
DMG_NAME="${DIST_ROOT}/$(echo "${APP_NAME}" | sed 's/ //g' | awk '{print tolower($0)}')-${APP_LONG_VERSION}-${ARCH}.dmg"
PYTHON_OS_VERSION="11"
}
@@ -27,20 +33,14 @@ _build_runtime() {
test -d "${BUILD_ROOT}" || mkdir "${BUILD_ROOT}"
# Get a fresh copy of electron
# uname -m returns "x86_64" on Intel, but we need "x64"
ELECTRON_ARCH="x64"
if [ "$(uname -m)" == "arm64" ]; then
ELECTRON_ARCH="arm64"
fi
ELECTRON_VERSION="$(npm info electron version)"
pushd "${BUILD_ROOT}" > /dev/null || exit
while true;do
wget "https://github.com/electron/electron/releases/download/v${ELECTRON_VERSION}/electron-v${ELECTRON_VERSION}-darwin-${ELECTRON_ARCH}.zip" && break
rm "electron-v${ELECTRON_VERSION}-darwin-${ELECTRON_ARCH}.zip"
wget "https://github.com/electron/electron/releases/download/v${ELECTRON_VERSION}/electron-v${ELECTRON_VERSION}-darwin-${ARCH}.zip" && break
rm "electron-v${ELECTRON_VERSION}-darwin-${ARCH}.zip"
done
unzip "electron-v${ELECTRON_VERSION}-darwin-${ELECTRON_ARCH}.zip"
unzip "electron-v${ELECTRON_VERSION}-darwin-${ARCH}.zip"
popd > /dev/null || exit
# WGET END
-2
View File
@@ -61,8 +61,6 @@ echo
%_gpg_path ~/.gnupg
%_gpg_name <your signing key>
%_gpgbin /usr/bin/gpg2
%__gpg_sign_cmd %{__gpg} gpg --force-v3-sigs --batch --verbose --no-armor --no-secmem-warning -u "%{_gpg_name}" -sbo %{__signature_filename
} --digest-algo sha256 %{__plaintext_filename}
EOF
echo
+1
View File
@@ -38,6 +38,7 @@ WizardImageFile=sidebar.bmp
MinVersion={#MinimumWindowsVer}
SignTool=pgAdminSigntool
SignedUninstaller=yes
CloseApplications=yes
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
+16 -14
View File
@@ -12,14 +12,14 @@
# relevant packages.
###############################################################################
Authlib==1.6.*
azure-identity==1.24.0
azure-mgmt-rdbms==10.1.0
Authlib==1.6.5
azure-identity==1.25.1
azure-mgmt-rdbms==10.1.1
azure-mgmt-resource==24.0.0
azure-mgmt-subscription==3.1.1
bcrypt==4.3.*
boto3==1.40.*
cryptography==45.0.*
bcrypt==5.0.*
boto3==1.42.*
cryptography==46.0.*
Flask-Babel==4.0.*
Flask-Compress==1.*
Flask-Login==0.*
@@ -27,34 +27,36 @@ Flask-Mail==0.*
Flask-Migrate==4.*
Flask-Paranoid==0.*
Flask-Security-Too==5.4.*; python_version <= '3.9'
Flask-Security-Too==5.6.*; python_version > '3.9'
Flask-Security-Too==5.7.*; python_version > '3.9'
Flask-SocketIO==5.5.*
Flask-SQLAlchemy==3.1.*
Flask-WTF==1.2.*
Flask==3.1.*
google-api-python-client==2.*
google-auth-oauthlib==1.2.2
gssapi==1.9.*
google-auth-oauthlib==1.2.3
gssapi==1.10.*
jsonformatter~=0.3.4
keyring==25.*
ldap3==2.*
libgravatar==1.0.*
paramiko==3.5.1
passlib==1.*
psutil==7.0.*
psycopg[c]==3.2.9
psutil==7.1.*
psycopg[c]==3.2.13; python_version < '3.10'
psycopg[c]==3.3.0; python_version >= '3.10'
pyotp==2.*
python-dateutil==2.*
pytz==2025.*
pywinpty==3.0.*; sys_platform=="win32"
# pinned for https://github.com/andfoy/pywinpty/issues/545
pywinpty==2.0.*; sys_platform=="win32"
qrcode[pil]==8.*; python_version >= '3.9'
setuptools==80.*
SQLAlchemy==2.*
sqlparse==0.*
sshtunnel==0.*
typer[all]==0.16.*
typer[all]==0.20.*
urllib3==1.26.*; python_version <= '3.9'
urllib3==2.5.*; python_version > '3.9'
urllib3==2.6.*; python_version > '3.9'
user-agents==2.2.0
Werkzeug==3.1.*
WTForms==3.1.*; python_version <= '3.9'
+4 -4
View File
@@ -12,13 +12,13 @@
},
"packageManager": "yarn@4.9.2",
"devDependencies": {
"electron": "37.3.1",
"eslint": "^9.34.0",
"electron": "39.2.4",
"eslint": "^9.39.1",
"eslint-plugin-unused-imports": "^4.2.0"
},
"dependencies": {
"axios": "^1.11.0",
"axios": "^1.13.2",
"electron-context-menu": "^4.1.0",
"electron-store": "^10.1.0"
"electron-store": "^11.0.2"
}
}
+5 -5
View File
@@ -21,24 +21,24 @@ export function updateConfigAndMenus(event, configStore, pgAdminMainScreen, menu
// This function registers autoUpdater event listeners ONCE
function registerAutoUpdaterEvents({ pgAdminMainScreen, configStore, menuCallbacks }) {
autoUpdater.on('checking-for-update', () => {
misc.writeServerLog('[Auto-Updater]: Checking for update...');
misc.writeServerLog('[Auto-Updater]: Checking for update.');
});
autoUpdater.on('update-available', () => {
updateConfigAndMenus('update-available', configStore, pgAdminMainScreen, menuCallbacks);
misc.writeServerLog('[Auto-Updater]: Update downloading...');
misc.writeServerLog('[Auto-Updater]: Update downloading.');
pgAdminMainScreen.webContents.send('notifyAppAutoUpdate', { update_downloading: true });
});
autoUpdater.on('update-not-available', () => {
updateConfigAndMenus('update-not-available', configStore, pgAdminMainScreen, menuCallbacks);
misc.writeServerLog('[Auto-Updater]: No update available...');
misc.writeServerLog('[Auto-Updater]: No update available.');
pgAdminMainScreen.webContents.send('notifyAppAutoUpdate', { no_update_available: true });
});
autoUpdater.on('update-downloaded', () => {
updateConfigAndMenus('update-downloaded', configStore, pgAdminMainScreen, menuCallbacks);
misc.writeServerLog('[Auto-Updater]: Update downloaded...');
misc.writeServerLog('[Auto-Updater]: Update downloaded.');
pgAdminMainScreen.webContents.send('notifyAppAutoUpdate', { update_downloaded: true });
});
@@ -82,7 +82,7 @@ function handleSendDataForAppUpdate({
try {
autoUpdater.setFeedURL({ url: serverUrl });
misc.writeServerLog('[Auto-Updater]: Initiating update check...');
misc.writeServerLog('[Auto-Updater]: Initiating update check.');
autoUpdater.checkForUpdates();
} catch (err) {
misc.writeServerLog('[Auto-Updater]: Error setting autoUpdater feed URL: ' + err.message);
+1 -1
View File
@@ -75,7 +75,7 @@ function handleAutoUpdateMenu(menuFile, configStore, callbacks) {
menuFile.submenu.unshift({
name: 'mnu_restart_to_update',
id: 'mnu_restart_to_update',
label: 'Restart to Update...',
label: 'Restart to Update',
enabled: true,
priority: 998,
click: callbacks['restart_to_update'],
+2 -2
View File
@@ -443,14 +443,14 @@ function notifyUpdateInstalled() {
try {
// Notify renderer
if (pgAdminMainScreen) {
misc.writeServerLog('[Auto-Updater]: Update installed successfully...');
misc.writeServerLog('[Auto-Updater]: Update installed successfully.');
setTimeout(() => {
pgAdminMainScreen.webContents.send('notifyAppAutoUpdate', {update_installed: true});
}, 10000);
} else {
// If main screen not ready, wait and send after it's created
app.once('browser-window-created', (event, window) => {
misc.writeServerLog('[Auto-Updater]: Update installed successfully...');
misc.writeServerLog('[Auto-Updater]: Update installed successfully.');
setTimeout(() => {
pgAdminMainScreen.webContents.send('notifyAppAutoUpdate', {update_installed: true});
}, 10000);
+194 -158
View File
@@ -24,54 +24,56 @@ __metadata:
languageName: node
linkType: hard
"@eslint-community/eslint-utils@npm:^4.2.0":
version: 4.7.0
resolution: "@eslint-community/eslint-utils@npm:4.7.0"
"@eslint-community/eslint-utils@npm:^4.8.0":
version: 4.9.0
resolution: "@eslint-community/eslint-utils@npm:4.9.0"
dependencies:
eslint-visitor-keys: "npm:^3.4.3"
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
checksum: 10c0/c0f4f2bd73b7b7a9de74b716a664873d08ab71ab439e51befe77d61915af41a81ecec93b408778b3a7856185244c34c2c8ee28912072ec14def84ba2dec70adf
checksum: 10c0/8881e22d519326e7dba85ea915ac7a143367c805e6ba1374c987aa2fbdd09195cc51183d2da72c0e2ff388f84363e1b220fd0d19bef10c272c63455162176817
languageName: node
linkType: hard
"@eslint-community/regexpp@npm:^4.12.1":
version: 4.12.1
resolution: "@eslint-community/regexpp@npm:4.12.1"
checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6
version: 4.12.2
resolution: "@eslint-community/regexpp@npm:4.12.2"
checksum: 10c0/fddcbc66851b308478d04e302a4d771d6917a0b3740dc351513c0da9ca2eab8a1adf99f5e0aa7ab8b13fa0df005c81adeee7e63a92f3effd7d367a163b721c2d
languageName: node
linkType: hard
"@eslint/config-array@npm:^0.21.0":
version: 0.21.0
resolution: "@eslint/config-array@npm:0.21.0"
"@eslint/config-array@npm:^0.21.1":
version: 0.21.1
resolution: "@eslint/config-array@npm:0.21.1"
dependencies:
"@eslint/object-schema": "npm:^2.1.6"
"@eslint/object-schema": "npm:^2.1.7"
debug: "npm:^4.3.1"
minimatch: "npm:^3.1.2"
checksum: 10c0/0ea801139166c4aa56465b309af512ef9b2d3c68f9198751bbc3e21894fe70f25fbf26e1b0e9fffff41857bc21bfddeee58649ae6d79aadcd747db0c5dca771f
checksum: 10c0/2f657d4edd6ddcb920579b72e7a5b127865d4c3fb4dda24f11d5c4f445a93ca481aebdbd6bf3291c536f5d034458dbcbb298ee3b698bc6c9dd02900fe87eec3c
languageName: node
linkType: hard
"@eslint/config-helpers@npm:^0.3.1":
version: 0.3.1
resolution: "@eslint/config-helpers@npm:0.3.1"
checksum: 10c0/f6c5b3a0b76a0d7d84cc93e310c259e6c3e0792ddd0a62c5fc0027796ffae44183432cb74b2c2b1162801ee1b1b34a6beb5d90a151632b4df7349f994146a856
"@eslint/config-helpers@npm:^0.4.2":
version: 0.4.2
resolution: "@eslint/config-helpers@npm:0.4.2"
dependencies:
"@eslint/core": "npm:^0.17.0"
checksum: 10c0/92efd7a527b2d17eb1a148409d71d80f9ac160b565ac73ee092252e8bf08ecd08670699f46b306b94f13d22e88ac88a612120e7847570dd7cdc72f234d50dcb4
languageName: node
linkType: hard
"@eslint/core@npm:^0.15.2":
version: 0.15.2
resolution: "@eslint/core@npm:0.15.2"
"@eslint/core@npm:^0.17.0":
version: 0.17.0
resolution: "@eslint/core@npm:0.17.0"
dependencies:
"@types/json-schema": "npm:^7.0.15"
checksum: 10c0/c17a6dc4f5a6006ecb60165cc38bcd21fefb4a10c7a2578a0cfe5813bbd442531a87ed741da5adab5eb678e8e693fda2e2b14555b035355537e32bcec367ea17
checksum: 10c0/9a580f2246633bc752298e7440dd942ec421860d1946d0801f0423830e67887e4aeba10ab9a23d281727a978eb93d053d1922a587d502942a713607f40ed704e
languageName: node
linkType: hard
"@eslint/eslintrc@npm:^3.3.1":
version: 3.3.1
resolution: "@eslint/eslintrc@npm:3.3.1"
version: 3.3.3
resolution: "@eslint/eslintrc@npm:3.3.3"
dependencies:
ajv: "npm:^6.12.4"
debug: "npm:^4.3.2"
@@ -79,34 +81,34 @@ __metadata:
globals: "npm:^14.0.0"
ignore: "npm:^5.2.0"
import-fresh: "npm:^3.2.1"
js-yaml: "npm:^4.1.0"
js-yaml: "npm:^4.1.1"
minimatch: "npm:^3.1.2"
strip-json-comments: "npm:^3.1.1"
checksum: 10c0/b0e63f3bc5cce4555f791a4e487bf999173fcf27c65e1ab6e7d63634d8a43b33c3693e79f192cbff486d7df1be8ebb2bd2edc6e70ddd486cbfa84a359a3e3b41
checksum: 10c0/532c7acc7ddd042724c28b1f020bd7bf148fcd4653bb44c8314168b5f772508c842ce4ee070299cac51c5c5757d2124bdcfcef5551c8c58ff9986e3e17f2260d
languageName: node
linkType: hard
"@eslint/js@npm:9.34.0":
version: 9.34.0
resolution: "@eslint/js@npm:9.34.0"
checksum: 10c0/53f1bfd2a374683d9382a6850354555f6e89a88416c34a5d34e9fbbaf717e97c2b06300e8f93e5eddba8bda8951ccab7f93a680e56ded1a3d21d526019e69bab
"@eslint/js@npm:9.39.1":
version: 9.39.1
resolution: "@eslint/js@npm:9.39.1"
checksum: 10c0/6f7f26f8cdb7ad6327bbf9741973b6278eb946f18f70e35406e88194b0d5c522d0547a34a02f2a208eec95c5d1388cdf7ccb20039efd2e4cb6655615247a50f1
languageName: node
linkType: hard
"@eslint/object-schema@npm:^2.1.6":
version: 2.1.6
resolution: "@eslint/object-schema@npm:2.1.6"
checksum: 10c0/b8cdb7edea5bc5f6a96173f8d768d3554a628327af536da2fc6967a93b040f2557114d98dbcdbf389d5a7b290985ad6a9ce5babc547f36fc1fde42e674d11a56
"@eslint/object-schema@npm:^2.1.7":
version: 2.1.7
resolution: "@eslint/object-schema@npm:2.1.7"
checksum: 10c0/936b6e499853d1335803f556d526c86f5fe2259ed241bc665000e1d6353828edd913feed43120d150adb75570cae162cf000b5b0dfc9596726761c36b82f4e87
languageName: node
linkType: hard
"@eslint/plugin-kit@npm:^0.3.5":
version: 0.3.5
resolution: "@eslint/plugin-kit@npm:0.3.5"
"@eslint/plugin-kit@npm:^0.4.1":
version: 0.4.1
resolution: "@eslint/plugin-kit@npm:0.4.1"
dependencies:
"@eslint/core": "npm:^0.15.2"
"@eslint/core": "npm:^0.17.0"
levn: "npm:^0.4.1"
checksum: 10c0/c178c1b58c574200c0fd125af3e4bc775daba7ce434ba6d1eeaf9bcb64b2e9fea75efabffb3ed3ab28858e55a016a5efa95f509994ee4341b341199ca630b89e
checksum: 10c0/51600f78b798f172a9915dffb295e2ffb44840d583427bc732baf12ecb963eb841b253300e657da91d890f4b323d10a1bd12934bf293e3018d8bb66fdce5217b
languageName: node
linkType: hard
@@ -118,12 +120,12 @@ __metadata:
linkType: hard
"@humanfs/node@npm:^0.16.6":
version: 0.16.6
resolution: "@humanfs/node@npm:0.16.6"
version: 0.16.7
resolution: "@humanfs/node@npm:0.16.7"
dependencies:
"@humanfs/core": "npm:^0.19.1"
"@humanwhocodes/retry": "npm:^0.3.0"
checksum: 10c0/8356359c9f60108ec204cbd249ecd0356667359b2524886b357617c4a7c3b6aace0fd5a369f63747b926a762a88f8a25bc066fa1778508d110195ce7686243e1
"@humanwhocodes/retry": "npm:^0.4.0"
checksum: 10c0/9f83d3cf2cfa37383e01e3cdaead11cd426208e04c44adcdd291aa983aaf72d7d3598844d2fe9ce54896bb1bf8bd4b56883376611c8905a19c44684642823f30
languageName: node
linkType: hard
@@ -134,14 +136,7 @@ __metadata:
languageName: node
linkType: hard
"@humanwhocodes/retry@npm:^0.3.0":
version: 0.3.1
resolution: "@humanwhocodes/retry@npm:0.3.1"
checksum: 10c0/f0da1282dfb45e8120480b9e2e275e2ac9bbe1cf016d046fdad8e27cc1285c45bb9e711681237944445157b430093412b4446c1ab3fc4bb037861b5904101d3b
languageName: node
linkType: hard
"@humanwhocodes/retry@npm:^0.4.2":
"@humanwhocodes/retry@npm:^0.4.0, @humanwhocodes/retry@npm:^0.4.2":
version: 0.4.3
resolution: "@humanwhocodes/retry@npm:0.4.3"
checksum: 10c0/3775bb30087d4440b3f7406d5a057777d90e4b9f435af488a4923ef249e93615fb78565a85f173a186a076c7706a81d0d57d563a2624e4de2c5c9c66c486ce42
@@ -207,20 +202,20 @@ __metadata:
linkType: hard
"@types/node@npm:*":
version: 24.3.0
resolution: "@types/node@npm:24.3.0"
version: 24.10.1
resolution: "@types/node@npm:24.10.1"
dependencies:
undici-types: "npm:~7.10.0"
checksum: 10c0/96bdeca01f690338957c2dcc92cb9f76c262c10398f8d91860865464412b0f9d309c24d9b03d0bdd26dd47fa7ee3f8227893d5c89bc2009d919a525a22512030
undici-types: "npm:~7.16.0"
checksum: 10c0/d6bca7a78f550fbb376f236f92b405d676003a8a09a1b411f55920ef34286ee3ee51f566203920e835478784df52662b5b2af89159d9d319352e9ea21801c002
languageName: node
linkType: hard
"@types/node@npm:^22.7.7":
version: 22.18.0
resolution: "@types/node@npm:22.18.0"
version: 22.19.1
resolution: "@types/node@npm:22.19.1"
dependencies:
undici-types: "npm:~6.21.0"
checksum: 10c0/02cce4493eee8408e66e76fcad164f33c0600ed0854ad08e5519a76a06402da5b589b278cf71bc975c9e014f2668bdf758bc3be7fed63bdbfd0900495372797c
checksum: 10c0/6edd93aea86da740cb7872626839cd6f4a67a049d3a3a6639cb592c620ec591408a30989ab7410008d1a0b2d4985ce50f1e488e79c033e4476d3bec6833b0a2f
languageName: node
linkType: hard
@@ -299,9 +294,9 @@ __metadata:
linkType: hard
"ansi-regex@npm:^6.0.1":
version: 6.2.0
resolution: "ansi-regex@npm:6.2.0"
checksum: 10c0/20a2e55ae9816074a60e6729dbe3daad664cd967fc82acc08b02f5677db84baa688babf940d71f50acbbb184c02459453789705e079f4d521166ae66451de551
version: 6.2.2
resolution: "ansi-regex@npm:6.2.2"
checksum: 10c0/05d4acb1d2f59ab2cf4b794339c7b168890d44dda4bf0ce01152a8da0213aca207802f930442ce8cd22d7a92f44907664aac6508904e75e038fa944d2601b30f
languageName: node
linkType: hard
@@ -315,9 +310,9 @@ __metadata:
linkType: hard
"ansi-styles@npm:^6.0.0":
version: 6.2.1
resolution: "ansi-styles@npm:6.2.1"
checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c
version: 6.2.3
resolution: "ansi-styles@npm:6.2.3"
checksum: 10c0/23b8a4ce14e18fb854693b95351e286b771d23d8844057ed2e7d083cd3e708376c3323707ec6a24365f7d7eda3ca00327fe04092e29e551499ec4c8b7bfac868
languageName: node
linkType: hard
@@ -328,6 +323,20 @@ __metadata:
languageName: node
linkType: hard
"async-function@npm:^1.0.0":
version: 1.0.0
resolution: "async-function@npm:1.0.0"
checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73
languageName: node
linkType: hard
"async-generator-function@npm:^1.0.0":
version: 1.0.0
resolution: "async-generator-function@npm:1.0.0"
checksum: 10c0/2c50ef856c543ad500d8d8777d347e3c1ba623b93e99c9263ecc5f965c1b12d2a140e2ab6e43c3d0b85366110696f28114649411cbcd10b452a92a2318394186
languageName: node
linkType: hard
"asynckit@npm:^0.4.0":
version: 0.4.0
resolution: "asynckit@npm:0.4.0"
@@ -336,23 +345,23 @@ __metadata:
linkType: hard
"atomically@npm:^2.0.3":
version: 2.0.3
resolution: "atomically@npm:2.0.3"
version: 2.1.0
resolution: "atomically@npm:2.1.0"
dependencies:
stubborn-fs: "npm:^1.2.5"
when-exit: "npm:^2.1.1"
checksum: 10c0/b9008a74f590d29be947f34b7583dab32034335fedfe340ac3e6458e2e315c770d8af6f15cd3947214702c523d91b5f989498348b1ab49c197bd645dc87d7a94
stubborn-fs: "npm:^2.0.0"
when-exit: "npm:^2.1.4"
checksum: 10c0/c352ce2e247e4f9aec4e5f46b9720a3598a8241ba4ac7d067060cfd418051268976fec5c958b9d13cc1139b9f11076a8cbdb7837c2e15ca34d3dcceb9c1000b5
languageName: node
linkType: hard
"axios@npm:^1.11.0":
version: 1.11.0
resolution: "axios@npm:1.11.0"
"axios@npm:^1.13.2":
version: 1.13.2
resolution: "axios@npm:1.13.2"
dependencies:
follow-redirects: "npm:^1.15.6"
form-data: "npm:^4.0.4"
proxy-from-env: "npm:^1.1.0"
checksum: 10c0/5de273d33d43058610e4d252f0963cc4f10714da0bfe872e8ef2cbc23c2c999acc300fd357b6bce0fc84a2ca9bd45740fa6bb28199ce2c1266c8b1a393f2b36e
checksum: 10c0/e8a42e37e5568ae9c7a28c348db0e8cf3e43d06fcbef73f0048669edfe4f71219664da7b6cc991b0c0f01c28a48f037c515263cb79be1f1ae8ff034cd813867b
languageName: node
linkType: hard
@@ -487,20 +496,20 @@ __metadata:
languageName: node
linkType: hard
"conf@npm:^14.0.0":
version: 14.0.0
resolution: "conf@npm:14.0.0"
"conf@npm:^15.0.2":
version: 15.0.2
resolution: "conf@npm:15.0.2"
dependencies:
ajv: "npm:^8.17.1"
ajv-formats: "npm:^3.0.1"
atomically: "npm:^2.0.3"
debounce-fn: "npm:^6.0.0"
dot-prop: "npm:^9.0.0"
dot-prop: "npm:^10.0.0"
env-paths: "npm:^3.0.0"
json-schema-typed: "npm:^8.0.1"
semver: "npm:^7.7.2"
uint8array-extras: "npm:^1.4.0"
checksum: 10c0/d1472ea24dad78d0d33dee47a795dfefe92fcdf2633763a8b35563989f22b2658e768c9d338de8e8e5f9163525d22df9e5f8733094d822a8329f4571dedce208
uint8array-extras: "npm:^1.5.0"
checksum: 10c0/77713ffe61e1ec26713fba972b6a4f589a3c45872cf07f0e6499a3e54fe855d2c88bf80e148346b28abef0174e4bffcb98cc0a58dd42d451c936a045bd319113
languageName: node
linkType: hard
@@ -525,14 +534,14 @@ __metadata:
linkType: hard
"debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2":
version: 4.4.1
resolution: "debug@npm:4.4.1"
version: 4.4.3
resolution: "debug@npm:4.4.3"
dependencies:
ms: "npm:^2.1.3"
peerDependenciesMeta:
supports-color:
optional: true
checksum: 10c0/d2b44bc1afd912b49bb7ebb0d50a860dc93a4dd7d946e8de94abc957bb63726b7dd5aa48c18c2386c379ec024c46692e15ed3ed97d481729f929201e671fcd55
checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6
languageName: node
linkType: hard
@@ -595,12 +604,12 @@ __metadata:
languageName: node
linkType: hard
"dot-prop@npm:^9.0.0":
version: 9.0.0
resolution: "dot-prop@npm:9.0.0"
"dot-prop@npm:^10.0.0":
version: 10.1.0
resolution: "dot-prop@npm:10.1.0"
dependencies:
type-fest: "npm:^4.18.2"
checksum: 10c0/4bac49a2f559156811862ac92813906f70529c50da918eaab81b38dd869743c667d578e183607f5ae11e8ae2a02e43e98e32c8a37bc4cae76b04d5b576e3112f
type-fest: "npm:^5.0.0"
checksum: 10c0/b034a06f017909ed55c6c164ddea962ccdce3d88b9b092f7106a9b738116a4cd003db5d47a0c6e140e93adbf1922b5e3a147e3d4a124c8556862940446ba5f75
languageName: node
linkType: hard
@@ -644,33 +653,33 @@ __metadata:
languageName: node
linkType: hard
"electron-store@npm:^10.1.0":
version: 10.1.0
resolution: "electron-store@npm:10.1.0"
"electron-store@npm:^11.0.2":
version: 11.0.2
resolution: "electron-store@npm:11.0.2"
dependencies:
conf: "npm:^14.0.0"
type-fest: "npm:^4.41.0"
checksum: 10c0/a527a1957b09decbbb36828e299bb06c239ed9a7d406ceda07abe84d2a9dfd1920120c63859e42c9c7a0922b95b840c4f4e5d8db90256814445f22a8a48de07e
conf: "npm:^15.0.2"
type-fest: "npm:^5.0.1"
checksum: 10c0/14a24b49f92b5fc818285a528a2032257dc3221fc3917ba94c0308f4c45bf468f92fb7ba401f1d7f0151bcf10487370448632e8a765dab47db20fc7b3f1925bb
languageName: node
linkType: hard
"electron@npm:37.3.1":
version: 37.3.1
resolution: "electron@npm:37.3.1"
"electron@npm:39.2.4":
version: 39.2.4
resolution: "electron@npm:39.2.4"
dependencies:
"@electron/get": "npm:^2.0.0"
"@types/node": "npm:^22.7.7"
extract-zip: "npm:^2.0.1"
bin:
electron: cli.js
checksum: 10c0/1b171804646f229768c29413629b70b968c4c06686913b69e8615da09c58d63a95817021c31ed3c3bdbba0ad360ad4469773b9dda2662884d7df2866559f95f1
checksum: 10c0/d84bf710c16124c4b81e36b1fedbb8ee2ac040447b1ea3fcf374c509db7e40859579685e33d6dcdd2d8adbd8e3562f2bad062780c4a9f620d77c6ba0c4e72554
languageName: node
linkType: hard
"emoji-regex@npm:^10.3.0":
version: 10.4.0
resolution: "emoji-regex@npm:10.4.0"
checksum: 10c0/a3fcedfc58bfcce21a05a5f36a529d81e88d602100145fcca3dc6f795e3c8acc4fc18fe773fbf9b6d6e9371205edb3afa2668ec3473fa2aa7fd47d2a9d46482d
version: 10.6.0
resolution: "emoji-regex@npm:10.6.0"
checksum: 10c0/1e4aa097bb007301c3b4b1913879ae27327fdc48e93eeefefe3b87e495eb33c5af155300be951b4349ff6ac084f4403dc9eff970acba7c1c572d89396a9a32d7
languageName: node
linkType: hard
@@ -761,15 +770,15 @@ __metadata:
linkType: hard
"eslint-plugin-unused-imports@npm:^4.2.0":
version: 4.2.0
resolution: "eslint-plugin-unused-imports@npm:4.2.0"
version: 4.3.0
resolution: "eslint-plugin-unused-imports@npm:4.3.0"
peerDependencies:
"@typescript-eslint/eslint-plugin": ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0
eslint: ^9.0.0 || ^8.0.0
peerDependenciesMeta:
"@typescript-eslint/eslint-plugin":
optional: true
checksum: 10c0/b6293323670dda64b0b5931ace1ab45f731e399e87da591c208da09c6bf89a84591b160b8e15e3b47f8f1f662dc80306368a60c09f833de0f6f1dbd97c247949
checksum: 10c0/aa4d8ebd8bea5fc0ac8d3fdeb0d0ed2dd0fccb96a1f5569bca772f71b4c45edd1b3c32d9754fb175c45ccf4d123725f333bf99380b9896bb678a8d599e290aa3
languageName: node
linkType: hard
@@ -797,23 +806,22 @@ __metadata:
languageName: node
linkType: hard
"eslint@npm:^9.34.0":
version: 9.34.0
resolution: "eslint@npm:9.34.0"
"eslint@npm:^9.39.1":
version: 9.39.1
resolution: "eslint@npm:9.39.1"
dependencies:
"@eslint-community/eslint-utils": "npm:^4.2.0"
"@eslint-community/eslint-utils": "npm:^4.8.0"
"@eslint-community/regexpp": "npm:^4.12.1"
"@eslint/config-array": "npm:^0.21.0"
"@eslint/config-helpers": "npm:^0.3.1"
"@eslint/core": "npm:^0.15.2"
"@eslint/config-array": "npm:^0.21.1"
"@eslint/config-helpers": "npm:^0.4.2"
"@eslint/core": "npm:^0.17.0"
"@eslint/eslintrc": "npm:^3.3.1"
"@eslint/js": "npm:9.34.0"
"@eslint/plugin-kit": "npm:^0.3.5"
"@eslint/js": "npm:9.39.1"
"@eslint/plugin-kit": "npm:^0.4.1"
"@humanfs/node": "npm:^0.16.6"
"@humanwhocodes/module-importer": "npm:^1.0.1"
"@humanwhocodes/retry": "npm:^0.4.2"
"@types/estree": "npm:^1.0.6"
"@types/json-schema": "npm:^7.0.15"
ajv: "npm:^6.12.4"
chalk: "npm:^4.0.0"
cross-spawn: "npm:^7.0.6"
@@ -843,7 +851,7 @@ __metadata:
optional: true
bin:
eslint: bin/eslint.js
checksum: 10c0/ba3e54fa0c8ed23d062f91519afaae77fed922a6c4d76130b6cd32154bcb406aaea4b3c5ed88e0be40828c1d5b6921592f3947dbdc5e2043de6bd7aa341fe5ea
checksum: 10c0/59b2480639404ba24578ca480f973683b87b7aac8aa7e349240474a39067804fd13cd8b9cb22fee074170b8c7c563b57bab703ec0f0d3f81ea017e5d2cad299d
languageName: node
linkType: hard
@@ -1010,15 +1018,15 @@ __metadata:
linkType: hard
"form-data@npm:^4.0.4":
version: 4.0.4
resolution: "form-data@npm:4.0.4"
version: 4.0.5
resolution: "form-data@npm:4.0.5"
dependencies:
asynckit: "npm:^0.4.0"
combined-stream: "npm:^1.0.8"
es-set-tostringtag: "npm:^2.1.0"
hasown: "npm:^2.0.2"
mime-types: "npm:^2.1.12"
checksum: 10c0/373525a9a034b9d57073e55eab79e501a714ffac02e7a9b01be1c820780652b16e4101819785e1e18f8d98f0aee866cc654d660a435c378e16a72f2e7cac9695
checksum: 10c0/dd6b767ee0bbd6d84039db12a0fa5a2028160ffbfaba1800695713b46ae974a5f6e08b3356c3195137f8530dcd9dfcb5d5ae1eeff53d0db1e5aad863b619ce3b
languageName: node
linkType: hard
@@ -1040,28 +1048,38 @@ __metadata:
languageName: node
linkType: hard
"generator-function@npm:^2.0.0":
version: 2.0.1
resolution: "generator-function@npm:2.0.1"
checksum: 10c0/8a9f59df0f01cfefafdb3b451b80555e5cf6d76487095db91ac461a0e682e4ff7a9dbce15f4ecec191e53586d59eece01949e05a4b4492879600bbbe8e28d6b8
languageName: node
linkType: hard
"get-east-asian-width@npm:^1.0.0":
version: 1.3.0
resolution: "get-east-asian-width@npm:1.3.0"
checksum: 10c0/1a049ba697e0f9a4d5514c4623781c5246982bdb61082da6b5ae6c33d838e52ce6726407df285cdbb27ec1908b333cf2820989bd3e986e37bb20979437fdf34b
version: 1.4.0
resolution: "get-east-asian-width@npm:1.4.0"
checksum: 10c0/4e481d418e5a32061c36fbb90d1b225a254cc5b2df5f0b25da215dcd335a3c111f0c2023ffda43140727a9cafb62dac41d022da82c08f31083ee89f714ee3b83
languageName: node
linkType: hard
"get-intrinsic@npm:^1.2.6":
version: 1.3.0
resolution: "get-intrinsic@npm:1.3.0"
version: 1.3.1
resolution: "get-intrinsic@npm:1.3.1"
dependencies:
async-function: "npm:^1.0.0"
async-generator-function: "npm:^1.0.0"
call-bind-apply-helpers: "npm:^1.0.2"
es-define-property: "npm:^1.0.1"
es-errors: "npm:^1.3.0"
es-object-atoms: "npm:^1.1.1"
function-bind: "npm:^1.1.2"
generator-function: "npm:^2.0.0"
get-proto: "npm:^1.0.1"
gopd: "npm:^1.2.0"
has-symbols: "npm:^1.1.0"
hasown: "npm:^2.0.2"
math-intrinsics: "npm:^1.1.0"
checksum: 10c0/52c81808af9a8130f581e6a6a83e1ba4a9f703359e7a438d1369a5267a25412322f03dcbd7c549edaef0b6214a0630a28511d7df0130c93cfd380f4fa0b5b66a
checksum: 10c0/9f4ab0cf7efe0fd2c8185f52e6f637e708f3a112610c88869f8f041bb9ecc2ce44bf285dfdbdc6f4f7c277a5b88d8e94a432374d97cca22f3de7fc63795deb5d
languageName: node
linkType: hard
@@ -1276,14 +1294,14 @@ __metadata:
languageName: node
linkType: hard
"js-yaml@npm:^4.1.0":
version: 4.1.0
resolution: "js-yaml@npm:4.1.0"
"js-yaml@npm:^4.1.1":
version: 4.1.1
resolution: "js-yaml@npm:4.1.1"
dependencies:
argparse: "npm:^2.0.1"
bin:
js-yaml: bin/js-yaml.js
checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f
checksum: 10c0/561c7d7088c40a9bb53cc75becbfb1df6ae49b34b5e6e5a81744b14ae8667ec564ad2527709d1a6e7d5e5fa6d483aa0f373a50ad98d42fde368ec4a190d4fae7
languageName: node
linkType: hard
@@ -1309,9 +1327,9 @@ __metadata:
linkType: hard
"json-schema-typed@npm:^8.0.1":
version: 8.0.1
resolution: "json-schema-typed@npm:8.0.1"
checksum: 10c0/68dcffc20d3b4bdd30c6bc88ea32e7ef10812cea25ab0f0b03c6bee525072b5da5cd391029186257dec97d96bfb98ed405aaceb5ef5390e37dbd3aa2dd62e604
version: 8.0.2
resolution: "json-schema-typed@npm:8.0.2"
checksum: 10c0/89f5e2fb1495483b705c027203c07277ee6bf2665165ad25a9cb55de5af7f72570326d13d32565180781e4083ad5c9688102f222baed7b353c2f39c1e02b0428
languageName: node
linkType: hard
@@ -1569,11 +1587,11 @@ __metadata:
version: 0.0.0-use.local
resolution: "pgadmin4@workspace:."
dependencies:
axios: "npm:^1.11.0"
electron: "npm:37.3.1"
axios: "npm:^1.13.2"
electron: "npm:39.2.4"
electron-context-menu: "npm:^4.1.0"
electron-store: "npm:^10.1.0"
eslint: "npm:^9.34.0"
electron-store: "npm:^11.0.2"
eslint: "npm:^9.39.1"
eslint-plugin-unused-imports: "npm:^4.2.0"
languageName: unknown
linkType: soft
@@ -1617,11 +1635,11 @@ __metadata:
linkType: hard
"pupa@npm:^3.1.0":
version: 3.1.0
resolution: "pupa@npm:3.1.0"
version: 3.3.0
resolution: "pupa@npm:3.3.0"
dependencies:
escape-goat: "npm:^4.0.0"
checksum: 10c0/02afa6e4547a733484206aaa8f8eb3fbfb12d3dd17d7ca4fa1ea390a7da2cb8f381e38868bbf68009c4d372f8f6059f553171b6a712d8f2802c7cd43d513f06c
checksum: 10c0/9707e0a7f00e5922d47527d1c8d88d4224b1e86502da2fca27943eb0e9bb218121c91fa0af6c30531a2ee5ade0c326b5d33c40fdf61bc593c4224027412fd9b7
languageName: node
linkType: hard
@@ -1693,11 +1711,11 @@ __metadata:
linkType: hard
"semver@npm:^7.3.2, semver@npm:^7.7.2":
version: 7.7.2
resolution: "semver@npm:7.7.2"
version: 7.7.3
resolution: "semver@npm:7.7.3"
bin:
semver: bin/semver.js
checksum: 10c0/aca305edfbf2383c22571cb7714f48cadc7ac95371b4b52362fb8eeffdfbc0de0669368b82b2b15978f8848f01d7114da65697e56cd8c37b0dab8c58e543f9ea
checksum: 10c0/4afe5c986567db82f44c8c6faef8fe9df2a9b1d98098fc1721f57c696c4c21cebd572f297fc21002f81889492345b8470473bc6f4aff5fb032a6ea59ea2bc45e
languageName: node
linkType: hard
@@ -1773,11 +1791,11 @@ __metadata:
linkType: hard
"strip-ansi@npm:^7.1.0":
version: 7.1.0
resolution: "strip-ansi@npm:7.1.0"
version: 7.1.2
resolution: "strip-ansi@npm:7.1.2"
dependencies:
ansi-regex: "npm:^6.0.1"
checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4
checksum: 10c0/0d6d7a023de33368fd042aab0bf48f4f4077abdfd60e5393e73c7c411e85e1b3a83507c11af2e656188511475776215df9ca589b4da2295c9455cc399ce1858b
languageName: node
linkType: hard
@@ -1788,10 +1806,19 @@ __metadata:
languageName: node
linkType: hard
"stubborn-fs@npm:^1.2.5":
version: 1.2.5
resolution: "stubborn-fs@npm:1.2.5"
checksum: 10c0/0676befd9901d4dd4e162700fa0396f11d523998589cd6b61b06d1021db811dc4c1e6713869748c6cfa49d58beb9b6f0dc5b6aca6b075811b949e1602ce1e26f
"stubborn-fs@npm:^2.0.0":
version: 2.0.0
resolution: "stubborn-fs@npm:2.0.0"
dependencies:
stubborn-utils: "npm:^1.0.1"
checksum: 10c0/31a60c9b2a61ce380b688f2649acaeff63cb0f2503bb6820c3ccd4f3af584c6310a48efa41b40c16b1717f1728572ed887c2c88650955c776a088228797e8d0e
languageName: node
linkType: hard
"stubborn-utils@npm:^1.0.1":
version: 1.0.2
resolution: "stubborn-utils@npm:1.0.2"
checksum: 10c0/e65c5820d02c993df55c88e938796c2fb2f3a6d3dc247c961d1e4be4d6d88c355283f4b74157e89d1a1a761d66b5ae79560a416384241a7d3b4e8ba8f1ff5a78
languageName: node
linkType: hard
@@ -1813,6 +1840,13 @@ __metadata:
languageName: node
linkType: hard
"tagged-tag@npm:^1.0.0":
version: 1.0.0
resolution: "tagged-tag@npm:1.0.0"
checksum: 10c0/91d25c9ffb86a91f20522cefb2cbec9b64caa1febe27ad0df52f08993ff60888022d771e868e6416cf2e72dab68449d2139e8709ba009b74c6c7ecd4000048d1
languageName: node
linkType: hard
"type-check@npm:^0.4.0, type-check@npm:~0.4.0":
version: 0.4.0
resolution: "type-check@npm:0.4.0"
@@ -1829,14 +1863,16 @@ __metadata:
languageName: node
linkType: hard
"type-fest@npm:^4.18.2, type-fest@npm:^4.41.0":
version: 4.41.0
resolution: "type-fest@npm:4.41.0"
checksum: 10c0/f5ca697797ed5e88d33ac8f1fec21921839871f808dc59345c9cf67345bfb958ce41bd821165dbf3ae591cedec2bf6fe8882098dfdd8dc54320b859711a2c1e4
"type-fest@npm:^5.0.0, type-fest@npm:^5.0.1":
version: 5.2.0
resolution: "type-fest@npm:5.2.0"
dependencies:
tagged-tag: "npm:^1.0.0"
checksum: 10c0/5fd6c651c08d735213257c1b9498dc4a5b78ce94748901da5945a8e0cde5152dfba59c4bd749845072278ebf92be4351369ed5c79cc695402d3aa4fe1d3f9aa5
languageName: node
linkType: hard
"uint8array-extras@npm:^1.4.0":
"uint8array-extras@npm:^1.5.0":
version: 1.5.0
resolution: "uint8array-extras@npm:1.5.0"
checksum: 10c0/0e74641ac7dadb02eadefc1ccdadba6010e007757bda824960de3c72bbe2b04e6d3af75648441f412148c4103261d54fcb60be45a2863beb76643a55fddba3bd
@@ -1850,10 +1886,10 @@ __metadata:
languageName: node
linkType: hard
"undici-types@npm:~7.10.0":
version: 7.10.0
resolution: "undici-types@npm:7.10.0"
checksum: 10c0/8b00ce50e235fe3cc601307f148b5e8fb427092ee3b23e8118ec0a5d7f68eca8cee468c8fc9f15cbb2cf2a3797945ebceb1cbd9732306a1d00e0a9b6afa0f635
"undici-types@npm:~7.16.0":
version: 7.16.0
resolution: "undici-types@npm:7.16.0"
checksum: 10c0/3033e2f2b5c9f1504bdc5934646cb54e37ecaca0f9249c983f7b1fc2e87c6d18399ebb05dc7fd5419e02b2e915f734d872a65da2e3eeed1813951c427d33cc9a
languageName: node
linkType: hard
@@ -1883,10 +1919,10 @@ __metadata:
languageName: node
linkType: hard
"when-exit@npm:^2.1.1":
version: 2.1.4
resolution: "when-exit@npm:2.1.4"
checksum: 10c0/d8ffba54afca880de6f366ab06a32e8fab99fa298a3f79b2d5304bab19d290f55c5f081336cdaa65d0b6e9a842b46a46bab0800e94e755ea599a2082224a8cc0
"when-exit@npm:^2.1.4":
version: 2.1.5
resolution: "when-exit@npm:2.1.5"
checksum: 10c0/7db41b28c98456b784c25780ca327653f233c6eb7b25d4ce251d04519828cbd609fb6d10548caf9031d4d6fab2999d6f6911c32e1731efab24c93a522573470d
languageName: node
linkType: hard
+1 -1
View File
@@ -23,7 +23,7 @@ ALLOWED_FILE_EXTENSIONS = (
"LICENSE", "Dockerfile", "Makefile", ".ts", ".tsx"
)
EXCLUDE_DIR = ("node_modules")
EXCLUDE_DIR = ("node_modules",)
# Filter the files by its extension
+252 -163
View File
@@ -1,210 +1,299 @@
# -*- coding: utf-8 -*-
##########################################################################
#
# pgAdmin 4 - PostgreSQL Tools
#
# Copyright (C) 2013 - 2025, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
# Get the correct version of chromedriver for the version of Chrome on the
# machine and save it to the specified location.
import argparse
import os
import platform
import subprocess
import sys
from urllib.request import urlopen, urlretrieve
from urllib.error import URLError
import requests
import zipfile
import stat
# --- Helper Functions for Auto-Detection ---
def _find_chrome_executable():
"""Find the Chrome executable path on Linux or macOS."""
system = platform.system()
if system == 'Darwin':
# macOS standard location
paths = [
'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
]
elif system == 'Linux':
# Common Linux executables (Chromium and Google Chrome)
paths = [
'google-chrome',
'google-chrome-stable',
'chromium',
'chromium-browser',
]
else:
return None
for path in paths:
try:
# Check if the command/path is callable (using 'which' or
# direct check)
if system == 'Linux':
# Use 'which' for common Linux commands/paths
result = subprocess.run(
['which', path],
capture_output=True,
text=True,
check=False
)
if result.returncode == 0:
return result.stdout.strip()
# For macOS, or if 'which' failed/is unavailable, check direct path
if os.path.exists(path):
return path
except FileNotFoundError:
continue
return None
def read_command_line():
"""Read the command line arguments.
Returns:
ArgumentParser: The parsed arguments object
"""
The 'chrome' argument is now removed."""
parser = argparse.ArgumentParser(
description='Get the correct version of chromedriver for the '
'specified Chrome installation and save it.')
if platform.system() != 'Windows':
parser.add_argument("chrome", metavar="CHROME",
help="the Chrome executable")
parser.add_argument("directory", metavar="DIRECTORY",
help="the directory in which to save chromedriver")
description=(
'Auto-detects Chrome version, gets the correct Chromedriver '
'using Chrome for Testing, and saves it.'
)
)
args = parser.parse_args()
# Only accept the directory argument
parser.add_argument(
'directory',
metavar='DIRECTORY',
help='the directory in which to save chromedriver'
)
return args
return parser.parse_args()
def get_chrome_version(args):
"""Get the Chrome version number.
def get_chrome_version():
"""Get the Chrome version number via OS-specific auto-detection."""
full_version = None
Args:
args: The parsed arguments object
Returns:
The Chrome version number
"""
if platform.system() == 'Windows':
# On Windows we need to examine the resource section of the binary
import winreg
def _read_registry(root, key, value):
try:
hkey = winreg.OpenKey(root, key)
except Exception:
return None
try:
(val, typ) = winreg.QueryValueEx(hkey, value)
except Exception:
winreg.CloseKey(hkey)
return None
winreg.CloseKey(hkey)
return val
key = r'SOFTWARE\Google\Chrome\BLBeacon'
version_str = _read_registry(winreg.HKEY_CURRENT_USER, key, 'Version')
# On a 64b host, look for a 32b installation
if not version_str:
key = r'SOFTWARE\Wow6432Node\Google\Chrome\BLBeacon'
version_str = _read_registry(winreg.HKEY_CURRENT_USER, key,
'Version')
if not version_str:
print('The Chrome version could not be read from the registry.')
sys.exit(1)
chrome_version = '.'.join(version_str.split()[-1].split('.')[:-1])
else:
# On Linux/Mac we run the Chrome executable with the --version flag,
# then parse the output.
try:
result = subprocess.Popen([args.chrome, '--version'],
stdout=subprocess.PIPE)
except FileNotFoundError:
print('The specified Chrome executable could not be found.')
import winreg
def _read_registry(root, key, value):
try:
with winreg.OpenKey(root, key) as hkey:
val, _ = winreg.QueryValueEx(hkey, value)
return val
except Exception:
return None
keys = [
r'SOFTWARE\Google\Chrome\BLBeacon',
r'SOFTWARE\Wow6432Node\Google\Chrome\BLBeacon',
]
version_str = None
for key in keys:
version_str = _read_registry(
winreg.HKEY_CURRENT_USER, key, 'Version'
)
if version_str:
break
if not version_str:
print(
'Error: The Chrome version could not be read '
'from the Windows registry.'
)
sys.exit(1)
full_version = (
version_str.split()[-1].strip()
if version_str.split()
else version_str.strip()
)
except ImportError:
print("Error: The 'winreg' module is required on Windows.")
sys.exit(1)
except Exception as e:
print(f"Error reading Windows registry: {e}")
sys.exit(1)
version_str = result.stdout.read().decode("utf-8")
# Check for 'Chrom' not 'Chrome' in case the user is using Chromium.
if "Chrom" not in version_str:
print('The specified Chrome executable output an unexpected '
'version string: {}.'.format(version_str))
else:
chrome_executable = _find_chrome_executable()
if not chrome_executable:
print(
'Error: Could not find the Google Chrome or Chromium '
'executable in common locations.'
)
sys.exit(1)
# On some linux distro `chrome--version` gives output like
# 'Google Chrome 80.0.3987.132 unknown\n'
# so we need to check and remove the unknown string from the version
if version_str.endswith("unknown\n"):
version_str = version_str.strip("unknown\n").strip()
chrome_version = '.'.join(version_str.split()[-1].split('.')[:-1])
try:
result = subprocess.run(
[chrome_executable, '--version'],
capture_output=True,
text=True,
check=True
)
if chrome_version.count('.') != 2:
print('The specified Chrome executable output an unexpected '
'version string: {}.'.format(version_str))
version_str = result.stdout.strip()
if 'Chrom' not in version_str:
print(
'Error: Executable output unexpected version string: '
f'{version_str}'
)
sys.exit(1)
full_version = version_str.split()[-1]
except subprocess.CalledProcessError as e:
print(f"Error executing '{chrome_executable} --version': {e}")
sys.exit(1)
if not full_version or full_version.count('.') < 3:
print(f'Error: Extracted Chrome version "{full_version}" '
f'seems invalid.')
sys.exit(1)
return chrome_version
return full_version
def get_chromedriver_version(chrome_version):
"""Get the required chromedriver version number.
def get_system_and_platform():
"""Get the CfT platform name (e.g., mac-arm64, linux64)."""
system = platform.system()
Args:
chrome_version: The chrome version number
Returns:
The chromedriver version number
"""
url = 'https://chromedriver.storage.googleapis.com/LATEST_RELEASE_{}' \
.format(chrome_version)
if system == 'Darwin':
if platform.machine() in ('arm64', 'aarch64'):
return 'mac-arm64'
return 'mac-x64'
if system == 'Linux':
return 'linux64'
if system == 'Windows':
return 'win64'
print(f'Error: Unknown or unsupported operating system: {system}')
sys.exit(1)
def get_chromedriver_download_url(full_chrome_version, cft_platform):
"""Get the required Chromedriver version and download URL using CfT."""
download_url = (
'https://storage.googleapis.com/chrome-for-testing-public/'
f'{full_chrome_version}/{cft_platform}/'
f'chromedriver-{cft_platform}.zip'
)
return full_chrome_version, download_url
def download_and_extract(url, target_directory, cft_platform):
"""Downloads the zip, extracts chromedriver, and sets permissions."""
print(f'Downloading from: {url}')
temp_zip_path = os.path.join(target_directory, 'chromedriver_temp.zip')
try:
response = requests.get(url, stream=True)
response.raise_for_status()
with open(temp_zip_path, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
except Exception as e:
print(f'Error during download: {e}')
sys.exit(1)
print('Extracting chromedriver...')
chromedriver_in_zip_dir = f'chromedriver-{cft_platform}/'
if cft_platform.startswith('win'):
chromedriver_in_zip = chromedriver_in_zip_dir + 'chromedriver.exe'
chromedriver_target_name = 'chromedriver.exe'
else:
chromedriver_in_zip = chromedriver_in_zip_dir + 'chromedriver'
chromedriver_target_name = 'chromedriver'
target_path = os.path.join(target_directory, chromedriver_target_name)
found = False
try:
fp = urlopen(url)
except URLError as e:
print('The chromedriver catalog URL could not be accessed: {}'
.format(e))
with zipfile.ZipFile(temp_zip_path, 'r') as z:
for name in z.namelist():
if name == chromedriver_in_zip:
with z.open(name) as source, open(
target_path, 'wb'
) as target:
target.write(source.read())
found = True
break
except Exception as e:
print(f'Error during extraction: {e}')
sys.exit(1)
finally:
os.remove(temp_zip_path)
if not found:
print(f"Error: '{chromedriver_in_zip}' not found in archive.")
sys.exit(1)
version = fp.read().decode("utf-8").strip()
fp.close()
if not cft_platform.startswith('win'):
print('Setting executable permissions.')
os.chmod(
target_path,
stat.S_IRWXU |
stat.S_IRGRP |
stat.S_IXGRP |
stat.S_IROTH |
stat.S_IXOTH
)
return version
print(f'\nSuccess! Chromedriver downloaded and saved to: {target_path}')
def get_system():
"""Get the system name as known to chromedriver
# --- Core Logic ---
Returns:
The system name
"""
if platform.system() == 'Darwin':
return 'mac64'
elif platform.system() == 'Linux':
return 'linux64'
elif platform.system() == 'Windows':
return 'win32'
else:
print("Unknown or unsupported operating system: {}"
.format(platform.system()))
def main():
"""The core structure of the app."""
try:
import requests # noqa: F401
except ImportError:
print(
"Error: The 'requests' library is required. "
"Please install it with 'pip install requests'"
)
sys.exit(1)
args = read_command_line()
"""The core structure of the app."""
if not os.path.isdir(args.directory):
print(
f'Error: The specified output directory "{args.directory}" '
'could not be accessed.'
)
sys.exit(1)
# Read the command line options
args = read_command_line()
cft_platform = get_system_and_platform()
current_system = platform.system()
print(f'Detected OS: {current_system} | '
f'Target CfT Platform: {cft_platform}')
chrome_version = get_chrome_version(args)
full_chrome_version = get_chrome_version()
print(f'Detected Chrome Version: {full_chrome_version}')
# Check the directory exists
if not os.path.isdir(args.directory):
print('The specified output directory could not be accessed.')
sys.exit(1)
chromedriver_version, download_url = get_chromedriver_download_url(
full_chrome_version, cft_platform
)
print(f'Downloading chromedriver v{chromedriver_version}...')
chromedriver_version = get_chromedriver_version(chrome_version)
download_and_extract(download_url, args.directory, cft_platform)
system = get_system()
url = 'https://chromedriver.storage.googleapis.com/{}/chromedriver_{}.zip' \
.format(chromedriver_version, system)
print('Downloading chromedriver v{} for Chrome v{} on {}...'
.format(chromedriver_version, chrome_version, system))
try:
file, headers = urlretrieve(url)
except URLError as e:
print('The chromedriver download URL could not be accessed: {}'
.format(e))
sys.exit(1)
# Unzip chromedriver
print('Extracting chromedriver...')
found = False
fp = open(file, 'rb')
z = zipfile.ZipFile(fp)
for name in z.namelist():
if (system == 'win32' and name == 'chromedriver.exe') or \
(system != 'win32' and name == 'chromedriver'):
z.extract(name, args.directory)
found = True
fp.close()
if not found:
print("chromedriver could not be found in the downloaded archive: {}"
.format(file))
sys.exit(1)
# Set the permissions
if system == 'mac64' or system == 'linux64':
os.chmod(os.path.join(args.directory, 'chromedriver'), 0o755)
print('Chromedriver downloaded to: {}'.format(args.directory))
if __name__ == '__main__':
main()
+3 -1
View File
@@ -92,7 +92,9 @@ module.exports = [
'no-import-assign': 'off',
...reactjs.configs.recommended.rules,
...reactjs.configs['jsx-runtime'].rules,
'react/jsx-uses-react': 'error',
'react/prop-types': 'off',
'react/react-in-jsx-scope': 0,
'react/jsx-uses-react': 0,
'react/jsx-uses-vars': 'error',
'no-unused-vars': 'off',
'unused-imports/no-unused-imports': 'error',
+4 -2
View File
@@ -1,4 +1,6 @@
{
"presets": [["@babel/preset-env", {"modules": "commonjs", "useBuiltIns": "usage", "corejs": 3}], "@babel/preset-react", "@babel/preset-typescript"],
"plugins": ["@babel/plugin-proposal-class-properties", "@babel/proposal-object-rest-spread", "@babel/plugin-transform-runtime"]
"presets": [["@babel/preset-env", {"modules": "commonjs", "useBuiltIns": "usage", "corejs": 3}], ["@babel/preset-react", {
"runtime": "automatic"
}], "@babel/preset-typescript"],
"plugins": ["@babel/plugin-proposal-class-properties", "@babel/proposal-object-rest-spread"]
}
+3
View File
@@ -754,6 +754,9 @@ LDAP_CA_CERT_FILE = ''
LDAP_CERT_FILE = ''
LDAP_KEY_FILE = ''
# TLS/SSL certificate Validation (True/False),
# Make it false if certificate validation is not required.
LDAP_CERT_VALIDATE = True
##########################################################################
# Some flaky LDAP servers returns malformed schema. If True, no exception
+3 -2
View File
@@ -2,7 +2,8 @@ const webpackShimAlias = require('./webpack.shim').resolveAlias;
const webpackAliasToJestModules = ()=>{
const ret = {
'\\.svg': '<rootDir>/regression/javascript/__mocks__/svg.js'
'\\.svg\\?svgr$': '<rootDir>/regression/javascript/__mocks__/svg.js',
'react-dom/server': 'react-dom/server.edge',
};
Object.keys(webpackShimAlias).forEach((an)=>{
// eg - sources: ./pgadmin/static/js/ to '^sources/(.*)$': '<rootDir>/pgadmin/static/js/$1'
@@ -51,7 +52,7 @@ module.exports = {
],
'testEnvironment': 'jsdom',
'transformIgnorePatterns': [
'[/\\\\]node_modules[/\\\\](?!react-dnd|dnd-core|@react-dnd|react-resize-detector).+\\.(js|jsx|mjs|cjs|ts|tsx)$',
'[/\\\\]node_modules[/\\\\](?!react-dnd|dnd-core|@react-dnd|react-resize-detector|react-data-grid).+\\.(js|jsx|mjs|cjs|ts|tsx)$',
'^.+\\.module\\.(css|sass|scss)$'
]
};
+42
View File
@@ -0,0 +1,42 @@
##########################################################################
#
# pgAdmin 4 - PostgreSQL Tools
#
# Copyright (C) 2013 - 2025, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
"""
Revision ID: efbbe5d5862f
Revises: e6ed5dac37c2
Create Date: 2025-09-29 18:40:30.248908
"""
from alembic import op, context
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'efbbe5d5862f'
down_revision = 'e6ed5dac37c2'
branch_labels = None
depends_on = None
def upgrade():
with op.batch_alter_table(
"server",
table_kwargs={'sqlite_autoincrement': True}) as batch_op:
batch_op.add_column(sa.Column('tunnel_prompt_password',
sa.Integer(), server_default='0'))
with op.batch_alter_table(
"sharedserver",
table_kwargs={'sqlite_autoincrement': True}) as batch_op:
batch_op.add_column(sa.Column('tunnel_prompt_password',
sa.Integer(), server_default='0'))
def downgrade():
# pgAdmin only upgrades, downgrade not implemented.
pass
+31 -30
View File
@@ -16,8 +16,8 @@
"@babel/preset-env": "^7.28.0",
"@babel/preset-typescript": "^7.24.7",
"@emotion/memoize": "^0.9.0",
"@emotion/react": "^11.11.3",
"@emotion/styled": "^11.11.0",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1",
"@emotion/utils": "^1.0.0",
"@svgr/webpack": "^8.1.0",
"@testing-library/dom": "10.4.1",
@@ -34,17 +34,17 @@
"cross-env": "^10.0.0",
"css-loader": "^7.1.2",
"css-minimizer-webpack-plugin": "^7.0.0",
"eslint": "^9.34.0",
"eslint-plugin-jest": "^29.0.1",
"eslint": "^9.39.1",
"eslint-plugin-jest": "^29.2.1",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-unused-imports": "^4.2.0",
"exports-loader": "^5.0.0",
"globals": "^16.3.0",
"html-react-parser": "^5.2.0",
"globals": "^16.5.0",
"html-react-parser": "^5.2.10",
"image-minimizer-webpack-plugin": "^4.1.4",
"imports-loader": "^5.0.0",
"jest": "^30.0.2",
"jest-environment-jsdom": "^30.0.4",
"jest": "^30.2.0",
"jest-environment-jsdom": "^30.2.0",
"loader-utils": "^3.2.1",
"mini-css-extract-plugin": "^2.9.2",
"postcss-loader": "^8.1.1",
@@ -58,39 +58,40 @@
"svgo-loader": "^4.0.0",
"terser-webpack-plugin": "^5.3.12",
"typescript": "^5.9.2",
"typescript-eslint": "^8.35.0",
"typescript-eslint": "^8.48.0",
"url-loader": "^4.1.1",
"webfonts-loader": "^8.0.1",
"webpack": "^5.101.0",
"webpack-bundle-analyzer": "^4.8.0",
"webpack": "^5.103.0",
"webpack-bundle-analyzer": "^5.0.1",
"webpack-cli": "^6.0.1",
"yarn-audit-html": "7.3.2"
},
"optionalDependencies": {
"sharp": "^0.34.3"
"sharp": "^0.34.4"
},
"dependencies": {
"@babel/plugin-proposal-class-properties": "^7.10.4",
"@babel/preset-react": "^7.12.13",
"@babel/preset-react": "^7.27.1",
"@codemirror/lang-json": "^6.0.1",
"@codemirror/lang-sql": "^6.9.1",
"@codemirror/lang-sql": "^6.10.0",
"@date-io/core": "^3.0.0",
"@date-io/date-fns": "3.x",
"@emotion/sheet": "^1.0.1",
"@fluentui/keyboard-key": "^0.4.23",
"@fortawesome/fontawesome-free": "latest",
"@mui/icons-material": "^7.3.1",
"@mui/material": "^7.3.1",
"@mui/x-date-pickers": "^8.10.0",
"@mui/icons-material": "^7.3.4",
"@mui/material": "^7.3.4",
"@mui/x-date-pickers": "^8.19.0",
"@nozbe/microfuzz": "^1.0.0",
"@projectstorm/react-diagrams": "^7.0.4",
"@simonwep/pickr": "^1.5.1",
"@szhsin/react-menu": "^4.4.1",
"@tanstack/react-query": "^5.84.2",
"@szhsin/react-menu": "^4.5.1",
"@tanstack/react-query": "^5.90.11",
"@tanstack/react-table": "^8.16.0",
"@tanstack/react-virtual": "^3.13.6",
"@types/classnames": "^2.3.4",
"@types/react": "^18.0.2",
"@types/react-dom": "^18.0.0",
"@types/react": "^19.2.7",
"@types/react-dom": "^19.0.0",
"@xterm/addon-fit": "^0.10.0",
"@xterm/addon-search": "^0.15.0",
"@xterm/addon-web-links": "^0.11.0",
@@ -98,7 +99,7 @@
"ajv": "^8.8.2",
"anti-trojan-source": "^1.4.0",
"aspen-decorations": "^1.0.2",
"axios": "^1.11.0",
"axios": "^1.13.2",
"babelify": "~10.0.0",
"bignumber.js": "^9.2.0",
"brace": "^0.11.1",
@@ -112,7 +113,7 @@
"html-to-image": "1.11.11",
"immutability-helper": "^3.0.0",
"insert-if": "^1.1.0",
"ip-address": "^10.0.1",
"ip-address": "^10.1.0",
"json-bignumber": "^1.0.1",
"leaflet": "^1.9.4",
"lodash": "4.*",
@@ -123,21 +124,21 @@
"papaparse": "^5.5.2",
"path-fx": "^2.0.0",
"postcss": "^8.5.6",
"rc-dock": "^3.3.2",
"react": "^18.2.0",
"rc-dock": "^4.0.0-alpha.2",
"react": "^19.2.1",
"react-arborist": "^3.2.0",
"react-aspen": "^1.1.0",
"react-checkbox-tree": "^1.7.2",
"react-data-grid": "https://github.com/pgadmin-org/react-data-grid.git#3dfc2ca01a046d55c1c7a45392dcec104815dc76",
"react-data-grid": "https://github.com/pgadmin-org/react-data-grid.git#8ddaa7bed99c8329e39b8ff37ba156f7fc8e85d4",
"react-dnd": "^16.0.1",
"react-dnd-html5-backend": "^16.0.1",
"react-dom": "^18.2.0",
"react-dom": "^19.2.1",
"react-draggable": "^4.4.6",
"react-dropzone": "^14.2.1",
"react-frame-component": "^5.2.6",
"react-leaflet": "^4.2.1",
"react-new-window": "^1.0.1",
"react-resize-detector": "^12.1.0",
"react-resize-detector": "^12.3.0",
"react-rnd": "^10.5.1",
"react-select": "^5.7.2",
"react-timer-hook": "^4.0.1",
@@ -145,14 +146,14 @@
"snapsvg-cjs": "^0.0.6",
"socket.io-client": "^4.5.0",
"split.js": "^1.5.10",
"sql-formatter": "^15.6.2",
"sql-formatter": "^15.6.10",
"uplot": "^1.6.32",
"uplot-react": "^1.1.4",
"use-resize-observer": "^9.1.0",
"valid-filename": "^4.0.0",
"vanilla-jsoneditor": "^3.3.1",
"wkx": "^0.5.0",
"zustand": "^5.0.7"
"zustand": "^5.0.9"
},
"resolutions": {
"rc-resize-observer": "1.4.0"
@@ -9,7 +9,7 @@
import gettext from 'sources/gettext';
import url_for from 'sources/url_for';
import React, { useEffect, useState, useRef } from 'react';
import { useEffect, useState, useRef } from 'react';
import { Box, Grid, InputLabel } from '@mui/material';
import { InputSQL } from '../../../static/js/components/FormComponents';
import getApiInstance from '../../../static/js/api_instance';
-1
View File
@@ -7,7 +7,6 @@
//
//////////////////////////////////////////////////////////////
import React from 'react';
import gettext from 'sources/gettext';
import pgAdmin from 'sources/pgadmin';
import AboutComponent from './AboutComponent';
Loaded 100 of 664 files, more files were not shown because too many files have changed in this diff. Show more