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
|
@@ -1,787 +0,0 @@
|
|
|
1
|
-
import { existsSync } from 'fs'
|
|
2
|
-
import {
|
|
3
|
-
mkdir,
|
|
4
|
-
readdir,
|
|
5
|
-
readFile,
|
|
6
|
-
writeFile,
|
|
7
|
-
rm,
|
|
8
|
-
cp,
|
|
9
|
-
unlink,
|
|
10
|
-
rename as fsRename,
|
|
11
|
-
} from 'fs/promises'
|
|
12
|
-
import { paths } from '../config/paths'
|
|
13
|
-
import { processManager } from './process-manager'
|
|
14
|
-
import { portManager } from './port-manager'
|
|
15
|
-
import { isWindows } from './platform-service'
|
|
16
|
-
import { logDebug, UnsupportedOperationError } from './error-handler'
|
|
17
|
-
import { getEngineDefaults, getSupportedEngines } from '../config/defaults'
|
|
18
|
-
import { getEngine } from '../engines'
|
|
19
|
-
import { sqliteRegistry } from '../engines/sqlite/registry'
|
|
20
|
-
import { duckdbRegistry } from '../engines/duckdb/registry'
|
|
21
|
-
import type { ContainerConfig } from '../types'
|
|
22
|
-
import { Engine, isFileBasedEngine } from '../types'
|
|
23
|
-
|
|
24
|
-
export type CreateOptions = {
|
|
25
|
-
engine: Engine
|
|
26
|
-
version: string
|
|
27
|
-
port: number
|
|
28
|
-
database: string
|
|
29
|
-
/** Path to the engine binary (for system-installed engines like MySQL, MongoDB, Redis) */
|
|
30
|
-
binaryPath?: string
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export type DeleteOptions = {
|
|
34
|
-
force?: boolean
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export class ContainerManager {
|
|
38
|
-
async create(name: string, options: CreateOptions): Promise<ContainerConfig> {
|
|
39
|
-
const { engine, version, port, database, binaryPath } = options
|
|
40
|
-
|
|
41
|
-
// Validate container name
|
|
42
|
-
if (!this.isValidName(name)) {
|
|
43
|
-
throw new Error(
|
|
44
|
-
'Container name must be alphanumeric with hyphens/underscores only',
|
|
45
|
-
)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Check if container already exists (for this engine)
|
|
49
|
-
if (await this.exists(name, { engine })) {
|
|
50
|
-
throw new Error(`Container "${name}" already exists for engine ${engine}`)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// Create container directory (engine-scoped)
|
|
54
|
-
const containerPath = paths.getContainerPath(name, { engine })
|
|
55
|
-
const dataPath = paths.getContainerDataPath(name, { engine })
|
|
56
|
-
|
|
57
|
-
await mkdir(containerPath, { recursive: true })
|
|
58
|
-
await mkdir(dataPath, { recursive: true })
|
|
59
|
-
|
|
60
|
-
// Create container config
|
|
61
|
-
const config: ContainerConfig = {
|
|
62
|
-
name,
|
|
63
|
-
engine,
|
|
64
|
-
version,
|
|
65
|
-
port,
|
|
66
|
-
database,
|
|
67
|
-
databases: [database],
|
|
68
|
-
created: new Date().toISOString(),
|
|
69
|
-
status: 'created',
|
|
70
|
-
// Store binary path for system-installed engines (MySQL, MongoDB, Redis)
|
|
71
|
-
// This ensures version consistency when starting the container
|
|
72
|
-
...(binaryPath && { binaryPath }),
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
await this.saveConfig(name, { engine }, config)
|
|
76
|
-
|
|
77
|
-
return config
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// If engine is not provided, searches all engine directories.
|
|
81
|
-
// Automatically migrates old schemas to include databases array.
|
|
82
|
-
async getConfig(
|
|
83
|
-
name: string,
|
|
84
|
-
options?: { engine?: string },
|
|
85
|
-
): Promise<ContainerConfig | null> {
|
|
86
|
-
const { engine } = options || {}
|
|
87
|
-
|
|
88
|
-
if (engine) {
|
|
89
|
-
// SQLite uses registry instead of filesystem
|
|
90
|
-
if (engine === Engine.SQLite) {
|
|
91
|
-
return this.getSqliteConfig(name)
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Look in specific engine directory
|
|
95
|
-
const configPath = paths.getContainerConfigPath(name, { engine })
|
|
96
|
-
if (!existsSync(configPath)) {
|
|
97
|
-
return null
|
|
98
|
-
}
|
|
99
|
-
const content = await readFile(configPath, 'utf8')
|
|
100
|
-
const config = JSON.parse(content) as ContainerConfig
|
|
101
|
-
return this.migrateConfig(config)
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Search SQLite registry first
|
|
105
|
-
const sqliteConfig = await this.getSqliteConfig(name)
|
|
106
|
-
if (sqliteConfig) {
|
|
107
|
-
return sqliteConfig
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Search DuckDB registry
|
|
111
|
-
const duckdbConfig = await this.getDuckDBConfig(name)
|
|
112
|
-
if (duckdbConfig) {
|
|
113
|
-
return duckdbConfig
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Search all engine directories (excluding file-based engines which use registries)
|
|
117
|
-
const engines = getSupportedEngines().filter(
|
|
118
|
-
(e) => e !== 'sqlite' && e !== 'duckdb',
|
|
119
|
-
)
|
|
120
|
-
for (const eng of engines) {
|
|
121
|
-
const configPath = paths.getContainerConfigPath(name, { engine: eng })
|
|
122
|
-
if (existsSync(configPath)) {
|
|
123
|
-
const content = await readFile(configPath, 'utf8')
|
|
124
|
-
const config = JSON.parse(content) as ContainerConfig
|
|
125
|
-
return this.migrateConfig(config)
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
return null
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
private async getSqliteConfig(name: string): Promise<ContainerConfig | null> {
|
|
133
|
-
const entry = await sqliteRegistry.get(name)
|
|
134
|
-
if (!entry) {
|
|
135
|
-
return null
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// Convert registry entry to ContainerConfig format
|
|
139
|
-
const fileExists = existsSync(entry.filePath)
|
|
140
|
-
return {
|
|
141
|
-
name: entry.name,
|
|
142
|
-
engine: Engine.SQLite,
|
|
143
|
-
version: '3',
|
|
144
|
-
port: 0,
|
|
145
|
-
database: entry.filePath, // For SQLite, database field stores file path
|
|
146
|
-
databases: [entry.filePath],
|
|
147
|
-
created: entry.created,
|
|
148
|
-
status: fileExists ? 'running' : 'stopped', // "running" = file exists
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
private async getDuckDBConfig(name: string): Promise<ContainerConfig | null> {
|
|
153
|
-
const entry = await duckdbRegistry.get(name)
|
|
154
|
-
if (!entry) {
|
|
155
|
-
return null
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Convert registry entry to ContainerConfig format
|
|
159
|
-
const fileExists = existsSync(entry.filePath)
|
|
160
|
-
return {
|
|
161
|
-
name: entry.name,
|
|
162
|
-
engine: Engine.DuckDB,
|
|
163
|
-
version: '1',
|
|
164
|
-
port: 0,
|
|
165
|
-
database: entry.filePath, // For DuckDB, database field stores file path
|
|
166
|
-
databases: [entry.filePath],
|
|
167
|
-
created: entry.created,
|
|
168
|
-
status: fileExists ? 'running' : 'stopped', // "running" = file exists
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// Migrates old container configs to include databases array.
|
|
173
|
-
private async migrateConfig(
|
|
174
|
-
config: ContainerConfig,
|
|
175
|
-
): Promise<ContainerConfig> {
|
|
176
|
-
let needsSave = false
|
|
177
|
-
|
|
178
|
-
// If databases array is missing, create it with the primary database
|
|
179
|
-
if (!config.databases) {
|
|
180
|
-
config.databases = [config.database]
|
|
181
|
-
needsSave = true
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// Ensure primary database is in the array
|
|
185
|
-
if (!config.databases.includes(config.database)) {
|
|
186
|
-
config.databases = [config.database, ...config.databases]
|
|
187
|
-
needsSave = true
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
// Save if we made changes
|
|
191
|
-
if (needsSave) {
|
|
192
|
-
await this.saveConfig(config.name, { engine: config.engine }, config)
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
return config
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
async saveConfig(
|
|
199
|
-
name: string,
|
|
200
|
-
options: { engine: string },
|
|
201
|
-
config: ContainerConfig,
|
|
202
|
-
): Promise<void> {
|
|
203
|
-
const { engine } = options
|
|
204
|
-
const configPath = paths.getContainerConfigPath(name, { engine })
|
|
205
|
-
await writeFile(configPath, JSON.stringify(config, null, 2))
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
async updateConfig(
|
|
209
|
-
name: string,
|
|
210
|
-
updates: Partial<ContainerConfig>,
|
|
211
|
-
): Promise<ContainerConfig> {
|
|
212
|
-
const config = await this.getConfig(name)
|
|
213
|
-
if (!config) {
|
|
214
|
-
throw new Error(`Container "${name}" not found`)
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
const updatedConfig = { ...config, ...updates }
|
|
218
|
-
await this.saveConfig(name, { engine: config.engine }, updatedConfig)
|
|
219
|
-
return updatedConfig
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
async exists(name: string, options?: { engine?: string }): Promise<boolean> {
|
|
223
|
-
const { engine } = options || {}
|
|
224
|
-
|
|
225
|
-
if (engine) {
|
|
226
|
-
// SQLite uses registry
|
|
227
|
-
if (engine === Engine.SQLite) {
|
|
228
|
-
return sqliteRegistry.exists(name)
|
|
229
|
-
}
|
|
230
|
-
const configPath = paths.getContainerConfigPath(name, { engine })
|
|
231
|
-
return existsSync(configPath)
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// Check SQLite registry first
|
|
235
|
-
if (await sqliteRegistry.exists(name)) {
|
|
236
|
-
return true
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
// Check DuckDB registry
|
|
240
|
-
if (await duckdbRegistry.exists(name)) {
|
|
241
|
-
return true
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// Check all engine directories (excluding file-based engines)
|
|
245
|
-
const engines = getSupportedEngines().filter(
|
|
246
|
-
(e) => e !== 'sqlite' && e !== 'duckdb',
|
|
247
|
-
)
|
|
248
|
-
for (const eng of engines) {
|
|
249
|
-
const configPath = paths.getContainerConfigPath(name, { engine: eng })
|
|
250
|
-
if (existsSync(configPath)) {
|
|
251
|
-
return true
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
return false
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
async list(): Promise<ContainerConfig[]> {
|
|
259
|
-
const containers: ContainerConfig[] = []
|
|
260
|
-
|
|
261
|
-
// List SQLite containers from registry
|
|
262
|
-
const sqliteEntries = await sqliteRegistry.list()
|
|
263
|
-
for (const entry of sqliteEntries) {
|
|
264
|
-
const fileExists = existsSync(entry.filePath)
|
|
265
|
-
containers.push({
|
|
266
|
-
name: entry.name,
|
|
267
|
-
engine: Engine.SQLite,
|
|
268
|
-
version: '3',
|
|
269
|
-
port: 0,
|
|
270
|
-
database: entry.filePath,
|
|
271
|
-
databases: [entry.filePath],
|
|
272
|
-
created: entry.created,
|
|
273
|
-
status: fileExists ? 'running' : 'stopped', // "running" = file exists
|
|
274
|
-
})
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// List DuckDB containers from registry
|
|
278
|
-
const duckdbEntries = await duckdbRegistry.list()
|
|
279
|
-
for (const entry of duckdbEntries) {
|
|
280
|
-
const fileExists = existsSync(entry.filePath)
|
|
281
|
-
containers.push({
|
|
282
|
-
name: entry.name,
|
|
283
|
-
engine: Engine.DuckDB,
|
|
284
|
-
version: '1',
|
|
285
|
-
port: 0,
|
|
286
|
-
database: entry.filePath,
|
|
287
|
-
databases: [entry.filePath],
|
|
288
|
-
created: entry.created,
|
|
289
|
-
status: fileExists ? 'running' : 'stopped', // "running" = file exists
|
|
290
|
-
})
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
// List server-based containers (PostgreSQL, MySQL, etc.)
|
|
294
|
-
const containersDir = paths.containers
|
|
295
|
-
if (!existsSync(containersDir)) {
|
|
296
|
-
return containers
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
const engines = getSupportedEngines().filter(
|
|
300
|
-
(e) => e !== 'sqlite' && e !== 'duckdb',
|
|
301
|
-
)
|
|
302
|
-
|
|
303
|
-
// Collect all container check promises for parallel execution
|
|
304
|
-
const containerChecks: Promise<ContainerConfig | null>[] = []
|
|
305
|
-
|
|
306
|
-
for (const engine of engines) {
|
|
307
|
-
const engineDir = paths.getEngineContainersPath(engine)
|
|
308
|
-
if (!existsSync(engineDir)) {
|
|
309
|
-
continue
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
const entries = await readdir(engineDir, { withFileTypes: true })
|
|
313
|
-
|
|
314
|
-
for (const entry of entries) {
|
|
315
|
-
if (entry.isDirectory()) {
|
|
316
|
-
// Push async check as promise (don't await yet)
|
|
317
|
-
containerChecks.push(
|
|
318
|
-
(async () => {
|
|
319
|
-
const config = await this.getConfig(entry.name, { engine })
|
|
320
|
-
if (!config) return null
|
|
321
|
-
const running = await processManager.isRunning(entry.name, {
|
|
322
|
-
engine,
|
|
323
|
-
})
|
|
324
|
-
return { ...config, status: running ? 'running' : 'stopped' }
|
|
325
|
-
})(),
|
|
326
|
-
)
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
// Execute all container checks in parallel
|
|
332
|
-
const results = await Promise.all(containerChecks)
|
|
333
|
-
containers.push(...results.filter((c): c is ContainerConfig => c !== null))
|
|
334
|
-
|
|
335
|
-
return containers
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
async delete(name: string, options: DeleteOptions = {}): Promise<void> {
|
|
339
|
-
const { force = false } = options
|
|
340
|
-
|
|
341
|
-
// Get container config to find engine
|
|
342
|
-
const config = await this.getConfig(name)
|
|
343
|
-
if (!config) {
|
|
344
|
-
throw new Error(`Container "${name}" not found`)
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
const { engine } = config
|
|
348
|
-
|
|
349
|
-
// SQLite: delete file, remove from registry, and clean up container directory
|
|
350
|
-
if (engine === Engine.SQLite) {
|
|
351
|
-
const entry = await sqliteRegistry.get(name)
|
|
352
|
-
if (entry && existsSync(entry.filePath)) {
|
|
353
|
-
await unlink(entry.filePath)
|
|
354
|
-
}
|
|
355
|
-
await sqliteRegistry.remove(name)
|
|
356
|
-
|
|
357
|
-
// Also remove the container directory (created by containerManager.create)
|
|
358
|
-
const containerPath = paths.getContainerPath(name, { engine })
|
|
359
|
-
if (existsSync(containerPath)) {
|
|
360
|
-
await rm(containerPath, { recursive: true, force: true })
|
|
361
|
-
}
|
|
362
|
-
return
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
// DuckDB: delete file, remove from registry, and clean up container directory
|
|
366
|
-
if (engine === Engine.DuckDB) {
|
|
367
|
-
const entry = await duckdbRegistry.get(name)
|
|
368
|
-
if (entry && existsSync(entry.filePath)) {
|
|
369
|
-
await unlink(entry.filePath)
|
|
370
|
-
}
|
|
371
|
-
await duckdbRegistry.remove(name)
|
|
372
|
-
|
|
373
|
-
// Also remove the container directory (created by containerManager.create)
|
|
374
|
-
const containerPath = paths.getContainerPath(name, { engine })
|
|
375
|
-
if (existsSync(containerPath)) {
|
|
376
|
-
await rm(containerPath, { recursive: true, force: true })
|
|
377
|
-
}
|
|
378
|
-
return
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
// Server databases: check if running first
|
|
382
|
-
const running = await processManager.isRunning(name, { engine })
|
|
383
|
-
if (running && !force) {
|
|
384
|
-
throw new Error(
|
|
385
|
-
`Container "${name}" is running. Stop it first or use --force`,
|
|
386
|
-
)
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
const containerPath = paths.getContainerPath(name, { engine })
|
|
390
|
-
await this.safeRemoveDirectory(containerPath)
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
// Removes a directory with retry logic for Windows EBUSY errors.
|
|
394
|
-
// Windows may hold file handles after process termination.
|
|
395
|
-
// Windows can hold file locks for 120+ seconds due to:
|
|
396
|
-
// - Antivirus software scanning
|
|
397
|
-
// - Windows Search indexer
|
|
398
|
-
// - Memory-mapped files (SurrealDB's SurrealKV, QuestDB's columnar storage)
|
|
399
|
-
// - Java JVM file handle cleanup (QuestDB)
|
|
400
|
-
private async safeRemoveDirectory(dirPath: string): Promise<void> {
|
|
401
|
-
const maxRetries = isWindows() ? 90 : 1 // 90 retries × 2s = 180 seconds max
|
|
402
|
-
const retryDelay = 2000 // 2 seconds between retries
|
|
403
|
-
|
|
404
|
-
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
405
|
-
try {
|
|
406
|
-
await rm(dirPath, { recursive: true, force: true })
|
|
407
|
-
return // Success
|
|
408
|
-
} catch (error) {
|
|
409
|
-
const e = error as NodeJS.ErrnoException
|
|
410
|
-
if (e.code === 'EBUSY' && attempt < maxRetries) {
|
|
411
|
-
logDebug(
|
|
412
|
-
`EBUSY on rmdir attempt ${attempt}/${maxRetries}, retrying in ${retryDelay}ms...`,
|
|
413
|
-
)
|
|
414
|
-
await new Promise((resolve) => setTimeout(resolve, retryDelay))
|
|
415
|
-
} else {
|
|
416
|
-
throw error
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
async clone(
|
|
423
|
-
sourceName: string,
|
|
424
|
-
targetName: string,
|
|
425
|
-
): Promise<ContainerConfig> {
|
|
426
|
-
// Validate target name
|
|
427
|
-
if (!this.isValidName(targetName)) {
|
|
428
|
-
throw new Error(
|
|
429
|
-
'Container name must be alphanumeric with hyphens/underscores only',
|
|
430
|
-
)
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
// Get source config
|
|
434
|
-
const sourceConfig = await this.getConfig(sourceName)
|
|
435
|
-
if (!sourceConfig) {
|
|
436
|
-
throw new Error(`Source container "${sourceName}" not found`)
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
const { engine } = sourceConfig
|
|
440
|
-
|
|
441
|
-
// Check target doesn't exist (for this engine)
|
|
442
|
-
if (await this.exists(targetName, { engine })) {
|
|
443
|
-
throw new Error(`Target container "${targetName}" already exists`)
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
// Check source is not running
|
|
447
|
-
const running = await processManager.isRunning(sourceName, { engine })
|
|
448
|
-
if (running) {
|
|
449
|
-
throw new Error(
|
|
450
|
-
`Source container "${sourceName}" is running. Stop it first`,
|
|
451
|
-
)
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
// Copy container directory
|
|
455
|
-
const sourcePath = paths.getContainerPath(sourceName, { engine })
|
|
456
|
-
const targetPath = paths.getContainerPath(targetName, { engine })
|
|
457
|
-
|
|
458
|
-
await cp(sourcePath, targetPath, { recursive: true })
|
|
459
|
-
|
|
460
|
-
// If anything fails after copy, clean up the target directory
|
|
461
|
-
try {
|
|
462
|
-
// Update target config
|
|
463
|
-
const config = await this.getConfig(targetName, { engine })
|
|
464
|
-
if (!config) {
|
|
465
|
-
throw new Error('Failed to read cloned container config')
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
config.name = targetName
|
|
469
|
-
config.created = new Date().toISOString()
|
|
470
|
-
config.clonedFrom = sourceName
|
|
471
|
-
|
|
472
|
-
// Assign new port (excluding ports already used by other containers)
|
|
473
|
-
const engineDefaults = getEngineDefaults(engine)
|
|
474
|
-
const { port } = await portManager.findAvailablePortExcludingContainers({
|
|
475
|
-
portRange: engineDefaults.portRange,
|
|
476
|
-
})
|
|
477
|
-
config.port = port
|
|
478
|
-
|
|
479
|
-
await this.saveConfig(targetName, { engine }, config)
|
|
480
|
-
|
|
481
|
-
// ClickHouse stores absolute paths in config.xml - regenerate with new paths
|
|
482
|
-
if (engine === Engine.ClickHouse) {
|
|
483
|
-
const clickhouseEngine = getEngine(Engine.ClickHouse)
|
|
484
|
-
if ('regenerateConfig' in clickhouseEngine) {
|
|
485
|
-
await (
|
|
486
|
-
clickhouseEngine as {
|
|
487
|
-
regenerateConfig: (name: string, port: number) => Promise<void>
|
|
488
|
-
}
|
|
489
|
-
).regenerateConfig(targetName, config.port)
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
return config
|
|
494
|
-
} catch (error) {
|
|
495
|
-
// Clean up the copied directory on failure
|
|
496
|
-
await rm(targetPath, { recursive: true, force: true }).catch(() => {
|
|
497
|
-
// Ignore cleanup errors
|
|
498
|
-
})
|
|
499
|
-
throw error
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
async rename(oldName: string, newName: string): Promise<ContainerConfig> {
|
|
504
|
-
// Validate new name
|
|
505
|
-
if (!this.isValidName(newName)) {
|
|
506
|
-
throw new Error(
|
|
507
|
-
'Container name must be alphanumeric with hyphens/underscores only',
|
|
508
|
-
)
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
// Get source config
|
|
512
|
-
const sourceConfig = await this.getConfig(oldName)
|
|
513
|
-
if (!sourceConfig) {
|
|
514
|
-
throw new Error(`Container "${oldName}" not found`)
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
const { engine } = sourceConfig
|
|
518
|
-
|
|
519
|
-
// Check target doesn't exist
|
|
520
|
-
if (await this.exists(newName, { engine })) {
|
|
521
|
-
throw new Error(`Container "${newName}" already exists`)
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
// SQLite: rename in registry and handle container directory
|
|
525
|
-
if (engine === Engine.SQLite) {
|
|
526
|
-
const entry = await sqliteRegistry.get(oldName)
|
|
527
|
-
if (!entry) {
|
|
528
|
-
throw new Error(`SQLite container "${oldName}" not found in registry`)
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
// Move container directory first (if it exists) - do filesystem ops before registry
|
|
532
|
-
// This way if the move fails, registry is unchanged
|
|
533
|
-
const oldContainerPath = paths.getContainerPath(oldName, { engine })
|
|
534
|
-
const newContainerPath = paths.getContainerPath(newName, { engine })
|
|
535
|
-
if (existsSync(oldContainerPath)) {
|
|
536
|
-
await this.atomicMoveDirectory(oldContainerPath, newContainerPath)
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
// Now update registry - remove old entry and add new one with updated name
|
|
540
|
-
await sqliteRegistry.remove(oldName)
|
|
541
|
-
await sqliteRegistry.add({
|
|
542
|
-
name: newName,
|
|
543
|
-
filePath: entry.filePath,
|
|
544
|
-
created: entry.created,
|
|
545
|
-
lastVerified: entry.lastVerified,
|
|
546
|
-
})
|
|
547
|
-
|
|
548
|
-
// Return updated config
|
|
549
|
-
return {
|
|
550
|
-
...sourceConfig,
|
|
551
|
-
name: newName,
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
// DuckDB: rename in registry and handle container directory
|
|
556
|
-
if (engine === Engine.DuckDB) {
|
|
557
|
-
const entry = await duckdbRegistry.get(oldName)
|
|
558
|
-
if (!entry) {
|
|
559
|
-
throw new Error(`DuckDB container "${oldName}" not found in registry`)
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
// Move container directory first (if it exists) - do filesystem ops before registry
|
|
563
|
-
// This way if the move fails, registry is unchanged
|
|
564
|
-
const oldContainerPath = paths.getContainerPath(oldName, { engine })
|
|
565
|
-
const newContainerPath = paths.getContainerPath(newName, { engine })
|
|
566
|
-
if (existsSync(oldContainerPath)) {
|
|
567
|
-
await this.atomicMoveDirectory(oldContainerPath, newContainerPath)
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
// Now update registry - remove old entry and add new one with updated name
|
|
571
|
-
await duckdbRegistry.remove(oldName)
|
|
572
|
-
await duckdbRegistry.add({
|
|
573
|
-
name: newName,
|
|
574
|
-
filePath: entry.filePath,
|
|
575
|
-
created: entry.created,
|
|
576
|
-
lastVerified: entry.lastVerified,
|
|
577
|
-
})
|
|
578
|
-
|
|
579
|
-
// Return updated config
|
|
580
|
-
return {
|
|
581
|
-
...sourceConfig,
|
|
582
|
-
name: newName,
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
// Server databases: check container is not running
|
|
587
|
-
const running = await processManager.isRunning(oldName, { engine })
|
|
588
|
-
if (running) {
|
|
589
|
-
throw new Error(`Container "${oldName}" is running. Stop it first`)
|
|
590
|
-
}
|
|
591
|
-
|
|
592
|
-
// Rename directory
|
|
593
|
-
const oldPath = paths.getContainerPath(oldName, { engine })
|
|
594
|
-
const newPath = paths.getContainerPath(newName, { engine })
|
|
595
|
-
|
|
596
|
-
await this.atomicMoveDirectory(oldPath, newPath)
|
|
597
|
-
|
|
598
|
-
// Update config with new name
|
|
599
|
-
const config = await this.getConfig(newName, { engine })
|
|
600
|
-
if (!config) {
|
|
601
|
-
throw new Error('Failed to read renamed container config')
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
config.name = newName
|
|
605
|
-
await this.saveConfig(newName, { engine }, config)
|
|
606
|
-
|
|
607
|
-
// ClickHouse stores absolute paths in config.xml - regenerate with new paths
|
|
608
|
-
if (engine === Engine.ClickHouse) {
|
|
609
|
-
const clickhouseEngine = getEngine(Engine.ClickHouse)
|
|
610
|
-
if ('regenerateConfig' in clickhouseEngine) {
|
|
611
|
-
await (
|
|
612
|
-
clickhouseEngine as {
|
|
613
|
-
regenerateConfig: (name: string, port: number) => Promise<void>
|
|
614
|
-
}
|
|
615
|
-
).regenerateConfig(newName, config.port)
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
return config
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
// Moves a directory atomically when possible (same filesystem).
|
|
623
|
-
// Falls back to copy+delete for cross-filesystem moves.
|
|
624
|
-
// On Windows, retries on EBUSY errors (file handles held after process termination).
|
|
625
|
-
// Windows can hold file locks for 120+ seconds due to:
|
|
626
|
-
// - Antivirus software scanning
|
|
627
|
-
// - Windows Search indexer
|
|
628
|
-
// - Memory-mapped files (SurrealDB's SurrealKV, QuestDB's columnar storage)
|
|
629
|
-
// - Java JVM file handle cleanup (QuestDB)
|
|
630
|
-
private async atomicMoveDirectory(
|
|
631
|
-
sourcePath: string,
|
|
632
|
-
targetPath: string,
|
|
633
|
-
): Promise<void> {
|
|
634
|
-
const maxRetries = isWindows() ? 90 : 1 // 90 retries × 2s = 180 seconds max
|
|
635
|
-
const retryDelay = 2000 // 2 seconds between retries
|
|
636
|
-
|
|
637
|
-
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
638
|
-
try {
|
|
639
|
-
// Try atomic rename first (only works on same filesystem)
|
|
640
|
-
await fsRename(sourcePath, targetPath)
|
|
641
|
-
return // Success
|
|
642
|
-
} catch (error) {
|
|
643
|
-
const e = error as NodeJS.ErrnoException
|
|
644
|
-
if (e.code === 'EXDEV') {
|
|
645
|
-
// Cross-filesystem move - fall back to copy+delete
|
|
646
|
-
await cp(sourcePath, targetPath, { recursive: true })
|
|
647
|
-
try {
|
|
648
|
-
await rm(sourcePath, { recursive: true, force: true })
|
|
649
|
-
} catch {
|
|
650
|
-
// If delete fails after copy, we have duplicates
|
|
651
|
-
// Try to clean up the target to avoid inconsistency
|
|
652
|
-
await rm(targetPath, { recursive: true, force: true }).catch(
|
|
653
|
-
() => {},
|
|
654
|
-
)
|
|
655
|
-
throw new Error(
|
|
656
|
-
`Failed to complete move: source and target may both exist. ` +
|
|
657
|
-
`Please manually remove one of: ${sourcePath} or ${targetPath}`,
|
|
658
|
-
)
|
|
659
|
-
}
|
|
660
|
-
return // Success
|
|
661
|
-
} else if (e.code === 'EBUSY' && attempt < maxRetries) {
|
|
662
|
-
// Windows: file handles may still be held - retry after delay
|
|
663
|
-
logDebug(
|
|
664
|
-
`EBUSY on rename attempt ${attempt}/${maxRetries}, retrying in ${retryDelay}ms...`,
|
|
665
|
-
)
|
|
666
|
-
await new Promise((resolve) => setTimeout(resolve, retryDelay))
|
|
667
|
-
} else {
|
|
668
|
-
throw error
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
isValidName(name: string): boolean {
|
|
675
|
-
return /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(name)
|
|
676
|
-
}
|
|
677
|
-
|
|
678
|
-
async addDatabase(containerName: string, database: string): Promise<void> {
|
|
679
|
-
const config = await this.getConfig(containerName)
|
|
680
|
-
if (!config) {
|
|
681
|
-
throw new Error(`Container "${containerName}" not found`)
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
// Ensure databases array exists
|
|
685
|
-
if (!config.databases) {
|
|
686
|
-
config.databases = [config.database]
|
|
687
|
-
}
|
|
688
|
-
|
|
689
|
-
// Add if not already present
|
|
690
|
-
if (!config.databases.includes(database)) {
|
|
691
|
-
config.databases.push(database)
|
|
692
|
-
await this.saveConfig(containerName, { engine: config.engine }, config)
|
|
693
|
-
}
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
async removeDatabase(containerName: string, database: string): Promise<void> {
|
|
697
|
-
const config = await this.getConfig(containerName)
|
|
698
|
-
if (!config) {
|
|
699
|
-
throw new Error(`Container "${containerName}" not found`)
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
// Don't remove the primary database from the array
|
|
703
|
-
if (database === config.database) {
|
|
704
|
-
throw new Error(
|
|
705
|
-
`Cannot remove primary database "${database}" from tracking`,
|
|
706
|
-
)
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
if (config.databases) {
|
|
710
|
-
config.databases = config.databases.filter((db) => db !== database)
|
|
711
|
-
await this.saveConfig(containerName, { engine: config.engine }, config)
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
/**
|
|
716
|
-
* Sync the databases array with the actual databases on the server.
|
|
717
|
-
* Queries the database server for all user databases and updates the registry.
|
|
718
|
-
*
|
|
719
|
-
* @param containerName - The container to sync
|
|
720
|
-
* @returns The updated list of databases
|
|
721
|
-
* @throws Error if the container is not running or doesn't support listing databases
|
|
722
|
-
*/
|
|
723
|
-
async syncDatabases(containerName: string): Promise<string[]> {
|
|
724
|
-
const config = await this.getConfig(containerName)
|
|
725
|
-
if (!config) {
|
|
726
|
-
throw new Error(`Container "${containerName}" not found`)
|
|
727
|
-
}
|
|
728
|
-
|
|
729
|
-
// File-based engines don't have multiple databases to sync
|
|
730
|
-
if (isFileBasedEngine(config.engine)) {
|
|
731
|
-
return config.databases || [config.database]
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
// Container must be running to query databases
|
|
735
|
-
const running = await processManager.isRunning(containerName, {
|
|
736
|
-
engine: config.engine,
|
|
737
|
-
})
|
|
738
|
-
if (!running) {
|
|
739
|
-
throw new Error(
|
|
740
|
-
`Container "${containerName}" is not running. Start it first to sync databases.`,
|
|
741
|
-
)
|
|
742
|
-
}
|
|
743
|
-
|
|
744
|
-
const engine = getEngine(config.engine)
|
|
745
|
-
|
|
746
|
-
// Query the actual database server for all databases
|
|
747
|
-
let actualDatabases: string[]
|
|
748
|
-
try {
|
|
749
|
-
actualDatabases = await engine.listDatabases(config)
|
|
750
|
-
} catch (error) {
|
|
751
|
-
// If the engine doesn't support listDatabases, return current registry
|
|
752
|
-
if (error instanceof UnsupportedOperationError) {
|
|
753
|
-
logDebug(
|
|
754
|
-
`listDatabases not supported for ${config.engine}, skipping sync`,
|
|
755
|
-
)
|
|
756
|
-
return config.databases || [config.database]
|
|
757
|
-
}
|
|
758
|
-
throw error
|
|
759
|
-
}
|
|
760
|
-
|
|
761
|
-
// Ensure primary database is always included
|
|
762
|
-
if (!actualDatabases.includes(config.database)) {
|
|
763
|
-
actualDatabases = [config.database, ...actualDatabases]
|
|
764
|
-
}
|
|
765
|
-
|
|
766
|
-
// Sort for consistent ordering (primary database first, then alphabetical)
|
|
767
|
-
const sortedDatabases = [
|
|
768
|
-
config.database,
|
|
769
|
-
...actualDatabases
|
|
770
|
-
.filter((db) => db !== config.database)
|
|
771
|
-
.sort((a, b) => a.localeCompare(b)),
|
|
772
|
-
]
|
|
773
|
-
|
|
774
|
-
// Update the registry
|
|
775
|
-
config.databases = sortedDatabases
|
|
776
|
-
await this.saveConfig(containerName, { engine: config.engine }, config)
|
|
777
|
-
|
|
778
|
-
return sortedDatabases
|
|
779
|
-
}
|
|
780
|
-
|
|
781
|
-
getConnectionString(config: ContainerConfig, database?: string): string {
|
|
782
|
-
const engine = getEngine(config.engine)
|
|
783
|
-
return engine.getConnectionString(config, database)
|
|
784
|
-
}
|
|
785
|
-
}
|
|
786
|
-
|
|
787
|
-
export const containerManager = new ContainerManager()
|