diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b61f6ae..bc994c54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ * Add ability to run vite bundler in warden for Laravel. See: [Laravel + Vite](https://docs.warden.dev/environments/laravel.html) ([#846](https://github.com/wardenenv/warden/issues/846) by @bap14) * Added Valkey service ([#861](https://github.com/wardenenv/warden#861) by @navarr) * Added `warden db upgrade` command ([#895](https://github.com/wardenenv/warden/pull/895) by @workslop8264) +* Added Postgres support for `warden db` (`connect`, `import`, `dump`) **Bug Fixes:** * System-level SSL certificates are no longer overwritten ([#812](https://github.com/wardenenv/warden/pull/812) by @SamJUK) diff --git a/commands/db.cmd b/commands/db.cmd index 991c597a..b2ccc277 100644 --- a/commands/db.cmd +++ b/commands/db.cmd @@ -13,48 +13,58 @@ if (( ${#WARDEN_PARAMS[@]} == 0 )) || [[ "${WARDEN_PARAMS[0]}" == "help" ]]; the $WARDEN_BIN db --help || exit $? && exit $? fi -## load connection information for the mysql service +## load connection information for the database service DB_CONTAINER=$($WARDEN_BIN env ps -q db) if [[ ! ${DB_CONTAINER} ]]; then fatal "No container found for db service." fi -eval "$( +## detect database type and load appropriate connection variables +DB_ENV_OUTPUT="$( docker container inspect ${DB_CONTAINER} --format ' {{- range .Config.Env }}{{with split . "=" -}} {{- index . 0 }}='\''{{ range $i, $v := . }}{{ if $i }}{{ $v }}{{ end }}{{ end }}'\''{{println}} {{- end }}{{ end -}} - ' | grep "^MYSQL_" + ' )" +DB_TYPE="mysql" +if echo "${DB_ENV_OUTPUT}" | grep -q "^POSTGRES_"; then + DB_TYPE="postgres" +fi + +eval "$(echo "${DB_ENV_OUTPUT}" | grep "^${DB_TYPE^^}_")" + ## sub-command execution case "${WARDEN_PARAMS[0]}" in connect) - "$WARDEN_BIN" env exec db \ - mysql -u"${MYSQL_USER}" -p"${MYSQL_PASSWORD}" --database="${MYSQL_DATABASE}" "${WARDEN_PARAMS[@]:1}" "$@" + if [[ "${DB_TYPE}" == "postgres" ]]; then + PGPASSWORD="${POSTGRES_PASSWORD}" "$WARDEN_BIN" env exec db \ + psql -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" "${WARDEN_PARAMS[@]:1}" "$@" + else + "$WARDEN_BIN" env exec db \ + mysql -u"${MYSQL_USER}" -p"${MYSQL_PASSWORD}" --database="${MYSQL_DATABASE}" "${WARDEN_PARAMS[@]:1}" "$@" + fi ;; import) - LC_ALL=C sed -E 's/DEFINER[ ]*=[ ]*`[^`]+`@`[^`]+`/DEFINER=CURRENT_USER/g' \ - | LC_ALL=C sed -E '/\@\@(GLOBAL\.GTID_PURGED|SESSION\.SQL_LOG_BIN)/d' \ - | "$WARDEN_BIN" env exec -T db \ - mysql -u"${MYSQL_USER}" -p"${MYSQL_PASSWORD}" --database="${MYSQL_DATABASE}" "${WARDEN_PARAMS[@]:1}" "$@" + if [[ "${DB_TYPE}" == "postgres" ]]; then + PGPASSWORD="${POSTGRES_PASSWORD}" "$WARDEN_BIN" env exec -T db \ + psql -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" "${WARDEN_PARAMS[@]:1}" "$@" + else + LC_ALL=C sed -E 's/DEFINER[ ]*=[ ]*`[^`]+`@`[^`]+`/DEFINER=CURRENT_USER/g' \ + | LC_ALL=C sed -E '/\@\@(GLOBAL\.GTID_PURGED|SESSION\.SQL_LOG_BIN)/d' \ + | "$WARDEN_BIN" env exec -T db \ + mysql -u"${MYSQL_USER}" -p"${MYSQL_PASSWORD}" --database="${MYSQL_DATABASE}" "${WARDEN_PARAMS[@]:1}" "$@" + fi ;; dump) + if [[ "${DB_TYPE}" == "postgres" ]]; then + PGPASSWORD="${POSTGRES_PASSWORD}" "$WARDEN_BIN" env exec -T db \ + pg_dump -U "${POSTGRES_USER}" "${POSTGRES_DB:-${POSTGRES_USER}}" "${WARDEN_PARAMS[@]:1}" "$@" + else "$WARDEN_BIN" env exec -T db \ - mysqldump -u"${MYSQL_USER}" -p"${MYSQL_PASSWORD}" "${MYSQL_DATABASE}" "${WARDEN_PARAMS[@]:1}" "$@" - ;; - upgrade) - if [ "$MYSQL_DISTRIBUTION" == "mysql" ]; then - upgradeCmd="mysql_upgrade" - elif [ "$MYSQL_DISTRIBUTION" == "mariadb" ]; then - upgradeCmd="mariadb-upgrade" - else - fatal "The upgrade command only supports MySQL and MariaDB installations." - exit 1 - fi - - "$WARDEN_BIN" env exec -T db \ - ${upgradeCmd} -p"${MYSQL_ROOT_PASSWORD}" + mysqldump -u"${MYSQL_USER}" -p"${MYSQL_PASSWORD}" "${MYSQL_DATABASE}" "${WARDEN_PARAMS[@]:1}" "$@" + fi ;; *) fatal "The command \"${WARDEN_PARAMS[0]}\" does not exist. Please use --help for usage."