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
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b474095677d024d7aae488865411803476f0c5040d75fba89b063f0e9679a3d9
4
+ data.tar.gz: 18a4bbf0d5744c8e980a50ee4b6ee6a75133f299a96eabd458ca1bf40554bb78
5
+ SHA512:
6
+ metadata.gz: a719c2d1f1de9e98ac56a45ab3956ce5b216dd1987e510688af3d71cfe131f98463cbab9525ca96ef2cc34a4457d3475b65016f8595a9f4f3c9b5f621a503247
7
+ data.tar.gz: b0f0d139f3da9c4eb8bea8805cbefeff6c11dae8dcf47853b8a157b402e4c10103bbf8b94a84a8ef1d80c7fe07a63e2effa042bff21d6ac3591b7340ff6c1b55
data/.gitattributes ADDED
@@ -0,0 +1,20 @@
1
+ # Auto detect text files and perform LF normalization
2
+ * text=auto
3
+
4
+ # Ruby files
5
+ *.rb text diff=ruby
6
+ *.erb text diff=ruby
7
+ *.rake text diff=ruby
8
+ *.gemspec text diff=ruby
9
+
10
+ # Markdown
11
+ *.md text diff=markdown
12
+
13
+ # YAML
14
+ *.yml text diff=yaml
15
+ *.yaml text diff=yaml
16
+
17
+ # Binary formats
18
+ *.rdb binary
19
+ *.rdb-wal binary
20
+ *.rdb-shm binary
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,15 @@
1
+ ## Summary
2
+
3
+ Describe the change and the user or operator problem it solves.
4
+
5
+ ## Validation
6
+
7
+ - [ ] Tests added or updated for changed behavior
8
+ - [ ] `bundle exec rspec` passes, or failures are explained
9
+ - [ ] Documentation and compatibility claims are updated
10
+ - [ ] Production, security, migration, and rollback impact reviewed
11
+
12
+ ## Operational impact
13
+
14
+ Describe storage-format, WAL, migration, configuration, protocol, replication,
15
+ security, and upgrade implications. Include rollback and observability notes.
File without changes
@@ -0,0 +1,26 @@
1
+ name: Workload smoke benchmark
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main]
6
+ push:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ workload:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - uses: ruby/setup-ruby@v1
18
+ with:
19
+ ruby-version: "3.3"
20
+ bundler-cache: true
21
+ - name: Deterministic storage workload
22
+ run: RUBYDB_BENCHMARK_ITERATIONS=100 bundle exec ruby -Ilib benchmarks/basic_workload.rb
23
+ - name: Concurrent durability workload
24
+ run: RUBYDB_WORKLOAD_THREADS=4 RUBYDB_WORKLOAD_OPERATIONS=100 bundle exec ruby -Ilib benchmarks/concurrent_workload.rb
25
+ - name: Server protocol durability workload
26
+ run: RUBYDB_SERVER_WORKLOAD_CLIENTS=2 RUBYDB_SERVER_WORKLOAD_OPERATIONS=25 bundle exec ruby -Ilib benchmarks/server_workload.rb
@@ -0,0 +1,63 @@
1
+ name: Compatibility
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ ruby:
15
+ name: Ruby ${{ matrix.ruby }} on ${{ matrix.os }}
16
+ runs-on: ${{ matrix.os }}
17
+ strategy:
18
+ fail-fast: false
19
+ matrix:
20
+ os: [ubuntu-latest, macos-latest, windows-latest]
21
+ ruby: ["3.3", "3.4"]
22
+ steps:
23
+ - uses: actions/checkout@v4
24
+ - uses: ruby/setup-ruby@v1
25
+ with:
26
+ ruby-version: ${{ matrix.ruby }}
27
+ bundler-cache: true
28
+ - name: Run regression suite with coverage gate
29
+ env:
30
+ RUBYDB_COVERAGE: "1"
31
+ run: bundle exec rspec
32
+
33
+ - name: Validate SQLite compatibility profile
34
+ run: bundle exec rspec spec/sqlite_compatibility_spec.rb
35
+
36
+ rails:
37
+ name: ActiveRecord ${{ matrix.rails }}
38
+ runs-on: ubuntu-latest
39
+ strategy:
40
+ fail-fast: false
41
+ matrix:
42
+ rails: ["7.1", "7.2", "8.0"]
43
+ steps:
44
+ - uses: actions/checkout@v4
45
+ - uses: ruby/setup-ruby@v1
46
+ with:
47
+ ruby-version: "3.3"
48
+ bundler-cache: true
49
+ - name: Build current RubyDB gem
50
+ run: bundle exec rake build
51
+ - name: Install current RubyDB gem for adapter dependency
52
+ shell: bash
53
+ run: gem install "$(ls -t pkg/rubydb-*.gem | head -n 1)" --local --no-document
54
+ - name: Install adapter dependencies
55
+ working-directory: adapters/activerecord
56
+ env:
57
+ RUBYDB_RAILS_VERSION: ${{ matrix.rails }}
58
+ run: bundle install --jobs 4 --retry 3
59
+ - name: Run adapter integration suite
60
+ working-directory: adapters/activerecord
61
+ env:
62
+ RUBYDB_RAILS_VERSION: ${{ matrix.rails }}
63
+ run: bundle exec rspec
@@ -0,0 +1,33 @@
1
+ name: Fuzz safety
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [main]
6
+ schedule:
7
+ - cron: "17 3 * * 0"
8
+ workflow_dispatch:
9
+ inputs:
10
+ iterations:
11
+ description: "Iterations per fuzzer"
12
+ required: false
13
+ default: "1000"
14
+ type: string
15
+
16
+ permissions:
17
+ contents: read
18
+
19
+ jobs:
20
+ fuzz:
21
+ runs-on: ubuntu-latest
22
+ timeout-minutes: 15
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ - uses: ruby/setup-ruby@v1
26
+ with:
27
+ ruby-version: "3.3"
28
+ bundler-cache: true
29
+ - name: Run bounded fuzzers
30
+ env:
31
+ RUBYDB_FUZZ_ITERATIONS: ${{ inputs.iterations || '100' }}
32
+ RUBYDB_FUZZ_SEED: "20260909"
33
+ run: ruby scripts/fuzz
@@ -0,0 +1,21 @@
1
+ name: Lint
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ rubocop:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - uses: ruby/setup-ruby@v1
18
+ with:
19
+ ruby-version: "3.3"
20
+ bundler-cache: true
21
+ - run: bundle exec rubocop
@@ -0,0 +1,24 @@
1
+ name: Operations drills
2
+
3
+ on:
4
+ schedule:
5
+ - cron: "47 3 * * 1"
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ restore:
13
+ runs-on: ubuntu-latest
14
+ timeout-minutes: 15
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - uses: ruby/setup-ruby@v1
18
+ with:
19
+ ruby-version: "3.3"
20
+ bundler-cache: true
21
+ - name: Run backup and restore drill
22
+ run: ruby scripts/restore_drill
23
+ - name: Run durability fault and recovery drill
24
+ run: ruby scripts/durability_drill
@@ -0,0 +1,111 @@
1
+ name: Production validation
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ schedule:
6
+ - cron: "19 4 * * 3"
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ validate:
13
+ runs-on: ubuntu-latest
14
+ timeout-minutes: 45
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - uses: ruby/setup-ruby@v1
18
+ with:
19
+ ruby-version: "3.3"
20
+ bundler-cache: true
21
+
22
+ - name: Run production safety regression set
23
+ run: |
24
+ bundle exec rspec \
25
+ spec/server_protocol_spec.rb \
26
+ spec/server_concurrency_durability_spec.rb \
27
+ spec/concurrent_soak_harness_spec.rb \
28
+ spec/multiprocess_server_workload_spec.rb \
29
+ spec/filesystem_fault_injection_spec.rb \
30
+ spec/metadata_persistence_safety_spec.rb \
31
+ spec/index_persistence_spec.rb \
32
+ spec/compaction_persistence_spec.rb \
33
+ spec/backup_restore_spec.rb \
34
+ spec/replication_network_spec.rb \
35
+ spec/replication_partition_spec.rb \
36
+ spec/replication_failover_integration_spec.rb \
37
+ spec/fencing_spec.rb \
38
+ spec/corruption_repair_spec.rb
39
+ spec/sqlite_compatibility_spec.rb
40
+
41
+ - name: Run sustained threaded workload
42
+ shell: bash
43
+ run: |
44
+ set -euo pipefail
45
+ mkdir -p production-results
46
+ RUBYDB_SOAK_ROUNDS=3 \
47
+ RUBYDB_SOAK_THREADS=16 \
48
+ RUBYDB_SOAK_OPERATIONS=2000 \
49
+ RUBYDB_SOAK_PAYLOAD_BYTES=512 \
50
+ ruby benchmarks/concurrent_soak.rb | tee production-results/threaded.json
51
+
52
+ - name: Run server and independent-process workloads
53
+ shell: bash
54
+ run: |
55
+ set -euo pipefail
56
+ RUBYDB_SERVER_WORKLOAD_CLIENTS=16 \
57
+ RUBYDB_SERVER_WORKLOAD_OPERATIONS=1000 \
58
+ ruby -Ilib benchmarks/server_workload.rb | tee production-results/server.json
59
+ RUBYDB_SERVER_WORKLOAD_PROCESSES=8 \
60
+ RUBYDB_SERVER_WORKLOAD_OPERATIONS=1000 \
61
+ ruby benchmarks/multiprocess_server_workload.rb | tee production-results/multiprocess.json
62
+
63
+ - name: Run production concurrency and resilience soak
64
+ shell: bash
65
+ run: |
66
+ set -euo pipefail
67
+ RUBYDB_PRODUCTION_SOAK_CLIENTS=16 \
68
+ RUBYDB_PRODUCTION_SOAK_OPERATIONS=2000 \
69
+ RUBYDB_PRODUCTION_SOAK_CANCEL_ROWS=250000 \
70
+ ruby benchmarks/production_soak.rb | tee production-results/production-soak.json
71
+
72
+ - name: Run process-level replication failover drill
73
+ run: ruby scripts/replication_failover_drill | tee production-results/replication-failover.json
74
+
75
+ - name: Run network partition and promotion drill
76
+ run: ruby scripts/replication_network_failover_drill | tee production-results/replication-network-failover.json
77
+
78
+ - name: Run backup and restore drill
79
+ run: ruby scripts/restore_drill | tee production-results/restore.txt
80
+
81
+ - name: Run durability fault and recovery drill
82
+ run: ruby scripts/durability_drill | tee production-results/durability.txt
83
+
84
+ - name: Run bounded fuzzers
85
+ env:
86
+ RUBYDB_FUZZ_ITERATIONS: "250"
87
+ RUBYDB_FUZZ_SEED: "20260909"
88
+ run: ruby scripts/fuzz | tee production-results/fuzz.txt
89
+
90
+ - name: Build and verify release artifact
91
+ run: |
92
+ bundle exec rake build
93
+ ruby scripts/release | tee production-results/release.txt
94
+
95
+ - name: Upload validation evidence
96
+ if: always()
97
+ uses: actions/upload-artifact@v4
98
+ with:
99
+ name: rubydb-production-validation-${{ github.sha }}
100
+ path: production-results/
101
+
102
+ container-topology:
103
+ name: Multi-node container topology
104
+ runs-on: ubuntu-latest
105
+ timeout-minutes: 20
106
+ steps:
107
+ - uses: actions/checkout@v4
108
+ - name: Validate compose topology
109
+ run: docker compose -f packaging/docker/docker-compose.failover.yml config
110
+ - name: Build production image
111
+ run: docker compose -f packaging/docker/docker-compose.failover.yml build primary replica
@@ -0,0 +1,77 @@
1
+ name: Release gem
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ contents: write
9
+ id-token: write
10
+ attestations: write
11
+
12
+ jobs:
13
+ build-and-publish:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ with:
18
+ fetch-depth: 0
19
+ - uses: ruby/setup-ruby@v1
20
+ with:
21
+ ruby-version: "3.3"
22
+ bundler-cache: true
23
+ - name: Require protected release credentials
24
+ env:
25
+ RUBYGEMS_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
26
+ RUBYDB_GEM_SIGNING_KEY_B64: ${{ secrets.RUBYDB_GEM_SIGNING_KEY_B64 }}
27
+ RUBYDB_GEM_CERT_B64: ${{ secrets.RUBYDB_GEM_CERT_B64 }}
28
+ shell: bash
29
+ run: |
30
+ set -euo pipefail
31
+ test -n "$RUBYGEMS_API_KEY" || { echo "RUBYGEMS_API_KEY is required for a release tag" >&2; exit 1; }
32
+ test -n "$RUBYDB_GEM_SIGNING_KEY_B64" || { echo "RUBYDB_GEM_SIGNING_KEY_B64 is required for a release tag" >&2; exit 1; }
33
+ test -n "$RUBYDB_GEM_CERT_B64" || { echo "RUBYDB_GEM_CERT_B64 is required for a release tag" >&2; exit 1; }
34
+
35
+ - name: Configure RubyGems signing
36
+ env:
37
+ RUBYDB_GEM_SIGNING_KEY_B64: ${{ secrets.RUBYDB_GEM_SIGNING_KEY_B64 }}
38
+ RUBYDB_GEM_CERT_B64: ${{ secrets.RUBYDB_GEM_CERT_B64 }}
39
+ shell: bash
40
+ run: |
41
+ key_path="$RUNNER_TEMP/rubydb-gem-private-key.pem"
42
+ cert_path="$RUNNER_TEMP/rubydb-gem-public-cert.pem"
43
+ printf '%s' "$RUBYDB_GEM_SIGNING_KEY_B64" | base64 --decode > "$key_path"
44
+ printf '%s' "$RUBYDB_GEM_CERT_B64" | base64 --decode > "$cert_path"
45
+ chmod 600 "$key_path"
46
+ {
47
+ echo "RUBYDB_GEM_SIGNING_KEY=$key_path"
48
+ echo "RUBYDB_GEM_CERT=$cert_path"
49
+ } >> "$GITHUB_ENV"
50
+ - name: Verify tag matches gem version
51
+ shell: bash
52
+ run: test "${GITHUB_REF_NAME#v}" = "$(ruby -Ilib -rrubydb/version -e 'puts RubyDB::VERSION')"
53
+ - name: Verify changelog release entry
54
+ run: ruby scripts/release_check
55
+ - name: Test and build release artifact
56
+ run: |
57
+ bundle exec rspec
58
+ ruby scripts/release
59
+ - name: Sign release provenance
60
+ uses: actions/attest-build-provenance@v2
61
+ with:
62
+ subject-path: "pkg/*.gem"
63
+ - name: Publish to RubyGems
64
+ env:
65
+ GEM_HOST_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
66
+ RUBYDB_PUBLISH: "1"
67
+ run: ruby scripts/release
68
+ - name: Publish GitHub release notes from changelog history
69
+ env:
70
+ GH_TOKEN: ${{ github.token }}
71
+ run: gh release create "$GITHUB_REF_NAME" --verify-tag --generate-notes --title "$GITHUB_REF_NAME"
72
+ - uses: actions/upload-artifact@v4
73
+ with:
74
+ name: rubydb-gem-${{ github.ref_name }}
75
+ path: |
76
+ pkg/*.gem
77
+ checksums/*.sha512
@@ -0,0 +1,37 @@
1
+ name: Security
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ schedule:
9
+ - cron: "17 3 * * 1"
10
+
11
+ permissions:
12
+ contents: read
13
+ security-events: write
14
+
15
+ jobs:
16
+ dependency-audit:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+ - uses: ruby/setup-ruby@v1
21
+ with:
22
+ ruby-version: "3.3"
23
+ bundler-cache: true
24
+ - name: Audit Ruby dependencies
25
+ run: |
26
+ gem install bundler-audit --no-document
27
+ bundle audit check --update
28
+
29
+ codeql:
30
+ runs-on: ubuntu-latest
31
+ steps:
32
+ - uses: actions/checkout@v4
33
+ - uses: github/codeql-action/init@v3
34
+ with:
35
+ languages: ruby
36
+ build-mode: none
37
+ - uses: github/codeql-action/analyze@v3
@@ -0,0 +1,26 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ rspec:
14
+ runs-on: ubuntu-latest
15
+ strategy:
16
+ fail-fast: false
17
+ matrix:
18
+ ruby: ["3.3", "3.4"]
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+ - uses: ruby/setup-ruby@v1
22
+ with:
23
+ ruby-version: ${{ matrix.ruby }}
24
+ bundler-cache: true
25
+ - run: bundle exec rspec
26
+ - run: ruby benchmarks/concurrent_workload.rb
@@ -0,0 +1,58 @@
1
+ name: Sustained workload validation
2
+
3
+ on:
4
+ schedule:
5
+ - cron: "31 3 * * 6"
6
+ workflow_dispatch:
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ workload:
13
+ runs-on: ubuntu-latest
14
+ timeout-minutes: 30
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - uses: ruby/setup-ruby@v1
18
+ with:
19
+ ruby-version: "3.3"
20
+ bundler-cache: true
21
+ - name: Run sustained threaded durability soak
22
+ shell: bash
23
+ run: |
24
+ set -euo pipefail
25
+ mkdir -p workload-results
26
+ RUBYDB_SOAK_ROUNDS=3 \
27
+ RUBYDB_SOAK_THREADS=16 \
28
+ RUBYDB_SOAK_OPERATIONS=2000 \
29
+ RUBYDB_SOAK_PAYLOAD_BYTES=512 \
30
+ ruby benchmarks/concurrent_soak.rb | tee workload-results/threaded.json
31
+ - name: Run sustained server/client latency workload
32
+ shell: bash
33
+ run: |
34
+ set -euo pipefail
35
+ RUBYDB_SERVER_WORKLOAD_CLIENTS=16 \
36
+ RUBYDB_SERVER_WORKLOAD_OPERATIONS=1000 \
37
+ ruby -Ilib benchmarks/server_workload.rb | tee workload-results/server.json
38
+ - name: Run sustained multi-process client workload
39
+ shell: bash
40
+ run: |
41
+ set -euo pipefail
42
+ RUBYDB_SERVER_WORKLOAD_PROCESSES=8 \
43
+ RUBYDB_SERVER_WORKLOAD_OPERATIONS=1000 \
44
+ ruby benchmarks/multiprocess_server_workload.rb | tee workload-results/multiprocess.json
45
+ - name: Run cancellation, capacity, and deadlock soak
46
+ shell: bash
47
+ run: |
48
+ set -euo pipefail
49
+ RUBYDB_PRODUCTION_SOAK_CLIENTS=8 \
50
+ RUBYDB_PRODUCTION_SOAK_OPERATIONS=500 \
51
+ RUBYDB_PRODUCTION_SOAK_CANCEL_ROWS=250000 \
52
+ ruby benchmarks/production_soak.rb | tee workload-results/production-soak.json
53
+ - name: Upload workload metrics
54
+ if: always()
55
+ uses: actions/upload-artifact@v4
56
+ with:
57
+ name: rubydb-workload-${{ github.sha }}
58
+ path: workload-results/
data/.gitignore ADDED
@@ -0,0 +1,43 @@
1
+ # Ruby
2
+ *.gem
3
+ *.rbc
4
+ /.config
5
+ /coverage/
6
+ /InstalledFiles
7
+ /pkg/
8
+ /checksums/
9
+ /spec/reports/
10
+ /spec/examples.txt
11
+ /test/tmp/
12
+ /test/version_tmp/
13
+ /tmp/
14
+
15
+ # RubyDB specific
16
+ *.rdb
17
+ *.rdb-wal
18
+ *.rdb-shm
19
+ *.rdb.metadata
20
+ *.rdb.mvcc
21
+ *.rdb.visibility
22
+ *.rdb.wal/
23
+ *.rdb.lock
24
+ /data/
25
+ /log/
26
+ *.log
27
+ /examples/server/tmp/
28
+
29
+ # Environment
30
+ /.bundle/
31
+ /vendor/bundle/
32
+ /.env
33
+ /.env.local
34
+
35
+ # IDE
36
+ /.idea/
37
+ /.vscode/
38
+ *.swp
39
+ *.swo
40
+
41
+ # OS
42
+ .DS_Store
43
+ Thumbs.db
data/.rspec ADDED
@@ -0,0 +1,4 @@
1
+ --require spec_helper
2
+ --format documentation
3
+ --color
4
+ --order rand
data/.rubocop.yml ADDED
@@ -0,0 +1,44 @@
1
+ inherit_gem:
2
+ standard: config/base.yml
3
+
4
+ AllCops:
5
+ TargetRubyVersion: 4.0
6
+ NewCops: enable
7
+ Exclude:
8
+ - 'bin/**/*'
9
+ - 'exe/**/*'
10
+ - 'tmp/**/*'
11
+ - 'vendor/**/*'
12
+ - 'test/fixtures/**/*'
13
+ - 'fuzz/**/*'
14
+
15
+ # Ruby 4.0 modern features
16
+ Style/HashSyntax:
17
+ EnforcedShorthandSyntax: either
18
+
19
+ Style/EndlessMethod:
20
+ Enabled: true
21
+ EnforcedStyle: allow_single_line
22
+
23
+ Style/PatternMatching:
24
+ Enabled: true
25
+
26
+ Lint/ShadowingOuterLocalVariable:
27
+ Enabled: false
28
+
29
+ Metrics/ClassLength:
30
+ Max: 200
31
+
32
+ Metrics/MethodLength:
33
+ Max: 25
34
+
35
+ Metrics/BlockLength:
36
+ Max: 50
37
+ Exclude:
38
+ - 'spec/**/*'
39
+ - 'test/**/*'
40
+ - '*.gemspec'
41
+
42
+ Naming/FileName:
43
+ Exclude:
44
+ - 'lib/rubydb.rb'
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 4.0.6
data/.standard.yml ADDED
@@ -0,0 +1,14 @@
1
+ # Standard Ruby configuration
2
+ ruby_version: 4.0
3
+
4
+ ignore:
5
+ - 'tmp/**/*'
6
+ - 'vendor/**/*'
7
+ - 'test/fixtures/**/*'
8
+ - 'fuzz/**/*'
9
+ - 'bin/**/*'
10
+
11
+ # Allow some flexibility in development
12
+ plugins:
13
+ - rubocop-performance
14
+ - rubocop-rspec
data/ARCHITECTURE.md ADDED
@@ -0,0 +1,21 @@
1
+ # RubyDB architecture
2
+
3
+ RubyDB is organized as a durable relational engine with optional server/client
4
+ and Rails integration layers:
5
+
6
+ 1. SQL lexer/parser and AST
7
+ 2. binder, planner, and executor
8
+ 3. catalog, constraints, and indexes
9
+ 4. transactions, MVCC, lock management, and WAL
10
+ 5. page storage, checkpoints, recovery, backup, and compaction
11
+ 6. server protocol, authentication, TLS, limits, and monitoring
12
+ 7. logical replication, fencing, failover, and adapters
13
+
14
+ The architecture is deliberately modular so every durable boundary can be
15
+ tested independently and end to end. Start with the [architecture index](docs/README.md),
16
+ then read [current state](docs/architecture/current-state.md) and the
17
+ [production validation contract](docs/production_validation.md).
18
+
19
+ The embedded engine requires exclusive ownership. Server mode is the boundary
20
+ for multiple application processes. Automatic election is disabled until an
21
+ independent multi-host fencing authority is validated.