rubydb 0.1.4 → 0.1.6

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