rubydb 0.1.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.
- checksums.yaml +7 -0
- data/.gitattributes +20 -0
- data/.github/ISSUE_TEMPLATE/bug.yml +0 -0
- data/.github/ISSUE_TEMPLATE/feature.yml +0 -0
- data/.github/ISSUE_TEMPLATE/performance.yml +0 -0
- data/.github/ISSUE_TEMPLATE/security.yml +0 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +15 -0
- data/.github/dependabot.yml +0 -0
- data/.github/workflows/benchmark.yml +26 -0
- data/.github/workflows/compatibility.yml +63 -0
- data/.github/workflows/fuzz.yml +33 -0
- data/.github/workflows/lint.yml +21 -0
- data/.github/workflows/operations.yml +24 -0
- data/.github/workflows/production-validation.yml +111 -0
- data/.github/workflows/release.yml +77 -0
- data/.github/workflows/security.yml +37 -0
- data/.github/workflows/test.yml +26 -0
- data/.github/workflows/workload.yml +58 -0
- data/.gitignore +43 -0
- data/.rspec +4 -0
- data/.rubocop.yml +44 -0
- data/.ruby-version +1 -0
- data/.standard.yml +14 -0
- data/ARCHITECTURE.md +21 -0
- data/CHANGELOG.md +31 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/CONTRIBUTING.md +29 -0
- data/GOVERNANCE.md +16 -0
- data/Gemfile +17 -0
- data/Gemfile.lock +71 -0
- data/LICENSE +60 -0
- data/README.md +162 -0
- data/ROADMAP.md +27 -0
- data/Rakefile +71 -0
- data/SECURITY.md +54 -0
- data/SUPPORT.md +14 -0
- data/adapters/activerecord/Gemfile +11 -0
- data/adapters/activerecord/README.md +9 -0
- data/adapters/activerecord/lib/active_record/connection_adapters/rubydb_adapter.rb +887 -0
- data/adapters/activerecord/rubydb-activerecord.gemspec +27 -0
- data/adapters/activerecord/spec/rubydb_adapter_integration_spec.rb +151 -0
- data/adapters/ruby/README.md +18 -0
- data/adapters/sequel/README.md +11 -0
- data/bin/rubydb +19 -0
- data/bin/rubydb-server +126 -0
- data/config/development.yml +0 -0
- data/config/monitoring/prometheus-alerts.yml +39 -0
- data/config/production.yml +36 -0
- data/config/test.yml +0 -0
- data/docs/README.md +71 -0
- data/docs/architecture/concurrency.md +14 -0
- data/docs/architecture/current-state.md +125 -0
- data/docs/architecture/execution-engine.md +25 -0
- data/docs/architecture/indexes.md +19 -0
- data/docs/architecture/mvcc.md +19 -0
- data/docs/architecture/overview.md +13 -0
- data/docs/architecture/pages.md +11 -0
- data/docs/architecture/production-roadmap.md +82 -0
- data/docs/architecture/query-planner.md +20 -0
- data/docs/architecture/recovery.md +18 -0
- data/docs/architecture/sql-engine.md +12 -0
- data/docs/architecture/storage-engine.md +14 -0
- data/docs/architecture/transactions.md +10 -0
- data/docs/architecture/wal.md +28 -0
- data/docs/cli-cheatsheet.md +98 -0
- data/docs/cli.md +275 -0
- data/docs/contributing/architecture.md +9 -0
- data/docs/contributing/benchmarking.md +14 -0
- data/docs/contributing/development.md +16 -0
- data/docs/contributing/release-process.md +49 -0
- data/docs/contributing/testing.md +16 -0
- data/docs/debugging.md +229 -0
- data/docs/developer/branching.md +10 -0
- data/docs/developer/database-diff.md +10 -0
- data/docs/developer/local-development.md +17 -0
- data/docs/developer/snapshots.md +9 -0
- data/docs/developer/temporal-data.md +10 -0
- data/docs/developer-guide.md +297 -0
- data/docs/getting-started/first-database.md +16 -0
- data/docs/getting-started/first-query.md +13 -0
- data/docs/getting-started/installation.md +19 -0
- data/docs/getting-started/local-to-production.md +300 -0
- data/docs/getting-started/quickstart.md +17 -0
- data/docs/getting-started/rails.md +16 -0
- data/docs/hardening_backlog.md +93 -0
- data/docs/lessons-learned.md +112 -0
- data/docs/operations/backups.md +33 -0
- data/docs/operations/disaster-recovery.md +31 -0
- data/docs/operations/failover.md +30 -0
- data/docs/operations/monitoring.md +25 -0
- data/docs/operations/production-guide.md +295 -0
- data/docs/operations/production-runbook.md +45 -0
- data/docs/operations/replication.md +33 -0
- data/docs/operations/restore.md +6 -0
- data/docs/operations/runbook.md +34 -0
- data/docs/operations/upgrades.md +14 -0
- data/docs/operations/workload-testing.md +17 -0
- data/docs/production-readiness.md +118 -0
- data/docs/production_validation.md +150 -0
- data/docs/rails/active-record.md +11 -0
- data/docs/rails/compatibility-guide.md +90 -0
- data/docs/rails/database-yml.md +92 -0
- data/docs/rails/installation.md +17 -0
- data/docs/rails/migrations.md +17 -0
- data/docs/rails/production.md +82 -0
- data/docs/rails/troubleshooting.md +18 -0
- data/docs/release.md +59 -0
- data/docs/server/architecture.md +10 -0
- data/docs/server/authentication.md +10 -0
- data/docs/server/configuration.md +16 -0
- data/docs/server/connection-pooling.md +10 -0
- data/docs/server/deployment.md +10 -0
- data/docs/server/protocol.md +12 -0
- data/docs/sql/compatibility-guide.md +82 -0
- data/docs/sql/compatibility.md +39 -0
- data/docs/sql/data-types.md +10 -0
- data/docs/sql/functions.md +9 -0
- data/docs/sql/joins.md +9 -0
- data/docs/sql/operators.md +9 -0
- data/docs/sql/sqlite-compatibility.md +21 -0
- data/docs/sql/syntax.md +10 -0
- data/docs/sql/transactions.md +10 -0
- data/docs/troubleshooting.md +244 -0
- data/exe/rubydb +23 -0
- data/lib/rubydb/backup/archive.rb +334 -0
- data/lib/rubydb/backup/backup.rb +401 -0
- data/lib/rubydb/backup/incremental.rb +353 -0
- data/lib/rubydb/backup/restore.rb +290 -0
- data/lib/rubydb/backup/snapshot.rb +267 -0
- data/lib/rubydb/backup/verification.rb +279 -0
- data/lib/rubydb/branching/branch.rb +181 -0
- data/lib/rubydb/branching/branch_manager.rb +311 -0
- data/lib/rubydb/branching/branch_metadata.rb +140 -0
- data/lib/rubydb/branching/checkout.rb +166 -0
- data/lib/rubydb/branching/copy_on_write.rb +272 -0
- data/lib/rubydb/branching/diff.rb +138 -0
- data/lib/rubydb/branching/merge.rb +285 -0
- data/lib/rubydb/build_info.rb +15 -0
- data/lib/rubydb/catalog/catalog.rb +391 -0
- data/lib/rubydb/catalog/column.rb +112 -0
- data/lib/rubydb/catalog/constraint.rb +180 -0
- data/lib/rubydb/catalog/database.rb +184 -0
- data/lib/rubydb/catalog/index.rb +97 -0
- data/lib/rubydb/catalog/schema.rb +103 -0
- data/lib/rubydb/catalog/sequence.rb +90 -0
- data/lib/rubydb/catalog/system_catalog.rb +698 -0
- data/lib/rubydb/catalog/table.rb +178 -0
- data/lib/rubydb/catalog/trigger.rb +102 -0
- data/lib/rubydb/catalog/view.rb +66 -0
- data/lib/rubydb/cli/application.rb +163 -0
- data/lib/rubydb/cli/commands/backup.rb +81 -0
- data/lib/rubydb/cli/commands/branch.rb +72 -0
- data/lib/rubydb/cli/commands/checkout.rb +54 -0
- data/lib/rubydb/cli/commands/create.rb +58 -0
- data/lib/rubydb/cli/commands/diff.rb +77 -0
- data/lib/rubydb/cli/commands/doctor.rb +74 -0
- data/lib/rubydb/cli/commands/drop.rb +57 -0
- data/lib/rubydb/cli/commands/init.rb +102 -0
- data/lib/rubydb/cli/commands/inspect.rb +95 -0
- data/lib/rubydb/cli/commands/merge.rb +63 -0
- data/lib/rubydb/cli/commands/migrate.rb +62 -0
- data/lib/rubydb/cli/commands/restart.rb +39 -0
- data/lib/rubydb/cli/commands/restore.rb +121 -0
- data/lib/rubydb/cli/commands/shell.rb +365 -0
- data/lib/rubydb/cli/commands/snapshot.rb +79 -0
- data/lib/rubydb/cli/commands/start.rb +82 -0
- data/lib/rubydb/cli/commands/status.rb +92 -0
- data/lib/rubydb/cli/commands/stop.rb +47 -0
- data/lib/rubydb/cli/commands/vacuum.rb +58 -0
- data/lib/rubydb/cli/formatter.rb +221 -0
- data/lib/rubydb/cli/output.rb +168 -0
- data/lib/rubydb/client/client.rb +304 -0
- data/lib/rubydb/client/connection.rb +415 -0
- data/lib/rubydb/client/connection_pool.rb +168 -0
- data/lib/rubydb/client/connection_url.rb +96 -0
- data/lib/rubydb/client/prepared_statement.rb +60 -0
- data/lib/rubydb/client/result.rb +123 -0
- data/lib/rubydb/client/statement.rb +52 -0
- data/lib/rubydb/client/transaction.rb +130 -0
- data/lib/rubydb/concurrency/concurrency.rb +19 -0
- data/lib/rubydb/concurrency/deadlock_detector.rb +150 -0
- data/lib/rubydb/concurrency/latch.rb +101 -0
- data/lib/rubydb/concurrency/lock_graph.rb +165 -0
- data/lib/rubydb/concurrency/mutex.rb +183 -0
- data/lib/rubydb/concurrency/rw_lock.rb +180 -0
- data/lib/rubydb/concurrency/scheduler.rb +250 -0
- data/lib/rubydb/concurrency/worker_pool.rb +143 -0
- data/lib/rubydb/configuration/config.rb +170 -0
- data/lib/rubydb/configuration/defaults.rb +179 -0
- data/lib/rubydb/configuration/environment.rb +152 -0
- data/lib/rubydb/configuration/parser.rb +185 -0
- data/lib/rubydb/configuration/validation.rb +221 -0
- data/lib/rubydb/constants.rb +74 -0
- data/lib/rubydb/constraints/check.rb +181 -0
- data/lib/rubydb/constraints/constraint.rb +101 -0
- data/lib/rubydb/constraints/foreign_key.rb +130 -0
- data/lib/rubydb/constraints/not_null.rb +64 -0
- data/lib/rubydb/constraints/primary_key.rb +99 -0
- data/lib/rubydb/constraints/unique.rb +108 -0
- data/lib/rubydb/constraints/validator.rb +350 -0
- data/lib/rubydb/errors/authentication_error.rb +10 -0
- data/lib/rubydb/errors/authorization_error.rb +23 -0
- data/lib/rubydb/errors/client_error.rb +10 -0
- data/lib/rubydb/errors/configuration_error.rb +10 -0
- data/lib/rubydb/errors/connection_error.rb +10 -0
- data/lib/rubydb/errors/constraint_error.rb +23 -0
- data/lib/rubydb/errors/corruption_error.rb +10 -0
- data/lib/rubydb/errors/database_error.rb +10 -0
- data/lib/rubydb/errors/error.rb +20 -0
- data/lib/rubydb/errors/execution_error.rb +10 -0
- data/lib/rubydb/errors/parser_error.rb +10 -0
- data/lib/rubydb/errors/recovery_error.rb +10 -0
- data/lib/rubydb/errors/replication_error.rb +10 -0
- data/lib/rubydb/errors/server_error.rb +6 -0
- data/lib/rubydb/errors/storage_error.rb +10 -0
- data/lib/rubydb/errors/transaction_error.rb +10 -0
- data/lib/rubydb/execution/aggregate_executor.rb +138 -0
- data/lib/rubydb/execution/delete_executor.rb +112 -0
- data/lib/rubydb/execution/distinct_executor.rb +135 -0
- data/lib/rubydb/execution/executor.rb +1192 -0
- data/lib/rubydb/execution/expression.rb +193 -0
- data/lib/rubydb/execution/index_scan.rb +142 -0
- data/lib/rubydb/execution/insert_executor.rb +217 -0
- data/lib/rubydb/execution/join_executor.rb +249 -0
- data/lib/rubydb/execution/limit_executor.rb +85 -0
- data/lib/rubydb/execution/optimizer.rb +215 -0
- data/lib/rubydb/execution/plan.rb +361 -0
- data/lib/rubydb/execution/planner.rb +546 -0
- data/lib/rubydb/execution/predicate.rb +235 -0
- data/lib/rubydb/execution/scan.rb +49 -0
- data/lib/rubydb/execution/sequential_scan.rb +63 -0
- data/lib/rubydb/execution/sort_executor.rb +185 -0
- data/lib/rubydb/execution/update_executor.rb +162 -0
- data/lib/rubydb/functions/aggregate.rb +70 -0
- data/lib/rubydb/functions/date_functions.rb +278 -0
- data/lib/rubydb/functions/function.rb +85 -0
- data/lib/rubydb/functions/json_functions.rb +215 -0
- data/lib/rubydb/functions/numeric_functions.rb +346 -0
- data/lib/rubydb/functions/scalar.rb +52 -0
- data/lib/rubydb/functions/string_functions.rb +383 -0
- data/lib/rubydb/functions/system_functions.rb +246 -0
- data/lib/rubydb/history/as_of.rb +238 -0
- data/lib/rubydb/history/change.rb +105 -0
- data/lib/rubydb/history/history.rb +131 -0
- data/lib/rubydb/history/history_manager.rb +229 -0
- data/lib/rubydb/history/temporal_query.rb +202 -0
- data/lib/rubydb/history/timeline.rb +144 -0
- data/lib/rubydb/indexes/btree.rb +186 -0
- data/lib/rubydb/indexes/btree_cursor.rb +258 -0
- data/lib/rubydb/indexes/btree_node.rb +385 -0
- data/lib/rubydb/indexes/hash_index.rb +150 -0
- data/lib/rubydb/indexes/index.rb +71 -0
- data/lib/rubydb/indexes/index_manager.rb +406 -0
- data/lib/rubydb/indexes/index_scan.rb +470 -0
- data/lib/rubydb/migrations/migration.rb +254 -0
- data/lib/rubydb/migrations/migration_lock.rb +146 -0
- data/lib/rubydb/migrations/migration_manager.rb +176 -0
- data/lib/rubydb/migrations/migration_version.rb +71 -0
- data/lib/rubydb/migrations/schema_diff.rb +211 -0
- data/lib/rubydb/migrations/schema_version.rb +64 -0
- data/lib/rubydb/monitoring/events.rb +160 -0
- data/lib/rubydb/monitoring/health.rb +222 -0
- data/lib/rubydb/monitoring/logger.rb +193 -0
- data/lib/rubydb/monitoring/metrics.rb +359 -0
- data/lib/rubydb/monitoring/performance.rb +176 -0
- data/lib/rubydb/monitoring/statistics.rb +170 -0
- data/lib/rubydb/mvcc/garbage_collector.rb +199 -0
- data/lib/rubydb/mvcc/mvcc.rb +16 -0
- data/lib/rubydb/mvcc/snapshot.rb +147 -0
- data/lib/rubydb/mvcc/vacuum.rb +180 -0
- data/lib/rubydb/mvcc/version.rb +106 -0
- data/lib/rubydb/mvcc/version_store.rb +398 -0
- data/lib/rubydb/mvcc/visibility.rb +109 -0
- data/lib/rubydb/protocol/capabilities.rb +125 -0
- data/lib/rubydb/protocol/decoder.rb +145 -0
- data/lib/rubydb/protocol/encoder.rb +136 -0
- data/lib/rubydb/protocol/handshake.rb +305 -0
- data/lib/rubydb/protocol/message.rb +121 -0
- data/lib/rubydb/protocol/protocol.rb +277 -0
- data/lib/rubydb/protocol/version.rb +54 -0
- data/lib/rubydb/rails/adapter.rb +239 -0
- data/lib/rubydb/rails/connection.rb +314 -0
- data/lib/rubydb/rails/database_statements.rb +122 -0
- data/lib/rubydb/rails/migration.rb +131 -0
- data/lib/rubydb/rails/quoting.rb +109 -0
- data/lib/rubydb/rails/result.rb +120 -0
- data/lib/rubydb/rails/schema_statements.rb +339 -0
- data/lib/rubydb/rails/transaction.rb +105 -0
- data/lib/rubydb/rails/type.rb +126 -0
- data/lib/rubydb/recovery/checkpoint.rb +257 -0
- data/lib/rubydb/recovery/consistency.rb +467 -0
- data/lib/rubydb/recovery/corruption_detector.rb +5 -0
- data/lib/rubydb/recovery/crash_recovery.rb +387 -0
- data/lib/rubydb/recovery/recovery_manager.rb +206 -0
- data/lib/rubydb/recovery/redo.rb +237 -0
- data/lib/rubydb/recovery/undo.rb +206 -0
- data/lib/rubydb/replication/failover.rb +5 -0
- data/lib/rubydb/replication/fencing.rb +63 -0
- data/lib/rubydb/replication/primary.rb +450 -0
- data/lib/rubydb/replication/replica.rb +384 -0
- data/lib/rubydb/replication/replication_log.rb +200 -0
- data/lib/rubydb/replication/replication_manager.rb +308 -0
- data/lib/rubydb/replication/replication_slot.rb +295 -0
- data/lib/rubydb/replication/replication_stream.rb +201 -0
- data/lib/rubydb/rubydb.rb +560 -0
- data/lib/rubydb/security/access_control.rb +254 -0
- data/lib/rubydb/security/audit_log.rb +213 -0
- data/lib/rubydb/security/authentication.rb +302 -0
- data/lib/rubydb/security/authorization.rb +282 -0
- data/lib/rubydb/security/credentials.rb +196 -0
- data/lib/rubydb/security/password.rb +215 -0
- data/lib/rubydb/security/permissions.rb +74 -0
- data/lib/rubydb/security/role.rb +101 -0
- data/lib/rubydb/security/user.rb +86 -0
- data/lib/rubydb/server/connection.rb +366 -0
- data/lib/rubydb/server/connection_pool.rb +193 -0
- data/lib/rubydb/server/lifecycle.rb +228 -0
- data/lib/rubydb/server/listener.rb +136 -0
- data/lib/rubydb/server/request_handler.rb +276 -0
- data/lib/rubydb/server/server.rb +364 -0
- data/lib/rubydb/server/session.rb +369 -0
- data/lib/rubydb/server/worker.rb +210 -0
- data/lib/rubydb/server/worker_pool.rb +168 -0
- data/lib/rubydb/sql/ast/alter_table.rb +169 -0
- data/lib/rubydb/sql/ast/begin_transaction.rb +47 -0
- data/lib/rubydb/sql/ast/commit.rb +37 -0
- data/lib/rubydb/sql/ast/constraint.rb +83 -0
- data/lib/rubydb/sql/ast/create_database.rb +41 -0
- data/lib/rubydb/sql/ast/create_index.rb +61 -0
- data/lib/rubydb/sql/ast/create_schema.rb +52 -0
- data/lib/rubydb/sql/ast/create_table.rb +187 -0
- data/lib/rubydb/sql/ast/delete.rb +54 -0
- data/lib/rubydb/sql/ast/drop_database.rb +41 -0
- data/lib/rubydb/sql/ast/drop_index.rb +41 -0
- data/lib/rubydb/sql/ast/drop_schema.rb +49 -0
- data/lib/rubydb/sql/ast/drop_table.rb +49 -0
- data/lib/rubydb/sql/ast/explain.rb +64 -0
- data/lib/rubydb/sql/ast/expression.rb +604 -0
- data/lib/rubydb/sql/ast/insert.rb +82 -0
- data/lib/rubydb/sql/ast/node.rb +42 -0
- data/lib/rubydb/sql/ast/rollback.rb +63 -0
- data/lib/rubydb/sql/ast/savepoint.rb +59 -0
- data/lib/rubydb/sql/ast/select.rb +88 -0
- data/lib/rubydb/sql/ast/set_operation.rb +20 -0
- data/lib/rubydb/sql/ast/trigger.rb +29 -0
- data/lib/rubydb/sql/ast/update.rb +88 -0
- data/lib/rubydb/sql/ast/vacuum.rb +19 -0
- data/lib/rubydb/sql/ast/view.rb +32 -0
- data/lib/rubydb/sql/ast/with.rb +32 -0
- data/lib/rubydb/sql/grammar.rb +86 -0
- data/lib/rubydb/sql/keywords.rb +156 -0
- data/lib/rubydb/sql/lexer.rb +214 -0
- data/lib/rubydb/sql/operators.rb +100 -0
- data/lib/rubydb/sql/parser.rb +1185 -0
- data/lib/rubydb/sql/planner/analyzer.rb +302 -0
- data/lib/rubydb/sql/planner/binder.rb +550 -0
- data/lib/rubydb/sql/planner/type_checker.rb +431 -0
- data/lib/rubydb/sql/token.rb +210 -0
- data/lib/rubydb/storage/buffer_frame.rb +44 -0
- data/lib/rubydb/storage/buffer_pool.rb +155 -0
- data/lib/rubydb/storage/database_lock.rb +74 -0
- data/lib/rubydb/storage/deserializer.rb +342 -0
- data/lib/rubydb/storage/engine.rb +2338 -0
- data/lib/rubydb/storage/file_manager.rb +187 -0
- data/lib/rubydb/storage/free_space_map.rb +81 -0
- data/lib/rubydb/storage/page.rb +94 -0
- data/lib/rubydb/storage/page_allocator.rb +855 -0
- data/lib/rubydb/storage/page_header.rb +67 -0
- data/lib/rubydb/storage/page_manager.rb +131 -0
- data/lib/rubydb/storage/record.rb +58 -0
- data/lib/rubydb/storage/row.rb +78 -0
- data/lib/rubydb/storage/serializer.rb +51 -0
- data/lib/rubydb/storage/storage_layout.rb +151 -0
- data/lib/rubydb/storage/storage_manager.rb +114 -0
- data/lib/rubydb/storage/tuple.rb +461 -0
- data/lib/rubydb/storage/visibility_map.rb +984 -0
- data/lib/rubydb/transactions/commit_manager.rb +220 -0
- data/lib/rubydb/transactions/isolation.rb +98 -0
- data/lib/rubydb/transactions/lock.rb +76 -0
- data/lib/rubydb/transactions/lock_manager.rb +362 -0
- data/lib/rubydb/transactions/savepoint.rb +143 -0
- data/lib/rubydb/transactions/transaction.rb +215 -0
- data/lib/rubydb/transactions/transaction_id.rb +84 -0
- data/lib/rubydb/transactions/transaction_log.rb +257 -0
- data/lib/rubydb/transactions/transaction_manager.rb +435 -0
- data/lib/rubydb/types/bigint.rb +36 -0
- data/lib/rubydb/types/blob.rb +37 -0
- data/lib/rubydb/types/boolean.rb +34 -0
- data/lib/rubydb/types/date.rb +39 -0
- data/lib/rubydb/types/decimal.rb +48 -0
- data/lib/rubydb/types/float.rb +34 -0
- data/lib/rubydb/types/integer.rb +36 -0
- data/lib/rubydb/types/json.rb +41 -0
- data/lib/rubydb/types/null.rb +34 -0
- data/lib/rubydb/types/smallint.rb +36 -0
- data/lib/rubydb/types/text.rb +37 -0
- data/lib/rubydb/types/time.rb +46 -0
- data/lib/rubydb/types/timestamp.rb +39 -0
- data/lib/rubydb/types/type.rb +119 -0
- data/lib/rubydb/types/uuid.rb +47 -0
- data/lib/rubydb/types/varchar.rb +37 -0
- data/lib/rubydb/version.rb +33 -0
- data/lib/rubydb/wal/archive.rb +193 -0
- data/lib/rubydb/wal/checkpoint.rb +183 -0
- data/lib/rubydb/wal/lsn.rb +94 -0
- data/lib/rubydb/wal/reader.rb +260 -0
- data/lib/rubydb/wal/record.rb +105 -0
- data/lib/rubydb/wal/segment.rb +193 -0
- data/lib/rubydb/wal/wal.rb +452 -0
- data/lib/rubydb/wal/writer.rb +236 -0
- data/lib/rubydb.rb +7 -0
- data/packaging/docker/Dockerfile +36 -0
- data/packaging/docker/docker-compose.failover.yml +43 -0
- data/packaging/docker/entrypoint.sh +15 -0
- data/packaging/homebrew/rubydb.rb +19 -0
- data/packaging/systemd/rubydb.service +22 -0
- data/rubydb.gemspec +57 -0
- data/scripts/benchmark +7 -0
- data/scripts/durability_drill +37 -0
- data/scripts/format +0 -0
- data/scripts/fuzz +63 -0
- data/scripts/lint +0 -0
- data/scripts/release +50 -0
- data/scripts/release_check +43 -0
- data/scripts/replication_failover_drill +250 -0
- data/scripts/replication_network_failover_drill +255 -0
- data/scripts/restore_drill +45 -0
- data/scripts/security +0 -0
- data/scripts/setup +0 -0
- data/scripts/test +0 -0
- data/scripts/test-chaos +0 -0
- data/scripts/test-crash +0 -0
- data/scripts/test-integration +0 -0
- data/scripts/test-unit +0 -0
- data/visibility_map.json +1 -0
- metadata +538 -0
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to RubyDB are documented here. Versions follow
|
|
4
|
+
[Semantic Versioning](https://semver.org/).
|
|
5
|
+
|
|
6
|
+
## Unreleased
|
|
7
|
+
|
|
8
|
+
- Added full developer, troubleshooting, debugging, production operations,
|
|
9
|
+
Rails compatibility, and SQL compatibility guides with repository maps,
|
|
10
|
+
incident evidence procedures, safe recovery guidance, and deployment
|
|
11
|
+
checklists.
|
|
12
|
+
- Added RubyDB connection URLs (`rubydb://` and TLS-enabled `rubydbs://`) for
|
|
13
|
+
regular Ruby clients and Rails `database.yml`, including percent-encoded
|
|
14
|
+
credentials and documented TLS/query options.
|
|
15
|
+
- Added a beginner-friendly local-to-production guide covering local RubyDB,
|
|
16
|
+
PostgreSQL migration, RubyDB server deployment, environment URLs, Render-style
|
|
17
|
+
hosting, data transfer, smoke tests, and production checklists.
|
|
18
|
+
- Added a documentation index and lessons-learned guide covering durability,
|
|
19
|
+
ownership, replication fencing, cancellation, deadlocks, Rails adapters,
|
|
20
|
+
operations, evidence, and security review boundaries.
|
|
21
|
+
- Added a full CLI guide and cheat sheet covering lifecycle, server operation,
|
|
22
|
+
shell, migrations, backup/restore, snapshots, branches, inspection, doctor,
|
|
23
|
+
vacuum, maintenance, and release workflows.
|
|
24
|
+
- Clarified the tested common SQLite-style profile and production limits.
|
|
25
|
+
|
|
26
|
+
## 0.1.0 - 2026-09-07
|
|
27
|
+
|
|
28
|
+
- Initial public release candidate.
|
|
29
|
+
- Includes the embedded engine, ActiveRecord adapter, backup/recovery, WAL,
|
|
30
|
+
TLS, authentication, and validated production-hardening checkpoints.
|
|
31
|
+
- See `docs/production_validation.md` for tested scope and operational limits.
|
data/CODE_OF_CONDUCT.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Contributor Code of Conduct
|
|
2
|
+
|
|
3
|
+
RubyDB contributors are expected to make participation respectful, practical,
|
|
4
|
+
and safe. Harassment, discrimination, threats, personal attacks, doxxing,
|
|
5
|
+
deliberate disruption, and unwanted sexual attention are not acceptable.
|
|
6
|
+
|
|
7
|
+
Project maintainers may moderate comments, discussions, issues, and pull
|
|
8
|
+
requests when conduct violates this standard. They should explain the reason,
|
|
9
|
+
apply the rule consistently, and protect people who report concerns.
|
|
10
|
+
|
|
11
|
+
Report a conduct concern privately to the repository maintainers through a
|
|
12
|
+
GitHub private security/contact channel. Do not include production secrets or
|
|
13
|
+
customer data. Reports are handled confidentially as far as practical.
|
data/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Contributing to RubyDB
|
|
2
|
+
|
|
3
|
+
RubyDB is a correctness-first database project. Small, reviewable changes with
|
|
4
|
+
tests and documentation are preferred over broad changes with unverified
|
|
5
|
+
claims.
|
|
6
|
+
|
|
7
|
+
## Development
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
bundle install
|
|
11
|
+
bundle exec rspec
|
|
12
|
+
bundle exec rubocop
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Use a temporary database for tests. Do not commit database files, credentials,
|
|
16
|
+
generated private keys, coverage output, or release artifacts. Follow the
|
|
17
|
+
architecture and testing guides in `docs/`.
|
|
18
|
+
|
|
19
|
+
## Pull requests
|
|
20
|
+
|
|
21
|
+
Explain the invariant being changed, the failure mode it prevents, and the
|
|
22
|
+
rollback or compatibility impact. Add regression coverage for parser,
|
|
23
|
+
execution, storage, transaction, protocol, adapter, or operational changes.
|
|
24
|
+
Run the relevant workload, crash, backup/restore, and security checks. Update
|
|
25
|
+
the compatibility contract when behavior changes.
|
|
26
|
+
|
|
27
|
+
Never describe a simulated fault test as proof of physical power-loss,
|
|
28
|
+
multi-host, or independent security-review results. See the
|
|
29
|
+
[lessons learned](docs/lessons-learned.md) guide.
|
data/GOVERNANCE.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# RubyDB governance
|
|
2
|
+
|
|
3
|
+
RubyDB is maintained through reviewed changes in the public repository. The
|
|
4
|
+
maintainers are responsible for release decisions, security coordination,
|
|
5
|
+
compatibility claims, and accepting changes that affect data safety.
|
|
6
|
+
|
|
7
|
+
Changes to storage format, WAL, recovery, transaction isolation, replication,
|
|
8
|
+
authentication, protocol framing, or release automation require focused tests,
|
|
9
|
+
documentation, and an explicit operational-impact review.
|
|
10
|
+
|
|
11
|
+
Security vulnerabilities should be reported privately as described in
|
|
12
|
+
`SECURITY.md`. Public issues are appropriate for reproducible bugs that do not
|
|
13
|
+
expose an unpatched vulnerability.
|
|
14
|
+
|
|
15
|
+
The project follows semantic versioning while compatibility is still evolving.
|
|
16
|
+
Release tags must pass the protected CI and RubyGems release checks.
|
data/Gemfile
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
source 'https://rubygems.org'
|
|
4
|
+
|
|
5
|
+
gemspec
|
|
6
|
+
|
|
7
|
+
gem 'rake', '~> 13.2'
|
|
8
|
+
gem 'rspec', '~> 3.13'
|
|
9
|
+
gem 'rubocop', '~> 1.65', require: false
|
|
10
|
+
gem 'rubocop-performance', '~> 1.21', require: false
|
|
11
|
+
gem 'standard', '~> 1.39', require: false
|
|
12
|
+
gem 'simplecov', '~> 0.22', require: false
|
|
13
|
+
|
|
14
|
+
# Optional development dependencies
|
|
15
|
+
gem 'pry', '~> 0.14', group: :development
|
|
16
|
+
gem 'pry-byebug', '~> 3.10', group: :development
|
|
17
|
+
gem 'memory_profiler', '~> 1.0', group: :development
|
data/Gemfile.lock
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
rubydb (0.1.0)
|
|
5
|
+
|
|
6
|
+
GEM
|
|
7
|
+
remote: https://rubygems.org/
|
|
8
|
+
specs:
|
|
9
|
+
ast (2.4.2)
|
|
10
|
+
base64 (0.2.0)
|
|
11
|
+
json (2.7.2)
|
|
12
|
+
language_server-protocol (3.17.0.3)
|
|
13
|
+
parallel (1.24.0)
|
|
14
|
+
parser (3.3.1.0)
|
|
15
|
+
ast (~> 2.4.1)
|
|
16
|
+
racc
|
|
17
|
+
racc (1.8.0)
|
|
18
|
+
rainbow (3.1.1)
|
|
19
|
+
rake (13.2.1)
|
|
20
|
+
regexp_parser (2.9.2)
|
|
21
|
+
rexml (3.2.6)
|
|
22
|
+
rspec (3.13.0)
|
|
23
|
+
rspec-core (~> 3.13.0)
|
|
24
|
+
rspec-expectations (~> 3.13.0)
|
|
25
|
+
rspec-mocks (~> 3.13.0)
|
|
26
|
+
rspec-core (3.13.0)
|
|
27
|
+
rspec-support (~> 3.13.0)
|
|
28
|
+
rspec-expectations (3.13.0)
|
|
29
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
30
|
+
rspec-support (~> 3.13.0)
|
|
31
|
+
rspec-mocks (3.13.0)
|
|
32
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
33
|
+
rspec-support (~> 3.13.0)
|
|
34
|
+
rspec-support (3.13.1)
|
|
35
|
+
rubocop (1.63.4)
|
|
36
|
+
json (~> 2.3)
|
|
37
|
+
language_server-protocol (>= 3.17.0)
|
|
38
|
+
parallel (~> 1.10)
|
|
39
|
+
parser (>= 3.3.0.2)
|
|
40
|
+
rainbow (>= 2.2.2, < 4.0)
|
|
41
|
+
regexp_parser (>= 1.8, < 3.0)
|
|
42
|
+
rexml (>= 3.2.5, < 4.0)
|
|
43
|
+
rubocop-ast (>= 1.31.1, < 2.0)
|
|
44
|
+
ruby-progressbar (~> 1.7)
|
|
45
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
|
46
|
+
rubocop-ast (1.31.3)
|
|
47
|
+
parser (>= 3.3.0.2)
|
|
48
|
+
rubocop-performance (1.21.0)
|
|
49
|
+
rubocop (>= 1.48.1, < 2.0)
|
|
50
|
+
rubocop-ast (>= 1.31.1, < 2.0)
|
|
51
|
+
ruby-progressbar (1.13.0)
|
|
52
|
+
standard (1.35.1)
|
|
53
|
+
language_server-protocol (~> 3.17.0.2)
|
|
54
|
+
rubocop (~> 1.63.0)
|
|
55
|
+
rubocop-performance (~> 1.21.0)
|
|
56
|
+
unicode-display_width (2.5.0)
|
|
57
|
+
|
|
58
|
+
PLATFORMS
|
|
59
|
+
arm64-darwin-23
|
|
60
|
+
ruby
|
|
61
|
+
|
|
62
|
+
DEPENDENCIES
|
|
63
|
+
rake (~> 13.2)
|
|
64
|
+
rspec (~> 3.13)
|
|
65
|
+
rubocop (~> 1.60)
|
|
66
|
+
rubocop-performance (~> 1.20)
|
|
67
|
+
rubydb!
|
|
68
|
+
standard (~> 1.35)
|
|
69
|
+
|
|
70
|
+
BUNDLED WITH
|
|
71
|
+
2.5.9
|
data/LICENSE
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) Aldane Hutchinson
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Additional Disclaimer for Alpha Status
|
|
26
|
+
|
|
27
|
+
**⚠️ IMPORTANT: RubyDB is currently in ALPHA development.**
|
|
28
|
+
|
|
29
|
+
This software is provided "AS IS" without warranty of any kind. It is not yet
|
|
30
|
+
production ready. Use in development and testing environments only. Data loss
|
|
31
|
+
is possible. The API is subject to change without notice.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Third-Party Licenses
|
|
36
|
+
|
|
37
|
+
RubyDB includes dependencies with their own licenses:
|
|
38
|
+
|
|
39
|
+
| Dependency | License |
|
|
40
|
+
|------------|---------|
|
|
41
|
+
| concurrent-ruby | MIT |
|
|
42
|
+
| json | Ruby License |
|
|
43
|
+
| zlib | zlib License |
|
|
44
|
+
| openssl | Ruby License |
|
|
45
|
+
| digest | Ruby License |
|
|
46
|
+
| fileutils | Ruby License |
|
|
47
|
+
| activerecord | MIT |
|
|
48
|
+
| rake | MIT |
|
|
49
|
+
| rspec | MIT |
|
|
50
|
+
| rubocop | MIT |
|
|
51
|
+
|
|
52
|
+
All dependencies are compatible with the MIT License.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Contributing Agreement
|
|
57
|
+
|
|
58
|
+
By contributing to this project, you agree that your contributions will be
|
|
59
|
+
licensed under the MIT License. You also agree that your contributions are
|
|
60
|
+
your original work and you have the right to license them.
|
data/README.md
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# RubyDB
|
|
2
|
+
|
|
3
|
+
RubyDB is a Ruby-native relational database with an embedded engine, a
|
|
4
|
+
client/server mode, a Ruby client, and an ActiveRecord adapter.
|
|
5
|
+
|
|
6
|
+
> **Status: alpha.** RubyDB is suitable for experimentation, development,
|
|
7
|
+
> controlled embedded workloads, and applications that stay within the
|
|
8
|
+
> documented and tested feature set. It provides a tested common SQLite-style
|
|
9
|
+
> profile, but is not a drop-in replacement for PostgreSQL, MySQL, or SQLite.
|
|
10
|
+
|
|
11
|
+
## What works today
|
|
12
|
+
|
|
13
|
+
The repository contains implementation and automated coverage for:
|
|
14
|
+
|
|
15
|
+
- SQL tables, CRUD, joins, grouping and aggregates, ordering, transactions,
|
|
16
|
+
savepoints, conflict handling, and documented maintenance statements
|
|
17
|
+
- typed values, primary/foreign keys, unique and check constraints, and B-tree
|
|
18
|
+
indexes
|
|
19
|
+
- durable storage, WAL-backed commits, recovery, snapshots, branching, and
|
|
20
|
+
MVCC paths
|
|
21
|
+
- Ruby API, client/server protocol, connection pooling, configuration, and
|
|
22
|
+
operational tooling
|
|
23
|
+
- ActiveRecord integration, Rails migrations, and a runnable Rails example
|
|
24
|
+
|
|
25
|
+
These features are not a guarantee of compatibility with every application.
|
|
26
|
+
Run the test suite and validate your own schema, queries, workload, backup,
|
|
27
|
+
restore, and failure scenarios before using RubyDB for important data.
|
|
28
|
+
|
|
29
|
+
## Why “complete PostgreSQL/MySQL/SQLite compatibility” matters
|
|
30
|
+
|
|
31
|
+
That requirement is only necessary when RubyDB is intended to be a drop-in
|
|
32
|
+
replacement for an existing application using one of those databases.
|
|
33
|
+
|
|
34
|
+
It includes much more than accepting similar `SELECT` statements:
|
|
35
|
+
|
|
36
|
+
- dialect-specific SQL syntax, functions, operators, casts, and error behavior
|
|
37
|
+
- query semantics for joins, `NULL`, ordering, grouping, subqueries, CTEs,
|
|
38
|
+
unions, upserts, and window functions
|
|
39
|
+
- data types, indexes, constraints, generated values, and transaction behavior
|
|
40
|
+
- migration behavior and ActiveRecord adapter mappings
|
|
41
|
+
- client protocol, connection behavior, locking, limits, and operational tools
|
|
42
|
+
|
|
43
|
+
A new Ruby or Rails application does not need complete compatibility. It can
|
|
44
|
+
use RubyDB's documented SQL and adapter behavior directly. Compatibility is
|
|
45
|
+
needed to move an existing PostgreSQL, MySQL, or SQLite application without
|
|
46
|
+
rewriting queries and without discovering semantic differences in production.
|
|
47
|
+
|
|
48
|
+
RubyDB currently targets a documented RubyDB SQL subset plus tested Rails
|
|
49
|
+
operations. The compatibility documents describe the supported statements;
|
|
50
|
+
unsupported or unverified dialect features must not be assumed to work.
|
|
51
|
+
|
|
52
|
+
## Quick start
|
|
53
|
+
|
|
54
|
+
Install the prerelease gem:
|
|
55
|
+
|
|
56
|
+
```sh
|
|
57
|
+
gem install rubydb --pre
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
For local development from this repository:
|
|
61
|
+
|
|
62
|
+
```sh
|
|
63
|
+
bundle install
|
|
64
|
+
bundle exec rspec
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Ruby usage
|
|
68
|
+
|
|
69
|
+
RubyDB can run embedded in a single owning process:
|
|
70
|
+
|
|
71
|
+
```ruby
|
|
72
|
+
require "rubydb"
|
|
73
|
+
|
|
74
|
+
engine = RubyDB::Storage::Engine.new("tmp/example.rdb")
|
|
75
|
+
engine.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT NOT NULL)")
|
|
76
|
+
engine.execute("INSERT INTO users (name) VALUES ('Aldane')")
|
|
77
|
+
puts engine.execute("SELECT * FROM users").inspect
|
|
78
|
+
engine.close
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
For multiple application processes, use RubyDB's server/client mode and point
|
|
82
|
+
clients at the managed server. Do not open the same embedded database path
|
|
83
|
+
from multiple independent processes. A regular Ruby application can use a
|
|
84
|
+
RubyDB connection URL supplied by its environment:
|
|
85
|
+
|
|
86
|
+
```ruby
|
|
87
|
+
client = RubyDB::Client::Client.new(url: ENV.fetch("RUBYDB_URL"))
|
|
88
|
+
client.query("SELECT 1")
|
|
89
|
+
client.disconnect
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Use the `rubydb://` or TLS-enabled `rubydbs://` format documented in the Rails
|
|
93
|
+
configuration guide. RubyDB URLs are not PostgreSQL URLs.
|
|
94
|
+
|
|
95
|
+
## Rails example
|
|
96
|
+
|
|
97
|
+
The small Rails 7.2 application in
|
|
98
|
+
[`examples/rails_app`](examples/rails_app) runs a real migration, model query,
|
|
99
|
+
and browser form through `rubydb-activerecord`.
|
|
100
|
+
|
|
101
|
+
```sh
|
|
102
|
+
cd examples/rails_app
|
|
103
|
+
bundle install
|
|
104
|
+
bundle exec ruby bin/rails db:migrate
|
|
105
|
+
bundle exec ruby bin/rails server -b 127.0.0.1 -p 3001
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Open <http://127.0.0.1:3001/>. The example uses an embedded database under
|
|
109
|
+
`tmp/`; set `RUBYDB_DATABASE` to choose another path. See the adapter and Rails
|
|
110
|
+
documentation for network configuration, migrations, production deployment,
|
|
111
|
+
backups, restore drills, and monitoring.
|
|
112
|
+
|
|
113
|
+
For an even smaller end-to-end smoke test, see the tiny GitHub-style app in
|
|
114
|
+
[`examples/github_clone`](examples/github_clone). It covers repositories,
|
|
115
|
+
issues, commits, Rails associations, foreign keys, indexes, seed data, and a
|
|
116
|
+
browser page backed by RubyDB.
|
|
117
|
+
|
|
118
|
+
## Compatibility policy
|
|
119
|
+
|
|
120
|
+
RubyDB does not claim complete PostgreSQL, MySQL, or SQLite compatibility until
|
|
121
|
+
each compatibility area has both an implementation and repeatable validation.
|
|
122
|
+
The project must validate at least:
|
|
123
|
+
|
|
124
|
+
1. parser and execution behavior for the documented dialect surface
|
|
125
|
+
2. type, constraint, transaction, locking, and error semantics
|
|
126
|
+
3. ActiveRecord queries, joins, eager loading, associations, and migrations
|
|
127
|
+
4. sustained concurrency, cancellation, recovery, backup/restore, and failover
|
|
128
|
+
5. supported Ruby, Rails, operating-system, and client/server combinations
|
|
129
|
+
|
|
130
|
+
Until then, compatibility should be treated as feature-specific, not implied
|
|
131
|
+
by the presence of an adapter.
|
|
132
|
+
|
|
133
|
+
## Documentation
|
|
134
|
+
|
|
135
|
+
- [Documentation index](docs/README.md)
|
|
136
|
+
- [Developer guide](docs/developer-guide.md)
|
|
137
|
+
- [Troubleshooting guide](docs/troubleshooting.md)
|
|
138
|
+
- [Debugging playbook](docs/debugging.md)
|
|
139
|
+
- [Production operations guide](docs/operations/production-guide.md)
|
|
140
|
+
- [Lessons learned](docs/lessons-learned.md)
|
|
141
|
+
- [Getting started](docs/getting-started/quickstart.md)
|
|
142
|
+
- [Local development to production](docs/getting-started/local-to-production.md)
|
|
143
|
+
- [SQL compatibility](docs/sql/compatibility.md)
|
|
144
|
+
- [SQL compatibility guide](docs/sql/compatibility-guide.md)
|
|
145
|
+
- [SQLite compatibility profile](docs/sql/sqlite-compatibility.md)
|
|
146
|
+
- [SQL syntax](docs/sql/syntax.md)
|
|
147
|
+
- [Rails installation](docs/rails/installation.md)
|
|
148
|
+
- [Rails production guidance](docs/rails/production.md)
|
|
149
|
+
- [Rails compatibility guide](docs/rails/compatibility-guide.md)
|
|
150
|
+
- [Production readiness](docs/production-readiness.md)
|
|
151
|
+
- [Operations and workload testing](docs/operations/workload-testing.md)
|
|
152
|
+
- [Production runbook](docs/operations/production-runbook.md)
|
|
153
|
+
- [CLI guide](docs/cli.md)
|
|
154
|
+
- [CLI cheat sheet](docs/cli-cheatsheet.md)
|
|
155
|
+
- [Release checklist](docs/release.md)
|
|
156
|
+
- [Security policy](SECURITY.md)
|
|
157
|
+
- [Contributing and testing](CONTRIBUTING.md)
|
|
158
|
+
- [Roadmap](ROADMAP.md)
|
|
159
|
+
|
|
160
|
+
## License
|
|
161
|
+
|
|
162
|
+
RubyDB is released under the [MIT License](LICENSE).
|
data/ROADMAP.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# RubyDB roadmap
|
|
2
|
+
|
|
3
|
+
## Current phase: validated foundation
|
|
4
|
+
|
|
5
|
+
RubyDB has a durable storage/WAL/recovery foundation, transactions and MVCC,
|
|
6
|
+
the documented SQL engine, server/client protocol, Rails adapter coverage,
|
|
7
|
+
backups, logical replication, monitoring, fuzzing, and release automation.
|
|
8
|
+
The latest local audit passed 270 examples with zero failures.
|
|
9
|
+
|
|
10
|
+
## Next gates
|
|
11
|
+
|
|
12
|
+
1. Retain hosted Ruby/Rails/OS matrix evidence for each release.
|
|
13
|
+
2. Run physical filesystem quota, power-loss, corruption, restore, and compaction
|
|
14
|
+
drills on deployment targets.
|
|
15
|
+
3. Validate multi-host replication partitions, independent fencing, stale
|
|
16
|
+
primary rejection, and operator promotion procedures.
|
|
17
|
+
4. Complete certificate/secret rotation validation and an independent security
|
|
18
|
+
review.
|
|
19
|
+
5. Establish workload-specific latency, throughput, capacity, RPO, and RTO
|
|
20
|
+
baselines.
|
|
21
|
+
|
|
22
|
+
## Longer term
|
|
23
|
+
|
|
24
|
+
Expand the documented SQLite-style profile and only then consider broader
|
|
25
|
+
PostgreSQL/MySQL compatibility where implementation and semantic validation can
|
|
26
|
+
be maintained. Add automatic election only with an independently tested fencing
|
|
27
|
+
authority. Preserve correctness and explicit unsupported errors as hard gates.
|
data/Rakefile
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'bundler/gem_tasks'
|
|
4
|
+
require 'rspec/core/rake_task'
|
|
5
|
+
require 'rbconfig'
|
|
6
|
+
require 'digest'
|
|
7
|
+
require 'fileutils'
|
|
8
|
+
|
|
9
|
+
RSpec::Core::RakeTask.new(:spec)
|
|
10
|
+
|
|
11
|
+
task default: %i[spec rubocop]
|
|
12
|
+
|
|
13
|
+
namespace :build do
|
|
14
|
+
desc 'Build the gem and write a SHA-512 checksum for the exact artifact'
|
|
15
|
+
task checksum: :build do
|
|
16
|
+
gem_path = Dir['pkg/rubydb-*.gem'].max_by { |path| File.mtime(path) }
|
|
17
|
+
abort 'No built gem found in pkg/' unless gem_path
|
|
18
|
+
|
|
19
|
+
FileUtils.mkdir_p('checksums')
|
|
20
|
+
checksum_path = File.join('checksums', "#{File.basename(gem_path)}.sha512")
|
|
21
|
+
File.write(checksum_path, "#{Digest::SHA512.file(gem_path).hexdigest} #{File.basename(gem_path)}\n")
|
|
22
|
+
puts "Wrote #{checksum_path}"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
desc 'Run all tests'
|
|
27
|
+
task test: :spec
|
|
28
|
+
|
|
29
|
+
desc 'Run unit tests only'
|
|
30
|
+
RSpec::Core::RakeTask.new(:'test:unit') do |t|
|
|
31
|
+
t.pattern = 'test/unit/**/*_spec.rb'
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
desc 'Run integration tests only'
|
|
35
|
+
RSpec::Core::RakeTask.new(:'test:integration') do |t|
|
|
36
|
+
t.pattern = 'test/integration/**/*_spec.rb'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
begin
|
|
40
|
+
require 'rubocop/rake_task'
|
|
41
|
+
RuboCop::RakeTask.new
|
|
42
|
+
rescue LoadError
|
|
43
|
+
# rubocop not installed
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
namespace :test do
|
|
47
|
+
desc 'Run concurrency tests'
|
|
48
|
+
RSpec::Core::RakeTask.new(:concurrency) do |t|
|
|
49
|
+
t.pattern = 'test/concurrency/**/*_spec.rb'
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
desc 'Run crash tests'
|
|
53
|
+
RSpec::Core::RakeTask.new(:crash) do |t|
|
|
54
|
+
t.pattern = 'test/crash/**/*_spec.rb'
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
desc 'Run chaos tests'
|
|
58
|
+
RSpec::Core::RakeTask.new(:chaos) do |t|
|
|
59
|
+
t.pattern = 'test/chaos/**/*_spec.rb'
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
desc 'Run benchmarks'
|
|
64
|
+
task :benchmark do
|
|
65
|
+
Dir['benchmarks/**/*.rb'].each { |f| load f }
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
desc 'Run the concurrent workload and durability verification'
|
|
69
|
+
task :workload do
|
|
70
|
+
abort 'Concurrent workload failed' unless system(RbConfig.ruby, 'benchmarks/concurrent_workload.rb')
|
|
71
|
+
end
|
data/SECURITY.md
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# RubyDB security policy
|
|
2
|
+
|
|
3
|
+
RubyDB is alpha software with a documented, tested feature set. Security
|
|
4
|
+
controls are implemented and tested for the server protocol, TLS transport,
|
|
5
|
+
password/SCRAM authentication, authorization, bounded frames, query deadlines,
|
|
6
|
+
resource limits, replication tokens, path validation, backup manifests, and
|
|
7
|
+
fencing. A deployment must still complete an independent security review
|
|
8
|
+
before it handles sensitive or regulated data.
|
|
9
|
+
|
|
10
|
+
## Secure deployment requirements
|
|
11
|
+
|
|
12
|
+
- Keep the database directory, WAL, backups, TLS private keys, authentication
|
|
13
|
+
credentials, and replication state on protected storage with least-privilege
|
|
14
|
+
filesystem ownership.
|
|
15
|
+
- Bind the server and replication listeners to explicit private addresses. Do
|
|
16
|
+
not expose them directly to the public internet; restrict ingress with a
|
|
17
|
+
firewall or private network.
|
|
18
|
+
- Enable TLS with TLS 1.2 or newer, validate the server certificate, and use a
|
|
19
|
+
trusted CA or mutual TLS where the deployment requires peer identity.
|
|
20
|
+
- Use high-entropy credentials and a separate high-entropy replication token.
|
|
21
|
+
Never put secrets in source control, URLs, shell history, logs, or bug
|
|
22
|
+
reports.
|
|
23
|
+
- Configure maximum connections, request/frame sizes, query deadlines, and
|
|
24
|
+
filesystem thresholds for the host. Treat readiness failure and recovery-
|
|
25
|
+
required acknowledgements as incidents.
|
|
26
|
+
- Run backups with encryption approved by the organization, retain the
|
|
27
|
+
manifest and WAL chain together, and perform restore drills into a new
|
|
28
|
+
inactive directory.
|
|
29
|
+
|
|
30
|
+
## Rotation and incident response
|
|
31
|
+
|
|
32
|
+
Stage replacement certificates and credentials, validate them on a non-serving
|
|
33
|
+
instance, then rotate during a planned window. Drain clients or replication
|
|
34
|
+
peers, change both sides of a replication token, reconnect, and verify the
|
|
35
|
+
authentication-failure metric returns to baseline. Retain the old certificate
|
|
36
|
+
only for the documented overlap window and remove it afterward.
|
|
37
|
+
|
|
38
|
+
For suspected compromise, corruption, checksum failure, replication
|
|
39
|
+
divergence, or fencing anomalies: stop writes, isolate the affected node,
|
|
40
|
+
preserve the database/WAL/log files and timestamps, and create a verified copy
|
|
41
|
+
before attempting repair, vacuum, restore, or promotion. Automatic election is
|
|
42
|
+
disabled; never run two writable primaries without an externally verified
|
|
43
|
+
fencing lease.
|
|
44
|
+
|
|
45
|
+
## Reporting a vulnerability
|
|
46
|
+
|
|
47
|
+
Do not disclose unpatched vulnerabilities in a public issue. Use a private
|
|
48
|
+
GitHub security advisory for the repository or contact the maintainer listed in
|
|
49
|
+
the gem metadata with reproduction steps, affected versions, impact, and a
|
|
50
|
+
safe disclosure timeline. Do not include production secrets or customer data.
|
|
51
|
+
|
|
52
|
+
Security scans run in GitHub Actions, but scan results do not replace review of
|
|
53
|
+
deployment configuration, network policy, secret storage, certificate
|
|
54
|
+
lifecycle, or the host filesystem.
|
data/SUPPORT.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# RubyDB support policy
|
|
2
|
+
|
|
3
|
+
RubyDB currently supports the documented RubyDB SQL surface, the tested common
|
|
4
|
+
SQLite-style profile, the Ruby client/server path, and the ActiveRecord adapter
|
|
5
|
+
combinations listed by CI. It does not promise complete PostgreSQL, MySQL, or
|
|
6
|
+
SQLite dialect, file-format, extension, or wire compatibility.
|
|
7
|
+
|
|
8
|
+
When requesting help, include RubyDB commit/version, Ruby and Rails versions,
|
|
9
|
+
OS, topology, configuration shape without secrets, a minimal reproduction, and
|
|
10
|
+
the exact error. Include workload and recovery evidence for data-safety issues.
|
|
11
|
+
|
|
12
|
+
For corruption, checksum, replication divergence, or fencing anomalies, stop
|
|
13
|
+
writes and preserve the database, WAL, logs, and timestamps before attempting
|
|
14
|
+
repair. Report unpatched security issues privately through `SECURITY.md`.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
source "https://rubygems.org"
|
|
4
|
+
|
|
5
|
+
gemspec
|
|
6
|
+
|
|
7
|
+
rails_version = ENV.fetch("RUBYDB_RAILS_VERSION", "7.2")
|
|
8
|
+
gem "activerecord", "~> #{rails_version}.0"
|
|
9
|
+
gem "rake", "~> 13.2"
|
|
10
|
+
gem "rspec", "~> 3.13"
|
|
11
|
+
gem "rubocop", "~> 1.60"
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# RubyDB ActiveRecord adapter
|
|
2
|
+
|
|
3
|
+
The `rubydb-activerecord` gem connects Rails applications to RubyDB through
|
|
4
|
+
ActiveRecord. It supports embedded RubyDB engines and network connections.
|
|
5
|
+
|
|
6
|
+
For an executable Rails 7.2 example, see
|
|
7
|
+
[`examples/rails_app`](../../examples/rails_app). The example includes a
|
|
8
|
+
database configuration, migration, model/controller, browser form, and a
|
|
9
|
+
smoke test that exercises the adapter against a real RubyDB engine.
|