rubydb 0.1.0

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