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.
Files changed (420) hide show
  1. checksums.yaml +4 -4
  2. data/.github/PULL_REQUEST_TEMPLATE.md +15 -15
  3. data/.github/workflows/benchmark.yml +26 -26
  4. data/.github/workflows/compatibility.yml +63 -63
  5. data/.github/workflows/fuzz.yml +33 -33
  6. data/.github/workflows/lint.yml +21 -21
  7. data/.github/workflows/operations.yml +24 -24
  8. data/.github/workflows/production-validation.yml +111 -111
  9. data/.github/workflows/release.yml +77 -77
  10. data/.github/workflows/security.yml +39 -37
  11. data/.github/workflows/test.yml +26 -26
  12. data/.github/workflows/workload.yml +58 -58
  13. data/.gitignore +12 -5
  14. data/.rubocop.yml +50 -44
  15. data/.standard.yml +9 -14
  16. data/ARCHITECTURE.md +21 -21
  17. data/CHANGELOG.md +43 -27
  18. data/CODE_OF_CONDUCT.md +13 -13
  19. data/CONTRIBUTING.md +29 -29
  20. data/GOVERNANCE.md +16 -16
  21. data/Gemfile +18 -17
  22. data/Gemfile.lock +125 -71
  23. data/README.md +249 -162
  24. data/ROADMAP.md +27 -27
  25. data/Rakefile +71 -71
  26. data/SECURITY.md +54 -54
  27. data/SUPPORT.md +14 -14
  28. data/adapters/activerecord/Gemfile +11 -11
  29. data/adapters/activerecord/lib/active_record/connection_adapters/rubydb_adapter.rb +873 -879
  30. data/adapters/activerecord/rubydb-activerecord.gemspec +20 -20
  31. data/adapters/activerecord/spec/rubydb_adapter_integration_spec.rb +143 -143
  32. data/adapters/ruby/README.md +18 -18
  33. data/adapters/sequel/README.md +11 -11
  34. data/config/monitoring/prometheus-alerts.yml +39 -39
  35. data/config/production.yml +36 -36
  36. data/docs/README.md +75 -71
  37. data/docs/architecture/concurrency.md +14 -14
  38. data/docs/architecture/current-state.md +125 -125
  39. data/docs/architecture/execution-engine.md +25 -25
  40. data/docs/architecture/indexes.md +19 -19
  41. data/docs/architecture/mvcc.md +19 -19
  42. data/docs/architecture/overview.md +13 -13
  43. data/docs/architecture/pages.md +11 -11
  44. data/docs/architecture/production-roadmap.md +82 -82
  45. data/docs/architecture/query-planner.md +20 -20
  46. data/docs/architecture/recovery.md +18 -18
  47. data/docs/architecture/sql-engine.md +12 -12
  48. data/docs/architecture/storage-engine.md +14 -14
  49. data/docs/architecture/transactions.md +10 -10
  50. data/docs/architecture/wal.md +28 -28
  51. data/docs/cli-cheatsheet.md +98 -98
  52. data/docs/cli.md +275 -275
  53. data/docs/contributing/architecture.md +9 -9
  54. data/docs/contributing/benchmarking.md +14 -14
  55. data/docs/contributing/development.md +16 -16
  56. data/docs/contributing/release-process.md +49 -49
  57. data/docs/contributing/testing.md +16 -16
  58. data/docs/debugging.md +229 -229
  59. data/docs/developer/branching.md +10 -10
  60. data/docs/developer/database-diff.md +10 -10
  61. data/docs/developer/local-development.md +17 -17
  62. data/docs/developer/snapshots.md +9 -9
  63. data/docs/developer/temporal-data.md +10 -10
  64. data/docs/developer-guide.md +297 -297
  65. data/docs/getting-started/first-database.md +16 -16
  66. data/docs/getting-started/first-query.md +13 -13
  67. data/docs/getting-started/installation.md +19 -19
  68. data/docs/getting-started/local-to-production.md +300 -300
  69. data/docs/getting-started/quickstart.md +17 -17
  70. data/docs/getting-started/rails.md +16 -16
  71. data/docs/hardening_backlog.md +93 -93
  72. data/docs/lessons-learned.md +112 -112
  73. data/docs/operations/backups.md +33 -33
  74. data/docs/operations/disaster-recovery.md +31 -31
  75. data/docs/operations/failover.md +30 -30
  76. data/docs/operations/monitoring.md +25 -25
  77. data/docs/operations/production-guide.md +295 -295
  78. data/docs/operations/production-runbook.md +45 -45
  79. data/docs/operations/replication.md +33 -33
  80. data/docs/operations/restore.md +6 -6
  81. data/docs/operations/runbook.md +34 -34
  82. data/docs/operations/upgrades.md +14 -14
  83. data/docs/operations/workload-testing.md +17 -17
  84. data/docs/production-readiness.md +118 -118
  85. data/docs/production_validation.md +150 -150
  86. data/docs/rails/active-record.md +11 -11
  87. data/docs/rails/compatibility-guide.md +90 -90
  88. data/docs/rails/database-yml.md +92 -92
  89. data/docs/rails/installation.md +17 -17
  90. data/docs/rails/migrations.md +17 -17
  91. data/docs/rails/production.md +82 -82
  92. data/docs/rails/troubleshooting.md +18 -18
  93. data/docs/release.md +25 -25
  94. data/docs/server/architecture.md +10 -10
  95. data/docs/server/authentication.md +10 -10
  96. data/docs/server/configuration.md +16 -16
  97. data/docs/server/connection-pooling.md +10 -10
  98. data/docs/server/deployment.md +10 -10
  99. data/docs/server/protocol.md +12 -12
  100. data/docs/sql/compatibility-guide.md +82 -82
  101. data/docs/sql/compatibility.md +39 -39
  102. data/docs/sql/data-types.md +10 -10
  103. data/docs/sql/functions.md +9 -9
  104. data/docs/sql/joins.md +9 -9
  105. data/docs/sql/operators.md +9 -9
  106. data/docs/sql/sqlite-compatibility.md +21 -21
  107. data/docs/sql/syntax.md +10 -10
  108. data/docs/sql/transactions.md +10 -10
  109. data/docs/troubleshooting.md +244 -244
  110. data/lessons/01-foundations.md +73 -0
  111. data/lessons/02-local-development.md +121 -0
  112. data/lessons/03-embedded-rubydb.md +99 -0
  113. data/lessons/04-rails-complex-apps.md +138 -0
  114. data/lessons/05-rubydb-production-server.md +237 -0
  115. data/lessons/06-postgresql-massive-apps.md +96 -0
  116. data/lessons/07-hybrid-microservices.md +94 -0
  117. data/lessons/08-migrations-backups-recovery.md +86 -0
  118. data/lessons/09-observability-security-scale.md +87 -0
  119. data/lessons/10-release-readiness.md +125 -0
  120. data/lib/rubydb/backup/archive.rb +332 -334
  121. data/lib/rubydb/backup/backup.rb +400 -401
  122. data/lib/rubydb/backup/incremental.rb +349 -353
  123. data/lib/rubydb/backup/restore.rb +289 -290
  124. data/lib/rubydb/backup/snapshot.rb +265 -267
  125. data/lib/rubydb/backup/verification.rb +276 -279
  126. data/lib/rubydb/branching/branch.rb +181 -181
  127. data/lib/rubydb/branching/branch_manager.rb +307 -311
  128. data/lib/rubydb/branching/branch_metadata.rb +140 -140
  129. data/lib/rubydb/branching/checkout.rb +165 -166
  130. data/lib/rubydb/branching/copy_on_write.rb +272 -272
  131. data/lib/rubydb/branching/diff.rb +137 -138
  132. data/lib/rubydb/branching/merge.rb +282 -285
  133. data/lib/rubydb/build_info.rb +15 -15
  134. data/lib/rubydb/catalog/catalog.rb +391 -391
  135. data/lib/rubydb/catalog/column.rb +112 -112
  136. data/lib/rubydb/catalog/constraint.rb +180 -180
  137. data/lib/rubydb/catalog/database.rb +184 -184
  138. data/lib/rubydb/catalog/index.rb +97 -97
  139. data/lib/rubydb/catalog/schema.rb +103 -103
  140. data/lib/rubydb/catalog/sequence.rb +90 -90
  141. data/lib/rubydb/catalog/system_catalog.rb +698 -698
  142. data/lib/rubydb/catalog/table.rb +178 -178
  143. data/lib/rubydb/catalog/trigger.rb +102 -102
  144. data/lib/rubydb/catalog/view.rb +66 -66
  145. data/lib/rubydb/cli/application.rb +163 -163
  146. data/lib/rubydb/cli/commands/backup.rb +80 -81
  147. data/lib/rubydb/cli/commands/branch.rb +72 -72
  148. data/lib/rubydb/cli/commands/checkout.rb +54 -54
  149. data/lib/rubydb/cli/commands/create.rb +58 -58
  150. data/lib/rubydb/cli/commands/diff.rb +76 -77
  151. data/lib/rubydb/cli/commands/doctor.rb +74 -74
  152. data/lib/rubydb/cli/commands/drop.rb +57 -57
  153. data/lib/rubydb/cli/commands/init.rb +101 -102
  154. data/lib/rubydb/cli/commands/inspect.rb +95 -95
  155. data/lib/rubydb/cli/commands/merge.rb +63 -63
  156. data/lib/rubydb/cli/commands/migrate.rb +62 -62
  157. data/lib/rubydb/cli/commands/restart.rb +42 -39
  158. data/lib/rubydb/cli/commands/restore.rb +121 -121
  159. data/lib/rubydb/cli/commands/shell.rb +365 -365
  160. data/lib/rubydb/cli/commands/snapshot.rb +79 -79
  161. data/lib/rubydb/cli/commands/start.rb +88 -82
  162. data/lib/rubydb/cli/commands/status.rb +96 -92
  163. data/lib/rubydb/cli/commands/stop.rb +47 -47
  164. data/lib/rubydb/cli/commands/vacuum.rb +58 -58
  165. data/lib/rubydb/cli/formatter.rb +221 -221
  166. data/lib/rubydb/cli/output.rb +168 -168
  167. data/lib/rubydb/client/client.rb +302 -304
  168. data/lib/rubydb/client/connection.rb +414 -415
  169. data/lib/rubydb/client/connection_pool.rb +168 -168
  170. data/lib/rubydb/client/connection_url.rb +96 -96
  171. data/lib/rubydb/client/prepared_statement.rb +60 -60
  172. data/lib/rubydb/client/result.rb +123 -123
  173. data/lib/rubydb/client/statement.rb +52 -52
  174. data/lib/rubydb/client/transaction.rb +130 -130
  175. data/lib/rubydb/concurrency/concurrency.rb +19 -19
  176. data/lib/rubydb/concurrency/deadlock_detector.rb +148 -150
  177. data/lib/rubydb/concurrency/latch.rb +101 -101
  178. data/lib/rubydb/concurrency/lock_graph.rb +163 -165
  179. data/lib/rubydb/concurrency/mutex.rb +181 -183
  180. data/lib/rubydb/concurrency/rw_lock.rb +180 -180
  181. data/lib/rubydb/concurrency/scheduler.rb +248 -250
  182. data/lib/rubydb/concurrency/worker_pool.rb +145 -143
  183. data/lib/rubydb/configuration/config.rb +170 -170
  184. data/lib/rubydb/configuration/defaults.rb +179 -179
  185. data/lib/rubydb/configuration/environment.rb +152 -152
  186. data/lib/rubydb/configuration/parser.rb +185 -185
  187. data/lib/rubydb/configuration/validation.rb +221 -221
  188. data/lib/rubydb/constants.rb +74 -74
  189. data/lib/rubydb/constraints/check.rb +181 -181
  190. data/lib/rubydb/constraints/constraint.rb +101 -101
  191. data/lib/rubydb/constraints/foreign_key.rb +130 -130
  192. data/lib/rubydb/constraints/not_null.rb +64 -64
  193. data/lib/rubydb/constraints/primary_key.rb +99 -99
  194. data/lib/rubydb/constraints/unique.rb +106 -108
  195. data/lib/rubydb/constraints/validator.rb +349 -350
  196. data/lib/rubydb/errors/authentication_error.rb +10 -10
  197. data/lib/rubydb/errors/authorization_error.rb +23 -23
  198. data/lib/rubydb/errors/client_error.rb +10 -10
  199. data/lib/rubydb/errors/configuration_error.rb +10 -10
  200. data/lib/rubydb/errors/connection_error.rb +10 -10
  201. data/lib/rubydb/errors/constraint_error.rb +23 -23
  202. data/lib/rubydb/errors/corruption_error.rb +10 -10
  203. data/lib/rubydb/errors/database_error.rb +10 -10
  204. data/lib/rubydb/errors/error.rb +20 -20
  205. data/lib/rubydb/errors/execution_error.rb +10 -10
  206. data/lib/rubydb/errors/parser_error.rb +10 -10
  207. data/lib/rubydb/errors/recovery_error.rb +10 -10
  208. data/lib/rubydb/errors/replication_error.rb +10 -10
  209. data/lib/rubydb/errors/server_error.rb +6 -6
  210. data/lib/rubydb/errors/storage_error.rb +10 -10
  211. data/lib/rubydb/errors/transaction_error.rb +10 -10
  212. data/lib/rubydb/execution/aggregate_executor.rb +134 -138
  213. data/lib/rubydb/execution/delete_executor.rb +110 -112
  214. data/lib/rubydb/execution/distinct_executor.rb +131 -135
  215. data/lib/rubydb/execution/executor.rb +1182 -1188
  216. data/lib/rubydb/execution/expression.rb +191 -193
  217. data/lib/rubydb/execution/index_scan.rb +142 -142
  218. data/lib/rubydb/execution/insert_executor.rb +215 -217
  219. data/lib/rubydb/execution/join_executor.rb +243 -249
  220. data/lib/rubydb/execution/limit_executor.rb +83 -85
  221. data/lib/rubydb/execution/optimizer.rb +227 -215
  222. data/lib/rubydb/execution/plan.rb +355 -353
  223. data/lib/rubydb/execution/planner.rb +542 -536
  224. data/lib/rubydb/execution/predicate.rb +235 -235
  225. data/lib/rubydb/execution/scan.rb +49 -49
  226. data/lib/rubydb/execution/sequential_scan.rb +63 -63
  227. data/lib/rubydb/execution/sort_executor.rb +180 -185
  228. data/lib/rubydb/execution/update_executor.rb +160 -162
  229. data/lib/rubydb/functions/aggregate.rb +70 -70
  230. data/lib/rubydb/functions/date_functions.rb +274 -278
  231. data/lib/rubydb/functions/function.rb +85 -85
  232. data/lib/rubydb/functions/json_functions.rb +231 -215
  233. data/lib/rubydb/functions/numeric_functions.rb +346 -346
  234. data/lib/rubydb/functions/scalar.rb +52 -52
  235. data/lib/rubydb/functions/string_functions.rb +383 -383
  236. data/lib/rubydb/functions/system_functions.rb +258 -246
  237. data/lib/rubydb/history/as_of.rb +238 -238
  238. data/lib/rubydb/history/change.rb +105 -105
  239. data/lib/rubydb/history/history.rb +131 -131
  240. data/lib/rubydb/history/history_manager.rb +228 -229
  241. data/lib/rubydb/history/temporal_query.rb +202 -202
  242. data/lib/rubydb/history/timeline.rb +144 -144
  243. data/lib/rubydb/indexes/btree.rb +186 -186
  244. data/lib/rubydb/indexes/btree_cursor.rb +258 -258
  245. data/lib/rubydb/indexes/btree_node.rb +384 -385
  246. data/lib/rubydb/indexes/hash_index.rb +150 -150
  247. data/lib/rubydb/indexes/index.rb +71 -71
  248. data/lib/rubydb/indexes/index_manager.rb +408 -406
  249. data/lib/rubydb/indexes/index_scan.rb +466 -470
  250. data/lib/rubydb/migrations/migration.rb +253 -254
  251. data/lib/rubydb/migrations/migration_lock.rb +146 -146
  252. data/lib/rubydb/migrations/migration_manager.rb +187 -176
  253. data/lib/rubydb/migrations/migration_version.rb +71 -71
  254. data/lib/rubydb/migrations/schema_diff.rb +211 -211
  255. data/lib/rubydb/migrations/schema_version.rb +64 -64
  256. data/lib/rubydb/monitoring/events.rb +155 -160
  257. data/lib/rubydb/monitoring/health.rb +216 -222
  258. data/lib/rubydb/monitoring/logger.rb +188 -193
  259. data/lib/rubydb/monitoring/metrics.rb +363 -359
  260. data/lib/rubydb/monitoring/performance.rb +176 -176
  261. data/lib/rubydb/monitoring/statistics.rb +168 -170
  262. data/lib/rubydb/mvcc/garbage_collector.rb +199 -199
  263. data/lib/rubydb/mvcc/mvcc.rb +16 -16
  264. data/lib/rubydb/mvcc/snapshot.rb +146 -147
  265. data/lib/rubydb/mvcc/vacuum.rb +180 -180
  266. data/lib/rubydb/mvcc/version.rb +106 -106
  267. data/lib/rubydb/mvcc/version_store.rb +396 -398
  268. data/lib/rubydb/mvcc/visibility.rb +107 -109
  269. data/lib/rubydb/protocol/capabilities.rb +125 -125
  270. data/lib/rubydb/protocol/decoder.rb +142 -145
  271. data/lib/rubydb/protocol/encoder.rb +131 -136
  272. data/lib/rubydb/protocol/handshake.rb +306 -305
  273. data/lib/rubydb/protocol/message.rb +121 -121
  274. data/lib/rubydb/protocol/parameter_binder.rb +101 -0
  275. data/lib/rubydb/protocol/protocol.rb +276 -277
  276. data/lib/rubydb/protocol/version.rb +54 -54
  277. data/lib/rubydb/rails/adapter.rb +245 -239
  278. data/lib/rubydb/rails/connection.rb +312 -314
  279. data/lib/rubydb/rails/database_statements.rb +122 -122
  280. data/lib/rubydb/rails/migration.rb +131 -131
  281. data/lib/rubydb/rails/quoting.rb +109 -109
  282. data/lib/rubydb/rails/result.rb +117 -117
  283. data/lib/rubydb/rails/schema_statements.rb +339 -339
  284. data/lib/rubydb/rails/transaction.rb +105 -105
  285. data/lib/rubydb/rails/type.rb +126 -126
  286. data/lib/rubydb/recovery/checkpoint.rb +261 -257
  287. data/lib/rubydb/recovery/consistency.rb +457 -467
  288. data/lib/rubydb/recovery/corruption_detector.rb +5 -5
  289. data/lib/rubydb/recovery/crash_recovery.rb +381 -387
  290. data/lib/rubydb/recovery/recovery_manager.rb +204 -206
  291. data/lib/rubydb/recovery/redo.rb +235 -237
  292. data/lib/rubydb/recovery/undo.rb +204 -206
  293. data/lib/rubydb/replication/failover.rb +5 -5
  294. data/lib/rubydb/replication/fencing.rb +63 -63
  295. data/lib/rubydb/replication/primary.rb +461 -450
  296. data/lib/rubydb/replication/replica.rb +382 -384
  297. data/lib/rubydb/replication/replication_log.rb +194 -200
  298. data/lib/rubydb/replication/replication_manager.rb +307 -308
  299. data/lib/rubydb/replication/replication_slot.rb +293 -295
  300. data/lib/rubydb/replication/replication_stream.rb +198 -201
  301. data/lib/rubydb/rubydb.rb +564 -560
  302. data/lib/rubydb/security/access_control.rb +252 -254
  303. data/lib/rubydb/security/audit_log.rb +209 -213
  304. data/lib/rubydb/security/authentication.rb +302 -302
  305. data/lib/rubydb/security/authorization.rb +282 -282
  306. data/lib/rubydb/security/credentials.rb +192 -196
  307. data/lib/rubydb/security/password.rb +205 -215
  308. data/lib/rubydb/security/permissions.rb +74 -74
  309. data/lib/rubydb/security/role.rb +99 -101
  310. data/lib/rubydb/security/user.rb +86 -86
  311. data/lib/rubydb/server/connection.rb +383 -366
  312. data/lib/rubydb/server/connection_pool.rb +193 -193
  313. data/lib/rubydb/server/lifecycle.rb +227 -228
  314. data/lib/rubydb/server/listener.rb +139 -136
  315. data/lib/rubydb/server/request_handler.rb +277 -276
  316. data/lib/rubydb/server/server.rb +363 -364
  317. data/lib/rubydb/server/session.rb +371 -369
  318. data/lib/rubydb/server/worker.rb +206 -210
  319. data/lib/rubydb/server/worker_pool.rb +168 -168
  320. data/lib/rubydb/sql/ast/alter_table.rb +169 -169
  321. data/lib/rubydb/sql/ast/begin_transaction.rb +47 -47
  322. data/lib/rubydb/sql/ast/commit.rb +37 -37
  323. data/lib/rubydb/sql/ast/constraint.rb +92 -83
  324. data/lib/rubydb/sql/ast/create_database.rb +41 -41
  325. data/lib/rubydb/sql/ast/create_index.rb +61 -61
  326. data/lib/rubydb/sql/ast/create_schema.rb +52 -52
  327. data/lib/rubydb/sql/ast/create_table.rb +187 -187
  328. data/lib/rubydb/sql/ast/delete.rb +54 -54
  329. data/lib/rubydb/sql/ast/drop_database.rb +41 -41
  330. data/lib/rubydb/sql/ast/drop_index.rb +41 -41
  331. data/lib/rubydb/sql/ast/drop_schema.rb +49 -49
  332. data/lib/rubydb/sql/ast/drop_table.rb +49 -49
  333. data/lib/rubydb/sql/ast/explain.rb +64 -64
  334. data/lib/rubydb/sql/ast/expression.rb +617 -604
  335. data/lib/rubydb/sql/ast/insert.rb +66 -66
  336. data/lib/rubydb/sql/ast/node.rb +42 -42
  337. data/lib/rubydb/sql/ast/rollback.rb +63 -63
  338. data/lib/rubydb/sql/ast/savepoint.rb +59 -59
  339. data/lib/rubydb/sql/ast/select.rb +88 -88
  340. data/lib/rubydb/sql/ast/set_operation.rb +22 -20
  341. data/lib/rubydb/sql/ast/trigger.rb +35 -29
  342. data/lib/rubydb/sql/ast/update.rb +88 -88
  343. data/lib/rubydb/sql/ast/vacuum.rb +19 -19
  344. data/lib/rubydb/sql/ast/view.rb +38 -32
  345. data/lib/rubydb/sql/ast/with.rb +32 -32
  346. data/lib/rubydb/sql/grammar.rb +86 -86
  347. data/lib/rubydb/sql/keywords.rb +156 -156
  348. data/lib/rubydb/sql/lexer.rb +209 -214
  349. data/lib/rubydb/sql/operators.rb +100 -100
  350. data/lib/rubydb/sql/parser.rb +1167 -1170
  351. data/lib/rubydb/sql/planner/analyzer.rb +283 -302
  352. data/lib/rubydb/sql/planner/binder.rb +537 -550
  353. data/lib/rubydb/sql/planner/type_checker.rb +427 -431
  354. data/lib/rubydb/sql/token.rb +210 -210
  355. data/lib/rubydb/storage/buffer_frame.rb +44 -44
  356. data/lib/rubydb/storage/buffer_pool.rb +155 -155
  357. data/lib/rubydb/storage/database_lock.rb +74 -74
  358. data/lib/rubydb/storage/deserializer.rb +332 -342
  359. data/lib/rubydb/storage/engine.rb +2347 -2330
  360. data/lib/rubydb/storage/file_manager.rb +191 -187
  361. data/lib/rubydb/storage/free_space_map.rb +79 -81
  362. data/lib/rubydb/storage/page.rb +92 -94
  363. data/lib/rubydb/storage/page_allocator.rb +852 -855
  364. data/lib/rubydb/storage/page_header.rb +63 -67
  365. data/lib/rubydb/storage/page_manager.rb +127 -131
  366. data/lib/rubydb/storage/record.rb +58 -58
  367. data/lib/rubydb/storage/row.rb +78 -78
  368. data/lib/rubydb/storage/serializer.rb +51 -51
  369. data/lib/rubydb/storage/storage_layout.rb +151 -151
  370. data/lib/rubydb/storage/storage_manager.rb +114 -114
  371. data/lib/rubydb/storage/tuple.rb +458 -461
  372. data/lib/rubydb/storage/visibility_map.rb +964 -973
  373. data/lib/rubydb/transactions/commit_manager.rb +219 -220
  374. data/lib/rubydb/transactions/isolation.rb +98 -98
  375. data/lib/rubydb/transactions/lock.rb +76 -76
  376. data/lib/rubydb/transactions/lock_manager.rb +359 -362
  377. data/lib/rubydb/transactions/savepoint.rb +142 -143
  378. data/lib/rubydb/transactions/transaction.rb +214 -215
  379. data/lib/rubydb/transactions/transaction_id.rb +84 -84
  380. data/lib/rubydb/transactions/transaction_log.rb +256 -257
  381. data/lib/rubydb/transactions/transaction_manager.rb +434 -435
  382. data/lib/rubydb/types/bigint.rb +36 -36
  383. data/lib/rubydb/types/blob.rb +37 -37
  384. data/lib/rubydb/types/boolean.rb +34 -34
  385. data/lib/rubydb/types/date.rb +39 -39
  386. data/lib/rubydb/types/decimal.rb +48 -48
  387. data/lib/rubydb/types/float.rb +34 -34
  388. data/lib/rubydb/types/integer.rb +36 -36
  389. data/lib/rubydb/types/json.rb +41 -41
  390. data/lib/rubydb/types/null.rb +34 -34
  391. data/lib/rubydb/types/smallint.rb +36 -36
  392. data/lib/rubydb/types/text.rb +37 -37
  393. data/lib/rubydb/types/time.rb +46 -46
  394. data/lib/rubydb/types/timestamp.rb +39 -39
  395. data/lib/rubydb/types/type.rb +119 -119
  396. data/lib/rubydb/types/uuid.rb +47 -47
  397. data/lib/rubydb/types/varchar.rb +37 -37
  398. data/lib/rubydb/version.rb +32 -32
  399. data/lib/rubydb/wal/archive.rb +190 -193
  400. data/lib/rubydb/wal/checkpoint.rb +181 -183
  401. data/lib/rubydb/wal/lsn.rb +94 -94
  402. data/lib/rubydb/wal/reader.rb +259 -260
  403. data/lib/rubydb/wal/record.rb +105 -105
  404. data/lib/rubydb/wal/segment.rb +193 -193
  405. data/lib/rubydb/wal/wal.rb +480 -452
  406. data/lib/rubydb/wal/writer.rb +236 -236
  407. data/lib/rubydb.rb +7 -7
  408. data/packaging/docker/docker-compose.failover.yml +43 -43
  409. data/packaging/homebrew/rubydb.rb +19 -19
  410. data/rubydb.gemspec +60 -57
  411. data/scripts/benchmark +7 -7
  412. data/scripts/durability_drill +37 -37
  413. data/scripts/fuzz +63 -63
  414. data/scripts/release +45 -40
  415. data/scripts/release_check +43 -43
  416. data/scripts/replication_failover_drill +268 -250
  417. data/scripts/replication_network_failover_drill +287 -255
  418. data/scripts/restore_drill +45 -45
  419. data/scripts/security +45 -0
  420. 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.
@@ -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.
@@ -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.