rubydb 0.1.4 → 0.1.6
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 +4 -4
- data/.github/PULL_REQUEST_TEMPLATE.md +15 -15
- data/.github/workflows/benchmark.yml +26 -26
- data/.github/workflows/compatibility.yml +63 -63
- data/.github/workflows/fuzz.yml +33 -33
- data/.github/workflows/lint.yml +21 -21
- data/.github/workflows/operations.yml +24 -24
- data/.github/workflows/production-validation.yml +111 -111
- data/.github/workflows/release.yml +77 -77
- data/.github/workflows/security.yml +39 -37
- data/.github/workflows/test.yml +26 -26
- data/.github/workflows/workload.yml +58 -58
- data/.gitignore +16 -5
- data/.rubocop.yml +50 -44
- data/.standard.yml +9 -14
- data/ARCHITECTURE.md +21 -21
- data/CHANGELOG.md +57 -27
- data/CODE_OF_CONDUCT.md +13 -13
- data/CONTRIBUTING.md +29 -29
- data/GOVERNANCE.md +16 -16
- data/Gemfile +18 -17
- data/Gemfile.lock +125 -71
- data/README.md +168 -12
- data/ROADMAP.md +27 -27
- data/Rakefile +76 -71
- data/SECURITY.md +54 -54
- data/SUPPORT.md +14 -14
- data/accelerator/bin/SHA256SUMS +6 -0
- data/accelerator/bin/rubydb-accelerator-darwin-amd64 +0 -0
- data/accelerator/bin/rubydb-accelerator-darwin-arm64 +0 -0
- data/accelerator/bin/rubydb-accelerator-linux-amd64 +0 -0
- data/accelerator/bin/rubydb-accelerator-linux-arm64 +0 -0
- data/accelerator/bin/rubydb-accelerator-windows-amd64.exe +0 -0
- data/accelerator/bin/rubydb-accelerator-windows-arm64.exe +0 -0
- data/accelerator/cmd/rubydb-accelerator/main.go +11 -0
- data/accelerator/go.mod +3 -0
- data/accelerator/internal/execution/aggregate.go +94 -0
- data/accelerator/internal/execution/distinct.go +22 -0
- data/accelerator/internal/execution/filter.go +73 -0
- data/accelerator/internal/execution/join.go +79 -0
- data/accelerator/internal/execution/operators.go +167 -0
- data/accelerator/internal/execution/scan.go +20 -0
- data/accelerator/internal/execution/sort.go +62 -0
- data/accelerator/internal/execution/types.go +136 -0
- data/accelerator/internal/execution/value.go +67 -0
- data/accelerator/internal/memory/arena.go +47 -0
- data/accelerator/internal/memory/reuse.go +22 -0
- data/accelerator/internal/metrics/registry.go +67 -0
- data/accelerator/internal/parallel/bounded_queue.go +56 -0
- data/accelerator/internal/parallel/scheduler.go +47 -0
- data/accelerator/internal/parallel/worker_pool.go +53 -0
- data/accelerator/internal/protocol/cancellation.go +48 -0
- data/accelerator/internal/protocol/columnar.go +263 -0
- data/accelerator/internal/protocol/frame.go +187 -0
- data/accelerator/internal/runtime/worker.go +521 -0
- data/accelerator/internal/storage/page_reader.go +81 -0
- data/accelerator/internal/storage/snapshot_scan.go +539 -0
- data/accelerator/internal/wal/checksum.go +13 -0
- data/accelerator/internal/wal/compression.go +41 -0
- data/accelerator/internal/wal/group_commit.go +24 -0
- data/accelerator/internal/wal/record_encoder.go +40 -0
- data/adapters/activerecord/Gemfile +11 -11
- data/adapters/activerecord/README.md +8 -3
- data/adapters/activerecord/lib/active_record/connection_adapters/rubydb_adapter.rb +881 -879
- data/adapters/activerecord/rubydb-activerecord.gemspec +21 -21
- data/adapters/activerecord/spec/rubydb_adapter_integration_spec.rb +143 -143
- data/adapters/ruby/README.md +18 -18
- data/adapters/sequel/README.md +11 -11
- data/config/monitoring/prometheus-alerts.yml +39 -39
- data/config/production.yml +36 -36
- data/docs/README.md +77 -71
- data/docs/architecture/concurrency.md +14 -14
- data/docs/architecture/current-state.md +125 -125
- data/docs/architecture/execution-engine.md +25 -25
- data/docs/architecture/go-accelerator.md +179 -0
- data/docs/architecture/indexes.md +19 -19
- data/docs/architecture/mvcc.md +19 -19
- data/docs/architecture/overview.md +13 -13
- data/docs/architecture/pages.md +11 -11
- data/docs/architecture/production-roadmap.md +82 -82
- data/docs/architecture/query-planner.md +20 -20
- data/docs/architecture/recovery.md +18 -18
- data/docs/architecture/sql-engine.md +12 -12
- data/docs/architecture/storage-engine.md +14 -14
- data/docs/architecture/transactions.md +10 -10
- data/docs/architecture/wal.md +28 -28
- data/docs/cli-cheatsheet.md +98 -98
- data/docs/cli.md +299 -275
- data/docs/contributing/architecture.md +9 -9
- data/docs/contributing/benchmarking.md +30 -14
- data/docs/contributing/development.md +16 -16
- data/docs/contributing/release-process.md +49 -49
- data/docs/contributing/testing.md +16 -16
- data/docs/debugging.md +229 -229
- data/docs/developer/branching.md +10 -10
- data/docs/developer/database-diff.md +10 -10
- data/docs/developer/local-development.md +49 -17
- data/docs/developer/snapshots.md +9 -9
- data/docs/developer/temporal-data.md +10 -10
- data/docs/developer-guide.md +297 -297
- data/docs/getting-started/first-database.md +16 -16
- data/docs/getting-started/first-query.md +13 -13
- data/docs/getting-started/installation.md +19 -19
- data/docs/getting-started/local-to-production.md +300 -300
- data/docs/getting-started/quickstart.md +17 -17
- data/docs/getting-started/rails.md +16 -16
- data/docs/hardening_backlog.md +93 -93
- data/docs/lessons-learned.md +112 -112
- data/docs/operations/backups.md +33 -33
- data/docs/operations/disaster-recovery.md +31 -31
- data/docs/operations/failover.md +30 -30
- data/docs/operations/monitoring.md +25 -25
- data/docs/operations/production-guide.md +295 -295
- data/docs/operations/production-runbook.md +45 -45
- data/docs/operations/replication.md +33 -33
- data/docs/operations/restore.md +6 -6
- data/docs/operations/runbook.md +34 -34
- data/docs/operations/upgrades.md +14 -14
- data/docs/operations/workload-testing.md +17 -17
- data/docs/production-readiness.md +118 -118
- data/docs/production_validation.md +150 -150
- data/docs/rails/active-record.md +11 -11
- data/docs/rails/compatibility-guide.md +90 -90
- data/docs/rails/database-yml.md +92 -92
- data/docs/rails/installation.md +17 -17
- data/docs/rails/migrations.md +17 -17
- data/docs/rails/production.md +82 -82
- data/docs/rails/troubleshooting.md +18 -18
- data/docs/release.md +25 -25
- data/docs/server/architecture.md +10 -10
- data/docs/server/authentication.md +10 -10
- data/docs/server/configuration.md +16 -16
- data/docs/server/connection-pooling.md +10 -10
- data/docs/server/deployment.md +10 -10
- data/docs/server/protocol.md +12 -12
- data/docs/sql/compatibility-guide.md +82 -82
- data/docs/sql/compatibility.md +39 -39
- data/docs/sql/data-types.md +10 -10
- data/docs/sql/functions.md +9 -9
- data/docs/sql/joins.md +9 -9
- data/docs/sql/operators.md +9 -9
- data/docs/sql/sqlite-compatibility.md +21 -21
- data/docs/sql/syntax.md +10 -10
- data/docs/sql/transactions.md +10 -10
- data/docs/troubleshooting.md +244 -244
- data/lessons/01-foundations.md +73 -0
- data/lessons/02-local-development.md +121 -0
- data/lessons/03-embedded-rubydb.md +99 -0
- data/lessons/04-rails-complex-apps.md +138 -0
- data/lessons/05-rubydb-production-server.md +237 -0
- data/lessons/06-postgresql-massive-apps.md +96 -0
- data/lessons/07-hybrid-microservices.md +179 -0
- data/lessons/08-migrations-backups-recovery.md +86 -0
- data/lessons/09-observability-security-scale.md +87 -0
- data/lessons/10-release-readiness.md +192 -0
- data/lessons/11-community-adapter.md +323 -0
- data/lessons/12-rails-ecommerce-pressure.md +263 -0
- data/lib/rubydb/accelerator/client.rb +451 -0
- data/lib/rubydb/accelerator/error.rb +22 -0
- data/lib/rubydb/accelerator/manager.rb +606 -0
- data/lib/rubydb/accelerator.rb +13 -0
- data/lib/rubydb/backup/archive.rb +332 -334
- data/lib/rubydb/backup/backup.rb +400 -401
- data/lib/rubydb/backup/incremental.rb +349 -353
- data/lib/rubydb/backup/restore.rb +289 -290
- data/lib/rubydb/backup/snapshot.rb +265 -267
- data/lib/rubydb/backup/verification.rb +276 -279
- data/lib/rubydb/branching/branch.rb +181 -181
- data/lib/rubydb/branching/branch_manager.rb +307 -311
- data/lib/rubydb/branching/branch_metadata.rb +140 -140
- data/lib/rubydb/branching/checkout.rb +165 -166
- data/lib/rubydb/branching/copy_on_write.rb +272 -272
- data/lib/rubydb/branching/diff.rb +137 -138
- data/lib/rubydb/branching/merge.rb +282 -285
- data/lib/rubydb/build_info.rb +15 -15
- data/lib/rubydb/catalog/catalog.rb +391 -391
- data/lib/rubydb/catalog/column.rb +112 -112
- data/lib/rubydb/catalog/constraint.rb +180 -180
- data/lib/rubydb/catalog/database.rb +184 -184
- data/lib/rubydb/catalog/index.rb +97 -97
- data/lib/rubydb/catalog/schema.rb +103 -103
- data/lib/rubydb/catalog/sequence.rb +90 -90
- data/lib/rubydb/catalog/system_catalog.rb +698 -698
- data/lib/rubydb/catalog/table.rb +178 -178
- data/lib/rubydb/catalog/trigger.rb +102 -102
- data/lib/rubydb/catalog/view.rb +66 -66
- data/lib/rubydb/cli/application.rb +168 -163
- data/lib/rubydb/cli/commands/accelerator.rb +72 -0
- data/lib/rubydb/cli/commands/backup.rb +80 -81
- data/lib/rubydb/cli/commands/branch.rb +72 -72
- data/lib/rubydb/cli/commands/checkout.rb +54 -54
- data/lib/rubydb/cli/commands/create.rb +58 -58
- data/lib/rubydb/cli/commands/diff.rb +76 -77
- data/lib/rubydb/cli/commands/doctor.rb +77 -74
- data/lib/rubydb/cli/commands/drop.rb +57 -57
- data/lib/rubydb/cli/commands/init.rb +101 -102
- data/lib/rubydb/cli/commands/inspect.rb +95 -95
- data/lib/rubydb/cli/commands/merge.rb +63 -63
- data/lib/rubydb/cli/commands/migrate.rb +62 -62
- data/lib/rubydb/cli/commands/restart.rb +42 -39
- data/lib/rubydb/cli/commands/restore.rb +121 -121
- data/lib/rubydb/cli/commands/shell.rb +365 -365
- data/lib/rubydb/cli/commands/snapshot.rb +79 -79
- data/lib/rubydb/cli/commands/start.rb +88 -82
- data/lib/rubydb/cli/commands/status.rb +96 -92
- data/lib/rubydb/cli/commands/stop.rb +47 -47
- data/lib/rubydb/cli/commands/vacuum.rb +58 -58
- data/lib/rubydb/cli/formatter.rb +221 -221
- data/lib/rubydb/cli/output.rb +168 -168
- data/lib/rubydb/client/client.rb +309 -304
- data/lib/rubydb/client/connection.rb +429 -415
- data/lib/rubydb/client/connection_pool.rb +168 -168
- data/lib/rubydb/client/connection_url.rb +96 -96
- data/lib/rubydb/client/prepared_statement.rb +60 -60
- data/lib/rubydb/client/result.rb +127 -123
- data/lib/rubydb/client/statement.rb +52 -52
- data/lib/rubydb/client/transaction.rb +130 -130
- data/lib/rubydb/concurrency/concurrency.rb +19 -19
- data/lib/rubydb/concurrency/deadlock_detector.rb +148 -150
- data/lib/rubydb/concurrency/latch.rb +101 -101
- data/lib/rubydb/concurrency/lock_graph.rb +163 -165
- data/lib/rubydb/concurrency/mutex.rb +181 -183
- data/lib/rubydb/concurrency/rw_lock.rb +180 -180
- data/lib/rubydb/concurrency/scheduler.rb +248 -250
- data/lib/rubydb/concurrency/worker_pool.rb +145 -143
- data/lib/rubydb/configuration/config.rb +170 -170
- data/lib/rubydb/configuration/defaults.rb +191 -179
- data/lib/rubydb/configuration/environment.rb +152 -152
- data/lib/rubydb/configuration/parser.rb +185 -185
- data/lib/rubydb/configuration/validation.rb +228 -221
- data/lib/rubydb/constants.rb +74 -74
- data/lib/rubydb/constraints/check.rb +181 -181
- data/lib/rubydb/constraints/constraint.rb +101 -101
- data/lib/rubydb/constraints/foreign_key.rb +130 -130
- data/lib/rubydb/constraints/not_null.rb +64 -64
- data/lib/rubydb/constraints/primary_key.rb +99 -99
- data/lib/rubydb/constraints/unique.rb +106 -108
- data/lib/rubydb/constraints/validator.rb +349 -350
- data/lib/rubydb/errors/authentication_error.rb +10 -10
- data/lib/rubydb/errors/authorization_error.rb +23 -23
- data/lib/rubydb/errors/client_error.rb +10 -10
- data/lib/rubydb/errors/configuration_error.rb +10 -10
- data/lib/rubydb/errors/connection_error.rb +10 -10
- data/lib/rubydb/errors/constraint_error.rb +23 -23
- data/lib/rubydb/errors/corruption_error.rb +10 -10
- data/lib/rubydb/errors/database_error.rb +10 -10
- data/lib/rubydb/errors/error.rb +20 -20
- data/lib/rubydb/errors/execution_error.rb +10 -10
- data/lib/rubydb/errors/parser_error.rb +10 -10
- data/lib/rubydb/errors/recovery_error.rb +10 -10
- data/lib/rubydb/errors/replication_error.rb +10 -10
- data/lib/rubydb/errors/server_error.rb +6 -6
- data/lib/rubydb/errors/storage_error.rb +10 -10
- data/lib/rubydb/errors/transaction_error.rb +10 -10
- data/lib/rubydb/execution/accelerator_dispatch.rb +30 -0
- data/lib/rubydb/execution/aggregate_executor.rb +134 -138
- data/lib/rubydb/execution/cost_model.rb +72 -0
- data/lib/rubydb/execution/delete_executor.rb +110 -112
- data/lib/rubydb/execution/distinct_executor.rb +131 -135
- data/lib/rubydb/execution/executor.rb +1544 -1188
- data/lib/rubydb/execution/expression.rb +191 -193
- data/lib/rubydb/execution/index_scan.rb +142 -142
- data/lib/rubydb/execution/insert_executor.rb +215 -217
- data/lib/rubydb/execution/join_executor.rb +243 -249
- data/lib/rubydb/execution/limit_executor.rb +83 -85
- data/lib/rubydb/execution/operator_selection.rb +57 -0
- data/lib/rubydb/execution/optimizer.rb +227 -215
- data/lib/rubydb/execution/physical_plan.rb +47 -0
- data/lib/rubydb/execution/plan.rb +355 -353
- data/lib/rubydb/execution/planner.rb +508 -536
- data/lib/rubydb/execution/predicate.rb +235 -235
- data/lib/rubydb/execution/scan.rb +49 -49
- data/lib/rubydb/execution/sequential_scan.rb +63 -63
- data/lib/rubydb/execution/sort_executor.rb +194 -185
- data/lib/rubydb/execution/update_executor.rb +160 -162
- data/lib/rubydb/functions/aggregate.rb +70 -70
- data/lib/rubydb/functions/date_functions.rb +274 -278
- data/lib/rubydb/functions/function.rb +85 -85
- data/lib/rubydb/functions/json_functions.rb +231 -215
- data/lib/rubydb/functions/numeric_functions.rb +346 -346
- data/lib/rubydb/functions/scalar.rb +52 -52
- data/lib/rubydb/functions/string_functions.rb +383 -383
- data/lib/rubydb/functions/system_functions.rb +258 -246
- data/lib/rubydb/history/as_of.rb +238 -238
- data/lib/rubydb/history/change.rb +105 -105
- data/lib/rubydb/history/history.rb +131 -131
- data/lib/rubydb/history/history_manager.rb +228 -229
- data/lib/rubydb/history/temporal_query.rb +202 -202
- data/lib/rubydb/history/timeline.rb +144 -144
- data/lib/rubydb/indexes/btree.rb +215 -186
- data/lib/rubydb/indexes/btree_cursor.rb +258 -258
- data/lib/rubydb/indexes/btree_node.rb +384 -385
- data/lib/rubydb/indexes/hash_index.rb +150 -150
- data/lib/rubydb/indexes/index.rb +71 -71
- data/lib/rubydb/indexes/index_manager.rb +408 -406
- data/lib/rubydb/indexes/index_scan.rb +466 -470
- data/lib/rubydb/migrations/migration.rb +253 -254
- data/lib/rubydb/migrations/migration_lock.rb +146 -146
- data/lib/rubydb/migrations/migration_manager.rb +187 -176
- data/lib/rubydb/migrations/migration_version.rb +71 -71
- data/lib/rubydb/migrations/schema_diff.rb +211 -211
- data/lib/rubydb/migrations/schema_version.rb +64 -64
- data/lib/rubydb/monitoring/events.rb +155 -160
- data/lib/rubydb/monitoring/health.rb +216 -222
- data/lib/rubydb/monitoring/logger.rb +188 -193
- data/lib/rubydb/monitoring/metrics.rb +363 -359
- data/lib/rubydb/monitoring/performance.rb +176 -176
- data/lib/rubydb/monitoring/statistics.rb +168 -170
- data/lib/rubydb/mvcc/garbage_collector.rb +199 -199
- data/lib/rubydb/mvcc/mvcc.rb +16 -16
- data/lib/rubydb/mvcc/snapshot.rb +146 -147
- data/lib/rubydb/mvcc/vacuum.rb +180 -180
- data/lib/rubydb/mvcc/version.rb +106 -106
- data/lib/rubydb/mvcc/version_store.rb +396 -398
- data/lib/rubydb/mvcc/visibility.rb +107 -109
- data/lib/rubydb/protocol/capabilities.rb +125 -125
- data/lib/rubydb/protocol/decoder.rb +142 -145
- data/lib/rubydb/protocol/encoder.rb +131 -136
- data/lib/rubydb/protocol/handshake.rb +306 -305
- data/lib/rubydb/protocol/message.rb +121 -121
- data/lib/rubydb/protocol/parameter_binder.rb +101 -0
- data/lib/rubydb/protocol/protocol.rb +276 -277
- data/lib/rubydb/protocol/version.rb +54 -54
- data/lib/rubydb/rails/adapter.rb +245 -239
- data/lib/rubydb/rails/connection.rb +312 -314
- data/lib/rubydb/rails/database_statements.rb +122 -122
- data/lib/rubydb/rails/migration.rb +131 -131
- data/lib/rubydb/rails/quoting.rb +109 -109
- data/lib/rubydb/rails/result.rb +117 -117
- data/lib/rubydb/rails/schema_statements.rb +339 -339
- data/lib/rubydb/rails/transaction.rb +105 -105
- data/lib/rubydb/rails/type.rb +126 -126
- data/lib/rubydb/recovery/checkpoint.rb +261 -257
- data/lib/rubydb/recovery/consistency.rb +457 -467
- data/lib/rubydb/recovery/corruption_detector.rb +5 -5
- data/lib/rubydb/recovery/crash_recovery.rb +381 -387
- data/lib/rubydb/recovery/recovery_manager.rb +204 -206
- data/lib/rubydb/recovery/redo.rb +235 -237
- data/lib/rubydb/recovery/undo.rb +204 -206
- data/lib/rubydb/replication/failover.rb +5 -5
- data/lib/rubydb/replication/fencing.rb +63 -63
- data/lib/rubydb/replication/primary.rb +461 -450
- data/lib/rubydb/replication/replica.rb +382 -384
- data/lib/rubydb/replication/replication_log.rb +194 -200
- data/lib/rubydb/replication/replication_manager.rb +307 -308
- data/lib/rubydb/replication/replication_slot.rb +293 -295
- data/lib/rubydb/replication/replication_stream.rb +198 -201
- data/lib/rubydb/rubydb.rb +570 -560
- data/lib/rubydb/security/access_control.rb +252 -254
- data/lib/rubydb/security/audit_log.rb +209 -213
- data/lib/rubydb/security/authentication.rb +302 -302
- data/lib/rubydb/security/authorization.rb +282 -282
- data/lib/rubydb/security/credentials.rb +192 -196
- data/lib/rubydb/security/password.rb +205 -215
- data/lib/rubydb/security/permissions.rb +74 -74
- data/lib/rubydb/security/role.rb +99 -101
- data/lib/rubydb/security/user.rb +86 -86
- data/lib/rubydb/server/connection.rb +383 -366
- data/lib/rubydb/server/connection_pool.rb +193 -193
- data/lib/rubydb/server/lifecycle.rb +227 -228
- data/lib/rubydb/server/listener.rb +139 -136
- data/lib/rubydb/server/request_handler.rb +277 -276
- data/lib/rubydb/server/server.rb +363 -364
- data/lib/rubydb/server/session.rb +416 -369
- data/lib/rubydb/server/worker.rb +206 -210
- data/lib/rubydb/server/worker_pool.rb +168 -168
- data/lib/rubydb/sql/ast/alter_table.rb +169 -169
- data/lib/rubydb/sql/ast/begin_transaction.rb +47 -47
- data/lib/rubydb/sql/ast/commit.rb +37 -37
- data/lib/rubydb/sql/ast/constraint.rb +92 -83
- data/lib/rubydb/sql/ast/create_database.rb +41 -41
- data/lib/rubydb/sql/ast/create_index.rb +61 -61
- data/lib/rubydb/sql/ast/create_schema.rb +52 -52
- data/lib/rubydb/sql/ast/create_table.rb +187 -187
- data/lib/rubydb/sql/ast/delete.rb +54 -54
- data/lib/rubydb/sql/ast/drop_database.rb +41 -41
- data/lib/rubydb/sql/ast/drop_index.rb +41 -41
- data/lib/rubydb/sql/ast/drop_schema.rb +49 -49
- data/lib/rubydb/sql/ast/drop_table.rb +49 -49
- data/lib/rubydb/sql/ast/explain.rb +64 -64
- data/lib/rubydb/sql/ast/expression.rb +617 -604
- data/lib/rubydb/sql/ast/insert.rb +66 -66
- data/lib/rubydb/sql/ast/node.rb +42 -42
- data/lib/rubydb/sql/ast/rollback.rb +63 -63
- data/lib/rubydb/sql/ast/savepoint.rb +59 -59
- data/lib/rubydb/sql/ast/select.rb +88 -88
- data/lib/rubydb/sql/ast/set_operation.rb +22 -20
- data/lib/rubydb/sql/ast/trigger.rb +35 -29
- data/lib/rubydb/sql/ast/update.rb +88 -88
- data/lib/rubydb/sql/ast/vacuum.rb +19 -19
- data/lib/rubydb/sql/ast/view.rb +38 -32
- data/lib/rubydb/sql/ast/with.rb +32 -32
- data/lib/rubydb/sql/grammar.rb +86 -86
- data/lib/rubydb/sql/keywords.rb +156 -156
- data/lib/rubydb/sql/lexer.rb +209 -214
- data/lib/rubydb/sql/operators.rb +100 -100
- data/lib/rubydb/sql/parser.rb +1167 -1170
- data/lib/rubydb/sql/planner/analyzer.rb +283 -302
- data/lib/rubydb/sql/planner/binder.rb +537 -550
- data/lib/rubydb/sql/planner/type_checker.rb +427 -431
- data/lib/rubydb/sql/token.rb +210 -210
- data/lib/rubydb/storage/buffer_frame.rb +44 -44
- data/lib/rubydb/storage/buffer_pool.rb +155 -155
- data/lib/rubydb/storage/database_lock.rb +74 -74
- data/lib/rubydb/storage/deserializer.rb +332 -342
- data/lib/rubydb/storage/engine.rb +2409 -2330
- data/lib/rubydb/storage/file_manager.rb +191 -187
- data/lib/rubydb/storage/free_space_map.rb +79 -81
- data/lib/rubydb/storage/page.rb +92 -94
- data/lib/rubydb/storage/page_allocator.rb +852 -855
- data/lib/rubydb/storage/page_header.rb +63 -67
- data/lib/rubydb/storage/page_manager.rb +127 -131
- data/lib/rubydb/storage/record.rb +58 -58
- data/lib/rubydb/storage/row.rb +78 -78
- data/lib/rubydb/storage/serializer.rb +51 -51
- data/lib/rubydb/storage/snapshot_reader.rb +167 -0
- data/lib/rubydb/storage/storage_layout.rb +151 -151
- data/lib/rubydb/storage/storage_manager.rb +114 -114
- data/lib/rubydb/storage/tuple.rb +458 -461
- data/lib/rubydb/storage/visibility_map.rb +964 -973
- data/lib/rubydb/transactions/commit_manager.rb +219 -220
- data/lib/rubydb/transactions/isolation.rb +98 -98
- data/lib/rubydb/transactions/lock.rb +76 -76
- data/lib/rubydb/transactions/lock_manager.rb +359 -362
- data/lib/rubydb/transactions/savepoint.rb +142 -143
- data/lib/rubydb/transactions/transaction.rb +214 -215
- data/lib/rubydb/transactions/transaction_id.rb +84 -84
- data/lib/rubydb/transactions/transaction_log.rb +256 -257
- data/lib/rubydb/transactions/transaction_manager.rb +434 -435
- data/lib/rubydb/types/bigint.rb +36 -36
- data/lib/rubydb/types/blob.rb +37 -37
- data/lib/rubydb/types/boolean.rb +34 -34
- data/lib/rubydb/types/date.rb +39 -39
- data/lib/rubydb/types/decimal.rb +48 -48
- data/lib/rubydb/types/float.rb +34 -34
- data/lib/rubydb/types/integer.rb +36 -36
- data/lib/rubydb/types/json.rb +41 -41
- data/lib/rubydb/types/null.rb +34 -34
- data/lib/rubydb/types/smallint.rb +36 -36
- data/lib/rubydb/types/text.rb +37 -37
- data/lib/rubydb/types/time.rb +46 -46
- data/lib/rubydb/types/timestamp.rb +39 -39
- data/lib/rubydb/types/type.rb +119 -119
- data/lib/rubydb/types/uuid.rb +47 -47
- data/lib/rubydb/types/varchar.rb +37 -37
- data/lib/rubydb/version.rb +32 -32
- data/lib/rubydb/wal/archive.rb +207 -193
- data/lib/rubydb/wal/checkpoint.rb +181 -183
- data/lib/rubydb/wal/lsn.rb +94 -94
- data/lib/rubydb/wal/reader.rb +259 -260
- data/lib/rubydb/wal/record.rb +105 -105
- data/lib/rubydb/wal/segment.rb +193 -193
- data/lib/rubydb/wal/wal.rb +481 -452
- data/lib/rubydb/wal/writer.rb +236 -236
- data/lib/rubydb.rb +7 -7
- data/packaging/docker/docker-compose.failover.yml +43 -43
- data/packaging/homebrew/rubydb.rb +19 -19
- data/rubydb.gemspec +70 -57
- data/scripts/benchmark +7 -7
- data/scripts/build_accelerator +49 -0
- data/scripts/durability_drill +37 -37
- data/scripts/fuzz +63 -63
- data/scripts/release +77 -42
- data/scripts/release_check +43 -43
- data/scripts/replication_failover_drill +268 -250
- data/scripts/replication_network_failover_drill +287 -255
- data/scripts/restore_drill +45 -45
- data/scripts/security +45 -0
- metadata +102 -1
data/CHANGELOG.md
CHANGED
|
@@ -1,28 +1,58 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to RubyDB are documented here. Versions follow
|
|
4
|
-
[Semantic Versioning](https://semver.org/).
|
|
5
|
-
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to RubyDB are documented here. Versions follow
|
|
4
|
+
[Semantic Versioning](https://semver.org/).
|
|
5
|
+
|
|
6
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.
|
|
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
24
|
- Clarified the tested common SQLite-style profile and production limits.
|
|
25
25
|
|
|
26
|
+
## 0.1.6 - 2026-09-18
|
|
27
|
+
|
|
28
|
+
- Bundled the Go accelerator binaries and Ruby bridge for release installs;
|
|
29
|
+
developers do not need Go installed to use the packaged core gem.
|
|
30
|
+
- Added lock-protected direct storage snapshots, worker lifecycle recovery,
|
|
31
|
+
multiplexed requests, cancellation, bounded execution, and adaptive Ruby/Go
|
|
32
|
+
selection with a safe Ruby fallback.
|
|
33
|
+
- Added accelerator CLI diagnostics, environment-mode handling, checksums,
|
|
34
|
+
extracted-gem verification, and release packaging for the runtime binaries.
|
|
35
|
+
- Added the Rails ecommerce pressure example and expanded production guidance
|
|
36
|
+
for embedded development, managed RubyDB services, PostgreSQL-backed large
|
|
37
|
+
applications, and ActiveRecord adapter deployment.
|
|
38
|
+
- Prepared `rubydb-activerecord` 0.1.3 for the RubyDB 0.1.x release line.
|
|
39
|
+
|
|
40
|
+
## 0.1.5 - 2026-09-10
|
|
41
|
+
|
|
42
|
+
- Applied network query and prepared-statement parameters through the server
|
|
43
|
+
protocol before SQL parsing, using shared safe literal binding rules.
|
|
44
|
+
- Added the initial Python DB-API adapter and live protocol validation under
|
|
45
|
+
`adapters/python`.
|
|
46
|
+
- Added a ten-lesson guided journey with copy-and-paste development,
|
|
47
|
+
PostgreSQL, RubyDB server, Rails, microservice, recovery, security, and
|
|
48
|
+
release examples.
|
|
49
|
+
- Expanded the lesson journey with a direct RubyDB-to-production deployment
|
|
50
|
+
path covering persistent storage, TLS, secrets, migrations, smoke tests,
|
|
51
|
+
backup/restore, canary traffic, and rollback evidence.
|
|
52
|
+
- Added the initial `rubydb-python` DB-API 2.0 adapter under
|
|
53
|
+
`adapters/python`, including TLS URLs, prepared statements, transactions,
|
|
54
|
+
pooling, timeouts, cancellation, tests, and PyPI build instructions.
|
|
55
|
+
|
|
26
56
|
## 0.1.4 - 2026-09-09
|
|
27
57
|
|
|
28
58
|
- Returned logical generated primary-key values to ActiveRecord separately
|
|
@@ -53,8 +83,8 @@ All notable changes to RubyDB are documented here. Versions follow
|
|
|
53
83
|
range.
|
|
54
84
|
|
|
55
85
|
## 0.1.0 - 2026-09-07
|
|
56
|
-
|
|
57
|
-
- Initial public release candidate.
|
|
58
|
-
- Includes the embedded engine, ActiveRecord adapter, backup/recovery, WAL,
|
|
59
|
-
TLS, authentication, and validated production-hardening checkpoints.
|
|
60
|
-
- See `docs/production_validation.md` for tested scope and operational limits.
|
|
86
|
+
|
|
87
|
+
- Initial public release candidate.
|
|
88
|
+
- Includes the embedded engine, ActiveRecord adapter, backup/recovery, WAL,
|
|
89
|
+
TLS, authentication, and validated production-hardening checkpoints.
|
|
90
|
+
- See `docs/production_validation.md` for tested scope and operational limits.
|
data/CODE_OF_CONDUCT.md
CHANGED
|
@@ -1,13 +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.
|
|
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
CHANGED
|
@@ -1,29 +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.
|
|
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
CHANGED
|
@@ -1,16 +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.
|
|
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
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
source
|
|
4
|
-
|
|
5
|
-
gemspec
|
|
6
|
-
|
|
7
|
-
gem
|
|
8
|
-
gem
|
|
9
|
-
gem
|
|
10
|
-
gem
|
|
11
|
-
gem
|
|
12
|
-
gem
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
gem
|
|
17
|
-
gem
|
|
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.64", require: false
|
|
10
|
+
gem "rubocop-performance", "~> 1.21", require: false
|
|
11
|
+
gem "standard", "~> 1.39.0", require: false
|
|
12
|
+
gem "simplecov", "~> 0.22", require: false
|
|
13
|
+
gem "benchmark", "~> 0.4", require: false
|
|
14
|
+
|
|
15
|
+
# Optional development dependencies
|
|
16
|
+
gem "pry", "~> 0.14", group: :development
|
|
17
|
+
gem "pry-byebug", "~> 3.10", group: :development
|
|
18
|
+
gem "memory_profiler", "~> 1.0", group: :development
|
data/Gemfile.lock
CHANGED
|
@@ -1,71 +1,125 @@
|
|
|
1
|
-
PATH
|
|
2
|
-
remote: .
|
|
3
|
-
specs:
|
|
4
|
-
rubydb (0.1.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
1
|
+
PATH
|
|
2
|
+
remote: .
|
|
3
|
+
specs:
|
|
4
|
+
rubydb (0.1.6)
|
|
5
|
+
base64 (>= 0.2)
|
|
6
|
+
bigdecimal (>= 3.1)
|
|
7
|
+
concurrent-ruby (>= 1.2)
|
|
8
|
+
date (~> 3.3)
|
|
9
|
+
digest (~> 3.1)
|
|
10
|
+
json (~> 2.7)
|
|
11
|
+
time (~> 0.4)
|
|
12
|
+
|
|
13
|
+
GEM
|
|
14
|
+
remote: https://rubygems.org/
|
|
15
|
+
specs:
|
|
16
|
+
ast (2.4.3)
|
|
17
|
+
base64 (0.3.0)
|
|
18
|
+
benchmark (0.5.0)
|
|
19
|
+
bigdecimal (4.1.2)
|
|
20
|
+
byebug (13.0.0)
|
|
21
|
+
reline (>= 0.6.0)
|
|
22
|
+
coderay (1.1.3)
|
|
23
|
+
concurrent-ruby (1.3.8)
|
|
24
|
+
date (3.5.1)
|
|
25
|
+
diff-lcs (1.6.2)
|
|
26
|
+
digest (3.2.1)
|
|
27
|
+
docile (1.4.1)
|
|
28
|
+
io-console (0.9.2)
|
|
29
|
+
json (2.21.2)
|
|
30
|
+
language_server-protocol (3.17.0.6)
|
|
31
|
+
lint_roller (1.1.0)
|
|
32
|
+
memory_profiler (1.1.0)
|
|
33
|
+
method_source (1.1.0)
|
|
34
|
+
parallel (1.28.0)
|
|
35
|
+
parser (3.3.12.0)
|
|
36
|
+
ast (~> 2.4.1)
|
|
37
|
+
racc
|
|
38
|
+
prism (1.9.0)
|
|
39
|
+
pry (0.16.0)
|
|
40
|
+
coderay (~> 1.1)
|
|
41
|
+
method_source (~> 1.0)
|
|
42
|
+
reline (>= 0.6.0)
|
|
43
|
+
pry-byebug (3.12.0)
|
|
44
|
+
byebug (~> 13.0)
|
|
45
|
+
pry (>= 0.13, < 0.17)
|
|
46
|
+
racc (1.8.1)
|
|
47
|
+
rainbow (3.1.1)
|
|
48
|
+
rake (13.2.1)
|
|
49
|
+
regexp_parser (2.12.0)
|
|
50
|
+
reline (0.7.0)
|
|
51
|
+
io-console (~> 0.5)
|
|
52
|
+
rexml (3.4.4)
|
|
53
|
+
rspec (3.13.0)
|
|
54
|
+
rspec-core (~> 3.13.0)
|
|
55
|
+
rspec-expectations (~> 3.13.0)
|
|
56
|
+
rspec-mocks (~> 3.13.0)
|
|
57
|
+
rspec-core (3.13.0)
|
|
58
|
+
rspec-support (~> 3.13.0)
|
|
59
|
+
rspec-expectations (3.13.5)
|
|
60
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
61
|
+
rspec-support (~> 3.13.0)
|
|
62
|
+
rspec-mocks (3.13.8)
|
|
63
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
|
64
|
+
rspec-support (~> 3.13.0)
|
|
65
|
+
rspec-support (3.13.1)
|
|
66
|
+
rubocop (1.64.1)
|
|
67
|
+
json (~> 2.3)
|
|
68
|
+
language_server-protocol (>= 3.17.0)
|
|
69
|
+
parallel (~> 1.10)
|
|
70
|
+
parser (>= 3.3.0.2)
|
|
71
|
+
rainbow (>= 2.2.2, < 4.0)
|
|
72
|
+
regexp_parser (>= 1.8, < 3.0)
|
|
73
|
+
rexml (>= 3.2.5, < 4.0)
|
|
74
|
+
rubocop-ast (>= 1.31.1, < 2.0)
|
|
75
|
+
ruby-progressbar (~> 1.7)
|
|
76
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
|
77
|
+
rubocop-ast (1.50.0)
|
|
78
|
+
parser (>= 3.3.7.2)
|
|
79
|
+
prism (~> 1.7)
|
|
80
|
+
rubocop-performance (1.23.1)
|
|
81
|
+
rubocop (>= 1.48.1, < 2.0)
|
|
82
|
+
rubocop-ast (>= 1.31.1, < 2.0)
|
|
83
|
+
ruby-progressbar (1.13.0)
|
|
84
|
+
simplecov (0.22.0)
|
|
85
|
+
docile (~> 1.1)
|
|
86
|
+
simplecov-html (~> 0.11)
|
|
87
|
+
simplecov_json_formatter (~> 0.1)
|
|
88
|
+
simplecov-html (0.13.2)
|
|
89
|
+
simplecov_json_formatter (0.1.4)
|
|
90
|
+
standard (1.39.2)
|
|
91
|
+
language_server-protocol (~> 3.17.0.2)
|
|
92
|
+
lint_roller (~> 1.0)
|
|
93
|
+
rubocop (~> 1.64.0)
|
|
94
|
+
standard-custom (~> 1.0.0)
|
|
95
|
+
standard-performance (~> 1.4)
|
|
96
|
+
standard-custom (1.0.2)
|
|
97
|
+
lint_roller (~> 1.0)
|
|
98
|
+
rubocop (~> 1.50)
|
|
99
|
+
standard-performance (1.6.0)
|
|
100
|
+
lint_roller (~> 1.1)
|
|
101
|
+
rubocop-performance (~> 1.23.0)
|
|
102
|
+
time (0.4.2)
|
|
103
|
+
date
|
|
104
|
+
unicode-display_width (2.6.0)
|
|
105
|
+
|
|
106
|
+
PLATFORMS
|
|
107
|
+
arm64-darwin-23
|
|
108
|
+
ruby
|
|
109
|
+
x64-mingw-ucrt
|
|
110
|
+
|
|
111
|
+
DEPENDENCIES
|
|
112
|
+
benchmark (~> 0.4)
|
|
113
|
+
memory_profiler (~> 1.0)
|
|
114
|
+
pry (~> 0.14)
|
|
115
|
+
pry-byebug (~> 3.10)
|
|
116
|
+
rake (~> 13.2)
|
|
117
|
+
rspec (~> 3.13)
|
|
118
|
+
rubocop (~> 1.64)
|
|
119
|
+
rubocop-performance (~> 1.21)
|
|
120
|
+
rubydb!
|
|
121
|
+
simplecov (~> 0.22)
|
|
122
|
+
standard (~> 1.39.0)
|
|
123
|
+
|
|
124
|
+
BUNDLED WITH
|
|
125
|
+
2.5.9
|
data/README.md
CHANGED
|
@@ -3,10 +3,61 @@
|
|
|
3
3
|
RubyDB is a Ruby-native relational database with an embedded engine, a
|
|
4
4
|
client/server mode, a Ruby client, and an ActiveRecord adapter.
|
|
5
5
|
|
|
6
|
+
**Author:** Aldane Hutchinson
|
|
7
|
+
|
|
6
8
|
> **Status: alpha.** RubyDB is suitable for experimentation, development,
|
|
7
|
-
> controlled embedded workloads, and
|
|
8
|
-
> documented and tested feature set.
|
|
9
|
-
>
|
|
9
|
+
> controlled embedded workloads, and production microservices that stay within
|
|
10
|
+
> the documented and tested feature set. RubyDB can be used in both development
|
|
11
|
+
> and production, but each production workload must pass its own query,
|
|
12
|
+
> concurrency, backup, restore, security, and operational validation. It
|
|
13
|
+
> provides a tested common SQLite-style profile, but is not a drop-in
|
|
14
|
+
> replacement for PostgreSQL, MySQL, or SQLite.
|
|
15
|
+
|
|
16
|
+
## Recommended database roles
|
|
17
|
+
|
|
18
|
+
Use RubyDB when you want a Ruby-native database for local development, tests,
|
|
19
|
+
internal tools, or an independently owned microservice with a bounded workload.
|
|
20
|
+
Use embedded mode when one Ruby process owns the database file. Use RubyDB
|
|
21
|
+
server/client mode when multiple application processes connect to one service.
|
|
22
|
+
|
|
23
|
+
Use PostgreSQL as the default system of record for massive applications,
|
|
24
|
+
high-concurrency public products, large shared Rails applications, advanced
|
|
25
|
+
PostgreSQL SQL/extensions, and workloads requiring a mature managed database
|
|
26
|
+
ecosystem. A common production architecture is PostgreSQL for the main app and
|
|
27
|
+
RubyDB for smaller, independently operated microservices.
|
|
28
|
+
|
|
29
|
+
## Ecosystem and community adapters
|
|
30
|
+
|
|
31
|
+
RubyDB's ecosystem is built around a clear boundary: application code connects
|
|
32
|
+
to a RubyDB server through the documented client/server protocol. The embedded
|
|
33
|
+
`.rdb` file format is an internal storage implementation, not a public API for
|
|
34
|
+
third-party drivers. This lets RubyDB evolve its storage safely while language
|
|
35
|
+
and framework communities build clients that share the same server behavior.
|
|
36
|
+
|
|
37
|
+
Official integration surfaces include:
|
|
38
|
+
|
|
39
|
+
- Ruby's direct API and the `rubydb` client/server client
|
|
40
|
+
- `rubydb-activerecord` for Rails applications
|
|
41
|
+
- `rubydb-python` for Python DB-API 2.0 applications
|
|
42
|
+
- `rubydb-node` for Node.js and TypeScript applications
|
|
43
|
+
- Sequel and other Ruby integrations documented under `adapters/`
|
|
44
|
+
|
|
45
|
+
Community developers can create adapters for another language, framework,
|
|
46
|
+
ORM, query builder, migration tool, observability system, or job framework.
|
|
47
|
+
Every adapter should begin with the [server protocol](docs/server/protocol.md)
|
|
48
|
+
and the executable protocol tests, then provide an idiomatic API for its
|
|
49
|
+
community. A production adapter must preserve parameter binding, transaction
|
|
50
|
+
ownership, deadlines and wire cancellation, TLS verification, bounded frames,
|
|
51
|
+
error details, and clean connection shutdown. A wrapper that only sends a
|
|
52
|
+
string of SQL is not a production adapter.
|
|
53
|
+
|
|
54
|
+
Use a distinct package name such as `rubydb-go`, `rubydb-django`, or
|
|
55
|
+
`@your-scope/rubydb` and make its ownership clear. Do not present a community
|
|
56
|
+
package as an official RubyDB release. Add the adapter to the ecosystem list
|
|
57
|
+
only after it has live integration tests against a real RubyDB server and its
|
|
58
|
+
supported RubyDB versions are documented. The complete build, test, security,
|
|
59
|
+
and publishing workflow is in
|
|
60
|
+
[Lesson 11: Build a community adapter](lessons/11-community-adapter.md).
|
|
10
61
|
|
|
11
62
|
## What works today
|
|
12
63
|
|
|
@@ -51,18 +102,54 @@ unsupported or unverified dialect features must not be assumed to work.
|
|
|
51
102
|
|
|
52
103
|
## Quick start
|
|
53
104
|
|
|
54
|
-
Install the
|
|
55
|
-
|
|
56
|
-
```sh
|
|
57
|
-
gem install rubydb
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
For
|
|
105
|
+
Install the core release gem:
|
|
106
|
+
|
|
107
|
+
```sh
|
|
108
|
+
gem install rubydb -v 0.1.6
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
For Rails, install the core and ActiveRecord adapter together:
|
|
112
|
+
|
|
113
|
+
```ruby
|
|
114
|
+
# Gemfile
|
|
115
|
+
gem "rubydb", "~> 0.1.6"
|
|
116
|
+
gem "rubydb-activerecord", "~> 0.1.3"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
RubyDB ships the Go accelerator binaries inside the core gem. Developers and
|
|
120
|
+
deployments do not install Go. The default `accelerator.mode: auto` starts Go
|
|
121
|
+
for eligible workloads and keeps it only when the result is equivalent and
|
|
122
|
+
the measured latency wins; use `RUBYDB_ACCELERATOR=required` for a readiness
|
|
123
|
+
check that must exercise Go, or `RUBYDB_ACCELERATOR=off` for Ruby-only
|
|
124
|
+
diagnostics.
|
|
125
|
+
|
|
126
|
+
For local development from this repository:
|
|
61
127
|
|
|
62
128
|
```sh
|
|
63
129
|
bundle install
|
|
64
|
-
bundle exec rspec
|
|
65
|
-
```
|
|
130
|
+
bundle exec rspec
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Bundled Go acceleration
|
|
134
|
+
|
|
135
|
+
RubyDB keeps the Ruby engine as its correctness authority and automatically
|
|
136
|
+
starts a bundled, CGO-free Go worker for proven read-only pipelines, checksums,
|
|
137
|
+
and compression. The release gem contains platform binaries; end users do not
|
|
138
|
+
install or configure Go. From a source checkout, build and verify the worker
|
|
139
|
+
with:
|
|
140
|
+
|
|
141
|
+
```sh
|
|
142
|
+
ruby scripts/build_accelerator
|
|
143
|
+
ruby -Ilib exe/rubydb accelerator --ping --json
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Use `accelerator.mode: off` or `RUBYDB_ACCELERATOR=off` for Ruby-only
|
|
147
|
+
diagnostics. `mode: auto` calibrates eligible scans, aggregates, and inner
|
|
148
|
+
hash joins against Ruby and keeps Go only when it wins without changing the
|
|
149
|
+
result. Use `required` only for differential validation and readiness checks.
|
|
150
|
+
See [the accelerator architecture](docs/architecture/go-accelerator.md)
|
|
151
|
+
for the protocol boundary, fallback behavior, differential testing, and
|
|
152
|
+
release rules.
|
|
66
153
|
|
|
67
154
|
## Ruby usage
|
|
68
155
|
|
|
@@ -92,6 +179,73 @@ client.disconnect
|
|
|
92
179
|
Use the `rubydb://` or TLS-enabled `rubydbs://` format documented in the Rails
|
|
93
180
|
configuration guide. RubyDB URLs are not PostgreSQL URLs.
|
|
94
181
|
|
|
182
|
+
## Copy-and-paste examples
|
|
183
|
+
|
|
184
|
+
### RubyDB for local development
|
|
185
|
+
|
|
186
|
+
This creates a durable local database in one owning Ruby process:
|
|
187
|
+
|
|
188
|
+
```ruby
|
|
189
|
+
require "rubydb"
|
|
190
|
+
|
|
191
|
+
engine = RubyDB::Storage::Engine.new("tmp/development.rdb")
|
|
192
|
+
begin
|
|
193
|
+
engine.execute("CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY, body TEXT NOT NULL)")
|
|
194
|
+
engine.execute("INSERT INTO notes (body) VALUES ('First note')")
|
|
195
|
+
puts engine.execute("SELECT id, body FROM notes ORDER BY id").inspect
|
|
196
|
+
ensure
|
|
197
|
+
engine.close
|
|
198
|
+
end
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Do not open the same embedded path from separate web and worker processes.
|
|
202
|
+
|
|
203
|
+
### RubyDB for a production microservice
|
|
204
|
+
|
|
205
|
+
Run one RubyDB server on persistent storage and inject a TLS URL into the
|
|
206
|
+
service:
|
|
207
|
+
|
|
208
|
+
```sh
|
|
209
|
+
gem install rubydb -v 0.1.6
|
|
210
|
+
rubydb --config /etc/rubydb/production.yml --env production start
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
```ruby
|
|
214
|
+
require "rubydb"
|
|
215
|
+
|
|
216
|
+
client = RubyDB::Client::Client.new(url: ENV.fetch("RUBYDB_URL"))
|
|
217
|
+
begin
|
|
218
|
+
puts client.query("SELECT 1").to_hash
|
|
219
|
+
ensure
|
|
220
|
+
client.disconnect
|
|
221
|
+
end
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Use a URL such as `rubydbs://user:URL_ENCODED_PASSWORD@db.internal:7432/app`
|
|
225
|
+
with TLS verification enabled. Store the complete URL in a secret manager and
|
|
226
|
+
keep the database service on a private network.
|
|
227
|
+
|
|
228
|
+
### PostgreSQL for a massive Rails application
|
|
229
|
+
|
|
230
|
+
Use the `pg` gem and a managed PostgreSQL connection string for the main
|
|
231
|
+
application:
|
|
232
|
+
|
|
233
|
+
```ruby
|
|
234
|
+
# Gemfile
|
|
235
|
+
gem "pg"
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
```yaml
|
|
239
|
+
# config/database.yml
|
|
240
|
+
production:
|
|
241
|
+
url: <%= ENV.fetch("DATABASE_URL") %>
|
|
242
|
+
pool: <%= ENV.fetch("RAILS_MAX_THREADS", "5") %>
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
Set `DATABASE_URL` through the hosting provider’s secret settings, run
|
|
246
|
+
migrations once from a release job, and validate the application against the
|
|
247
|
+
same PostgreSQL major version used in production.
|
|
248
|
+
|
|
95
249
|
## Rails example
|
|
96
250
|
|
|
97
251
|
The small Rails 7.2 application in
|
|
@@ -133,6 +287,7 @@ by the presence of an adapter.
|
|
|
133
287
|
## Documentation
|
|
134
288
|
|
|
135
289
|
- [Documentation index](docs/README.md)
|
|
290
|
+
- [Production journey](lessons/01-foundations.md)
|
|
136
291
|
- [Developer guide](docs/developer-guide.md)
|
|
137
292
|
- [Troubleshooting guide](docs/troubleshooting.md)
|
|
138
293
|
- [Debugging playbook](docs/debugging.md)
|
|
@@ -147,6 +302,7 @@ by the presence of an adapter.
|
|
|
147
302
|
- [Rails installation](docs/rails/installation.md)
|
|
148
303
|
- [Rails production guidance](docs/rails/production.md)
|
|
149
304
|
- [Rails compatibility guide](docs/rails/compatibility-guide.md)
|
|
305
|
+
- [Python adapter](adapters/python/README.md)
|
|
150
306
|
- [Production readiness](docs/production-readiness.md)
|
|
151
307
|
- [Operations and workload testing](docs/operations/workload-testing.md)
|
|
152
308
|
- [Production runbook](docs/operations/production-runbook.md)
|