spindb 0.37.2 → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/bin.js +9 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/commands/attach.js +102 -0
- package/dist/cli/commands/attach.js.map +1 -0
- package/dist/cli/commands/backup.js +197 -0
- package/dist/cli/commands/backup.js.map +1 -0
- package/dist/cli/commands/backups.js +190 -0
- package/dist/cli/commands/backups.js.map +1 -0
- package/dist/cli/commands/clone.js +119 -0
- package/dist/cli/commands/clone.js.map +1 -0
- package/dist/cli/commands/config.js +276 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/connect.js +559 -0
- package/dist/cli/commands/connect.js.map +1 -0
- package/dist/cli/commands/create.js +952 -0
- package/dist/cli/commands/create.js.map +1 -0
- package/dist/cli/commands/databases.js +485 -0
- package/dist/cli/commands/databases.js.map +1 -0
- package/dist/cli/commands/delete.js +106 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/deps.js +238 -0
- package/dist/cli/commands/deps.js.map +1 -0
- package/dist/cli/commands/detach.js +81 -0
- package/dist/cli/commands/detach.js.map +1 -0
- package/dist/cli/commands/doctor.js +567 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/duckdb.js +207 -0
- package/dist/cli/commands/duckdb.js.map +1 -0
- package/dist/cli/commands/edit.js +524 -0
- package/dist/cli/commands/edit.js.map +1 -0
- package/dist/cli/commands/engines.js +1414 -0
- package/dist/cli/commands/engines.js.map +1 -0
- package/dist/cli/commands/export.js +383 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/info.js +270 -0
- package/dist/cli/commands/info.js.map +1 -0
- package/dist/cli/commands/list.js +215 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/logs.js +81 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/menu/backup-handlers.js +1202 -0
- package/dist/cli/commands/menu/backup-handlers.js.map +1 -0
- package/dist/cli/commands/menu/container-handlers.js +1788 -0
- package/dist/cli/commands/menu/container-handlers.js.map +1 -0
- package/dist/cli/commands/menu/engine-handlers.js +235 -0
- package/dist/cli/commands/menu/engine-handlers.js.map +1 -0
- package/dist/cli/commands/menu/index.js +266 -0
- package/dist/cli/commands/menu/index.js.map +1 -0
- package/dist/cli/commands/menu/settings-handlers.js +320 -0
- package/dist/cli/commands/menu/settings-handlers.js.map +1 -0
- package/dist/cli/commands/menu/shared.js +13 -0
- package/dist/cli/commands/menu/shared.js.map +1 -0
- package/dist/cli/commands/menu/shell-handlers.js +1573 -0
- package/dist/cli/commands/menu/shell-handlers.js.map +1 -0
- package/dist/cli/commands/menu/sql-handlers.js +185 -0
- package/dist/cli/commands/menu/sql-handlers.js.map +1 -0
- package/dist/cli/commands/menu/update-handlers.js +322 -0
- package/dist/cli/commands/menu/update-handlers.js.map +1 -0
- package/dist/cli/commands/menu/validators.js +9 -0
- package/dist/cli/commands/menu/validators.js.map +1 -0
- package/dist/cli/commands/ports.js +166 -0
- package/dist/cli/commands/ports.js.map +1 -0
- package/dist/cli/commands/pull.js +166 -0
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/query.js +180 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/restore.js +428 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/run.js +115 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/self-update.js +99 -0
- package/dist/cli/commands/self-update.js.map +1 -0
- package/dist/cli/commands/sqlite.js +207 -0
- package/dist/cli/commands/sqlite.js.map +1 -0
- package/dist/cli/commands/start.js +196 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/stop.js +182 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/url.js +88 -0
- package/dist/cli/commands/url.js.map +1 -0
- package/dist/cli/commands/users.js +189 -0
- package/dist/cli/commands/users.js.map +1 -0
- package/dist/cli/commands/version.js +52 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/commands/which.js +258 -0
- package/dist/cli/commands/which.js.map +1 -0
- package/dist/cli/constants.js +212 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/helpers.js +1120 -0
- package/dist/cli/helpers.js.map +1 -0
- package/dist/cli/index.js +146 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui/prompts.js +1002 -0
- package/dist/cli/ui/prompts.js.map +1 -0
- package/dist/cli/ui/spinner.js +74 -0
- package/dist/cli/ui/spinner.js.map +1 -0
- package/dist/cli/ui/theme.js +99 -0
- package/dist/cli/ui/theme.js.map +1 -0
- package/dist/cli/utils/file-follower.js +79 -0
- package/dist/cli/utils/file-follower.js.map +1 -0
- package/dist/config/backup-formats.js +363 -0
- package/dist/config/backup-formats.js.map +1 -0
- package/dist/config/defaults.js +25 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/engine-defaults.js +303 -0
- package/dist/config/engine-defaults.js.map +1 -0
- package/dist/config/engines-registry.js +103 -0
- package/dist/config/engines-registry.js.map +1 -0
- package/dist/config/os-dependencies.js +767 -0
- package/dist/config/os-dependencies.js.map +1 -0
- package/dist/config/paths.js +156 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/version.js +3 -0
- package/dist/config/version.js.map +1 -0
- package/dist/core/backup-restore.js +219 -0
- package/dist/core/backup-restore.js.map +1 -0
- package/dist/core/base-binary-manager.js +403 -0
- package/dist/core/base-binary-manager.js.map +1 -0
- package/dist/core/base-document-binary-manager.js +364 -0
- package/dist/core/base-document-binary-manager.js.map +1 -0
- package/dist/core/base-embedded-binary-manager.js +364 -0
- package/dist/core/base-embedded-binary-manager.js.map +1 -0
- package/dist/core/base-server-binary-manager.js +368 -0
- package/dist/core/base-server-binary-manager.js.map +1 -0
- package/dist/core/config-manager.js +495 -0
- package/dist/core/config-manager.js.map +1 -0
- package/dist/core/container-manager.js +609 -0
- package/dist/core/container-manager.js.map +1 -0
- package/dist/core/credential-generator.js +67 -0
- package/dist/core/credential-generator.js.map +1 -0
- package/dist/core/credential-manager.js +211 -0
- package/dist/core/credential-manager.js.map +1 -0
- package/dist/core/dblab-utils.js +105 -0
- package/dist/core/dblab-utils.js.map +1 -0
- package/dist/core/dependency-manager.js +359 -0
- package/dist/core/dependency-manager.js.map +1 -0
- package/dist/core/docker-exporter.js +1077 -0
- package/dist/core/docker-exporter.js.map +1 -0
- package/dist/core/error-handler.js +295 -0
- package/dist/core/error-handler.js.map +1 -0
- package/dist/core/fs-error-utils.js +74 -0
- package/dist/core/fs-error-utils.js.map +1 -0
- package/dist/core/homebrew-version-manager.js +280 -0
- package/dist/core/homebrew-version-manager.js.map +1 -0
- package/dist/core/hostdb-client.js +252 -0
- package/dist/core/hostdb-client.js.map +1 -0
- package/dist/core/hostdb-metadata.js +243 -0
- package/dist/core/hostdb-metadata.js.map +1 -0
- package/dist/core/hostdb-releases-factory.js +161 -0
- package/dist/core/hostdb-releases-factory.js.map +1 -0
- package/dist/core/library-env.js +88 -0
- package/dist/core/library-env.js.map +1 -0
- package/dist/core/pgweb-utils.js +53 -0
- package/dist/core/pgweb-utils.js.map +1 -0
- package/dist/core/platform-service.js +632 -0
- package/dist/core/platform-service.js.map +1 -0
- package/dist/core/port-manager.js +136 -0
- package/dist/core/port-manager.js.map +1 -0
- package/dist/core/process-manager.js +445 -0
- package/dist/core/process-manager.js.map +1 -0
- package/dist/core/pull-manager.js +418 -0
- package/dist/core/pull-manager.js.map +1 -0
- package/dist/core/query-parser.js +449 -0
- package/dist/core/query-parser.js.map +1 -0
- package/dist/core/spawn-utils.js +90 -0
- package/dist/core/spawn-utils.js.map +1 -0
- package/dist/core/start-with-retry.js +90 -0
- package/dist/core/start-with-retry.js.map +1 -0
- package/dist/core/test-cleanup.js +85 -0
- package/dist/core/test-cleanup.js.map +1 -0
- package/dist/core/tls-generator.js +84 -0
- package/dist/core/tls-generator.js.map +1 -0
- package/dist/core/transaction-manager.js +139 -0
- package/dist/core/transaction-manager.js.map +1 -0
- package/dist/core/update-manager.js +241 -0
- package/dist/core/update-manager.js.map +1 -0
- package/dist/core/version-migration.js +260 -0
- package/dist/core/version-migration.js.map +1 -0
- package/dist/core/version-utils.js +91 -0
- package/dist/core/version-utils.js.map +1 -0
- package/dist/engines/base-engine.js +179 -0
- package/dist/engines/base-engine.js.map +1 -0
- package/dist/engines/clickhouse/backup.js +289 -0
- package/dist/engines/clickhouse/backup.js.map +1 -0
- package/dist/engines/clickhouse/binary-manager.js +145 -0
- package/dist/engines/clickhouse/binary-manager.js.map +1 -0
- package/dist/engines/clickhouse/binary-urls.js +100 -0
- package/dist/engines/clickhouse/binary-urls.js.map +1 -0
- package/dist/engines/clickhouse/cli-utils.js +143 -0
- package/dist/engines/clickhouse/cli-utils.js.map +1 -0
- package/dist/engines/clickhouse/hostdb-releases.js +24 -0
- package/dist/engines/clickhouse/hostdb-releases.js.map +1 -0
- package/dist/engines/clickhouse/index.js +1077 -0
- package/dist/engines/clickhouse/index.js.map +1 -0
- package/dist/engines/clickhouse/restore.js +335 -0
- package/dist/engines/clickhouse/restore.js.map +1 -0
- package/dist/engines/clickhouse/version-maps.js +83 -0
- package/dist/engines/clickhouse/version-maps.js.map +1 -0
- package/dist/engines/clickhouse/version-validator.js +133 -0
- package/dist/engines/clickhouse/version-validator.js.map +1 -0
- package/dist/engines/cockroachdb/backup.js +261 -0
- package/dist/engines/cockroachdb/backup.js.map +1 -0
- package/dist/engines/cockroachdb/binary-manager.js +33 -0
- package/dist/engines/cockroachdb/binary-manager.js.map +1 -0
- package/dist/engines/cockroachdb/binary-urls.js +33 -0
- package/dist/engines/cockroachdb/binary-urls.js.map +1 -0
- package/dist/engines/cockroachdb/cli-utils.js +338 -0
- package/dist/engines/cockroachdb/cli-utils.js.map +1 -0
- package/dist/engines/cockroachdb/hostdb-releases.js +21 -0
- package/dist/engines/cockroachdb/hostdb-releases.js.map +1 -0
- package/dist/engines/cockroachdb/index.js +1016 -0
- package/dist/engines/cockroachdb/index.js.map +1 -0
- package/dist/engines/cockroachdb/restore.js +323 -0
- package/dist/engines/cockroachdb/restore.js.map +1 -0
- package/dist/engines/cockroachdb/version-maps.js +37 -0
- package/dist/engines/cockroachdb/version-maps.js.map +1 -0
- package/dist/engines/couchdb/api-client.js +64 -0
- package/dist/engines/couchdb/api-client.js.map +1 -0
- package/dist/engines/couchdb/backup.js +90 -0
- package/dist/engines/couchdb/backup.js.map +1 -0
- package/dist/engines/couchdb/binary-manager.js +62 -0
- package/dist/engines/couchdb/binary-manager.js.map +1 -0
- package/dist/engines/couchdb/binary-urls.js +92 -0
- package/dist/engines/couchdb/binary-urls.js.map +1 -0
- package/dist/engines/couchdb/hostdb-releases.js +21 -0
- package/dist/engines/couchdb/hostdb-releases.js.map +1 -0
- package/dist/engines/couchdb/index.js +1043 -0
- package/dist/engines/couchdb/index.js.map +1 -0
- package/dist/engines/couchdb/restore.js +198 -0
- package/dist/engines/couchdb/restore.js.map +1 -0
- package/dist/engines/couchdb/version-maps.js +67 -0
- package/dist/engines/couchdb/version-maps.js.map +1 -0
- package/dist/engines/couchdb/version-validator.js +88 -0
- package/dist/engines/couchdb/version-validator.js.map +1 -0
- package/dist/engines/duckdb/binary-manager.js +33 -0
- package/dist/engines/duckdb/binary-manager.js.map +1 -0
- package/{engines/duckdb/binary-urls.ts → dist/engines/duckdb/binary-urls.js} +11 -16
- package/dist/engines/duckdb/binary-urls.js.map +1 -0
- package/dist/engines/duckdb/hostdb-releases.js +21 -0
- package/dist/engines/duckdb/hostdb-releases.js.map +1 -0
- package/dist/engines/duckdb/index.js +594 -0
- package/dist/engines/duckdb/index.js.map +1 -0
- package/dist/engines/duckdb/registry.js +265 -0
- package/dist/engines/duckdb/registry.js.map +1 -0
- package/dist/engines/duckdb/scanner.js +12 -0
- package/dist/engines/duckdb/scanner.js.map +1 -0
- package/dist/engines/duckdb/version-maps.js +67 -0
- package/dist/engines/duckdb/version-maps.js.map +1 -0
- package/dist/engines/duckdb/version-validator.js +62 -0
- package/dist/engines/duckdb/version-validator.js.map +1 -0
- package/dist/engines/ferretdb/backup.js +170 -0
- package/dist/engines/ferretdb/backup.js.map +1 -0
- package/dist/engines/ferretdb/binary-manager.js +765 -0
- package/dist/engines/ferretdb/binary-manager.js.map +1 -0
- package/dist/engines/ferretdb/binary-urls.js +135 -0
- package/dist/engines/ferretdb/binary-urls.js.map +1 -0
- package/dist/engines/ferretdb/index.js +1517 -0
- package/dist/engines/ferretdb/index.js.map +1 -0
- package/dist/engines/ferretdb/restore.js +310 -0
- package/dist/engines/ferretdb/restore.js.map +1 -0
- package/{engines/ferretdb/version-maps.ts → dist/engines/ferretdb/version-maps.js} +62 -79
- package/dist/engines/ferretdb/version-maps.js.map +1 -0
- package/dist/engines/file-based-utils.js +184 -0
- package/dist/engines/file-based-utils.js.map +1 -0
- package/dist/engines/index.js +124 -0
- package/dist/engines/index.js.map +1 -0
- package/dist/engines/influxdb/api-client.js +54 -0
- package/dist/engines/influxdb/api-client.js.map +1 -0
- package/dist/engines/influxdb/backup.js +119 -0
- package/dist/engines/influxdb/backup.js.map +1 -0
- package/dist/engines/influxdb/binary-manager.js +87 -0
- package/dist/engines/influxdb/binary-manager.js.map +1 -0
- package/dist/engines/influxdb/binary-urls.js +56 -0
- package/dist/engines/influxdb/binary-urls.js.map +1 -0
- package/dist/engines/influxdb/hostdb-releases.js +21 -0
- package/dist/engines/influxdb/hostdb-releases.js.map +1 -0
- package/dist/engines/influxdb/index.js +962 -0
- package/dist/engines/influxdb/index.js.map +1 -0
- package/dist/engines/influxdb/restore.js +329 -0
- package/dist/engines/influxdb/restore.js.map +1 -0
- package/dist/engines/influxdb/version-maps.js +64 -0
- package/dist/engines/influxdb/version-maps.js.map +1 -0
- package/dist/engines/influxdb/version-validator.js +109 -0
- package/dist/engines/influxdb/version-validator.js.map +1 -0
- package/dist/engines/mariadb/backup.js +178 -0
- package/dist/engines/mariadb/backup.js.map +1 -0
- package/dist/engines/mariadb/binary-manager.js +33 -0
- package/dist/engines/mariadb/binary-manager.js.map +1 -0
- package/{engines/mariadb/binary-urls.ts → dist/engines/mariadb/binary-urls.js} +38 -55
- package/dist/engines/mariadb/binary-urls.js.map +1 -0
- package/dist/engines/mariadb/hostdb-releases.js +21 -0
- package/dist/engines/mariadb/hostdb-releases.js.map +1 -0
- package/dist/engines/mariadb/index.js +1011 -0
- package/dist/engines/mariadb/index.js.map +1 -0
- package/dist/engines/mariadb/restore.js +322 -0
- package/dist/engines/mariadb/restore.js.map +1 -0
- package/dist/engines/mariadb/version-maps.js +63 -0
- package/dist/engines/mariadb/version-maps.js.map +1 -0
- package/dist/engines/mariadb/version-validator.js +143 -0
- package/dist/engines/mariadb/version-validator.js.map +1 -0
- package/dist/engines/meilisearch/api-client.js +50 -0
- package/dist/engines/meilisearch/api-client.js.map +1 -0
- package/dist/engines/meilisearch/backup.js +167 -0
- package/dist/engines/meilisearch/backup.js.map +1 -0
- package/dist/engines/meilisearch/binary-manager.js +31 -0
- package/dist/engines/meilisearch/binary-manager.js.map +1 -0
- package/dist/engines/meilisearch/binary-urls.js +56 -0
- package/dist/engines/meilisearch/binary-urls.js.map +1 -0
- package/dist/engines/meilisearch/hostdb-releases.js +21 -0
- package/dist/engines/meilisearch/hostdb-releases.js.map +1 -0
- package/dist/engines/meilisearch/index.js +992 -0
- package/dist/engines/meilisearch/index.js.map +1 -0
- package/dist/engines/meilisearch/restore.js +167 -0
- package/dist/engines/meilisearch/restore.js.map +1 -0
- package/dist/engines/meilisearch/version-maps.js +67 -0
- package/dist/engines/meilisearch/version-maps.js.map +1 -0
- package/dist/engines/meilisearch/version-validator.js +109 -0
- package/dist/engines/meilisearch/version-validator.js.map +1 -0
- package/dist/engines/mongodb/backup.js +109 -0
- package/dist/engines/mongodb/backup.js.map +1 -0
- package/dist/engines/mongodb/binary-manager.js +36 -0
- package/dist/engines/mongodb/binary-manager.js.map +1 -0
- package/dist/engines/mongodb/binary-urls.js +46 -0
- package/dist/engines/mongodb/binary-urls.js.map +1 -0
- package/dist/engines/mongodb/cli-utils.js +131 -0
- package/dist/engines/mongodb/cli-utils.js.map +1 -0
- package/dist/engines/mongodb/hostdb-releases.js +77 -0
- package/dist/engines/mongodb/hostdb-releases.js.map +1 -0
- package/dist/engines/mongodb/index.js +873 -0
- package/dist/engines/mongodb/index.js.map +1 -0
- package/dist/engines/mongodb/restore.js +276 -0
- package/dist/engines/mongodb/restore.js.map +1 -0
- package/dist/engines/mongodb/version-maps.js +79 -0
- package/dist/engines/mongodb/version-maps.js.map +1 -0
- package/dist/engines/mongodb/version-validator.js +133 -0
- package/dist/engines/mongodb/version-validator.js.map +1 -0
- package/dist/engines/mysql/backup.js +210 -0
- package/dist/engines/mysql/backup.js.map +1 -0
- package/dist/engines/mysql/binary-detection.js +325 -0
- package/dist/engines/mysql/binary-detection.js.map +1 -0
- package/dist/engines/mysql/binary-manager.js +30 -0
- package/dist/engines/mysql/binary-manager.js.map +1 -0
- package/dist/engines/mysql/binary-urls.js +87 -0
- package/dist/engines/mysql/binary-urls.js.map +1 -0
- package/{engines/mysql/hostdb-releases.ts → dist/engines/mysql/hostdb-releases.js} +20 -23
- package/dist/engines/mysql/hostdb-releases.js.map +1 -0
- package/dist/engines/mysql/index.js +1066 -0
- package/dist/engines/mysql/index.js.map +1 -0
- package/dist/engines/mysql/restore.js +361 -0
- package/dist/engines/mysql/restore.js.map +1 -0
- package/dist/engines/mysql/version-maps.js +79 -0
- package/dist/engines/mysql/version-maps.js.map +1 -0
- package/dist/engines/mysql/version-validator.js +266 -0
- package/dist/engines/mysql/version-validator.js.map +1 -0
- package/dist/engines/postgresql/backup.js +118 -0
- package/dist/engines/postgresql/backup.js.map +1 -0
- package/dist/engines/postgresql/binary-manager.js +85 -0
- package/dist/engines/postgresql/binary-manager.js.map +1 -0
- package/dist/engines/postgresql/binary-urls.js +80 -0
- package/dist/engines/postgresql/binary-urls.js.map +1 -0
- package/dist/engines/postgresql/hostdb-releases.js +21 -0
- package/dist/engines/postgresql/hostdb-releases.js.map +1 -0
- package/dist/engines/postgresql/index.js +852 -0
- package/dist/engines/postgresql/index.js.map +1 -0
- package/dist/engines/postgresql/remote-version.js +109 -0
- package/dist/engines/postgresql/remote-version.js.map +1 -0
- package/dist/engines/postgresql/restore.js +254 -0
- package/dist/engines/postgresql/restore.js.map +1 -0
- package/dist/engines/postgresql/version-maps.js +73 -0
- package/dist/engines/postgresql/version-maps.js.map +1 -0
- package/dist/engines/postgresql/version-validator.js +286 -0
- package/dist/engines/postgresql/version-validator.js.map +1 -0
- package/dist/engines/qdrant/api-client.js +50 -0
- package/dist/engines/qdrant/api-client.js.map +1 -0
- package/dist/engines/qdrant/backup.js +115 -0
- package/dist/engines/qdrant/backup.js.map +1 -0
- package/dist/engines/qdrant/binary-manager.js +31 -0
- package/dist/engines/qdrant/binary-manager.js.map +1 -0
- package/dist/engines/qdrant/binary-urls.js +92 -0
- package/dist/engines/qdrant/binary-urls.js.map +1 -0
- package/dist/engines/qdrant/cli-utils.js +39 -0
- package/dist/engines/qdrant/cli-utils.js.map +1 -0
- package/dist/engines/qdrant/hostdb-releases.js +21 -0
- package/dist/engines/qdrant/hostdb-releases.js.map +1 -0
- package/dist/engines/qdrant/index.js +1002 -0
- package/dist/engines/qdrant/index.js.map +1 -0
- package/dist/engines/qdrant/restore.js +154 -0
- package/dist/engines/qdrant/restore.js.map +1 -0
- package/dist/engines/qdrant/version-maps.js +67 -0
- package/dist/engines/qdrant/version-maps.js.map +1 -0
- package/dist/engines/qdrant/version-validator.js +109 -0
- package/dist/engines/qdrant/version-validator.js.map +1 -0
- package/dist/engines/questdb/backup.js +191 -0
- package/dist/engines/questdb/backup.js.map +1 -0
- package/dist/engines/questdb/binary-manager.js +247 -0
- package/dist/engines/questdb/binary-manager.js.map +1 -0
- package/dist/engines/questdb/binary-urls.js +27 -0
- package/dist/engines/questdb/binary-urls.js.map +1 -0
- package/dist/engines/questdb/hostdb-releases.js +21 -0
- package/dist/engines/questdb/hostdb-releases.js.map +1 -0
- package/dist/engines/questdb/index.js +814 -0
- package/dist/engines/questdb/index.js.map +1 -0
- package/dist/engines/questdb/restore.js +202 -0
- package/dist/engines/questdb/restore.js.map +1 -0
- package/dist/engines/questdb/version-maps.js +33 -0
- package/dist/engines/questdb/version-maps.js.map +1 -0
- package/dist/engines/questdb/version-validator.js +99 -0
- package/dist/engines/questdb/version-validator.js.map +1 -0
- package/dist/engines/redis/backup.js +292 -0
- package/dist/engines/redis/backup.js.map +1 -0
- package/dist/engines/redis/binary-manager.js +32 -0
- package/dist/engines/redis/binary-manager.js.map +1 -0
- package/dist/engines/redis/binary-urls.js +96 -0
- package/dist/engines/redis/binary-urls.js.map +1 -0
- package/dist/engines/redis/cli-utils.js +38 -0
- package/dist/engines/redis/cli-utils.js.map +1 -0
- package/dist/engines/redis/hostdb-releases.js +21 -0
- package/dist/engines/redis/hostdb-releases.js.map +1 -0
- package/dist/engines/redis/index.js +1263 -0
- package/dist/engines/redis/index.js.map +1 -0
- package/dist/engines/redis/restore.js +338 -0
- package/dist/engines/redis/restore.js.map +1 -0
- package/dist/engines/redis/version-maps.js +70 -0
- package/dist/engines/redis/version-maps.js.map +1 -0
- package/dist/engines/redis/version-validator.js +109 -0
- package/dist/engines/redis/version-validator.js.map +1 -0
- package/dist/engines/sqlite/binary-manager.js +39 -0
- package/dist/engines/sqlite/binary-manager.js.map +1 -0
- package/{engines/sqlite/binary-urls.ts → dist/engines/sqlite/binary-urls.js} +11 -16
- package/dist/engines/sqlite/binary-urls.js.map +1 -0
- package/dist/engines/sqlite/hostdb-releases.js +21 -0
- package/dist/engines/sqlite/hostdb-releases.js.map +1 -0
- package/dist/engines/sqlite/index.js +493 -0
- package/dist/engines/sqlite/index.js.map +1 -0
- package/dist/engines/sqlite/registry.js +163 -0
- package/dist/engines/sqlite/registry.js.map +1 -0
- package/dist/engines/sqlite/scanner.js +12 -0
- package/dist/engines/sqlite/scanner.js.map +1 -0
- package/dist/engines/sqlite/version-maps.js +57 -0
- package/dist/engines/sqlite/version-maps.js.map +1 -0
- package/dist/engines/surrealdb/backup.js +97 -0
- package/dist/engines/surrealdb/backup.js.map +1 -0
- package/dist/engines/surrealdb/binary-manager.js +33 -0
- package/dist/engines/surrealdb/binary-manager.js.map +1 -0
- package/dist/engines/surrealdb/binary-urls.js +33 -0
- package/dist/engines/surrealdb/binary-urls.js.map +1 -0
- package/dist/engines/surrealdb/cli-utils.js +147 -0
- package/dist/engines/surrealdb/cli-utils.js.map +1 -0
- package/dist/engines/surrealdb/hostdb-releases.js +21 -0
- package/dist/engines/surrealdb/hostdb-releases.js.map +1 -0
- package/dist/engines/surrealdb/index.js +1022 -0
- package/dist/engines/surrealdb/index.js.map +1 -0
- package/dist/engines/surrealdb/restore.js +224 -0
- package/dist/engines/surrealdb/restore.js.map +1 -0
- package/dist/engines/surrealdb/version-maps.js +36 -0
- package/dist/engines/surrealdb/version-maps.js.map +1 -0
- package/dist/engines/tigerbeetle/backup.js +36 -0
- package/dist/engines/tigerbeetle/backup.js.map +1 -0
- package/dist/engines/tigerbeetle/binary-manager.js +72 -0
- package/dist/engines/tigerbeetle/binary-manager.js.map +1 -0
- package/dist/engines/tigerbeetle/binary-urls.js +49 -0
- package/dist/engines/tigerbeetle/binary-urls.js.map +1 -0
- package/dist/engines/tigerbeetle/hostdb-releases.js +21 -0
- package/dist/engines/tigerbeetle/hostdb-releases.js.map +1 -0
- package/dist/engines/tigerbeetle/index.js +559 -0
- package/dist/engines/tigerbeetle/index.js.map +1 -0
- package/dist/engines/tigerbeetle/restore.js +91 -0
- package/dist/engines/tigerbeetle/restore.js.map +1 -0
- package/{engines/tigerbeetle/version-maps.ts → dist/engines/tigerbeetle/version-maps.js} +22 -31
- package/dist/engines/tigerbeetle/version-maps.js.map +1 -0
- package/dist/engines/tigerbeetle/version-validator.js +108 -0
- package/dist/engines/tigerbeetle/version-validator.js.map +1 -0
- package/dist/engines/typedb/backup.js +129 -0
- package/dist/engines/typedb/backup.js.map +1 -0
- package/dist/engines/typedb/binary-manager.js +151 -0
- package/dist/engines/typedb/binary-manager.js.map +1 -0
- package/dist/engines/typedb/binary-urls.js +33 -0
- package/dist/engines/typedb/binary-urls.js.map +1 -0
- package/dist/engines/typedb/cli-utils.js +163 -0
- package/dist/engines/typedb/cli-utils.js.map +1 -0
- package/dist/engines/typedb/hostdb-releases.js +21 -0
- package/dist/engines/typedb/hostdb-releases.js.map +1 -0
- package/dist/engines/typedb/index.js +1003 -0
- package/dist/engines/typedb/index.js.map +1 -0
- package/dist/engines/typedb/restore.js +279 -0
- package/dist/engines/typedb/restore.js.map +1 -0
- package/dist/engines/typedb/version-maps.js +40 -0
- package/dist/engines/typedb/version-maps.js.map +1 -0
- package/dist/engines/typedb/version-validator.js +103 -0
- package/dist/engines/typedb/version-validator.js.map +1 -0
- package/dist/engines/valkey/backup.js +292 -0
- package/dist/engines/valkey/backup.js.map +1 -0
- package/dist/engines/valkey/binary-manager.js +33 -0
- package/dist/engines/valkey/binary-manager.js.map +1 -0
- package/dist/engines/valkey/binary-urls.js +98 -0
- package/dist/engines/valkey/binary-urls.js.map +1 -0
- package/dist/engines/valkey/cli-utils.js +38 -0
- package/dist/engines/valkey/cli-utils.js.map +1 -0
- package/dist/engines/valkey/hostdb-releases.js +21 -0
- package/dist/engines/valkey/hostdb-releases.js.map +1 -0
- package/dist/engines/valkey/index.js +1257 -0
- package/dist/engines/valkey/index.js.map +1 -0
- package/dist/engines/valkey/restore.js +340 -0
- package/dist/engines/valkey/restore.js.map +1 -0
- package/dist/engines/valkey/version-maps.js +70 -0
- package/dist/engines/valkey/version-maps.js.map +1 -0
- package/dist/engines/valkey/version-validator.js +112 -0
- package/dist/engines/valkey/version-validator.js.map +1 -0
- package/dist/engines/weaviate/api-client.js +50 -0
- package/dist/engines/weaviate/api-client.js.map +1 -0
- package/dist/engines/weaviate/backup.js +95 -0
- package/dist/engines/weaviate/backup.js.map +1 -0
- package/dist/engines/weaviate/binary-manager.js +58 -0
- package/dist/engines/weaviate/binary-manager.js.map +1 -0
- package/dist/engines/weaviate/binary-urls.js +92 -0
- package/dist/engines/weaviate/binary-urls.js.map +1 -0
- package/dist/engines/weaviate/cli-utils.js +39 -0
- package/dist/engines/weaviate/cli-utils.js.map +1 -0
- package/dist/engines/weaviate/hostdb-releases.js +21 -0
- package/dist/engines/weaviate/hostdb-releases.js.map +1 -0
- package/dist/engines/weaviate/index.js +871 -0
- package/dist/engines/weaviate/index.js.map +1 -0
- package/dist/engines/weaviate/restore.js +185 -0
- package/dist/engines/weaviate/restore.js.map +1 -0
- package/dist/engines/weaviate/version-maps.js +67 -0
- package/dist/engines/weaviate/version-maps.js.map +1 -0
- package/dist/engines/weaviate/version-validator.js +109 -0
- package/dist/engines/weaviate/version-validator.js.map +1 -0
- package/dist/types/index.js +102 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +12 -9
- package/bin/cli.js +0 -68
- package/cli/bin.ts +0 -10
- package/cli/commands/attach.ts +0 -139
- package/cli/commands/backup.ts +0 -290
- package/cli/commands/backups.ts +0 -247
- package/cli/commands/clone.ts +0 -159
- package/cli/commands/config.ts +0 -367
- package/cli/commands/connect.ts +0 -684
- package/cli/commands/create.ts +0 -1201
- package/cli/commands/databases.ts +0 -630
- package/cli/commands/delete.ts +0 -133
- package/cli/commands/deps.ts +0 -342
- package/cli/commands/detach.ts +0 -107
- package/cli/commands/doctor.ts +0 -689
- package/cli/commands/duckdb.ts +0 -273
- package/cli/commands/edit.ts +0 -683
- package/cli/commands/engines.ts +0 -1914
- package/cli/commands/export.ts +0 -544
- package/cli/commands/info.ts +0 -340
- package/cli/commands/list.ts +0 -284
- package/cli/commands/logs.ts +0 -102
- package/cli/commands/menu/backup-handlers.ts +0 -1571
- package/cli/commands/menu/container-handlers.ts +0 -2288
- package/cli/commands/menu/engine-handlers.ts +0 -355
- package/cli/commands/menu/index.ts +0 -342
- package/cli/commands/menu/settings-handlers.ts +0 -365
- package/cli/commands/menu/shared.ts +0 -23
- package/cli/commands/menu/shell-handlers.ts +0 -1811
- package/cli/commands/menu/sql-handlers.ts +0 -231
- package/cli/commands/menu/update-handlers.ts +0 -378
- package/cli/commands/menu/validators.ts +0 -8
- package/cli/commands/ports.ts +0 -211
- package/cli/commands/pull.ts +0 -223
- package/cli/commands/query.ts +0 -241
- package/cli/commands/restore.ts +0 -587
- package/cli/commands/run.ts +0 -178
- package/cli/commands/self-update.ts +0 -121
- package/cli/commands/sqlite.ts +0 -273
- package/cli/commands/start.ts +0 -218
- package/cli/commands/stop.ts +0 -241
- package/cli/commands/url.ts +0 -104
- package/cli/commands/users.ts +0 -264
- package/cli/commands/version.ts +0 -55
- package/cli/commands/which.ts +0 -290
- package/cli/constants.ts +0 -233
- package/cli/helpers.ts +0 -1593
- package/cli/index.ts +0 -162
- package/cli/ui/prompts.ts +0 -1525
- package/cli/ui/spinner.ts +0 -88
- package/cli/ui/theme.ts +0 -128
- package/cli/utils/file-follower.ts +0 -93
- package/config/backup-formats.ts +0 -446
- package/config/defaults.ts +0 -56
- package/config/engine-defaults.ts +0 -336
- package/config/engines-registry.ts +0 -150
- package/config/engines.schema.json +0 -135
- package/config/os-dependencies.ts +0 -888
- package/config/paths.ts +0 -200
- package/core/backup-restore.ts +0 -330
- package/core/base-binary-manager.ts +0 -562
- package/core/base-document-binary-manager.ts +0 -523
- package/core/base-embedded-binary-manager.ts +0 -547
- package/core/base-server-binary-manager.ts +0 -523
- package/core/config-manager.ts +0 -652
- package/core/container-manager.ts +0 -787
- package/core/credential-generator.ts +0 -93
- package/core/credential-manager.ts +0 -259
- package/core/dblab-utils.ts +0 -113
- package/core/dependency-manager.ts +0 -512
- package/core/docker-exporter.ts +0 -1345
- package/core/error-handler.ts +0 -419
- package/core/fs-error-utils.ts +0 -82
- package/core/homebrew-version-manager.ts +0 -352
- package/core/hostdb-client.ts +0 -344
- package/core/hostdb-metadata.ts +0 -350
- package/core/hostdb-releases-factory.ts +0 -237
- package/core/library-env.ts +0 -118
- package/core/pgweb-utils.ts +0 -62
- package/core/platform-service.ts +0 -829
- package/core/port-manager.ts +0 -165
- package/core/process-manager.ts +0 -576
- package/core/pull-manager.ts +0 -511
- package/core/query-parser.ts +0 -514
- package/core/spawn-utils.ts +0 -122
- package/core/start-with-retry.ts +0 -130
- package/core/test-cleanup.ts +0 -108
- package/core/tls-generator.ts +0 -116
- package/core/transaction-manager.ts +0 -158
- package/core/update-manager.ts +0 -308
- package/core/version-migration.ts +0 -346
- package/core/version-utils.ts +0 -104
- package/engines/base-engine.ts +0 -340
- package/engines/clickhouse/README.md +0 -231
- package/engines/clickhouse/backup.ts +0 -398
- package/engines/clickhouse/binary-manager.ts +0 -201
- package/engines/clickhouse/binary-urls.ts +0 -125
- package/engines/clickhouse/cli-utils.ts +0 -176
- package/engines/clickhouse/hostdb-releases.ts +0 -30
- package/engines/clickhouse/index.ts +0 -1345
- package/engines/clickhouse/restore.ts +0 -466
- package/engines/clickhouse/version-maps.ts +0 -95
- package/engines/clickhouse/version-validator.ts +0 -154
- package/engines/cockroachdb/README.md +0 -170
- package/engines/cockroachdb/backup.ts +0 -376
- package/engines/cockroachdb/binary-manager.ts +0 -45
- package/engines/cockroachdb/binary-urls.ts +0 -40
- package/engines/cockroachdb/cli-utils.ts +0 -384
- package/engines/cockroachdb/hostdb-releases.ts +0 -26
- package/engines/cockroachdb/index.ts +0 -1276
- package/engines/cockroachdb/restore.ts +0 -455
- package/engines/cockroachdb/version-maps.ts +0 -42
- package/engines/couchdb/README.md +0 -257
- package/engines/couchdb/api-client.ts +0 -81
- package/engines/couchdb/backup.ts +0 -137
- package/engines/couchdb/binary-manager.ts +0 -86
- package/engines/couchdb/binary-urls.ts +0 -115
- package/engines/couchdb/hostdb-releases.ts +0 -23
- package/engines/couchdb/index.ts +0 -1429
- package/engines/couchdb/restore.ts +0 -290
- package/engines/couchdb/version-maps.ts +0 -78
- package/engines/couchdb/version-validator.ts +0 -111
- package/engines/duckdb/README.md +0 -154
- package/engines/duckdb/binary-manager.ts +0 -45
- package/engines/duckdb/hostdb-releases.ts +0 -23
- package/engines/duckdb/index.ts +0 -749
- package/engines/duckdb/registry.ts +0 -303
- package/engines/duckdb/scanner.ts +0 -22
- package/engines/duckdb/version-maps.ts +0 -78
- package/engines/duckdb/version-validator.ts +0 -78
- package/engines/ferretdb/README.md +0 -262
- package/engines/ferretdb/backup.ts +0 -173
- package/engines/ferretdb/binary-manager.ts +0 -1095
- package/engines/ferretdb/binary-urls.ts +0 -183
- package/engines/ferretdb/index.ts +0 -1907
- package/engines/ferretdb/restore.ts +0 -357
- package/engines/file-based-utils.ts +0 -262
- package/engines/index.ts +0 -131
- package/engines/influxdb/README.md +0 -180
- package/engines/influxdb/api-client.ts +0 -64
- package/engines/influxdb/backup.ts +0 -160
- package/engines/influxdb/binary-manager.ts +0 -110
- package/engines/influxdb/binary-urls.ts +0 -69
- package/engines/influxdb/hostdb-releases.ts +0 -23
- package/engines/influxdb/index.ts +0 -1272
- package/engines/influxdb/restore.ts +0 -417
- package/engines/influxdb/version-maps.ts +0 -75
- package/engines/influxdb/version-validator.ts +0 -128
- package/engines/mariadb/README.md +0 -141
- package/engines/mariadb/backup.ts +0 -233
- package/engines/mariadb/binary-manager.ts +0 -45
- package/engines/mariadb/hostdb-releases.ts +0 -23
- package/engines/mariadb/index.ts +0 -1300
- package/engines/mariadb/restore.ts +0 -447
- package/engines/mariadb/version-maps.ts +0 -72
- package/engines/mariadb/version-validator.ts +0 -181
- package/engines/meilisearch/README.md +0 -255
- package/engines/meilisearch/api-client.ts +0 -61
- package/engines/meilisearch/backup.ts +0 -233
- package/engines/meilisearch/binary-manager.ts +0 -43
- package/engines/meilisearch/binary-urls.ts +0 -69
- package/engines/meilisearch/hostdb-releases.ts +0 -26
- package/engines/meilisearch/index.ts +0 -1292
- package/engines/meilisearch/restore.ts +0 -219
- package/engines/meilisearch/version-maps.ts +0 -78
- package/engines/meilisearch/version-validator.ts +0 -128
- package/engines/mongodb/README.md +0 -162
- package/engines/mongodb/backup.ts +0 -127
- package/engines/mongodb/binary-manager.ts +0 -48
- package/engines/mongodb/binary-urls.ts +0 -63
- package/engines/mongodb/cli-utils.ts +0 -171
- package/engines/mongodb/hostdb-releases.ts +0 -91
- package/engines/mongodb/index.ts +0 -1118
- package/engines/mongodb/restore.ts +0 -361
- package/engines/mongodb/version-maps.ts +0 -91
- package/engines/mongodb/version-validator.ts +0 -160
- package/engines/mysql/README.md +0 -142
- package/engines/mysql/backup.ts +0 -270
- package/engines/mysql/binary-detection.ts +0 -408
- package/engines/mysql/binary-manager.ts +0 -42
- package/engines/mysql/binary-urls.ts +0 -104
- package/engines/mysql/index.ts +0 -1361
- package/engines/mysql/restore.ts +0 -500
- package/engines/mysql/version-maps.ts +0 -91
- package/engines/mysql/version-validator.ts +0 -369
- package/engines/postgresql/README.md +0 -158
- package/engines/postgresql/backup.ts +0 -151
- package/engines/postgresql/binary-manager.ts +0 -114
- package/engines/postgresql/binary-urls.ts +0 -99
- package/engines/postgresql/hostdb-releases.ts +0 -26
- package/engines/postgresql/index.ts +0 -1143
- package/engines/postgresql/remote-version.ts +0 -161
- package/engines/postgresql/restore.ts +0 -342
- package/engines/postgresql/version-maps.ts +0 -83
- package/engines/postgresql/version-validator.ts +0 -413
- package/engines/qdrant/README.md +0 -222
- package/engines/qdrant/api-client.ts +0 -61
- package/engines/qdrant/backup.ts +0 -165
- package/engines/qdrant/binary-manager.ts +0 -43
- package/engines/qdrant/binary-urls.ts +0 -115
- package/engines/qdrant/cli-utils.ts +0 -43
- package/engines/qdrant/hostdb-releases.ts +0 -23
- package/engines/qdrant/index.ts +0 -1312
- package/engines/qdrant/restore.ts +0 -203
- package/engines/qdrant/version-maps.ts +0 -78
- package/engines/qdrant/version-validator.ts +0 -128
- package/engines/questdb/README.md +0 -334
- package/engines/questdb/backup.ts +0 -220
- package/engines/questdb/binary-manager.ts +0 -310
- package/engines/questdb/binary-urls.ts +0 -34
- package/engines/questdb/hostdb-releases.ts +0 -23
- package/engines/questdb/index.ts +0 -1023
- package/engines/questdb/restore.ts +0 -260
- package/engines/questdb/version-maps.ts +0 -37
- package/engines/questdb/version-validator.ts +0 -121
- package/engines/redis/README.md +0 -173
- package/engines/redis/backup.ts +0 -389
- package/engines/redis/binary-manager.ts +0 -44
- package/engines/redis/binary-urls.ts +0 -117
- package/engines/redis/cli-utils.ts +0 -42
- package/engines/redis/hostdb-releases.ts +0 -23
- package/engines/redis/index.ts +0 -1583
- package/engines/redis/restore.ts +0 -443
- package/engines/redis/version-maps.ts +0 -81
- package/engines/redis/version-validator.ts +0 -131
- package/engines/sqlite/README.md +0 -162
- package/engines/sqlite/binary-manager.ts +0 -52
- package/engines/sqlite/hostdb-releases.ts +0 -23
- package/engines/sqlite/index.ts +0 -641
- package/engines/sqlite/registry.ts +0 -198
- package/engines/sqlite/scanner.ts +0 -22
- package/engines/sqlite/version-maps.ts +0 -64
- package/engines/surrealdb/README.md +0 -218
- package/engines/surrealdb/backup.ts +0 -131
- package/engines/surrealdb/binary-manager.ts +0 -45
- package/engines/surrealdb/binary-urls.ts +0 -40
- package/engines/surrealdb/cli-utils.ts +0 -173
- package/engines/surrealdb/hostdb-releases.ts +0 -23
- package/engines/surrealdb/index.ts +0 -1246
- package/engines/surrealdb/restore.ts +0 -302
- package/engines/surrealdb/version-maps.ts +0 -41
- package/engines/tigerbeetle/README.md +0 -61
- package/engines/tigerbeetle/backup.ts +0 -49
- package/engines/tigerbeetle/binary-manager.ts +0 -95
- package/engines/tigerbeetle/binary-urls.ts +0 -62
- package/engines/tigerbeetle/hostdb-releases.ts +0 -26
- package/engines/tigerbeetle/index.ts +0 -746
- package/engines/tigerbeetle/restore.ts +0 -130
- package/engines/tigerbeetle/version-validator.ts +0 -126
- package/engines/typedb/backup.ts +0 -167
- package/engines/typedb/binary-manager.ts +0 -200
- package/engines/typedb/binary-urls.ts +0 -40
- package/engines/typedb/cli-utils.ts +0 -210
- package/engines/typedb/hostdb-releases.ts +0 -23
- package/engines/typedb/index.ts +0 -1275
- package/engines/typedb/restore.ts +0 -377
- package/engines/typedb/version-maps.ts +0 -48
- package/engines/typedb/version-validator.ts +0 -127
- package/engines/valkey/README.md +0 -219
- package/engines/valkey/backup.ts +0 -389
- package/engines/valkey/binary-manager.ts +0 -45
- package/engines/valkey/binary-urls.ts +0 -122
- package/engines/valkey/cli-utils.ts +0 -42
- package/engines/valkey/hostdb-releases.ts +0 -23
- package/engines/valkey/index.ts +0 -1585
- package/engines/valkey/restore.ts +0 -446
- package/engines/valkey/version-maps.ts +0 -81
- package/engines/valkey/version-validator.ts +0 -131
- package/engines/weaviate/README.md +0 -302
- package/engines/weaviate/api-client.ts +0 -61
- package/engines/weaviate/backup.ts +0 -145
- package/engines/weaviate/binary-manager.ts +0 -80
- package/engines/weaviate/binary-urls.ts +0 -115
- package/engines/weaviate/cli-utils.ts +0 -43
- package/engines/weaviate/hostdb-releases.ts +0 -23
- package/engines/weaviate/index.ts +0 -1139
- package/engines/weaviate/restore.ts +0 -235
- package/engines/weaviate/version-maps.ts +0 -78
- package/engines/weaviate/version-validator.ts +0 -128
- package/types/index.ts +0 -624
- /package/{config → dist/config}/engines.json +0 -0
|
@@ -0,0 +1,852 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import { spawn, exec } from 'child_process';
|
|
3
|
+
import { promisify } from 'util';
|
|
4
|
+
import { existsSync } from 'fs';
|
|
5
|
+
import { readFile, writeFile } from 'fs/promises';
|
|
6
|
+
import { BaseEngine } from '../base-engine.js';
|
|
7
|
+
import { postgresqlBinaryManager } from './binary-manager.js';
|
|
8
|
+
import { processManager } from '../../core/process-manager.js';
|
|
9
|
+
import { configManager } from '../../core/config-manager.js';
|
|
10
|
+
import { containerManager } from '../../core/container-manager.js';
|
|
11
|
+
import { platformService, isWindows, getWindowsSpawnOptions, } from '../../core/platform-service.js';
|
|
12
|
+
import { paths } from '../../config/paths.js';
|
|
13
|
+
import { defaults, getEngineDefaults } from '../../config/defaults.js';
|
|
14
|
+
import { getBinaryUrl } from './binary-urls.js';
|
|
15
|
+
import { fetchAvailableVersions, getLatestVersion } from './hostdb-releases.js';
|
|
16
|
+
import { SUPPORTED_MAJOR_VERSIONS, POSTGRESQL_VERSION_MAP, } from './version-maps.js';
|
|
17
|
+
import { detectBackupFormat, restoreBackup } from './restore.js';
|
|
18
|
+
import { createBackup } from './backup.js';
|
|
19
|
+
import { validateDumpCompatibility, } from './version-validator.js';
|
|
20
|
+
import { switchHomebrewVersion } from '../../core/homebrew-version-manager.js';
|
|
21
|
+
import { assertValidDatabaseName, assertValidUsername, SpinDBError, ErrorCodes, } from '../../core/error-handler.js';
|
|
22
|
+
import { parseCSVToQueryResult } from '../../core/query-parser.js';
|
|
23
|
+
const execAsync = promisify(exec);
|
|
24
|
+
/**
|
|
25
|
+
* Build a Windows-safe psql command string for either a file or inline SQL.
|
|
26
|
+
* This is exported for unit testing.
|
|
27
|
+
*/
|
|
28
|
+
export function buildWindowsPsqlCommand(psqlPath, port, user, db, options) {
|
|
29
|
+
if (!options.file && !options.sql) {
|
|
30
|
+
throw new Error('Either file or sql option must be provided');
|
|
31
|
+
}
|
|
32
|
+
let cmd = `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${user} -d ${db}`;
|
|
33
|
+
if (options.file) {
|
|
34
|
+
cmd += ` -f "${options.file}"`;
|
|
35
|
+
}
|
|
36
|
+
else if (options.sql) {
|
|
37
|
+
// Escape double quotes in the SQL so the outer double quotes are preserved
|
|
38
|
+
const escaped = options.sql.replace(/"/g, '\\"');
|
|
39
|
+
cmd += ` -c "${escaped}"`;
|
|
40
|
+
}
|
|
41
|
+
return cmd;
|
|
42
|
+
}
|
|
43
|
+
export class PostgreSQLEngine extends BaseEngine {
|
|
44
|
+
name = 'postgresql';
|
|
45
|
+
displayName = 'PostgreSQL';
|
|
46
|
+
defaultPort = getEngineDefaults('postgresql').defaultPort;
|
|
47
|
+
supportedVersions = SUPPORTED_MAJOR_VERSIONS;
|
|
48
|
+
async fetchAvailableVersions() {
|
|
49
|
+
return fetchAvailableVersions();
|
|
50
|
+
}
|
|
51
|
+
getPlatformInfo() {
|
|
52
|
+
const info = platformService.getPlatformInfo();
|
|
53
|
+
return {
|
|
54
|
+
platform: info.platform,
|
|
55
|
+
arch: info.arch,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Resolves version string to full version (e.g., '17' -> '17.7.0').
|
|
59
|
+
resolveFullVersion(version) {
|
|
60
|
+
// Check if already a full version (has at least one dot with numbers after)
|
|
61
|
+
if (/^\d+\.\d+/.test(version)) {
|
|
62
|
+
return version;
|
|
63
|
+
}
|
|
64
|
+
// It's a major version, resolve using fallback map (sync, no network)
|
|
65
|
+
return POSTGRESQL_VERSION_MAP[version] || `${version}.0.0`;
|
|
66
|
+
}
|
|
67
|
+
async resolveFullVersionAsync(version) {
|
|
68
|
+
// Check if already a full version
|
|
69
|
+
if (/^\d+\.\d+/.test(version)) {
|
|
70
|
+
return version;
|
|
71
|
+
}
|
|
72
|
+
// Resolve from network/cache
|
|
73
|
+
return getLatestVersion(version);
|
|
74
|
+
}
|
|
75
|
+
getBinaryPath(version) {
|
|
76
|
+
const fullVersion = this.resolveFullVersion(version);
|
|
77
|
+
const { platform: p, arch: a } = this.getPlatformInfo();
|
|
78
|
+
return paths.getBinaryPath({
|
|
79
|
+
engine: 'postgresql',
|
|
80
|
+
version: fullVersion,
|
|
81
|
+
platform: p,
|
|
82
|
+
arch: a,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Gets the binary path with self-healing fallback logic.
|
|
87
|
+
*
|
|
88
|
+
* If binaries for the exact version don't exist:
|
|
89
|
+
* 1. Looks for any installed binaries with the same major version
|
|
90
|
+
* 2. If found, uses those and optionally updates the container config
|
|
91
|
+
* 3. If not found, downloads the current supported version for that major
|
|
92
|
+
*
|
|
93
|
+
* @param version - The version from container config (e.g., "17.7.0")
|
|
94
|
+
* @param containerName - Container name for config updates (optional)
|
|
95
|
+
* @param onProgress - Progress callback for downloads
|
|
96
|
+
* @returns Object with binPath and actualVersion (may differ from requested)
|
|
97
|
+
*/
|
|
98
|
+
async getBinaryPathWithFallback(version, containerName, onProgress) {
|
|
99
|
+
const fullVersion = this.resolveFullVersion(version);
|
|
100
|
+
const { platform: p, arch: a } = this.getPlatformInfo();
|
|
101
|
+
// Check if exact version binaries exist
|
|
102
|
+
const expectedPath = paths.getBinaryPath({
|
|
103
|
+
engine: 'postgresql',
|
|
104
|
+
version: fullVersion,
|
|
105
|
+
platform: p,
|
|
106
|
+
arch: a,
|
|
107
|
+
});
|
|
108
|
+
const ext = platformService.getExecutableExtension();
|
|
109
|
+
const pgCtlPath = join(expectedPath, 'bin', `pg_ctl${ext}`);
|
|
110
|
+
if (existsSync(pgCtlPath)) {
|
|
111
|
+
return {
|
|
112
|
+
binPath: expectedPath,
|
|
113
|
+
actualVersion: fullVersion,
|
|
114
|
+
wasHealed: false,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// Binaries don't exist - try to find same major version
|
|
118
|
+
const majorVersion = fullVersion.split('.')[0];
|
|
119
|
+
// Check if we have any installed binaries for this major version
|
|
120
|
+
const installed = paths.findInstalledBinaryForMajor('postgresql', majorVersion, p, a);
|
|
121
|
+
if (installed) {
|
|
122
|
+
// Found compatible binaries - verify they work
|
|
123
|
+
const installedPgCtl = join(installed.path, 'bin', `pg_ctl${ext}`);
|
|
124
|
+
if (existsSync(installedPgCtl)) {
|
|
125
|
+
// Update container config if container name provided
|
|
126
|
+
if (containerName) {
|
|
127
|
+
await containerManager.updateConfig(containerName, {
|
|
128
|
+
version: installed.version,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
binPath: installed.path,
|
|
133
|
+
actualVersion: installed.version,
|
|
134
|
+
wasHealed: true,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// No compatible binaries found - download the current supported version
|
|
139
|
+
const targetVersion = POSTGRESQL_VERSION_MAP[majorVersion];
|
|
140
|
+
if (!targetVersion) {
|
|
141
|
+
throw new Error(`PostgreSQL major version ${majorVersion} is not supported. ` +
|
|
142
|
+
`Supported versions: ${SUPPORTED_MAJOR_VERSIONS.join(', ')}`);
|
|
143
|
+
}
|
|
144
|
+
onProgress?.({
|
|
145
|
+
stage: 'downloading',
|
|
146
|
+
message: `Binaries for PostgreSQL ${fullVersion} not found, downloading ${targetVersion}...`,
|
|
147
|
+
});
|
|
148
|
+
const binPath = await this.ensureBinaries(targetVersion, onProgress);
|
|
149
|
+
// Update container config if container name provided
|
|
150
|
+
if (containerName && targetVersion !== fullVersion) {
|
|
151
|
+
await containerManager.updateConfig(containerName, {
|
|
152
|
+
version: targetVersion,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
binPath,
|
|
157
|
+
actualVersion: targetVersion,
|
|
158
|
+
wasHealed: targetVersion !== fullVersion,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
getBinaryUrl(version, plat, arc) {
|
|
162
|
+
return getBinaryUrl(version, plat, arc);
|
|
163
|
+
}
|
|
164
|
+
async verifyBinary(binPath) {
|
|
165
|
+
const { platform: p, arch: a } = this.getPlatformInfo();
|
|
166
|
+
// Extract version from path like "postgresql-17.7.0-darwin-arm64"
|
|
167
|
+
const match = binPath.match(/postgresql-(\d+(?:\.\d+)*)/);
|
|
168
|
+
if (!match) {
|
|
169
|
+
throw new Error(`Could not extract PostgreSQL version from path: ${binPath}`);
|
|
170
|
+
}
|
|
171
|
+
const version = match[1];
|
|
172
|
+
return postgresqlBinaryManager.verify(version, p, a);
|
|
173
|
+
}
|
|
174
|
+
// Downloads binaries and registers all tools (server and client) in config.
|
|
175
|
+
// hostdb bundles all PostgreSQL binaries for all platforms.
|
|
176
|
+
async ensureBinaries(version, onProgress) {
|
|
177
|
+
const { platform: p, arch: a } = this.getPlatformInfo();
|
|
178
|
+
const binPath = await postgresqlBinaryManager.ensureInstalled(version, p, a, onProgress);
|
|
179
|
+
// Register all binaries from downloaded package in config
|
|
180
|
+
const ext = platformService.getExecutableExtension();
|
|
181
|
+
// All PostgreSQL tools bundled in hostdb downloads
|
|
182
|
+
const allTools = [
|
|
183
|
+
// Server binaries
|
|
184
|
+
'postgres',
|
|
185
|
+
'pg_ctl',
|
|
186
|
+
'initdb',
|
|
187
|
+
// Client tools
|
|
188
|
+
'psql',
|
|
189
|
+
'pg_dump',
|
|
190
|
+
'pg_restore',
|
|
191
|
+
'pg_basebackup',
|
|
192
|
+
];
|
|
193
|
+
for (const tool of allTools) {
|
|
194
|
+
const toolPath = join(binPath, 'bin', `${tool}${ext}`);
|
|
195
|
+
if (existsSync(toolPath)) {
|
|
196
|
+
await configManager.setBinaryPath(tool, toolPath, 'bundled');
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return binPath;
|
|
200
|
+
}
|
|
201
|
+
async isBinaryInstalled(version) {
|
|
202
|
+
const { platform: p, arch: a } = this.getPlatformInfo();
|
|
203
|
+
return postgresqlBinaryManager.isInstalled(version, p, a);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Check if any compatible binaries are installed for the given version.
|
|
207
|
+
* Returns true if either the exact version OR any same-major-version binaries exist.
|
|
208
|
+
* This is used by the CLI to determine if it needs to prompt for download.
|
|
209
|
+
*/
|
|
210
|
+
hasCompatibleBinaries(version) {
|
|
211
|
+
const fullVersion = this.resolveFullVersion(version);
|
|
212
|
+
const { platform: p, arch: a } = this.getPlatformInfo();
|
|
213
|
+
// Check if exact version exists
|
|
214
|
+
const expectedPath = paths.getBinaryPath({
|
|
215
|
+
engine: 'postgresql',
|
|
216
|
+
version: fullVersion,
|
|
217
|
+
platform: p,
|
|
218
|
+
arch: a,
|
|
219
|
+
});
|
|
220
|
+
const ext = platformService.getExecutableExtension();
|
|
221
|
+
const pgCtlPath = join(expectedPath, 'bin', `pg_ctl${ext}`);
|
|
222
|
+
if (existsSync(pgCtlPath)) {
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
// Check if any same-major version exists
|
|
226
|
+
const majorVersion = fullVersion.split('.')[0];
|
|
227
|
+
const installed = paths.findInstalledBinaryForMajor('postgresql', majorVersion, p, a);
|
|
228
|
+
return installed !== null;
|
|
229
|
+
}
|
|
230
|
+
async initDataDir(containerName, version, options = {}) {
|
|
231
|
+
const binPath = this.getBinaryPath(version);
|
|
232
|
+
const ext = platformService.getExecutableExtension();
|
|
233
|
+
const initdbPath = join(binPath, 'bin', `initdb${ext}`);
|
|
234
|
+
const dataDir = paths.getContainerDataPath(containerName, {
|
|
235
|
+
engine: this.name,
|
|
236
|
+
});
|
|
237
|
+
await processManager.initdb(initdbPath, dataDir, {
|
|
238
|
+
superuser: options.superuser || defaults.superuser,
|
|
239
|
+
});
|
|
240
|
+
// Configure max_connections after initdb creates postgresql.conf
|
|
241
|
+
const maxConnections = options.maxConnections ||
|
|
242
|
+
getEngineDefaults('postgresql').maxConnections;
|
|
243
|
+
await this.setConfigValue(dataDir, 'max_connections', String(maxConnections));
|
|
244
|
+
return dataDir;
|
|
245
|
+
}
|
|
246
|
+
getConfigPath(containerName) {
|
|
247
|
+
const dataDir = paths.getContainerDataPath(containerName, {
|
|
248
|
+
engine: this.name,
|
|
249
|
+
});
|
|
250
|
+
return join(dataDir, 'postgresql.conf');
|
|
251
|
+
}
|
|
252
|
+
// Updates or appends a configuration value in postgresql.conf.
|
|
253
|
+
async setConfigValue(dataDir, key, value) {
|
|
254
|
+
const configPath = join(dataDir, 'postgresql.conf');
|
|
255
|
+
let content = await readFile(configPath, 'utf8');
|
|
256
|
+
// Match both commented (#key = ...) and uncommented (key = ...) lines
|
|
257
|
+
const regex = new RegExp(`^#?\\s*${key}\\s*=.*$`, 'm');
|
|
258
|
+
if (regex.test(content)) {
|
|
259
|
+
// Update existing line (commented or not)
|
|
260
|
+
content = content.replace(regex, `${key} = ${value}`);
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
// Append to end of file
|
|
264
|
+
content = content.trimEnd() + `\n${key} = ${value}\n`;
|
|
265
|
+
}
|
|
266
|
+
await writeFile(configPath, content, 'utf8');
|
|
267
|
+
}
|
|
268
|
+
async getConfigValue(dataDir, key) {
|
|
269
|
+
const configPath = join(dataDir, 'postgresql.conf');
|
|
270
|
+
const content = await readFile(configPath, 'utf8');
|
|
271
|
+
// Match only uncommented lines
|
|
272
|
+
const regex = new RegExp(`^${key}\\s*=\\s*(.+?)\\s*(?:#.*)?$`, 'm');
|
|
273
|
+
const match = content.match(regex);
|
|
274
|
+
if (match) {
|
|
275
|
+
// Remove quotes if present
|
|
276
|
+
return match[1].replace(/^['"]|['"]$/g, '');
|
|
277
|
+
}
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
async start(container, onProgress) {
|
|
281
|
+
const { name, version, port } = container;
|
|
282
|
+
// Check if already running (idempotent behavior)
|
|
283
|
+
const alreadyRunning = await processManager.isRunning(name, {
|
|
284
|
+
engine: this.name,
|
|
285
|
+
});
|
|
286
|
+
if (alreadyRunning) {
|
|
287
|
+
return {
|
|
288
|
+
port,
|
|
289
|
+
connectionString: this.getConnectionString(container),
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
// Get binary path with self-healing fallback
|
|
293
|
+
const { binPath, wasHealed } = await this.getBinaryPathWithFallback(version, name, onProgress);
|
|
294
|
+
if (wasHealed) {
|
|
295
|
+
onProgress?.({
|
|
296
|
+
stage: 'info',
|
|
297
|
+
message: 'Container version updated to match available binaries',
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
const ext = platformService.getExecutableExtension();
|
|
301
|
+
const pgCtlPath = join(binPath, 'bin', `pg_ctl${ext}`);
|
|
302
|
+
const dataDir = paths.getContainerDataPath(name, { engine: this.name });
|
|
303
|
+
const logFile = paths.getContainerLogPath(name, { engine: this.name });
|
|
304
|
+
onProgress?.({ stage: 'starting', message: 'Starting PostgreSQL...' });
|
|
305
|
+
await processManager.start(pgCtlPath, dataDir, {
|
|
306
|
+
port,
|
|
307
|
+
logFile,
|
|
308
|
+
});
|
|
309
|
+
return {
|
|
310
|
+
port,
|
|
311
|
+
connectionString: this.getConnectionString(container),
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
async stop(container) {
|
|
315
|
+
const { name, version } = container;
|
|
316
|
+
// Get binary path with self-healing fallback (no progress callback for stop)
|
|
317
|
+
const { binPath } = await this.getBinaryPathWithFallback(version, name);
|
|
318
|
+
const ext = platformService.getExecutableExtension();
|
|
319
|
+
const pgCtlPath = join(binPath, 'bin', `pg_ctl${ext}`);
|
|
320
|
+
const dataDir = paths.getContainerDataPath(name, { engine: this.name });
|
|
321
|
+
await processManager.stop(pgCtlPath, dataDir);
|
|
322
|
+
// Kill pgweb if running for this container
|
|
323
|
+
await this.stopPgweb(name);
|
|
324
|
+
}
|
|
325
|
+
async status(container) {
|
|
326
|
+
const { name, version } = container;
|
|
327
|
+
// Get binary path with self-healing fallback (no progress callback for status)
|
|
328
|
+
const { binPath } = await this.getBinaryPathWithFallback(version, name);
|
|
329
|
+
const ext = platformService.getExecutableExtension();
|
|
330
|
+
const pgCtlPath = join(binPath, 'bin', `pg_ctl${ext}`);
|
|
331
|
+
const dataDir = paths.getContainerDataPath(name, { engine: this.name });
|
|
332
|
+
return processManager.status(pgCtlPath, dataDir);
|
|
333
|
+
}
|
|
334
|
+
async detectBackupFormat(filePath) {
|
|
335
|
+
return detectBackupFormat(filePath);
|
|
336
|
+
}
|
|
337
|
+
async restore(container, backupPath, options = {}) {
|
|
338
|
+
const { version, port } = container;
|
|
339
|
+
const binPath = this.getBinaryPath(version);
|
|
340
|
+
const database = options.database || container.name;
|
|
341
|
+
// First create the database if it doesn't exist
|
|
342
|
+
if (options.createDatabase !== false) {
|
|
343
|
+
await this.createDatabase(container, database);
|
|
344
|
+
}
|
|
345
|
+
return restoreBackup(binPath, backupPath, {
|
|
346
|
+
port,
|
|
347
|
+
database,
|
|
348
|
+
user: defaults.superuser,
|
|
349
|
+
pgRestorePath: options.pgRestorePath, // Use custom path if provided
|
|
350
|
+
containerVersion: version, // Pass container version for version-matched binary lookup
|
|
351
|
+
...options,
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
getConnectionString(container, database) {
|
|
355
|
+
const { port } = container;
|
|
356
|
+
const db = database || container.database || 'postgres';
|
|
357
|
+
return `postgresql://${defaults.superuser}@127.0.0.1:${port}/${db}`;
|
|
358
|
+
}
|
|
359
|
+
async getPsqlPath() {
|
|
360
|
+
const psqlPath = await configManager.getBinaryPath('psql');
|
|
361
|
+
if (!psqlPath) {
|
|
362
|
+
throw new Error('psql not found. Install PostgreSQL client tools:\n' +
|
|
363
|
+
' macOS: brew install libpq && brew link --force libpq\n' +
|
|
364
|
+
' Ubuntu/Debian: apt install postgresql-client\n\n' +
|
|
365
|
+
'Or configure manually: spindb config set psql /path/to/psql');
|
|
366
|
+
}
|
|
367
|
+
return psqlPath;
|
|
368
|
+
}
|
|
369
|
+
async getPgRestorePath() {
|
|
370
|
+
const pgRestorePath = await configManager.getBinaryPath('pg_restore');
|
|
371
|
+
if (!pgRestorePath) {
|
|
372
|
+
throw new Error('pg_restore not found. Install PostgreSQL client tools:\n' +
|
|
373
|
+
' macOS: brew install libpq && brew link --force libpq\n' +
|
|
374
|
+
' Ubuntu/Debian: apt install postgresql-client\n\n' +
|
|
375
|
+
'Or configure manually: spindb config set pg_restore /path/to/pg_restore');
|
|
376
|
+
}
|
|
377
|
+
return pgRestorePath;
|
|
378
|
+
}
|
|
379
|
+
async getPgDumpPath() {
|
|
380
|
+
const pgDumpPath = await configManager.getBinaryPath('pg_dump');
|
|
381
|
+
if (!pgDumpPath) {
|
|
382
|
+
throw new Error('pg_dump not found. Install PostgreSQL client tools:\n' +
|
|
383
|
+
' macOS: brew install libpq && brew link --force libpq\n' +
|
|
384
|
+
' Ubuntu/Debian: apt install postgresql-client\n\n' +
|
|
385
|
+
'Or configure manually: spindb config set pg_dump /path/to/pg_dump');
|
|
386
|
+
}
|
|
387
|
+
return pgDumpPath;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Get a compatible pg_dump path for dumping from a remote database
|
|
391
|
+
*
|
|
392
|
+
* This checks the remote database version and finds a compatible pg_dump:
|
|
393
|
+
* 1. First checks if the current pg_dump is compatible
|
|
394
|
+
* 2. If not, tries to find a direct path to a compatible version
|
|
395
|
+
* 3. If that fails, tries to switch Homebrew links
|
|
396
|
+
* 4. If all else fails, throws an error with install instructions
|
|
397
|
+
*/
|
|
398
|
+
async getCompatiblePgDumpPath(connectionString) {
|
|
399
|
+
const warnings = [];
|
|
400
|
+
// Get current pg_dump path with version validation
|
|
401
|
+
const { path, versionMismatch, cachedVersion, actualVersion } = await configManager.getBinaryPathWithVersionCheck('pg_dump');
|
|
402
|
+
if (!path) {
|
|
403
|
+
throw new SpinDBError(ErrorCodes.DEPENDENCY_MISSING, 'pg_dump not found. Install PostgreSQL client tools.', 'fatal', 'macOS: brew install postgresql@17 && brew link --overwrite postgresql@17\n' +
|
|
404
|
+
'Ubuntu/Debian: apt install postgresql-client');
|
|
405
|
+
}
|
|
406
|
+
if (versionMismatch) {
|
|
407
|
+
warnings.push(`pg_dump version changed: ${cachedVersion} -> ${actualVersion} (Homebrew link changed)`);
|
|
408
|
+
}
|
|
409
|
+
// Check compatibility with remote database
|
|
410
|
+
let compatibility;
|
|
411
|
+
try {
|
|
412
|
+
compatibility = await validateDumpCompatibility({
|
|
413
|
+
connectionString,
|
|
414
|
+
pgDumpPath: path,
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
catch (error) {
|
|
418
|
+
// Connection or version detection failed
|
|
419
|
+
const e = error;
|
|
420
|
+
throw new SpinDBError(ErrorCodes.CONNECTION_FAILED, `Failed to detect remote database version: ${e.message}`, 'fatal', 'Check your connection string and ensure the database is accessible.');
|
|
421
|
+
}
|
|
422
|
+
if (compatibility.compatible) {
|
|
423
|
+
return { path, switched: false, warnings };
|
|
424
|
+
}
|
|
425
|
+
// Handle incompatibility based on required action
|
|
426
|
+
// All cases that don't return will fall through to VERSION_MISMATCH error below
|
|
427
|
+
switch (compatibility.requiredAction) {
|
|
428
|
+
case 'use_direct_path':
|
|
429
|
+
if (compatibility.alternativePath) {
|
|
430
|
+
warnings.push(`Using PostgreSQL ${compatibility.switchTarget} pg_dump (remote DB is v${compatibility.remoteDbVersion.majorVersion})`);
|
|
431
|
+
return {
|
|
432
|
+
path: compatibility.alternativePath,
|
|
433
|
+
switched: false,
|
|
434
|
+
warnings,
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
// No alternative path available - fall through to VERSION_MISMATCH error
|
|
438
|
+
break;
|
|
439
|
+
case 'switch_homebrew':
|
|
440
|
+
if (compatibility.switchTarget) {
|
|
441
|
+
const switchResult = await switchHomebrewVersion(compatibility.switchTarget);
|
|
442
|
+
if (switchResult.success) {
|
|
443
|
+
// Refresh config cache after switching
|
|
444
|
+
await configManager.refreshBinaryWithVersion('pg_dump');
|
|
445
|
+
await configManager.refreshBinaryWithVersion('pg_restore');
|
|
446
|
+
await configManager.refreshBinaryWithVersion('psql');
|
|
447
|
+
const newPath = await configManager.getBinaryPath('pg_dump');
|
|
448
|
+
if (newPath) {
|
|
449
|
+
warnings.push(`Switched Homebrew from PostgreSQL ${switchResult.previousVersion} to ${switchResult.currentVersion}`);
|
|
450
|
+
return { path: newPath, switched: true, warnings };
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
// Switch failed or no target - fall through to VERSION_MISMATCH error
|
|
455
|
+
break;
|
|
456
|
+
case 'install':
|
|
457
|
+
// User needs to install manually - fall through to VERSION_MISMATCH error
|
|
458
|
+
break;
|
|
459
|
+
}
|
|
460
|
+
// Cannot auto-fix - throw error with install instructions
|
|
461
|
+
throw new SpinDBError(ErrorCodes.VERSION_MISMATCH, compatibility.error ||
|
|
462
|
+
`Your pg_dump version (${compatibility.localToolVersion.major}) cannot dump from PostgreSQL ${compatibility.remoteDbVersion.majorVersion}`, 'fatal', `Install PostgreSQL ${compatibility.remoteDbVersion.majorVersion} client tools:\n` +
|
|
463
|
+
` brew install postgresql@${compatibility.remoteDbVersion.majorVersion}`, { compatibility });
|
|
464
|
+
}
|
|
465
|
+
async connect(container, database) {
|
|
466
|
+
const { port } = container;
|
|
467
|
+
const db = database || 'postgres';
|
|
468
|
+
const psqlPath = await this.getPsqlPath();
|
|
469
|
+
const spawnOptions = {
|
|
470
|
+
stdio: 'inherit',
|
|
471
|
+
...getWindowsSpawnOptions(),
|
|
472
|
+
};
|
|
473
|
+
return new Promise((resolve, reject) => {
|
|
474
|
+
const proc = spawn(psqlPath, [
|
|
475
|
+
'-h',
|
|
476
|
+
'127.0.0.1',
|
|
477
|
+
'-p',
|
|
478
|
+
String(port),
|
|
479
|
+
'-U',
|
|
480
|
+
defaults.superuser,
|
|
481
|
+
'-d',
|
|
482
|
+
db,
|
|
483
|
+
], spawnOptions);
|
|
484
|
+
proc.on('error', (err) => {
|
|
485
|
+
reject(err);
|
|
486
|
+
});
|
|
487
|
+
proc.on('close', () => resolve());
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
async createDatabase(container, database) {
|
|
491
|
+
assertValidDatabaseName(database);
|
|
492
|
+
const { port } = container;
|
|
493
|
+
const psqlPath = await this.getPsqlPath();
|
|
494
|
+
// On Windows, single quotes don't work in cmd.exe - use double quotes and escape inner quotes
|
|
495
|
+
const sql = `CREATE DATABASE "${database}"`;
|
|
496
|
+
const cmd = isWindows()
|
|
497
|
+
? `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -c "${sql.replace(/"/g, '\\"')}"`
|
|
498
|
+
: `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -c '${sql}'`;
|
|
499
|
+
try {
|
|
500
|
+
await execAsync(cmd);
|
|
501
|
+
}
|
|
502
|
+
catch (error) {
|
|
503
|
+
const err = error;
|
|
504
|
+
// Ignore "database already exists" error
|
|
505
|
+
if (!err.message.includes('already exists')) {
|
|
506
|
+
throw error;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
async dropDatabase(container, database) {
|
|
511
|
+
assertValidDatabaseName(database);
|
|
512
|
+
const { port } = container;
|
|
513
|
+
const psqlPath = await this.getPsqlPath();
|
|
514
|
+
// On Windows, single quotes don't work in cmd.exe - use double quotes and escape inner quotes
|
|
515
|
+
const sql = `DROP DATABASE IF EXISTS "${database}"`;
|
|
516
|
+
const cmd = isWindows()
|
|
517
|
+
? `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -c "${sql.replace(/"/g, '\\"')}"`
|
|
518
|
+
: `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -c '${sql}'`;
|
|
519
|
+
try {
|
|
520
|
+
await execAsync(cmd);
|
|
521
|
+
}
|
|
522
|
+
catch (error) {
|
|
523
|
+
const err = error;
|
|
524
|
+
// Ignore "database does not exist" error
|
|
525
|
+
if (!err.message.includes('does not exist')) {
|
|
526
|
+
throw error;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
async getDatabaseSize(container) {
|
|
531
|
+
const { port, database } = container;
|
|
532
|
+
const db = database || 'postgres';
|
|
533
|
+
// Validate database name to prevent SQL injection
|
|
534
|
+
assertValidDatabaseName(db);
|
|
535
|
+
try {
|
|
536
|
+
const psqlPath = await this.getPsqlPath();
|
|
537
|
+
// Query pg_database_size for the specific database
|
|
538
|
+
// On Windows, use escaped double quotes; on Unix, use single quotes
|
|
539
|
+
const sql = `SELECT pg_database_size('${db}')`;
|
|
540
|
+
const cmd = isWindows()
|
|
541
|
+
? `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -t -A -c "${sql.replace(/'/g, "''")}"`
|
|
542
|
+
: `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -t -A -c "${sql}"`;
|
|
543
|
+
const { stdout } = await execAsync(cmd);
|
|
544
|
+
const size = parseInt(stdout.trim(), 10);
|
|
545
|
+
return isNaN(size) ? null : size;
|
|
546
|
+
}
|
|
547
|
+
catch {
|
|
548
|
+
// Container not running or query failed
|
|
549
|
+
return null;
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Dump a remote database to a file
|
|
554
|
+
*
|
|
555
|
+
* This method automatically detects the remote database version and uses
|
|
556
|
+
* a compatible pg_dump binary. If the current pg_dump is incompatible,
|
|
557
|
+
* it will try to find or switch to a compatible version.
|
|
558
|
+
*/
|
|
559
|
+
async dumpFromConnectionString(connectionString, outputPath) {
|
|
560
|
+
// Get compatible pg_dump path (may switch versions or use direct path)
|
|
561
|
+
const { path: pgDumpPath, warnings } = await this.getCompatiblePgDumpPath(connectionString);
|
|
562
|
+
const spawnOptions = {
|
|
563
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
564
|
+
...getWindowsSpawnOptions(),
|
|
565
|
+
};
|
|
566
|
+
return new Promise((resolve, reject) => {
|
|
567
|
+
const args = [connectionString, '-Fc', '-f', outputPath];
|
|
568
|
+
const proc = spawn(pgDumpPath, args, spawnOptions);
|
|
569
|
+
let stdout = '';
|
|
570
|
+
let stderr = '';
|
|
571
|
+
proc.stdout?.on('data', (data) => {
|
|
572
|
+
stdout += data.toString();
|
|
573
|
+
});
|
|
574
|
+
proc.stderr?.on('data', (data) => {
|
|
575
|
+
stderr += data.toString();
|
|
576
|
+
});
|
|
577
|
+
proc.on('error', (err) => {
|
|
578
|
+
reject(err);
|
|
579
|
+
});
|
|
580
|
+
proc.on('close', (code) => {
|
|
581
|
+
if (code === 0) {
|
|
582
|
+
resolve({
|
|
583
|
+
filePath: outputPath,
|
|
584
|
+
stdout,
|
|
585
|
+
stderr,
|
|
586
|
+
code,
|
|
587
|
+
warnings,
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
else {
|
|
591
|
+
// pg_dump failed
|
|
592
|
+
const errorMessage = stderr || `pg_dump exited with code ${code}`;
|
|
593
|
+
reject(new Error(errorMessage));
|
|
594
|
+
}
|
|
595
|
+
});
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
async backup(container, outputPath, options) {
|
|
599
|
+
return createBackup(container, outputPath, options);
|
|
600
|
+
}
|
|
601
|
+
async terminateConnections(container, database) {
|
|
602
|
+
assertValidDatabaseName(database);
|
|
603
|
+
const { port } = container;
|
|
604
|
+
const psqlPath = await this.getPsqlPath();
|
|
605
|
+
// Terminate all connections to the database except our own
|
|
606
|
+
const sql = `SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '${database}' AND pid <> pg_backend_pid()`;
|
|
607
|
+
// Connect to 'postgres' database for admin operations
|
|
608
|
+
// Escape single quotes for shell: ' becomes '\'' (end quote, escaped quote, start quote)
|
|
609
|
+
const shellEscapedSql = sql.replace(/'/g, "'\\''");
|
|
610
|
+
const cmd = isWindows()
|
|
611
|
+
? `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -c "${sql.replace(/"/g, '\\"')}"`
|
|
612
|
+
: `"${psqlPath}" -h 127.0.0.1 -p ${port} -U ${defaults.superuser} -d postgres -c '${shellEscapedSql}'`;
|
|
613
|
+
try {
|
|
614
|
+
await execAsync(cmd);
|
|
615
|
+
}
|
|
616
|
+
catch {
|
|
617
|
+
// Ignore errors - connections may already be gone
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
async runScript(container, options) {
|
|
621
|
+
const { port } = container;
|
|
622
|
+
const db = options.database || container.database || 'postgres';
|
|
623
|
+
const psqlPath = await this.getPsqlPath();
|
|
624
|
+
// On Windows, build a single command string and use exec to avoid
|
|
625
|
+
// passing an args array with shell:true (DEP0190 and quoting issues).
|
|
626
|
+
if (isWindows()) {
|
|
627
|
+
const cmd = buildWindowsPsqlCommand(psqlPath, port, defaults.superuser, db, options);
|
|
628
|
+
try {
|
|
629
|
+
const { stdout, stderr } = await execAsync(cmd);
|
|
630
|
+
if (stdout)
|
|
631
|
+
process.stdout.write(stdout);
|
|
632
|
+
if (stderr)
|
|
633
|
+
process.stderr.write(stderr);
|
|
634
|
+
return;
|
|
635
|
+
}
|
|
636
|
+
catch (error) {
|
|
637
|
+
const err = error;
|
|
638
|
+
throw new Error(`psql failed: ${err.message}`);
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
// Non-Windows: spawn directly with args (no shell)
|
|
642
|
+
const args = [
|
|
643
|
+
'-h',
|
|
644
|
+
'127.0.0.1',
|
|
645
|
+
'-p',
|
|
646
|
+
String(port),
|
|
647
|
+
'-U',
|
|
648
|
+
defaults.superuser,
|
|
649
|
+
'-d',
|
|
650
|
+
db,
|
|
651
|
+
];
|
|
652
|
+
if (options.file) {
|
|
653
|
+
args.push('-f', options.file);
|
|
654
|
+
}
|
|
655
|
+
else if (options.sql) {
|
|
656
|
+
args.push('-c', options.sql);
|
|
657
|
+
}
|
|
658
|
+
else {
|
|
659
|
+
throw new Error('Either file or sql option must be provided');
|
|
660
|
+
}
|
|
661
|
+
const spawnOptions = {
|
|
662
|
+
stdio: 'inherit',
|
|
663
|
+
};
|
|
664
|
+
return new Promise((resolve, reject) => {
|
|
665
|
+
const proc = spawn(psqlPath, args, spawnOptions);
|
|
666
|
+
proc.on('error', (err) => {
|
|
667
|
+
reject(err);
|
|
668
|
+
});
|
|
669
|
+
proc.on('close', (code) => {
|
|
670
|
+
if (code === 0) {
|
|
671
|
+
resolve();
|
|
672
|
+
}
|
|
673
|
+
else {
|
|
674
|
+
reject(new Error(`psql exited with code ${code}`));
|
|
675
|
+
}
|
|
676
|
+
});
|
|
677
|
+
});
|
|
678
|
+
}
|
|
679
|
+
async executeQuery(container, query, options) {
|
|
680
|
+
const { port } = container;
|
|
681
|
+
const db = options?.database || container.database || 'postgres';
|
|
682
|
+
const psqlPath = await this.getPsqlPath();
|
|
683
|
+
// Use --csv for machine-readable output
|
|
684
|
+
const args = [
|
|
685
|
+
'-X', // Skip ~/.psqlrc to ensure deterministic CSV output
|
|
686
|
+
'-h',
|
|
687
|
+
'127.0.0.1',
|
|
688
|
+
'-p',
|
|
689
|
+
String(port),
|
|
690
|
+
'-U',
|
|
691
|
+
defaults.superuser,
|
|
692
|
+
'-d',
|
|
693
|
+
db,
|
|
694
|
+
'--csv',
|
|
695
|
+
'-c',
|
|
696
|
+
query,
|
|
697
|
+
];
|
|
698
|
+
return new Promise((resolve, reject) => {
|
|
699
|
+
const proc = spawn(psqlPath, args, {
|
|
700
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
701
|
+
});
|
|
702
|
+
let stdout = '';
|
|
703
|
+
let stderr = '';
|
|
704
|
+
proc.stdout?.on('data', (data) => {
|
|
705
|
+
stdout += data.toString();
|
|
706
|
+
});
|
|
707
|
+
proc.stderr?.on('data', (data) => {
|
|
708
|
+
stderr += data.toString();
|
|
709
|
+
});
|
|
710
|
+
proc.on('error', (err) => {
|
|
711
|
+
reject(err);
|
|
712
|
+
});
|
|
713
|
+
proc.on('close', (code) => {
|
|
714
|
+
if (code === 0) {
|
|
715
|
+
resolve(parseCSVToQueryResult(stdout));
|
|
716
|
+
}
|
|
717
|
+
else {
|
|
718
|
+
reject(new Error(stderr || `psql exited with code ${code}`));
|
|
719
|
+
}
|
|
720
|
+
});
|
|
721
|
+
});
|
|
722
|
+
}
|
|
723
|
+
/**
|
|
724
|
+
* List all user databases, excluding system databases (template0, template1, postgres).
|
|
725
|
+
*/
|
|
726
|
+
async listDatabases(container) {
|
|
727
|
+
const { port } = container;
|
|
728
|
+
const psqlPath = await this.getPsqlPath();
|
|
729
|
+
// Query pg_database for all non-system databases
|
|
730
|
+
const sql = `SELECT datname FROM pg_database WHERE datname NOT IN ('template0', 'template1', 'postgres') AND datistemplate = false ORDER BY datname`;
|
|
731
|
+
const args = [
|
|
732
|
+
'-X', // Skip ~/.psqlrc
|
|
733
|
+
'-h',
|
|
734
|
+
'127.0.0.1',
|
|
735
|
+
'-p',
|
|
736
|
+
String(port),
|
|
737
|
+
'-U',
|
|
738
|
+
defaults.superuser,
|
|
739
|
+
'-d',
|
|
740
|
+
'postgres',
|
|
741
|
+
'-t', // Tuples only (no headers)
|
|
742
|
+
'-A', // Unaligned output
|
|
743
|
+
'-c',
|
|
744
|
+
sql,
|
|
745
|
+
];
|
|
746
|
+
return new Promise((resolve, reject) => {
|
|
747
|
+
const proc = spawn(psqlPath, args, {
|
|
748
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
749
|
+
});
|
|
750
|
+
let stdout = '';
|
|
751
|
+
let stderr = '';
|
|
752
|
+
proc.stdout?.on('data', (data) => {
|
|
753
|
+
stdout += data.toString();
|
|
754
|
+
});
|
|
755
|
+
proc.stderr?.on('data', (data) => {
|
|
756
|
+
stderr += data.toString();
|
|
757
|
+
});
|
|
758
|
+
proc.on('error', (err) => {
|
|
759
|
+
reject(err);
|
|
760
|
+
});
|
|
761
|
+
proc.on('close', (code) => {
|
|
762
|
+
if (code === 0) {
|
|
763
|
+
const databases = stdout
|
|
764
|
+
.trim()
|
|
765
|
+
.split('\n')
|
|
766
|
+
.map((db) => db.trim())
|
|
767
|
+
.filter((db) => db.length > 0);
|
|
768
|
+
resolve(databases);
|
|
769
|
+
}
|
|
770
|
+
else {
|
|
771
|
+
reject(new Error(stderr || `psql exited with code ${code}`));
|
|
772
|
+
}
|
|
773
|
+
});
|
|
774
|
+
});
|
|
775
|
+
}
|
|
776
|
+
async createUser(container, options) {
|
|
777
|
+
const { username, password, database } = options;
|
|
778
|
+
assertValidUsername(username);
|
|
779
|
+
const { port } = container;
|
|
780
|
+
const db = database || container.database;
|
|
781
|
+
if (!db) {
|
|
782
|
+
throw new Error('No target database specified. Provide a database name with --database or ensure the container has a default database.');
|
|
783
|
+
}
|
|
784
|
+
assertValidDatabaseName(db);
|
|
785
|
+
const psqlPath = await this.getPsqlPath();
|
|
786
|
+
// Pass SQL via stdin (psql -f -) to avoid exposing passwords in process listings
|
|
787
|
+
const psqlBaseArgs = [
|
|
788
|
+
'-h',
|
|
789
|
+
'127.0.0.1',
|
|
790
|
+
'-p',
|
|
791
|
+
String(port),
|
|
792
|
+
'-U',
|
|
793
|
+
defaults.superuser,
|
|
794
|
+
'-d',
|
|
795
|
+
'postgres',
|
|
796
|
+
'-f',
|
|
797
|
+
'-',
|
|
798
|
+
];
|
|
799
|
+
const runPsqlViaStdin = (sql) => new Promise((resolve, reject) => {
|
|
800
|
+
const proc = spawn(psqlPath, psqlBaseArgs, {
|
|
801
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
802
|
+
...getWindowsSpawnOptions(),
|
|
803
|
+
});
|
|
804
|
+
let stderr = '';
|
|
805
|
+
proc.stderr?.on('data', (data) => {
|
|
806
|
+
stderr += data.toString();
|
|
807
|
+
});
|
|
808
|
+
proc.on('error', reject);
|
|
809
|
+
proc.on('close', (code) => {
|
|
810
|
+
if (code === 0)
|
|
811
|
+
resolve();
|
|
812
|
+
else
|
|
813
|
+
reject(new Error(stderr || `psql exited with code ${code}`));
|
|
814
|
+
});
|
|
815
|
+
proc.stdin?.write(sql);
|
|
816
|
+
proc.stdin?.end();
|
|
817
|
+
});
|
|
818
|
+
// Escape username for safe identifier interpolation (defense-in-depth)
|
|
819
|
+
const escapedIdent = username.replace(/"/g, '""');
|
|
820
|
+
const escapedPass = password.replace(/'/g, "''");
|
|
821
|
+
// Create the role with login and password
|
|
822
|
+
const createRoleSql = `CREATE ROLE "${escapedIdent}" WITH LOGIN PASSWORD '${escapedPass}'`;
|
|
823
|
+
try {
|
|
824
|
+
await runPsqlViaStdin(createRoleSql);
|
|
825
|
+
}
|
|
826
|
+
catch (error) {
|
|
827
|
+
const err = error;
|
|
828
|
+
if (err.message.includes('already exists')) {
|
|
829
|
+
// User exists — update password instead
|
|
830
|
+
const alterSql = `ALTER ROLE "${escapedIdent}" WITH PASSWORD '${escapedPass}'`;
|
|
831
|
+
await runPsqlViaStdin(alterSql);
|
|
832
|
+
}
|
|
833
|
+
else {
|
|
834
|
+
throw error;
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
// Grant all privileges on the target database
|
|
838
|
+
const grantSql = `GRANT ALL PRIVILEGES ON DATABASE "${db}" TO "${escapedIdent}"`;
|
|
839
|
+
await runPsqlViaStdin(grantSql);
|
|
840
|
+
const connectionString = `postgresql://${encodeURIComponent(username)}:${encodeURIComponent(password)}@127.0.0.1:${port}/${db}`;
|
|
841
|
+
return {
|
|
842
|
+
username,
|
|
843
|
+
password,
|
|
844
|
+
connectionString,
|
|
845
|
+
engine: container.engine,
|
|
846
|
+
container: container.name,
|
|
847
|
+
database: db,
|
|
848
|
+
};
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
export const postgresqlEngine = new PostgreSQLEngine();
|
|
852
|
+
//# sourceMappingURL=index.js.map
|