rubydb 0.1.4 → 0.1.5
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 +12 -5
- data/.rubocop.yml +50 -44
- data/.standard.yml +9 -14
- data/ARCHITECTURE.md +21 -21
- data/CHANGELOG.md +43 -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 +249 -162
- data/ROADMAP.md +27 -27
- data/Rakefile +71 -71
- data/SECURITY.md +54 -54
- data/SUPPORT.md +14 -14
- data/adapters/activerecord/Gemfile +11 -11
- data/adapters/activerecord/lib/active_record/connection_adapters/rubydb_adapter.rb +873 -879
- data/adapters/activerecord/rubydb-activerecord.gemspec +20 -20
- 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 +75 -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/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 +275 -275
- data/docs/contributing/architecture.md +9 -9
- data/docs/contributing/benchmarking.md +14 -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 +17 -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 +94 -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 +125 -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 +163 -163
- 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 +74 -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 +302 -304
- data/lib/rubydb/client/connection.rb +414 -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 +123 -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 +179 -179
- data/lib/rubydb/configuration/environment.rb +152 -152
- data/lib/rubydb/configuration/parser.rb +185 -185
- data/lib/rubydb/configuration/validation.rb +221 -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/aggregate_executor.rb +134 -138
- data/lib/rubydb/execution/delete_executor.rb +110 -112
- data/lib/rubydb/execution/distinct_executor.rb +131 -135
- data/lib/rubydb/execution/executor.rb +1182 -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/optimizer.rb +227 -215
- data/lib/rubydb/execution/plan.rb +355 -353
- data/lib/rubydb/execution/planner.rb +542 -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 +180 -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 +186 -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 +564 -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 +371 -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 +2347 -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/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 +190 -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 +480 -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 +60 -57
- data/scripts/benchmark +7 -7
- data/scripts/durability_drill +37 -37
- data/scripts/fuzz +63 -63
- data/scripts/release +45 -40
- 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 +54 -1
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
# RubyDB production roadmap
|
|
2
|
-
|
|
3
|
-
## Current baseline
|
|
4
|
-
|
|
5
|
-
The project has a meaningful repository skeleton and substantial design intent. It already includes modules for storage, indexing, transactions, MVCC, SQL parts, server, replication, and backup flows. However, the implementation still lacks enough end-to-end proof for durable, crash-safe operation.
|
|
6
|
-
|
|
7
|
-
## Prioritized roadmap
|
|
8
|
-
|
|
9
|
-
### Phase 0 — Repository stabilization
|
|
10
|
-
|
|
11
|
-
- fix library loading and Ruby compatibility metadata
|
|
12
|
-
- verify the project loads via `require "rubydb"`
|
|
13
|
-
- establish a truthful project health baseline
|
|
14
|
-
- add characterization tests for current public behavior
|
|
15
|
-
|
|
16
|
-
### Phase 1 — Storage durability
|
|
17
|
-
|
|
18
|
-
- define a stable on-disk page format and file format
|
|
19
|
-
- add checksums, header validation, and corruption detection
|
|
20
|
-
- ensure WAL durability precedes page flush semantics
|
|
21
|
-
- add real restart tests and crash tests
|
|
22
|
-
|
|
23
|
-
### Phase 2 — Transaction correctness
|
|
24
|
-
|
|
25
|
-
- complete transaction lifecycle handling
|
|
26
|
-
- prove commit/rollback semantics under restart
|
|
27
|
-
- validate isolation semantics and visibility rules
|
|
28
|
-
- add deadlock and lock manager tests
|
|
29
|
-
|
|
30
|
-
### Phase 3 — Catalog and indexes
|
|
31
|
-
|
|
32
|
-
- persist catalog metadata consistently
|
|
33
|
-
- maintain indexes correctly during DML
|
|
34
|
-
- verify index consistency after crash and rollback
|
|
35
|
-
- document supported SQL compatibility targets honestly
|
|
36
|
-
|
|
37
|
-
### Phase 4 — SQL execution and optimizer
|
|
38
|
-
|
|
39
|
-
- validate end-to-end SQL execution
|
|
40
|
-
- ensure binder, planner, and executor are integrated
|
|
41
|
-
- add integration tests for basic DML and queries
|
|
42
|
-
- implement `EXPLAIN` only with real, honest plan output
|
|
43
|
-
|
|
44
|
-
### Phase 5 — Server and security
|
|
45
|
-
|
|
46
|
-
- harden server lifecycle and malformed-client handling
|
|
47
|
-
- enforce connection limits and timeouts
|
|
48
|
-
- check authorization before execution
|
|
49
|
-
- validate auth flows and access controls
|
|
50
|
-
|
|
51
|
-
### Phase 6 — Backup, recovery, and replication
|
|
52
|
-
|
|
53
|
-
- prove full backup + restore works from a clean environment
|
|
54
|
-
- validate point-in-time or incremental recovery only when implemented correctly
|
|
55
|
-
- only add replication once WAL recovery is demonstrably correct
|
|
56
|
-
|
|
57
|
-
### Phase 7 — Monitoring and production readiness
|
|
58
|
-
|
|
59
|
-
- add structured logging and health/readiness checks
|
|
60
|
-
- expose operational metrics
|
|
61
|
-
- create a final production-readiness audit with limitations and unsupported features
|
|
62
|
-
|
|
63
|
-
## Hard gates before declaring production readiness
|
|
64
|
-
|
|
65
|
-
RubyDB should not claim production readiness until it demonstrates all of the following:
|
|
66
|
-
|
|
67
|
-
- updated data survives restart
|
|
68
|
-
- crash recovery is validated with subprocess termination tests
|
|
69
|
-
- transactions preserve isolation semantics
|
|
70
|
-
- WAL ordering is durable and replayed correctly
|
|
71
|
-
- index and table data stay consistent
|
|
72
|
-
- authZ/authN is enforced over real operations
|
|
73
|
-
- backup and restore work in a clean environment
|
|
74
|
-
- server operations handle failures safely without whole-process crashes
|
|
75
|
-
|
|
76
|
-
## Decision rule
|
|
77
|
-
|
|
78
|
-
The repository must prefer correctness over feature breadth. A smaller well-tested engine is more valuable than a broad but unsafe one.
|
|
79
|
-
|
|
80
|
-
## Long-term target
|
|
81
|
-
|
|
82
|
-
The final target is not a fake "PostgreSQL clone" or a marketing demo. The target is a Ruby-first, SQLite-like development experience paired with durable, crash-safe relational database semantics that can be validated under real workloads.
|
|
1
|
+
# RubyDB production roadmap
|
|
2
|
+
|
|
3
|
+
## Current baseline
|
|
4
|
+
|
|
5
|
+
The project has a meaningful repository skeleton and substantial design intent. It already includes modules for storage, indexing, transactions, MVCC, SQL parts, server, replication, and backup flows. However, the implementation still lacks enough end-to-end proof for durable, crash-safe operation.
|
|
6
|
+
|
|
7
|
+
## Prioritized roadmap
|
|
8
|
+
|
|
9
|
+
### Phase 0 — Repository stabilization
|
|
10
|
+
|
|
11
|
+
- fix library loading and Ruby compatibility metadata
|
|
12
|
+
- verify the project loads via `require "rubydb"`
|
|
13
|
+
- establish a truthful project health baseline
|
|
14
|
+
- add characterization tests for current public behavior
|
|
15
|
+
|
|
16
|
+
### Phase 1 — Storage durability
|
|
17
|
+
|
|
18
|
+
- define a stable on-disk page format and file format
|
|
19
|
+
- add checksums, header validation, and corruption detection
|
|
20
|
+
- ensure WAL durability precedes page flush semantics
|
|
21
|
+
- add real restart tests and crash tests
|
|
22
|
+
|
|
23
|
+
### Phase 2 — Transaction correctness
|
|
24
|
+
|
|
25
|
+
- complete transaction lifecycle handling
|
|
26
|
+
- prove commit/rollback semantics under restart
|
|
27
|
+
- validate isolation semantics and visibility rules
|
|
28
|
+
- add deadlock and lock manager tests
|
|
29
|
+
|
|
30
|
+
### Phase 3 — Catalog and indexes
|
|
31
|
+
|
|
32
|
+
- persist catalog metadata consistently
|
|
33
|
+
- maintain indexes correctly during DML
|
|
34
|
+
- verify index consistency after crash and rollback
|
|
35
|
+
- document supported SQL compatibility targets honestly
|
|
36
|
+
|
|
37
|
+
### Phase 4 — SQL execution and optimizer
|
|
38
|
+
|
|
39
|
+
- validate end-to-end SQL execution
|
|
40
|
+
- ensure binder, planner, and executor are integrated
|
|
41
|
+
- add integration tests for basic DML and queries
|
|
42
|
+
- implement `EXPLAIN` only with real, honest plan output
|
|
43
|
+
|
|
44
|
+
### Phase 5 — Server and security
|
|
45
|
+
|
|
46
|
+
- harden server lifecycle and malformed-client handling
|
|
47
|
+
- enforce connection limits and timeouts
|
|
48
|
+
- check authorization before execution
|
|
49
|
+
- validate auth flows and access controls
|
|
50
|
+
|
|
51
|
+
### Phase 6 — Backup, recovery, and replication
|
|
52
|
+
|
|
53
|
+
- prove full backup + restore works from a clean environment
|
|
54
|
+
- validate point-in-time or incremental recovery only when implemented correctly
|
|
55
|
+
- only add replication once WAL recovery is demonstrably correct
|
|
56
|
+
|
|
57
|
+
### Phase 7 — Monitoring and production readiness
|
|
58
|
+
|
|
59
|
+
- add structured logging and health/readiness checks
|
|
60
|
+
- expose operational metrics
|
|
61
|
+
- create a final production-readiness audit with limitations and unsupported features
|
|
62
|
+
|
|
63
|
+
## Hard gates before declaring production readiness
|
|
64
|
+
|
|
65
|
+
RubyDB should not claim production readiness until it demonstrates all of the following:
|
|
66
|
+
|
|
67
|
+
- updated data survives restart
|
|
68
|
+
- crash recovery is validated with subprocess termination tests
|
|
69
|
+
- transactions preserve isolation semantics
|
|
70
|
+
- WAL ordering is durable and replayed correctly
|
|
71
|
+
- index and table data stay consistent
|
|
72
|
+
- authZ/authN is enforced over real operations
|
|
73
|
+
- backup and restore work in a clean environment
|
|
74
|
+
- server operations handle failures safely without whole-process crashes
|
|
75
|
+
|
|
76
|
+
## Decision rule
|
|
77
|
+
|
|
78
|
+
The repository must prefer correctness over feature breadth. A smaller well-tested engine is more valuable than a broad but unsafe one.
|
|
79
|
+
|
|
80
|
+
## Long-term target
|
|
81
|
+
|
|
82
|
+
The final target is not a fake "PostgreSQL clone" or a marketing demo. The target is a Ruby-first, SQLite-like development experience paired with durable, crash-safe relational database semantics that can be validated under real workloads.
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
# Query planner
|
|
2
|
-
|
|
3
|
-
The planner binds identifiers to catalog columns, validates expressions, and
|
|
4
|
-
builds executable plans. It supports sequential/index scans, safe inner-join
|
|
5
|
-
reordering, outer joins, filters, grouping, sorting, limits, set operations,
|
|
6
|
-
subqueries, CTEs, and window operations in the documented SQL surface.
|
|
7
|
-
|
|
8
|
-
Plans must preserve SQL null, ordering, grouping, and transaction visibility
|
|
9
|
-
semantics. `EXPLAIN` reports the actual selected plan; it is not a performance
|
|
10
|
-
promise. Use the benchmark and workload harnesses to establish capacity on the
|
|
11
|
-
target hardware.
|
|
12
|
-
|
|
13
|
-
## Plan review
|
|
14
|
-
|
|
15
|
-
For every rewrite, compare the optimized and baseline results on empty,
|
|
16
|
-
duplicate, null, and concurrent data. Include joins with unmatched rows,
|
|
17
|
-
grouping, limits, and repeated execution with bound parameters. Measure plan
|
|
18
|
-
selection, execution, lock wait, and I/O separately. A plan that is faster but
|
|
19
|
-
changes cardinality or ordering is incorrect; add the minimized query as a
|
|
20
|
-
regression spec before merging.
|
|
1
|
+
# Query planner
|
|
2
|
+
|
|
3
|
+
The planner binds identifiers to catalog columns, validates expressions, and
|
|
4
|
+
builds executable plans. It supports sequential/index scans, safe inner-join
|
|
5
|
+
reordering, outer joins, filters, grouping, sorting, limits, set operations,
|
|
6
|
+
subqueries, CTEs, and window operations in the documented SQL surface.
|
|
7
|
+
|
|
8
|
+
Plans must preserve SQL null, ordering, grouping, and transaction visibility
|
|
9
|
+
semantics. `EXPLAIN` reports the actual selected plan; it is not a performance
|
|
10
|
+
promise. Use the benchmark and workload harnesses to establish capacity on the
|
|
11
|
+
target hardware.
|
|
12
|
+
|
|
13
|
+
## Plan review
|
|
14
|
+
|
|
15
|
+
For every rewrite, compare the optimized and baseline results on empty,
|
|
16
|
+
duplicate, null, and concurrent data. Include joins with unmatched rows,
|
|
17
|
+
grouping, limits, and repeated execution with bound parameters. Measure plan
|
|
18
|
+
selection, execution, lock wait, and I/O separately. A plan that is faster but
|
|
19
|
+
changes cardinality or ordering is incorrect; add the minimized query as a
|
|
20
|
+
regression spec before merging.
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
# Recovery architecture
|
|
2
|
-
|
|
3
|
-
Recovery validates the database format, page headers, checksums, metadata, and
|
|
4
|
-
WAL before making state available. Valid committed WAL records may be replayed;
|
|
5
|
-
malformed or ambiguous records fail closed and require operator investigation.
|
|
6
|
-
|
|
7
|
-
Recovery procedures work from a preserved source or verified backup. Restore to
|
|
8
|
-
a new directory, run dry-run and checksum checks, reopen the restored engine,
|
|
9
|
-
compare schema/row evidence, and only then switch application traffic. See the
|
|
10
|
-
[disaster recovery](../operations/disaster-recovery.md) procedure.
|
|
11
|
-
|
|
12
|
-
## Failure handling
|
|
13
|
-
|
|
14
|
-
Recovery is allowed to replay only validated, committed records. Truncated
|
|
15
|
-
frames, invalid checksums, impossible LSNs, and incomplete metadata must stop
|
|
16
|
-
startup with an actionable error. Preserve the original directory and WAL;
|
|
17
|
-
repair or compaction experiments belong on a copy. The [debugging playbook](../debugging.md)
|
|
18
|
-
lists the evidence to collect.
|
|
1
|
+
# Recovery architecture
|
|
2
|
+
|
|
3
|
+
Recovery validates the database format, page headers, checksums, metadata, and
|
|
4
|
+
WAL before making state available. Valid committed WAL records may be replayed;
|
|
5
|
+
malformed or ambiguous records fail closed and require operator investigation.
|
|
6
|
+
|
|
7
|
+
Recovery procedures work from a preserved source or verified backup. Restore to
|
|
8
|
+
a new directory, run dry-run and checksum checks, reopen the restored engine,
|
|
9
|
+
compare schema/row evidence, and only then switch application traffic. See the
|
|
10
|
+
[disaster recovery](../operations/disaster-recovery.md) procedure.
|
|
11
|
+
|
|
12
|
+
## Failure handling
|
|
13
|
+
|
|
14
|
+
Recovery is allowed to replay only validated, committed records. Truncated
|
|
15
|
+
frames, invalid checksums, impossible LSNs, and incomplete metadata must stop
|
|
16
|
+
startup with an actionable error. Preserve the original directory and WAL;
|
|
17
|
+
repair or compaction experiments belong on a copy. The [debugging playbook](../debugging.md)
|
|
18
|
+
lists the evidence to collect.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
# SQL engine
|
|
2
|
-
|
|
3
|
-
RubyDB implements a documented RubyDB SQL subset with a tested common
|
|
4
|
-
SQLite-style application profile. Covered features include CRUD, constraints,
|
|
5
|
-
joins, grouping/aggregates, transactions/savepoints, CTEs, subqueries, set
|
|
6
|
-
operations, upserts, windows, indexes, views, and maintenance statements listed
|
|
7
|
-
in [SQL compatibility](../sql/compatibility.md).
|
|
8
|
-
|
|
9
|
-
This is not complete PostgreSQL, MySQL, or SQLite dialect/file-format
|
|
10
|
-
compatibility. Unsupported syntax must fail explicitly. Applications migrating
|
|
11
|
-
from another engine must run their own schema, query, migration, and error
|
|
12
|
-
behavior suite.
|
|
1
|
+
# SQL engine
|
|
2
|
+
|
|
3
|
+
RubyDB implements a documented RubyDB SQL subset with a tested common
|
|
4
|
+
SQLite-style application profile. Covered features include CRUD, constraints,
|
|
5
|
+
joins, grouping/aggregates, transactions/savepoints, CTEs, subqueries, set
|
|
6
|
+
operations, upserts, windows, indexes, views, and maintenance statements listed
|
|
7
|
+
in [SQL compatibility](../sql/compatibility.md).
|
|
8
|
+
|
|
9
|
+
This is not complete PostgreSQL, MySQL, or SQLite dialect/file-format
|
|
10
|
+
compatibility. Unsupported syntax must fail explicitly. Applications migrating
|
|
11
|
+
from another engine must run their own schema, query, migration, and error
|
|
12
|
+
behavior suite.
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
# Storage engine
|
|
2
|
-
|
|
3
|
-
The storage engine owns the database path, page manager, buffer pool, catalog,
|
|
4
|
-
indexes, WAL, and recovery lifecycle. It serializes durable changes and exposes
|
|
5
|
-
Ruby-native operations used by the SQL executor and adapters.
|
|
6
|
-
|
|
7
|
-
Embedded ownership is exclusive and enforced with an operating-system lock.
|
|
8
|
-
Multiple processes must use the server. On failure, callers should preserve the
|
|
9
|
-
original directory and recover into a new destination; do not delete WAL or
|
|
10
|
-
overwrite the source during investigation.
|
|
11
|
-
|
|
12
|
-
Storage changes require reopen, crash, fault-injection, corruption, compaction,
|
|
13
|
-
and backup/restore coverage. The [lessons learned](../lessons-learned.md) page
|
|
14
|
-
explains why these are separate guarantees.
|
|
1
|
+
# Storage engine
|
|
2
|
+
|
|
3
|
+
The storage engine owns the database path, page manager, buffer pool, catalog,
|
|
4
|
+
indexes, WAL, and recovery lifecycle. It serializes durable changes and exposes
|
|
5
|
+
Ruby-native operations used by the SQL executor and adapters.
|
|
6
|
+
|
|
7
|
+
Embedded ownership is exclusive and enforced with an operating-system lock.
|
|
8
|
+
Multiple processes must use the server. On failure, callers should preserve the
|
|
9
|
+
original directory and recover into a new destination; do not delete WAL or
|
|
10
|
+
overwrite the source during investigation.
|
|
11
|
+
|
|
12
|
+
Storage changes require reopen, crash, fault-injection, corruption, compaction,
|
|
13
|
+
and backup/restore coverage. The [lessons learned](../lessons-learned.md) page
|
|
14
|
+
explains why these are separate guarantees.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# Transactions
|
|
2
|
-
|
|
3
|
-
Transactions group mutations into a commit or rollback boundary. WAL commit and
|
|
4
|
-
flush ordering precede durable acknowledgement. MVCC determines visibility,
|
|
5
|
-
while lock management protects conflicting writes and resolves wait-for cycles.
|
|
6
|
-
|
|
7
|
-
Supported controls include `BEGIN`, `COMMIT`, `ROLLBACK`, savepoints, and
|
|
8
|
-
rollback to savepoint. A deadlock victim is rolled back and must retry the whole
|
|
9
|
-
application unit as appropriate. Test isolation and recovery together; a green
|
|
10
|
-
single-thread transaction test does not prove concurrent correctness.
|
|
1
|
+
# Transactions
|
|
2
|
+
|
|
3
|
+
Transactions group mutations into a commit or rollback boundary. WAL commit and
|
|
4
|
+
flush ordering precede durable acknowledgement. MVCC determines visibility,
|
|
5
|
+
while lock management protects conflicting writes and resolves wait-for cycles.
|
|
6
|
+
|
|
7
|
+
Supported controls include `BEGIN`, `COMMIT`, `ROLLBACK`, savepoints, and
|
|
8
|
+
rollback to savepoint. A deadlock victim is rolled back and must retry the whole
|
|
9
|
+
application unit as appropriate. Test isolation and recovery together; a green
|
|
10
|
+
single-thread transaction test does not prove concurrent correctness.
|
data/docs/architecture/wal.md
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
# RubyDB WAL format
|
|
2
|
-
|
|
3
|
-
Each WAL segment is a sequence of independently framed records:
|
|
4
|
-
|
|
5
|
-
```text
|
|
6
|
-
4-byte unsigned big-endian payload length
|
|
7
|
-
16-byte ASCII SHA-256 checksum prefix
|
|
8
|
-
UTF-8 JSON payload
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
The checksum covers the JSON payload only. A record's LSN offset is the byte
|
|
12
|
-
offset of its frame header within the segment, so readers can advance exactly
|
|
13
|
-
one frame at a time. If the final frame is incomplete, recovery stops at that
|
|
14
|
-
tail and retains all complete preceding records.
|
|
15
|
-
|
|
16
|
-
WAL data is flushed and fsynced before the storage engine flushes data pages
|
|
17
|
-
when synchronous WAL mode is enabled (the default). A successful `write` is
|
|
18
|
-
therefore durable only after the WAL sync completes; callers must still use
|
|
19
|
-
the engine's transaction/close APIs to coordinate higher-level durability.
|
|
20
|
-
|
|
21
|
-
## Transaction recovery records
|
|
22
|
-
|
|
23
|
-
Mutation records include the transaction ID. UPDATE records include the
|
|
24
|
-
previous column values, and DELETE records include the previous row values and
|
|
25
|
-
columns. Recovery replays mutations for transactions with a durable COMMIT
|
|
26
|
-
record. Transactions that have a BEGIN but no COMMIT are undone in reverse WAL
|
|
27
|
-
order. Recovery uses the existing row version for DELETE undo and does not
|
|
28
|
-
create a replacement row with a new identifier.
|
|
1
|
+
# RubyDB WAL format
|
|
2
|
+
|
|
3
|
+
Each WAL segment is a sequence of independently framed records:
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
4-byte unsigned big-endian payload length
|
|
7
|
+
16-byte ASCII SHA-256 checksum prefix
|
|
8
|
+
UTF-8 JSON payload
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
The checksum covers the JSON payload only. A record's LSN offset is the byte
|
|
12
|
+
offset of its frame header within the segment, so readers can advance exactly
|
|
13
|
+
one frame at a time. If the final frame is incomplete, recovery stops at that
|
|
14
|
+
tail and retains all complete preceding records.
|
|
15
|
+
|
|
16
|
+
WAL data is flushed and fsynced before the storage engine flushes data pages
|
|
17
|
+
when synchronous WAL mode is enabled (the default). A successful `write` is
|
|
18
|
+
therefore durable only after the WAL sync completes; callers must still use
|
|
19
|
+
the engine's transaction/close APIs to coordinate higher-level durability.
|
|
20
|
+
|
|
21
|
+
## Transaction recovery records
|
|
22
|
+
|
|
23
|
+
Mutation records include the transaction ID. UPDATE records include the
|
|
24
|
+
previous column values, and DELETE records include the previous row values and
|
|
25
|
+
columns. Recovery replays mutations for transactions with a durable COMMIT
|
|
26
|
+
record. Transactions that have a BEGIN but no COMMIT are undone in reverse WAL
|
|
27
|
+
order. Recovery uses the existing row version for DELETE undo and does not
|
|
28
|
+
create a replacement row with a new identifier.
|
data/docs/cli-cheatsheet.md
CHANGED
|
@@ -1,98 +1,98 @@
|
|
|
1
|
-
# RubyDB CLI cheat sheet
|
|
2
|
-
|
|
3
|
-
Replace paths and names before running. Put global options before the command.
|
|
4
|
-
|
|
5
|
-
## Global
|
|
6
|
-
|
|
7
|
-
```sh
|
|
8
|
-
rubydb --help
|
|
9
|
-
rubydb --version
|
|
10
|
-
rubydb --config config/production.yml --env production --no-color status --json
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## Database lifecycle
|
|
14
|
-
|
|
15
|
-
```sh
|
|
16
|
-
rubydb init --name app --dir data
|
|
17
|
-
rubydb create --database data/app.rdb
|
|
18
|
-
rubydb status --json
|
|
19
|
-
rubydb doctor --quick --json
|
|
20
|
-
rubydb inspect --database data/app.rdb --stats --wal
|
|
21
|
-
rubydb drop --database data/app.rdb # prompts
|
|
22
|
-
rubydb drop --database data/app.rdb --force # destructive
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Server
|
|
26
|
-
|
|
27
|
-
```sh
|
|
28
|
-
rubydb --env production start --host 127.0.0.1 --port 7432 \
|
|
29
|
-
--data-dir /var/lib/rubydb/data --log-dir /var/log/rubydb \
|
|
30
|
-
--pid-file /run/rubydb.pid
|
|
31
|
-
rubydb stop --pid-file /run/rubydb.pid
|
|
32
|
-
rubydb restart --pid-file /run/rubydb.pid
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## SQL shell
|
|
36
|
-
|
|
37
|
-
```sh
|
|
38
|
-
rubydb shell --database app --table
|
|
39
|
-
rubydb shell --database app --json
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
Inside shell: `.help` `.tables` `.table users` `.schema users` `.status`
|
|
43
|
-
`.begin` `.commit` `.rollback` `.explain SELECT ...` `.exit`.
|
|
44
|
-
|
|
45
|
-
## Migrations
|
|
46
|
-
|
|
47
|
-
```sh
|
|
48
|
-
rubydb migrate --database data/app.rdb --path db/migrate --dry-run
|
|
49
|
-
rubydb migrate --database data/app.rdb --path db/migrate
|
|
50
|
-
rubydb migrate --database data/app.rdb --path db/migrate --down --steps 1
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
## Backups and restore
|
|
54
|
-
|
|
55
|
-
```sh
|
|
56
|
-
rubydb backup --database data/app.rdb --dir backups --type full --compress
|
|
57
|
-
rubydb backup --database data/app.rdb --dir backups --type incremental
|
|
58
|
-
rubydb backup --database data/app.rdb --dir backups --type differential
|
|
59
|
-
rubydb restore --dir backups --latest --dry-run
|
|
60
|
-
rubydb restore --dir backups --latest
|
|
61
|
-
rubydb restore --dir backups --backup NAME --point-in-time 2026-09-09T12:00:00Z
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## Snapshots and branches
|
|
65
|
-
|
|
66
|
-
```sh
|
|
67
|
-
rubydb snapshot --database data/app.rdb --dir snapshots --name before-change
|
|
68
|
-
rubydb snapshot --database data/app.rdb --dir snapshots --list
|
|
69
|
-
rubydb branch --database data/app.rdb --branch-dir branches --list
|
|
70
|
-
rubydb branch --database data/app.rdb --branch-dir branches --create feature --from main
|
|
71
|
-
rubydb checkout --database data/app.rdb --branch-dir branches feature
|
|
72
|
-
rubydb diff --database data/app.rdb --branch-dir branches main feature --summary
|
|
73
|
-
rubydb merge --database data/app.rdb --branch-dir branches feature --into main
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
## Maintenance and release checks
|
|
77
|
-
|
|
78
|
-
```sh
|
|
79
|
-
rubydb vacuum --database data/app.rdb --dry-run
|
|
80
|
-
rubydb vacuum --database data/app.rdb --full --analyze
|
|
81
|
-
ruby scripts/durability_drill
|
|
82
|
-
ruby scripts/replication_failover_drill
|
|
83
|
-
ruby scripts/replication_network_failover_drill
|
|
84
|
-
ruby scripts/release
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## Safety rules
|
|
88
|
-
|
|
89
|
-
- Back up and verify before `migrate`, `merge`, `checkout`, `vacuum --full`, or
|
|
90
|
-
any restore.
|
|
91
|
-
- Treat `drop --force`, `create --force`, restore `--force`, and process `--force`
|
|
92
|
-
stop as destructive operations.
|
|
93
|
-
- Preserve database, WAL, lock, metadata, logs, and configuration together.
|
|
94
|
-
- Use one embedded owner; use server/client mode for multiple processes.
|
|
95
|
-
- Never put passwords, tokens, private keys, or API keys in commands committed
|
|
96
|
-
to source control or in captured output.
|
|
97
|
-
- A successful CLI exit is not a universal production certification; retain the
|
|
98
|
-
workload, restore, failover, CI, and security evidence.
|
|
1
|
+
# RubyDB CLI cheat sheet
|
|
2
|
+
|
|
3
|
+
Replace paths and names before running. Put global options before the command.
|
|
4
|
+
|
|
5
|
+
## Global
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
rubydb --help
|
|
9
|
+
rubydb --version
|
|
10
|
+
rubydb --config config/production.yml --env production --no-color status --json
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Database lifecycle
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
rubydb init --name app --dir data
|
|
17
|
+
rubydb create --database data/app.rdb
|
|
18
|
+
rubydb status --json
|
|
19
|
+
rubydb doctor --quick --json
|
|
20
|
+
rubydb inspect --database data/app.rdb --stats --wal
|
|
21
|
+
rubydb drop --database data/app.rdb # prompts
|
|
22
|
+
rubydb drop --database data/app.rdb --force # destructive
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Server
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
rubydb --env production start --host 127.0.0.1 --port 7432 \
|
|
29
|
+
--data-dir /var/lib/rubydb/data --log-dir /var/log/rubydb \
|
|
30
|
+
--pid-file /run/rubydb.pid
|
|
31
|
+
rubydb stop --pid-file /run/rubydb.pid
|
|
32
|
+
rubydb restart --pid-file /run/rubydb.pid
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## SQL shell
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
rubydb shell --database app --table
|
|
39
|
+
rubydb shell --database app --json
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Inside shell: `.help` `.tables` `.table users` `.schema users` `.status`
|
|
43
|
+
`.begin` `.commit` `.rollback` `.explain SELECT ...` `.exit`.
|
|
44
|
+
|
|
45
|
+
## Migrations
|
|
46
|
+
|
|
47
|
+
```sh
|
|
48
|
+
rubydb migrate --database data/app.rdb --path db/migrate --dry-run
|
|
49
|
+
rubydb migrate --database data/app.rdb --path db/migrate
|
|
50
|
+
rubydb migrate --database data/app.rdb --path db/migrate --down --steps 1
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Backups and restore
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
rubydb backup --database data/app.rdb --dir backups --type full --compress
|
|
57
|
+
rubydb backup --database data/app.rdb --dir backups --type incremental
|
|
58
|
+
rubydb backup --database data/app.rdb --dir backups --type differential
|
|
59
|
+
rubydb restore --dir backups --latest --dry-run
|
|
60
|
+
rubydb restore --dir backups --latest
|
|
61
|
+
rubydb restore --dir backups --backup NAME --point-in-time 2026-09-09T12:00:00Z
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Snapshots and branches
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
rubydb snapshot --database data/app.rdb --dir snapshots --name before-change
|
|
68
|
+
rubydb snapshot --database data/app.rdb --dir snapshots --list
|
|
69
|
+
rubydb branch --database data/app.rdb --branch-dir branches --list
|
|
70
|
+
rubydb branch --database data/app.rdb --branch-dir branches --create feature --from main
|
|
71
|
+
rubydb checkout --database data/app.rdb --branch-dir branches feature
|
|
72
|
+
rubydb diff --database data/app.rdb --branch-dir branches main feature --summary
|
|
73
|
+
rubydb merge --database data/app.rdb --branch-dir branches feature --into main
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Maintenance and release checks
|
|
77
|
+
|
|
78
|
+
```sh
|
|
79
|
+
rubydb vacuum --database data/app.rdb --dry-run
|
|
80
|
+
rubydb vacuum --database data/app.rdb --full --analyze
|
|
81
|
+
ruby scripts/durability_drill
|
|
82
|
+
ruby scripts/replication_failover_drill
|
|
83
|
+
ruby scripts/replication_network_failover_drill
|
|
84
|
+
ruby scripts/release
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Safety rules
|
|
88
|
+
|
|
89
|
+
- Back up and verify before `migrate`, `merge`, `checkout`, `vacuum --full`, or
|
|
90
|
+
any restore.
|
|
91
|
+
- Treat `drop --force`, `create --force`, restore `--force`, and process `--force`
|
|
92
|
+
stop as destructive operations.
|
|
93
|
+
- Preserve database, WAL, lock, metadata, logs, and configuration together.
|
|
94
|
+
- Use one embedded owner; use server/client mode for multiple processes.
|
|
95
|
+
- Never put passwords, tokens, private keys, or API keys in commands committed
|
|
96
|
+
to source control or in captured output.
|
|
97
|
+
- A successful CLI exit is not a universal production certification; retain the
|
|
98
|
+
workload, restore, failover, CI, and security evidence.
|