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,1011 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MariaDB Engine implementation
|
|
3
|
+
* Manages MariaDB database containers using pre-built binaries from hostdb
|
|
4
|
+
*/
|
|
5
|
+
import { spawn, exec } from 'child_process';
|
|
6
|
+
import { promisify } from 'util';
|
|
7
|
+
import { existsSync, createReadStream } from 'fs';
|
|
8
|
+
import { mkdir, writeFile, readFile, unlink, rm } from 'fs/promises';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
import { BaseEngine } from '../base-engine.js';
|
|
11
|
+
import { paths } from '../../config/paths.js';
|
|
12
|
+
import { getEngineDefaults } from '../../config/defaults.js';
|
|
13
|
+
import { platformService, isWindows, getWindowsSpawnOptions, } from '../../core/platform-service.js';
|
|
14
|
+
import { configManager } from '../../core/config-manager.js';
|
|
15
|
+
import { logDebug, logWarning, ErrorCodes, SpinDBError, assertValidDatabaseName, assertValidUsername, } from '../../core/error-handler.js';
|
|
16
|
+
import { mariadbBinaryManager } from './binary-manager.js';
|
|
17
|
+
import { getBinaryUrl } from './binary-urls.js';
|
|
18
|
+
import { fetchAvailableVersions, getLatestVersion } from './hostdb-releases.js';
|
|
19
|
+
import { SUPPORTED_MAJOR_VERSIONS, MARIADB_VERSION_MAP } from './version-maps.js';
|
|
20
|
+
import { detectBackupFormat as detectBackupFormatImpl, restoreBackup, parseConnectionString, } from './restore.js';
|
|
21
|
+
import { createBackup } from './backup.js';
|
|
22
|
+
import { Platform, } from '../../types/index.js';
|
|
23
|
+
import { parseTSVToQueryResult } from '../../core/query-parser.js';
|
|
24
|
+
import { getLibraryEnv, detectLibraryError } from '../../core/library-env.js';
|
|
25
|
+
const execAsync = promisify(exec);
|
|
26
|
+
const ENGINE = 'mariadb';
|
|
27
|
+
const engineDef = getEngineDefaults(ENGINE);
|
|
28
|
+
// Build a Windows-safe mariadb command string for either a file or inline SQL.
|
|
29
|
+
export function buildWindowsMariadbCommand(mysqlPath, port, user, db, options) {
|
|
30
|
+
if (!options.file && !options.sql) {
|
|
31
|
+
throw new Error('Either file or sql option must be provided');
|
|
32
|
+
}
|
|
33
|
+
let cmd = `"${mysqlPath}" -h 127.0.0.1 -P ${port} -u ${user} ${db}`;
|
|
34
|
+
if (options.file) {
|
|
35
|
+
cmd += ` < "${options.file}"`;
|
|
36
|
+
}
|
|
37
|
+
else if (options.sql) {
|
|
38
|
+
const escaped = options.sql.replace(/"/g, '\\"');
|
|
39
|
+
cmd += ` -e "${escaped}"`;
|
|
40
|
+
}
|
|
41
|
+
return cmd;
|
|
42
|
+
}
|
|
43
|
+
// Build a platform-safe mariadb command string with SQL inline.
|
|
44
|
+
export function buildMariadbInlineCommand(mysqlPath, port, user, sql, options = {}) {
|
|
45
|
+
const dbArg = options.database ? ` ${options.database}` : '';
|
|
46
|
+
if (isWindows()) {
|
|
47
|
+
const escaped = sql.replace(/"/g, '\\"');
|
|
48
|
+
return `"${mysqlPath}" -h 127.0.0.1 -P ${port} -u ${user}${dbArg} -e "${escaped}"`;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const escaped = sql.replace(/'/g, "'\\''");
|
|
52
|
+
return `"${mysqlPath}" -h 127.0.0.1 -P ${port} -u ${user}${dbArg} -e '${escaped}'`;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export class MariaDBEngine extends BaseEngine {
|
|
56
|
+
name = ENGINE;
|
|
57
|
+
displayName = 'MariaDB';
|
|
58
|
+
defaultPort = engineDef.defaultPort;
|
|
59
|
+
supportedVersions = SUPPORTED_MAJOR_VERSIONS;
|
|
60
|
+
async fetchAvailableVersions() {
|
|
61
|
+
return fetchAvailableVersions();
|
|
62
|
+
}
|
|
63
|
+
getPlatformInfo() {
|
|
64
|
+
const info = platformService.getPlatformInfo();
|
|
65
|
+
return {
|
|
66
|
+
platform: info.platform,
|
|
67
|
+
arch: info.arch,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
resolveFullVersion(version) {
|
|
71
|
+
// Check if already a full version (has at least two dots)
|
|
72
|
+
if (/^\d+\.\d+\.\d+/.test(version)) {
|
|
73
|
+
return version;
|
|
74
|
+
}
|
|
75
|
+
// It's a major version, resolve using fallback map
|
|
76
|
+
return MARIADB_VERSION_MAP[version] || `${version}.0`;
|
|
77
|
+
}
|
|
78
|
+
async resolveFullVersionAsync(version) {
|
|
79
|
+
if (/^\d+\.\d+\.\d+/.test(version)) {
|
|
80
|
+
return version;
|
|
81
|
+
}
|
|
82
|
+
return getLatestVersion(version);
|
|
83
|
+
}
|
|
84
|
+
getBinaryPath(version) {
|
|
85
|
+
const fullVersion = this.resolveFullVersion(version);
|
|
86
|
+
const { platform: p, arch: a } = this.getPlatformInfo();
|
|
87
|
+
return paths.getBinaryPath({
|
|
88
|
+
engine: 'mariadb',
|
|
89
|
+
version: fullVersion,
|
|
90
|
+
platform: p,
|
|
91
|
+
arch: a,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
getBinaryUrl(version, plat, arc) {
|
|
95
|
+
return getBinaryUrl(version, plat, arc);
|
|
96
|
+
}
|
|
97
|
+
async verifyBinary(binPath) {
|
|
98
|
+
const { platform: p, arch: a } = this.getPlatformInfo();
|
|
99
|
+
const parts = binPath.split('-');
|
|
100
|
+
const version = parts[1];
|
|
101
|
+
return mariadbBinaryManager.verify(version, p, a);
|
|
102
|
+
}
|
|
103
|
+
async ensureBinaries(version, onProgress) {
|
|
104
|
+
const { platform: p, arch: a } = this.getPlatformInfo();
|
|
105
|
+
const binPath = await mariadbBinaryManager.ensureInstalled(version, p, a, onProgress);
|
|
106
|
+
// Register all MariaDB binaries from downloaded package
|
|
107
|
+
// Using native names only (not mysql-named ones to avoid conflicts with MySQL engine)
|
|
108
|
+
const ext = platformService.getExecutableExtension();
|
|
109
|
+
const tools = [
|
|
110
|
+
'mariadbd',
|
|
111
|
+
'mariadb-admin',
|
|
112
|
+
'mariadb',
|
|
113
|
+
'mariadb-dump',
|
|
114
|
+
];
|
|
115
|
+
for (const tool of tools) {
|
|
116
|
+
const toolPath = join(binPath, 'bin', `${tool}${ext}`);
|
|
117
|
+
if (existsSync(toolPath)) {
|
|
118
|
+
await configManager.setBinaryPath(tool, toolPath, 'bundled');
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
logDebug(`Expected MariaDB binary not found`, { tool, toolPath });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return binPath;
|
|
125
|
+
}
|
|
126
|
+
async isBinaryInstalled(version) {
|
|
127
|
+
const { platform: p, arch: a } = this.getPlatformInfo();
|
|
128
|
+
return mariadbBinaryManager.isInstalled(version, p, a);
|
|
129
|
+
}
|
|
130
|
+
async initDataDir(containerName, version, _options = {}) {
|
|
131
|
+
const binPath = this.getBinaryPath(version);
|
|
132
|
+
const ext = platformService.getExecutableExtension();
|
|
133
|
+
const dataDir = paths.getContainerDataPath(containerName, {
|
|
134
|
+
engine: ENGINE,
|
|
135
|
+
});
|
|
136
|
+
let createdDataDir = false;
|
|
137
|
+
if (!existsSync(dataDir)) {
|
|
138
|
+
await mkdir(dataDir, { recursive: true });
|
|
139
|
+
createdDataDir = true;
|
|
140
|
+
}
|
|
141
|
+
const cleanupOnFailure = async () => {
|
|
142
|
+
if (createdDataDir) {
|
|
143
|
+
try {
|
|
144
|
+
await rm(dataDir, { recursive: true, force: true });
|
|
145
|
+
logDebug(`Cleaned up data directory after init failure: ${dataDir}`);
|
|
146
|
+
}
|
|
147
|
+
catch (cleanupErr) {
|
|
148
|
+
logDebug(`Failed to clean up data directory: ${cleanupErr instanceof Error ? cleanupErr.message : String(cleanupErr)}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
// Try mariadb-install-db first, then mysql_install_db
|
|
153
|
+
let installDb = join(binPath, 'scripts', `mariadb-install-db${ext}`);
|
|
154
|
+
if (!existsSync(installDb)) {
|
|
155
|
+
installDb = join(binPath, 'scripts', `mysql_install_db${ext}`);
|
|
156
|
+
}
|
|
157
|
+
if (!existsSync(installDb)) {
|
|
158
|
+
installDb = join(binPath, 'bin', `mariadb-install-db${ext}`);
|
|
159
|
+
}
|
|
160
|
+
if (!existsSync(installDb)) {
|
|
161
|
+
installDb = join(binPath, 'bin', `mysql_install_db${ext}`);
|
|
162
|
+
}
|
|
163
|
+
if (!existsSync(installDb)) {
|
|
164
|
+
await cleanupOnFailure();
|
|
165
|
+
throw new Error(`MariaDB initialization script not found in ${binPath}.\n` +
|
|
166
|
+
'Re-download the MariaDB binaries: spindb engines download mariadb');
|
|
167
|
+
}
|
|
168
|
+
// MariaDB initialization
|
|
169
|
+
// Windows mariadb-install-db.exe has limited options support
|
|
170
|
+
// Unix supports --auth-root-authentication-method=normal for passwordless root login
|
|
171
|
+
if (isWindows()) {
|
|
172
|
+
// Windows mariadb-install-db.exe only supports --datadir
|
|
173
|
+
// It does NOT support --auth-root-authentication-method or --basedir options
|
|
174
|
+
const cmd = `"${installDb}" --datadir="${dataDir}"`;
|
|
175
|
+
return new Promise((resolve, reject) => {
|
|
176
|
+
exec(cmd, {
|
|
177
|
+
timeout: 120000,
|
|
178
|
+
env: { ...process.env, ...getLibraryEnv(binPath) },
|
|
179
|
+
}, async (error, stdout, stderr) => {
|
|
180
|
+
if (error) {
|
|
181
|
+
await cleanupOnFailure();
|
|
182
|
+
const libError = detectLibraryError(stderr || stdout || error.message, 'MariaDB');
|
|
183
|
+
reject(new Error(libError ||
|
|
184
|
+
`MariaDB initialization failed with code ${error.code}: ${stderr || stdout || error.message}`));
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
resolve(dataDir);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
// Unix path (Linux/macOS)
|
|
193
|
+
// --no-defaults: Prevent reading system my.cnf files that might have MySQL-specific options
|
|
194
|
+
// --auth-root-authentication-method=normal: Allow passwordless root login for local dev
|
|
195
|
+
// --user: Required for non-root, but when running as root we can skip it to avoid
|
|
196
|
+
// needing a dedicated 'mysql' user to exist on the system
|
|
197
|
+
const isRunningAsRoot = process.getuid?.() === 0;
|
|
198
|
+
const args = [
|
|
199
|
+
'--no-defaults',
|
|
200
|
+
`--datadir=${dataDir}`,
|
|
201
|
+
'--auth-root-authentication-method=normal',
|
|
202
|
+
`--basedir=${binPath}`,
|
|
203
|
+
];
|
|
204
|
+
// Only add --user when not running as root
|
|
205
|
+
// When running as root, mariadb-install-db works without specifying a user
|
|
206
|
+
if (!isRunningAsRoot && process.env.USER) {
|
|
207
|
+
args.push(`--user=${process.env.USER}`);
|
|
208
|
+
}
|
|
209
|
+
return new Promise((resolve, reject) => {
|
|
210
|
+
const proc = spawn(installDb, args, {
|
|
211
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
212
|
+
env: { ...process.env, ...getLibraryEnv(binPath) },
|
|
213
|
+
});
|
|
214
|
+
let stdout = '';
|
|
215
|
+
let stderr = '';
|
|
216
|
+
proc.stdout?.on('data', (data) => {
|
|
217
|
+
stdout += data.toString();
|
|
218
|
+
});
|
|
219
|
+
proc.stderr?.on('data', (data) => {
|
|
220
|
+
stderr += data.toString();
|
|
221
|
+
});
|
|
222
|
+
proc.on('close', async (code) => {
|
|
223
|
+
if (code === 0) {
|
|
224
|
+
resolve(dataDir);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
await cleanupOnFailure();
|
|
228
|
+
const libError = detectLibraryError(stderr || stdout, 'MariaDB');
|
|
229
|
+
reject(new Error(libError ||
|
|
230
|
+
`MariaDB initialization failed with code ${code}: ${stderr || stdout}`));
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
proc.on('error', async (err) => {
|
|
234
|
+
await cleanupOnFailure();
|
|
235
|
+
reject(err);
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
async start(container, onProgress) {
|
|
240
|
+
const { name, port, version } = container;
|
|
241
|
+
const alreadyRunning = await this.isRunning(name);
|
|
242
|
+
if (alreadyRunning) {
|
|
243
|
+
return {
|
|
244
|
+
port,
|
|
245
|
+
connectionString: this.getConnectionString(container),
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
const binPath = this.getBinaryPath(version);
|
|
249
|
+
const ext = platformService.getExecutableExtension();
|
|
250
|
+
// Try mariadbd first, then mysqld
|
|
251
|
+
let mysqld = join(binPath, 'bin', `mariadbd${ext}`);
|
|
252
|
+
if (!existsSync(mysqld)) {
|
|
253
|
+
mysqld = join(binPath, 'bin', `mysqld${ext}`);
|
|
254
|
+
}
|
|
255
|
+
if (!existsSync(mysqld)) {
|
|
256
|
+
throw new Error(`MariaDB server binary not found in ${binPath}/bin/.\n` +
|
|
257
|
+
'Re-download the MariaDB binaries: spindb engines download mariadb');
|
|
258
|
+
}
|
|
259
|
+
const dataDir = paths.getContainerDataPath(name, { engine: ENGINE });
|
|
260
|
+
const logFile = paths.getContainerLogPath(name, { engine: ENGINE });
|
|
261
|
+
const pidFile = paths.getContainerPidPath(name, { engine: ENGINE });
|
|
262
|
+
const { platform } = platformService.getPlatformInfo();
|
|
263
|
+
onProgress?.({ stage: 'starting', message: 'Starting MariaDB...' });
|
|
264
|
+
// --no-defaults: CRITICAL - prevents reading system my.cnf files that might contain
|
|
265
|
+
// MySQL-specific options like mysqlx-bind-address which MariaDB doesn't support
|
|
266
|
+
const args = [
|
|
267
|
+
'--no-defaults',
|
|
268
|
+
`--datadir=${dataDir}`,
|
|
269
|
+
`--port=${port}`,
|
|
270
|
+
`--pid-file=${pidFile}`,
|
|
271
|
+
`--log-error=${logFile}`,
|
|
272
|
+
'--bind-address=127.0.0.1',
|
|
273
|
+
`--max-connections=${engineDef.maxConnections}`,
|
|
274
|
+
];
|
|
275
|
+
if (platform !== Platform.Win32) {
|
|
276
|
+
const socketFile = join(paths.getContainerPath(name, { engine: ENGINE }), 'mysql.sock');
|
|
277
|
+
args.push(`--socket=${socketFile}`);
|
|
278
|
+
}
|
|
279
|
+
let proc = null;
|
|
280
|
+
const libraryEnv = getLibraryEnv(binPath);
|
|
281
|
+
if (isWindows()) {
|
|
282
|
+
proc = spawn(mysqld, args, {
|
|
283
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
284
|
+
detached: true,
|
|
285
|
+
windowsHide: true,
|
|
286
|
+
env: { ...process.env, ...libraryEnv },
|
|
287
|
+
});
|
|
288
|
+
proc.stdout?.on('data', (data) => {
|
|
289
|
+
logDebug(`mariadbd stdout: ${data.toString()}`);
|
|
290
|
+
});
|
|
291
|
+
proc.stderr?.on('data', (data) => {
|
|
292
|
+
logDebug(`mariadbd stderr: ${data.toString()}`);
|
|
293
|
+
});
|
|
294
|
+
proc.unref();
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
proc = spawn(mysqld, args, {
|
|
298
|
+
stdio: ['ignore', 'ignore', 'ignore'],
|
|
299
|
+
detached: true,
|
|
300
|
+
env: { ...process.env, ...libraryEnv },
|
|
301
|
+
});
|
|
302
|
+
proc.unref();
|
|
303
|
+
}
|
|
304
|
+
return new Promise((resolve, reject) => {
|
|
305
|
+
// Track whether we've already settled the promise to avoid race conditions
|
|
306
|
+
let settled = false;
|
|
307
|
+
const errorHandler = (err) => {
|
|
308
|
+
if (settled)
|
|
309
|
+
return;
|
|
310
|
+
settled = true;
|
|
311
|
+
if (proc) {
|
|
312
|
+
proc.removeListener('error', errorHandler);
|
|
313
|
+
}
|
|
314
|
+
reject(err);
|
|
315
|
+
};
|
|
316
|
+
if (proc) {
|
|
317
|
+
proc.on('error', errorHandler);
|
|
318
|
+
}
|
|
319
|
+
setTimeout(async () => {
|
|
320
|
+
if (proc && proc.pid) {
|
|
321
|
+
try {
|
|
322
|
+
await writeFile(pidFile, String(proc.pid));
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
logDebug(`Could not write PID file: ${error}`);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Wait for MariaDB to be ready
|
|
329
|
+
let attempts = 0;
|
|
330
|
+
const maxAttempts = 60;
|
|
331
|
+
const checkInterval = 500;
|
|
332
|
+
const checkReady = async () => {
|
|
333
|
+
if (settled)
|
|
334
|
+
return;
|
|
335
|
+
attempts++;
|
|
336
|
+
try {
|
|
337
|
+
const mysqladmin = await this.getMysqladminPath();
|
|
338
|
+
await execAsync(`"${mysqladmin}" -h 127.0.0.1 -P ${port} -u root ping`);
|
|
339
|
+
if (settled)
|
|
340
|
+
return;
|
|
341
|
+
settled = true;
|
|
342
|
+
if (proc) {
|
|
343
|
+
proc.removeListener('error', errorHandler);
|
|
344
|
+
}
|
|
345
|
+
resolve({
|
|
346
|
+
port,
|
|
347
|
+
connectionString: this.getConnectionString(container),
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
if (settled)
|
|
352
|
+
return;
|
|
353
|
+
if (attempts < maxAttempts) {
|
|
354
|
+
setTimeout(checkReady, checkInterval);
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
if (settled)
|
|
358
|
+
return;
|
|
359
|
+
settled = true;
|
|
360
|
+
if (proc) {
|
|
361
|
+
proc.removeListener('error', errorHandler);
|
|
362
|
+
}
|
|
363
|
+
// Check log file for library errors
|
|
364
|
+
let libError = null;
|
|
365
|
+
try {
|
|
366
|
+
const logContent = await readFile(logFile, 'utf-8');
|
|
367
|
+
libError = detectLibraryError(logContent, 'MariaDB');
|
|
368
|
+
}
|
|
369
|
+
catch {
|
|
370
|
+
// Log file might not exist
|
|
371
|
+
}
|
|
372
|
+
reject(new Error(libError || 'MariaDB failed to start within timeout'));
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
};
|
|
376
|
+
checkReady();
|
|
377
|
+
}, 1000);
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
async isRunning(containerName) {
|
|
381
|
+
const pidFile = paths.getContainerPidPath(containerName, { engine: ENGINE });
|
|
382
|
+
if (!existsSync(pidFile)) {
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
try {
|
|
386
|
+
const pid = parseInt(await readFile(pidFile, 'utf8'), 10);
|
|
387
|
+
return platformService.isProcessRunning(pid);
|
|
388
|
+
}
|
|
389
|
+
catch {
|
|
390
|
+
return false;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
async stop(container) {
|
|
394
|
+
const { name, port } = container;
|
|
395
|
+
const pidFile = paths.getContainerPidPath(name, { engine: ENGINE });
|
|
396
|
+
logDebug(`Stopping MariaDB container "${name}" on port ${port}`);
|
|
397
|
+
const pid = await this.getValidatedPid(pidFile);
|
|
398
|
+
if (pid === null) {
|
|
399
|
+
logDebug('No valid PID, checking if MariaDB is responding on port');
|
|
400
|
+
try {
|
|
401
|
+
const mysqladmin = await this.getMysqladminPath();
|
|
402
|
+
await execAsync(`"${mysqladmin}" -h 127.0.0.1 -P ${port} -u root ping`, { timeout: 2000 });
|
|
403
|
+
logWarning(`MariaDB responding on port ${port} but no valid PID file`);
|
|
404
|
+
await this.gracefulShutdown(port);
|
|
405
|
+
}
|
|
406
|
+
catch {
|
|
407
|
+
logDebug('MariaDB not responding, nothing to stop');
|
|
408
|
+
}
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
const gracefulSuccess = await this.gracefulShutdown(port, pid);
|
|
412
|
+
if (gracefulSuccess) {
|
|
413
|
+
await this.cleanupPidFile(pidFile);
|
|
414
|
+
logDebug('MariaDB stopped gracefully');
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
await this.forceKillWithEscalation(pid, pidFile);
|
|
418
|
+
}
|
|
419
|
+
async getValidatedPid(pidFile) {
|
|
420
|
+
if (!existsSync(pidFile)) {
|
|
421
|
+
logDebug('PID file does not exist');
|
|
422
|
+
return null;
|
|
423
|
+
}
|
|
424
|
+
try {
|
|
425
|
+
const content = await readFile(pidFile, 'utf8');
|
|
426
|
+
const pid = parseInt(content.trim(), 10);
|
|
427
|
+
if (isNaN(pid) || pid <= 0) {
|
|
428
|
+
logWarning(`PID file contains invalid value: "${content.trim()}"`);
|
|
429
|
+
await this.cleanupPidFile(pidFile);
|
|
430
|
+
return null;
|
|
431
|
+
}
|
|
432
|
+
if (platformService.isProcessRunning(pid)) {
|
|
433
|
+
logDebug(`Validated PID ${pid}`);
|
|
434
|
+
return pid;
|
|
435
|
+
}
|
|
436
|
+
else {
|
|
437
|
+
logWarning(`PID file references non-existent process ${pid}`);
|
|
438
|
+
await this.cleanupPidFile(pidFile);
|
|
439
|
+
return null;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
catch (error) {
|
|
443
|
+
const e = error;
|
|
444
|
+
if (e.code !== 'ENOENT') {
|
|
445
|
+
logWarning(`Failed to read PID file: ${e.message}`);
|
|
446
|
+
}
|
|
447
|
+
return null;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
async gracefulShutdown(port, pid, timeoutMs = 10000) {
|
|
451
|
+
try {
|
|
452
|
+
const mysqladmin = await this.getMysqladminPath();
|
|
453
|
+
logDebug('Attempting mysqladmin shutdown');
|
|
454
|
+
await execAsync(`"${mysqladmin}" -h 127.0.0.1 -P ${port} -u root shutdown`, { timeout: 5000 });
|
|
455
|
+
}
|
|
456
|
+
catch (error) {
|
|
457
|
+
const e = error;
|
|
458
|
+
logDebug(`mysqladmin shutdown failed: ${e.message}`);
|
|
459
|
+
if (pid) {
|
|
460
|
+
try {
|
|
461
|
+
await platformService.terminateProcess(pid, false);
|
|
462
|
+
}
|
|
463
|
+
catch {
|
|
464
|
+
return true;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
if (pid) {
|
|
469
|
+
const startTime = Date.now();
|
|
470
|
+
const checkIntervalMs = 200;
|
|
471
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
472
|
+
if (!platformService.isProcessRunning(pid)) {
|
|
473
|
+
logDebug(`Process ${pid} terminated after graceful shutdown`);
|
|
474
|
+
return true;
|
|
475
|
+
}
|
|
476
|
+
await this.sleep(checkIntervalMs);
|
|
477
|
+
}
|
|
478
|
+
logDebug(`Graceful shutdown timed out after ${timeoutMs}ms`);
|
|
479
|
+
return false;
|
|
480
|
+
}
|
|
481
|
+
return true;
|
|
482
|
+
}
|
|
483
|
+
async forceKillWithEscalation(pid, pidFile) {
|
|
484
|
+
logWarning(`Graceful shutdown failed, force killing process ${pid}`);
|
|
485
|
+
try {
|
|
486
|
+
await platformService.terminateProcess(pid, false);
|
|
487
|
+
await this.sleep(2000);
|
|
488
|
+
if (!platformService.isProcessRunning(pid)) {
|
|
489
|
+
logDebug(`Process ${pid} terminated after graceful signal`);
|
|
490
|
+
await this.cleanupPidFile(pidFile);
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
catch (error) {
|
|
495
|
+
const e = error;
|
|
496
|
+
if (e.code === 'ESRCH') {
|
|
497
|
+
await this.cleanupPidFile(pidFile);
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
logDebug(`Graceful termination failed: ${e.message}`);
|
|
501
|
+
}
|
|
502
|
+
const { platform } = platformService.getPlatformInfo();
|
|
503
|
+
const killCmd = platform === Platform.Win32 ? 'taskkill /F' : 'kill -9';
|
|
504
|
+
logWarning(`Escalating to force kill for process ${pid}`);
|
|
505
|
+
try {
|
|
506
|
+
await platformService.terminateProcess(pid, true);
|
|
507
|
+
await this.sleep(1000);
|
|
508
|
+
if (platformService.isProcessRunning(pid)) {
|
|
509
|
+
throw new SpinDBError(ErrorCodes.PROCESS_STOP_TIMEOUT, `Failed to stop MariaDB process ${pid} even with force kill`, 'error', `Try manually killing the process: ${killCmd} ${pid}`);
|
|
510
|
+
}
|
|
511
|
+
logDebug(`Process ${pid} terminated after force kill`);
|
|
512
|
+
await this.cleanupPidFile(pidFile);
|
|
513
|
+
}
|
|
514
|
+
catch (error) {
|
|
515
|
+
if (error instanceof SpinDBError)
|
|
516
|
+
throw error;
|
|
517
|
+
const e = error;
|
|
518
|
+
if (e.code === 'ESRCH') {
|
|
519
|
+
await this.cleanupPidFile(pidFile);
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
522
|
+
logDebug(`Force kill failed: ${e.message}`);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
async cleanupPidFile(pidFile) {
|
|
526
|
+
try {
|
|
527
|
+
await unlink(pidFile);
|
|
528
|
+
logDebug('PID file cleaned up');
|
|
529
|
+
}
|
|
530
|
+
catch (error) {
|
|
531
|
+
const e = error;
|
|
532
|
+
if (e.code !== 'ENOENT') {
|
|
533
|
+
logDebug(`Failed to clean up PID file: ${e.message}`);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
sleep(ms) {
|
|
538
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
539
|
+
}
|
|
540
|
+
async status(container) {
|
|
541
|
+
const { name, port } = container;
|
|
542
|
+
const pidFile = paths.getContainerPidPath(name, { engine: ENGINE });
|
|
543
|
+
if (!existsSync(pidFile)) {
|
|
544
|
+
return { running: false, message: 'MariaDB is not running' };
|
|
545
|
+
}
|
|
546
|
+
try {
|
|
547
|
+
const mysqladmin = await this.getMysqladminPath();
|
|
548
|
+
await execAsync(`"${mysqladmin}" -h 127.0.0.1 -P ${port} -u root ping`);
|
|
549
|
+
return { running: true, message: 'MariaDB is running' };
|
|
550
|
+
}
|
|
551
|
+
catch {
|
|
552
|
+
return { running: false, message: 'MariaDB is not responding' };
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
async detectBackupFormat(filePath) {
|
|
556
|
+
return detectBackupFormatImpl(filePath);
|
|
557
|
+
}
|
|
558
|
+
async restore(container, backupPath, options = {}) {
|
|
559
|
+
const { port, version } = container;
|
|
560
|
+
const database = options.database || container.database;
|
|
561
|
+
const binPath = this.getBinaryPath(version);
|
|
562
|
+
if (options.createDatabase !== false) {
|
|
563
|
+
await this.createDatabase(container, database);
|
|
564
|
+
}
|
|
565
|
+
return restoreBackup(backupPath, {
|
|
566
|
+
port,
|
|
567
|
+
database,
|
|
568
|
+
user: engineDef.superuser,
|
|
569
|
+
createDatabase: false,
|
|
570
|
+
validateVersion: options.validateVersion !== false,
|
|
571
|
+
binPath,
|
|
572
|
+
});
|
|
573
|
+
}
|
|
574
|
+
getConnectionString(container, database) {
|
|
575
|
+
const { port } = container;
|
|
576
|
+
const db = database || container.database || 'mysql';
|
|
577
|
+
return `mysql://${engineDef.superuser}@127.0.0.1:${port}/${db}`;
|
|
578
|
+
}
|
|
579
|
+
async getMariadbClientPath() {
|
|
580
|
+
const configPath = await configManager.getBinaryPath('mariadb');
|
|
581
|
+
if (configPath)
|
|
582
|
+
return configPath;
|
|
583
|
+
throw new Error('mariadb client not found. Ensure MariaDB binaries are downloaded:\n' +
|
|
584
|
+
' spindb engines download mariadb');
|
|
585
|
+
}
|
|
586
|
+
async getMysqladminPath() {
|
|
587
|
+
const cfg = await configManager.getBinaryPath('mariadb-admin');
|
|
588
|
+
if (cfg)
|
|
589
|
+
return cfg;
|
|
590
|
+
throw new Error('mariadb-admin not found. Ensure MariaDB binaries are downloaded:\n' +
|
|
591
|
+
' spindb engines download mariadb');
|
|
592
|
+
}
|
|
593
|
+
async connect(container, database) {
|
|
594
|
+
const { port } = container;
|
|
595
|
+
const db = database || container.database || 'mysql';
|
|
596
|
+
const mysql = await this.getMariadbClientPath();
|
|
597
|
+
const spawnOptions = {
|
|
598
|
+
stdio: 'inherit',
|
|
599
|
+
...getWindowsSpawnOptions(),
|
|
600
|
+
};
|
|
601
|
+
return new Promise((resolve, reject) => {
|
|
602
|
+
const proc = spawn(mysql, ['-h', '127.0.0.1', '-P', String(port), '-u', engineDef.superuser, db], spawnOptions);
|
|
603
|
+
proc.on('error', reject);
|
|
604
|
+
proc.on('close', () => resolve());
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
async createDatabase(container, database) {
|
|
608
|
+
assertValidDatabaseName(database);
|
|
609
|
+
const { port } = container;
|
|
610
|
+
const mysql = await this.getMariadbClientPath();
|
|
611
|
+
try {
|
|
612
|
+
const cmd = buildMariadbInlineCommand(mysql, port, engineDef.superuser, `CREATE DATABASE IF NOT EXISTS \`${database}\``);
|
|
613
|
+
await execAsync(cmd);
|
|
614
|
+
}
|
|
615
|
+
catch (error) {
|
|
616
|
+
const err = error;
|
|
617
|
+
if (!err.message.includes('database exists')) {
|
|
618
|
+
throw error;
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
async dropDatabase(container, database) {
|
|
623
|
+
assertValidDatabaseName(database);
|
|
624
|
+
const { port } = container;
|
|
625
|
+
const mysql = await this.getMariadbClientPath();
|
|
626
|
+
try {
|
|
627
|
+
const cmd = buildMariadbInlineCommand(mysql, port, engineDef.superuser, `DROP DATABASE IF EXISTS \`${database}\``);
|
|
628
|
+
await execAsync(cmd);
|
|
629
|
+
}
|
|
630
|
+
catch (error) {
|
|
631
|
+
const err = error;
|
|
632
|
+
if (!err.message.includes("database doesn't exist")) {
|
|
633
|
+
throw error;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
async getDatabaseSize(container) {
|
|
638
|
+
const { port, database } = container;
|
|
639
|
+
const db = database || 'mysql';
|
|
640
|
+
assertValidDatabaseName(db);
|
|
641
|
+
try {
|
|
642
|
+
const mysql = await this.getMariadbClientPath();
|
|
643
|
+
const { stdout } = await execAsync(`"${mysql}" -h 127.0.0.1 -P ${port} -u ${engineDef.superuser} -N -e "SELECT COALESCE(SUM(data_length + index_length), 0) FROM information_schema.tables WHERE table_schema = '${db}'"`);
|
|
644
|
+
const size = parseInt(stdout.trim(), 10);
|
|
645
|
+
return isNaN(size) ? null : size;
|
|
646
|
+
}
|
|
647
|
+
catch {
|
|
648
|
+
return null;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
async dumpFromConnectionString(connectionString, outputPath) {
|
|
652
|
+
const dumpPath = await this.getDumpPath();
|
|
653
|
+
const { host, port, user, password, database } = parseConnectionString(connectionString);
|
|
654
|
+
if (isWindows()) {
|
|
655
|
+
let cmd = `"${dumpPath}" -h ${host} -P ${port} -u ${user} --result-file "${outputPath}" ${database}`;
|
|
656
|
+
let safeCmd = cmd;
|
|
657
|
+
if (password) {
|
|
658
|
+
cmd = `"${dumpPath}" -h ${host} -P ${port} -u ${user} -p"${password}" --result-file "${outputPath}" ${database}`;
|
|
659
|
+
safeCmd = `"${dumpPath}" -h ${host} -P ${port} -u ${user} -p"****" --result-file "${outputPath}" ${database}`;
|
|
660
|
+
}
|
|
661
|
+
try {
|
|
662
|
+
logDebug('Executing mariadb-dump command', { cmd: safeCmd });
|
|
663
|
+
await execAsync(cmd);
|
|
664
|
+
return {
|
|
665
|
+
filePath: outputPath,
|
|
666
|
+
stdout: '',
|
|
667
|
+
stderr: '',
|
|
668
|
+
code: 0,
|
|
669
|
+
};
|
|
670
|
+
}
|
|
671
|
+
catch (error) {
|
|
672
|
+
throw new Error(error.message);
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
const args = [
|
|
676
|
+
'-h',
|
|
677
|
+
host,
|
|
678
|
+
'-P',
|
|
679
|
+
port,
|
|
680
|
+
'-u',
|
|
681
|
+
user,
|
|
682
|
+
'--result-file',
|
|
683
|
+
outputPath,
|
|
684
|
+
];
|
|
685
|
+
if (password) {
|
|
686
|
+
args.push(`-p${password}`);
|
|
687
|
+
}
|
|
688
|
+
args.push(database);
|
|
689
|
+
const spawnOptions = {
|
|
690
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
691
|
+
...getWindowsSpawnOptions(),
|
|
692
|
+
};
|
|
693
|
+
return new Promise((resolve, reject) => {
|
|
694
|
+
const proc = spawn(dumpPath, args, spawnOptions);
|
|
695
|
+
let stdout = '';
|
|
696
|
+
let stderr = '';
|
|
697
|
+
proc.stdout?.on('data', (data) => {
|
|
698
|
+
stdout += data.toString();
|
|
699
|
+
});
|
|
700
|
+
proc.stderr?.on('data', (data) => {
|
|
701
|
+
stderr += data.toString();
|
|
702
|
+
});
|
|
703
|
+
proc.on('error', reject);
|
|
704
|
+
proc.on('close', (code) => {
|
|
705
|
+
if (code === 0) {
|
|
706
|
+
resolve({
|
|
707
|
+
filePath: outputPath,
|
|
708
|
+
stdout,
|
|
709
|
+
stderr,
|
|
710
|
+
code,
|
|
711
|
+
});
|
|
712
|
+
}
|
|
713
|
+
else {
|
|
714
|
+
reject(new Error(stderr || `mariadb-dump exited with code ${code}`));
|
|
715
|
+
}
|
|
716
|
+
});
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
async getDumpPath() {
|
|
720
|
+
const configPath = await configManager.getBinaryPath('mariadb-dump');
|
|
721
|
+
if (configPath)
|
|
722
|
+
return configPath;
|
|
723
|
+
throw new Error('mariadb-dump not found. Ensure MariaDB binaries are downloaded:\n' +
|
|
724
|
+
' spindb engines download mariadb');
|
|
725
|
+
}
|
|
726
|
+
async backup(container, outputPath, options) {
|
|
727
|
+
return createBackup(container, outputPath, options);
|
|
728
|
+
}
|
|
729
|
+
async terminateConnections(container, database) {
|
|
730
|
+
assertValidDatabaseName(database);
|
|
731
|
+
const { port } = container;
|
|
732
|
+
const mysql = await this.getMariadbClientPath();
|
|
733
|
+
// Get all connection IDs for the target database and kill them
|
|
734
|
+
// We need to do this in two steps since MariaDB doesn't support subqueries in KILL
|
|
735
|
+
const getIdsCmd = buildMariadbInlineCommand(mysql, port, engineDef.superuser, `SELECT ID FROM information_schema.PROCESSLIST WHERE DB = '${database}' AND ID != CONNECTION_ID()`);
|
|
736
|
+
try {
|
|
737
|
+
const { stdout } = await execAsync(getIdsCmd);
|
|
738
|
+
const lines = stdout
|
|
739
|
+
.trim()
|
|
740
|
+
.split('\n')
|
|
741
|
+
.filter((l) => l.trim());
|
|
742
|
+
// Skip header row if present
|
|
743
|
+
const ids = lines
|
|
744
|
+
.slice(1)
|
|
745
|
+
.map((l) => l.trim())
|
|
746
|
+
.filter((l) => /^\d+$/.test(l));
|
|
747
|
+
for (const id of ids) {
|
|
748
|
+
const killCmd = buildMariadbInlineCommand(mysql, port, engineDef.superuser, `KILL CONNECTION ${id}`);
|
|
749
|
+
try {
|
|
750
|
+
await execAsync(killCmd);
|
|
751
|
+
}
|
|
752
|
+
catch {
|
|
753
|
+
// Connection may already be gone
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
catch {
|
|
758
|
+
// Ignore errors - connections may already be gone
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
async runScript(container, options) {
|
|
762
|
+
const { port } = container;
|
|
763
|
+
const db = options.database || container.database || 'mysql';
|
|
764
|
+
assertValidDatabaseName(db);
|
|
765
|
+
const mysql = await this.getMariadbClientPath();
|
|
766
|
+
if (isWindows()) {
|
|
767
|
+
const cmd = buildWindowsMariadbCommand(mysql, port, engineDef.superuser, db, options);
|
|
768
|
+
try {
|
|
769
|
+
const { stdout, stderr } = await execAsync(cmd);
|
|
770
|
+
if (stdout)
|
|
771
|
+
process.stdout.write(stdout);
|
|
772
|
+
if (stderr)
|
|
773
|
+
process.stderr.write(stderr);
|
|
774
|
+
return;
|
|
775
|
+
}
|
|
776
|
+
catch (error) {
|
|
777
|
+
const err = error;
|
|
778
|
+
throw new Error(`mariadb client failed: ${err.message}`);
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
const args = [
|
|
782
|
+
'-h',
|
|
783
|
+
'127.0.0.1',
|
|
784
|
+
'-P',
|
|
785
|
+
String(port),
|
|
786
|
+
'-u',
|
|
787
|
+
engineDef.superuser,
|
|
788
|
+
db,
|
|
789
|
+
];
|
|
790
|
+
if (options.sql) {
|
|
791
|
+
args.push('-e', options.sql);
|
|
792
|
+
const spawnOptions = {
|
|
793
|
+
stdio: 'inherit',
|
|
794
|
+
};
|
|
795
|
+
return new Promise((resolve, reject) => {
|
|
796
|
+
const proc = spawn(mysql, args, spawnOptions);
|
|
797
|
+
proc.on('error', reject);
|
|
798
|
+
proc.on('close', (code) => {
|
|
799
|
+
if (code === 0) {
|
|
800
|
+
resolve();
|
|
801
|
+
}
|
|
802
|
+
else {
|
|
803
|
+
reject(new Error(`mariadb client exited with code ${code}`));
|
|
804
|
+
}
|
|
805
|
+
});
|
|
806
|
+
});
|
|
807
|
+
}
|
|
808
|
+
else if (options.file) {
|
|
809
|
+
const spawnOptions = {
|
|
810
|
+
stdio: ['pipe', 'inherit', 'inherit'],
|
|
811
|
+
};
|
|
812
|
+
return new Promise((resolve, reject) => {
|
|
813
|
+
const fileStream = createReadStream(options.file);
|
|
814
|
+
const proc = spawn(mysql, args, spawnOptions);
|
|
815
|
+
fileStream.pipe(proc.stdin);
|
|
816
|
+
fileStream.on('error', (err) => {
|
|
817
|
+
proc.kill();
|
|
818
|
+
reject(err);
|
|
819
|
+
});
|
|
820
|
+
proc.on('error', reject);
|
|
821
|
+
proc.on('close', (code) => {
|
|
822
|
+
if (code === 0) {
|
|
823
|
+
resolve();
|
|
824
|
+
}
|
|
825
|
+
else {
|
|
826
|
+
reject(new Error(`mariadb client exited with code ${code}`));
|
|
827
|
+
}
|
|
828
|
+
});
|
|
829
|
+
});
|
|
830
|
+
}
|
|
831
|
+
else {
|
|
832
|
+
throw new Error('Either file or sql option must be provided');
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
async executeQuery(container, query, options) {
|
|
836
|
+
const { port } = container;
|
|
837
|
+
const db = options?.database || container.database || 'mysql';
|
|
838
|
+
assertValidDatabaseName(db);
|
|
839
|
+
const mariadb = await this.getMariadbClientPath();
|
|
840
|
+
// Use -B (batch mode) for tab-separated output
|
|
841
|
+
const args = [
|
|
842
|
+
'-h',
|
|
843
|
+
'127.0.0.1',
|
|
844
|
+
'-P',
|
|
845
|
+
String(port),
|
|
846
|
+
'-u',
|
|
847
|
+
engineDef.superuser,
|
|
848
|
+
'-B',
|
|
849
|
+
db,
|
|
850
|
+
'-e',
|
|
851
|
+
query,
|
|
852
|
+
];
|
|
853
|
+
return new Promise((resolve, reject) => {
|
|
854
|
+
const proc = spawn(mariadb, args, {
|
|
855
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
856
|
+
});
|
|
857
|
+
let stdout = '';
|
|
858
|
+
let stderr = '';
|
|
859
|
+
proc.stdout?.on('data', (data) => {
|
|
860
|
+
stdout += data.toString();
|
|
861
|
+
});
|
|
862
|
+
proc.stderr?.on('data', (data) => {
|
|
863
|
+
stderr += data.toString();
|
|
864
|
+
});
|
|
865
|
+
proc.on('error', reject);
|
|
866
|
+
proc.on('close', (code) => {
|
|
867
|
+
if (code === 0) {
|
|
868
|
+
resolve(parseTSVToQueryResult(stdout));
|
|
869
|
+
}
|
|
870
|
+
else {
|
|
871
|
+
reject(new Error(stderr || `mariadb exited with code ${code}`));
|
|
872
|
+
}
|
|
873
|
+
});
|
|
874
|
+
});
|
|
875
|
+
}
|
|
876
|
+
/**
|
|
877
|
+
* List all user databases, excluding system databases
|
|
878
|
+
* (information_schema, mysql, performance_schema, sys).
|
|
879
|
+
*/
|
|
880
|
+
async listDatabases(container) {
|
|
881
|
+
const { port } = container;
|
|
882
|
+
const mariadb = await this.getMariadbClientPath();
|
|
883
|
+
// Query for all non-system databases
|
|
884
|
+
const sql = `SHOW DATABASES WHERE \`Database\` NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys')`;
|
|
885
|
+
const args = [
|
|
886
|
+
'-h',
|
|
887
|
+
'127.0.0.1',
|
|
888
|
+
'-P',
|
|
889
|
+
String(port),
|
|
890
|
+
'-u',
|
|
891
|
+
engineDef.superuser,
|
|
892
|
+
'-N', // Skip column names
|
|
893
|
+
'-B', // Batch mode (no formatting)
|
|
894
|
+
'-e',
|
|
895
|
+
sql,
|
|
896
|
+
];
|
|
897
|
+
return new Promise((resolve, reject) => {
|
|
898
|
+
const proc = spawn(mariadb, args, {
|
|
899
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
900
|
+
});
|
|
901
|
+
let stdout = '';
|
|
902
|
+
let stderr = '';
|
|
903
|
+
proc.stdout?.on('data', (data) => {
|
|
904
|
+
stdout += data.toString();
|
|
905
|
+
});
|
|
906
|
+
proc.stderr?.on('data', (data) => {
|
|
907
|
+
stderr += data.toString();
|
|
908
|
+
});
|
|
909
|
+
proc.on('error', reject);
|
|
910
|
+
proc.on('close', (code) => {
|
|
911
|
+
if (code === 0) {
|
|
912
|
+
const databases = stdout
|
|
913
|
+
.trim()
|
|
914
|
+
.split('\n')
|
|
915
|
+
.map((db) => db.trim())
|
|
916
|
+
.filter((db) => db.length > 0);
|
|
917
|
+
resolve(databases);
|
|
918
|
+
}
|
|
919
|
+
else {
|
|
920
|
+
reject(new Error(stderr || `mariadb exited with code ${code}`));
|
|
921
|
+
}
|
|
922
|
+
});
|
|
923
|
+
});
|
|
924
|
+
}
|
|
925
|
+
async createUser(container, options) {
|
|
926
|
+
const { username, password, database } = options;
|
|
927
|
+
assertValidUsername(username);
|
|
928
|
+
const { port } = container;
|
|
929
|
+
const db = database || container.database || 'mysql';
|
|
930
|
+
assertValidDatabaseName(db);
|
|
931
|
+
const mariadb = await this.getMariadbClientPath();
|
|
932
|
+
// Check if NO_BACKSLASH_ESCAPES is enabled — if so, only escape single quotes
|
|
933
|
+
let noBackslashEscapes = false;
|
|
934
|
+
try {
|
|
935
|
+
const modeArgs = [
|
|
936
|
+
'-h',
|
|
937
|
+
'127.0.0.1',
|
|
938
|
+
'-P',
|
|
939
|
+
String(port),
|
|
940
|
+
'-u',
|
|
941
|
+
engineDef.superuser,
|
|
942
|
+
'-N',
|
|
943
|
+
'-B',
|
|
944
|
+
'-e',
|
|
945
|
+
'SELECT @@sql_mode',
|
|
946
|
+
];
|
|
947
|
+
const modeResult = await new Promise((resolve, reject) => {
|
|
948
|
+
const proc = spawn(mariadb, modeArgs, {
|
|
949
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
950
|
+
});
|
|
951
|
+
let stdout = '';
|
|
952
|
+
proc.stdout?.on('data', (data) => {
|
|
953
|
+
stdout += data.toString();
|
|
954
|
+
});
|
|
955
|
+
proc.on('close', (code) => {
|
|
956
|
+
if (code === 0)
|
|
957
|
+
resolve(stdout.trim());
|
|
958
|
+
else
|
|
959
|
+
reject(new Error(`Failed to query sql_mode`));
|
|
960
|
+
});
|
|
961
|
+
proc.on('error', reject);
|
|
962
|
+
});
|
|
963
|
+
noBackslashEscapes = modeResult.includes('NO_BACKSLASH_ESCAPES');
|
|
964
|
+
}
|
|
965
|
+
catch {
|
|
966
|
+
// Default to backslash-escaping if query fails
|
|
967
|
+
}
|
|
968
|
+
const escapedPass = noBackslashEscapes
|
|
969
|
+
? password.replace(/'/g, "''")
|
|
970
|
+
: password.replace(/\\/g, '\\\\').replace(/'/g, "''");
|
|
971
|
+
const sql = `CREATE USER IF NOT EXISTS '${username}'@'%' IDENTIFIED BY '${escapedPass}'; CREATE USER IF NOT EXISTS '${username}'@'localhost' IDENTIFIED BY '${escapedPass}'; ALTER USER '${username}'@'%' IDENTIFIED BY '${escapedPass}'; ALTER USER '${username}'@'localhost' IDENTIFIED BY '${escapedPass}'; GRANT ALL ON \`${db}\`.* TO '${username}'@'%'; GRANT ALL ON \`${db}\`.* TO '${username}'@'localhost'; FLUSH PRIVILEGES;`;
|
|
972
|
+
// Send SQL via stdin to avoid leaking password in process argv
|
|
973
|
+
const args = [
|
|
974
|
+
'-h',
|
|
975
|
+
'127.0.0.1',
|
|
976
|
+
'-P',
|
|
977
|
+
String(port),
|
|
978
|
+
'-u',
|
|
979
|
+
engineDef.superuser,
|
|
980
|
+
];
|
|
981
|
+
await new Promise((resolve, reject) => {
|
|
982
|
+
const proc = spawn(mariadb, args, {
|
|
983
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
984
|
+
});
|
|
985
|
+
let stderr = '';
|
|
986
|
+
proc.stderr?.on('data', (data) => {
|
|
987
|
+
stderr += data.toString();
|
|
988
|
+
});
|
|
989
|
+
proc.on('close', (code) => {
|
|
990
|
+
if (code === 0)
|
|
991
|
+
resolve();
|
|
992
|
+
else
|
|
993
|
+
reject(new Error(`Failed to create user: ${stderr}`));
|
|
994
|
+
});
|
|
995
|
+
proc.on('error', reject);
|
|
996
|
+
proc.stdin?.write(sql);
|
|
997
|
+
proc.stdin?.end();
|
|
998
|
+
});
|
|
999
|
+
const connectionString = `mysql://${encodeURIComponent(username)}:${encodeURIComponent(password)}@127.0.0.1:${port}/${db}`;
|
|
1000
|
+
return {
|
|
1001
|
+
username,
|
|
1002
|
+
password,
|
|
1003
|
+
connectionString,
|
|
1004
|
+
engine: container.engine,
|
|
1005
|
+
container: container.name,
|
|
1006
|
+
database: db,
|
|
1007
|
+
};
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
export const mariadbEngine = new MariaDBEngine();
|
|
1011
|
+
//# sourceMappingURL=index.js.map
|