rubydb 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) hide show
  1. checksums.yaml +4 -4
  2. data/.github/PULL_REQUEST_TEMPLATE.md +15 -15
  3. data/.github/workflows/benchmark.yml +26 -26
  4. data/.github/workflows/compatibility.yml +63 -63
  5. data/.github/workflows/fuzz.yml +33 -33
  6. data/.github/workflows/lint.yml +21 -21
  7. data/.github/workflows/operations.yml +24 -24
  8. data/.github/workflows/production-validation.yml +111 -111
  9. data/.github/workflows/release.yml +77 -77
  10. data/.github/workflows/security.yml +39 -37
  11. data/.github/workflows/test.yml +26 -26
  12. data/.github/workflows/workload.yml +58 -58
  13. data/.gitignore +12 -5
  14. data/.rubocop.yml +50 -44
  15. data/.standard.yml +9 -14
  16. data/ARCHITECTURE.md +21 -21
  17. data/CHANGELOG.md +43 -27
  18. data/CODE_OF_CONDUCT.md +13 -13
  19. data/CONTRIBUTING.md +29 -29
  20. data/GOVERNANCE.md +16 -16
  21. data/Gemfile +18 -17
  22. data/Gemfile.lock +125 -71
  23. data/README.md +249 -162
  24. data/ROADMAP.md +27 -27
  25. data/Rakefile +71 -71
  26. data/SECURITY.md +54 -54
  27. data/SUPPORT.md +14 -14
  28. data/adapters/activerecord/Gemfile +11 -11
  29. data/adapters/activerecord/lib/active_record/connection_adapters/rubydb_adapter.rb +873 -879
  30. data/adapters/activerecord/rubydb-activerecord.gemspec +20 -20
  31. data/adapters/activerecord/spec/rubydb_adapter_integration_spec.rb +143 -143
  32. data/adapters/ruby/README.md +18 -18
  33. data/adapters/sequel/README.md +11 -11
  34. data/config/monitoring/prometheus-alerts.yml +39 -39
  35. data/config/production.yml +36 -36
  36. data/docs/README.md +75 -71
  37. data/docs/architecture/concurrency.md +14 -14
  38. data/docs/architecture/current-state.md +125 -125
  39. data/docs/architecture/execution-engine.md +25 -25
  40. data/docs/architecture/indexes.md +19 -19
  41. data/docs/architecture/mvcc.md +19 -19
  42. data/docs/architecture/overview.md +13 -13
  43. data/docs/architecture/pages.md +11 -11
  44. data/docs/architecture/production-roadmap.md +82 -82
  45. data/docs/architecture/query-planner.md +20 -20
  46. data/docs/architecture/recovery.md +18 -18
  47. data/docs/architecture/sql-engine.md +12 -12
  48. data/docs/architecture/storage-engine.md +14 -14
  49. data/docs/architecture/transactions.md +10 -10
  50. data/docs/architecture/wal.md +28 -28
  51. data/docs/cli-cheatsheet.md +98 -98
  52. data/docs/cli.md +275 -275
  53. data/docs/contributing/architecture.md +9 -9
  54. data/docs/contributing/benchmarking.md +14 -14
  55. data/docs/contributing/development.md +16 -16
  56. data/docs/contributing/release-process.md +49 -49
  57. data/docs/contributing/testing.md +16 -16
  58. data/docs/debugging.md +229 -229
  59. data/docs/developer/branching.md +10 -10
  60. data/docs/developer/database-diff.md +10 -10
  61. data/docs/developer/local-development.md +17 -17
  62. data/docs/developer/snapshots.md +9 -9
  63. data/docs/developer/temporal-data.md +10 -10
  64. data/docs/developer-guide.md +297 -297
  65. data/docs/getting-started/first-database.md +16 -16
  66. data/docs/getting-started/first-query.md +13 -13
  67. data/docs/getting-started/installation.md +19 -19
  68. data/docs/getting-started/local-to-production.md +300 -300
  69. data/docs/getting-started/quickstart.md +17 -17
  70. data/docs/getting-started/rails.md +16 -16
  71. data/docs/hardening_backlog.md +93 -93
  72. data/docs/lessons-learned.md +112 -112
  73. data/docs/operations/backups.md +33 -33
  74. data/docs/operations/disaster-recovery.md +31 -31
  75. data/docs/operations/failover.md +30 -30
  76. data/docs/operations/monitoring.md +25 -25
  77. data/docs/operations/production-guide.md +295 -295
  78. data/docs/operations/production-runbook.md +45 -45
  79. data/docs/operations/replication.md +33 -33
  80. data/docs/operations/restore.md +6 -6
  81. data/docs/operations/runbook.md +34 -34
  82. data/docs/operations/upgrades.md +14 -14
  83. data/docs/operations/workload-testing.md +17 -17
  84. data/docs/production-readiness.md +118 -118
  85. data/docs/production_validation.md +150 -150
  86. data/docs/rails/active-record.md +11 -11
  87. data/docs/rails/compatibility-guide.md +90 -90
  88. data/docs/rails/database-yml.md +92 -92
  89. data/docs/rails/installation.md +17 -17
  90. data/docs/rails/migrations.md +17 -17
  91. data/docs/rails/production.md +82 -82
  92. data/docs/rails/troubleshooting.md +18 -18
  93. data/docs/release.md +25 -25
  94. data/docs/server/architecture.md +10 -10
  95. data/docs/server/authentication.md +10 -10
  96. data/docs/server/configuration.md +16 -16
  97. data/docs/server/connection-pooling.md +10 -10
  98. data/docs/server/deployment.md +10 -10
  99. data/docs/server/protocol.md +12 -12
  100. data/docs/sql/compatibility-guide.md +82 -82
  101. data/docs/sql/compatibility.md +39 -39
  102. data/docs/sql/data-types.md +10 -10
  103. data/docs/sql/functions.md +9 -9
  104. data/docs/sql/joins.md +9 -9
  105. data/docs/sql/operators.md +9 -9
  106. data/docs/sql/sqlite-compatibility.md +21 -21
  107. data/docs/sql/syntax.md +10 -10
  108. data/docs/sql/transactions.md +10 -10
  109. data/docs/troubleshooting.md +244 -244
  110. data/lessons/01-foundations.md +73 -0
  111. data/lessons/02-local-development.md +121 -0
  112. data/lessons/03-embedded-rubydb.md +99 -0
  113. data/lessons/04-rails-complex-apps.md +138 -0
  114. data/lessons/05-rubydb-production-server.md +237 -0
  115. data/lessons/06-postgresql-massive-apps.md +96 -0
  116. data/lessons/07-hybrid-microservices.md +94 -0
  117. data/lessons/08-migrations-backups-recovery.md +86 -0
  118. data/lessons/09-observability-security-scale.md +87 -0
  119. data/lessons/10-release-readiness.md +125 -0
  120. data/lib/rubydb/backup/archive.rb +332 -334
  121. data/lib/rubydb/backup/backup.rb +400 -401
  122. data/lib/rubydb/backup/incremental.rb +349 -353
  123. data/lib/rubydb/backup/restore.rb +289 -290
  124. data/lib/rubydb/backup/snapshot.rb +265 -267
  125. data/lib/rubydb/backup/verification.rb +276 -279
  126. data/lib/rubydb/branching/branch.rb +181 -181
  127. data/lib/rubydb/branching/branch_manager.rb +307 -311
  128. data/lib/rubydb/branching/branch_metadata.rb +140 -140
  129. data/lib/rubydb/branching/checkout.rb +165 -166
  130. data/lib/rubydb/branching/copy_on_write.rb +272 -272
  131. data/lib/rubydb/branching/diff.rb +137 -138
  132. data/lib/rubydb/branching/merge.rb +282 -285
  133. data/lib/rubydb/build_info.rb +15 -15
  134. data/lib/rubydb/catalog/catalog.rb +391 -391
  135. data/lib/rubydb/catalog/column.rb +112 -112
  136. data/lib/rubydb/catalog/constraint.rb +180 -180
  137. data/lib/rubydb/catalog/database.rb +184 -184
  138. data/lib/rubydb/catalog/index.rb +97 -97
  139. data/lib/rubydb/catalog/schema.rb +103 -103
  140. data/lib/rubydb/catalog/sequence.rb +90 -90
  141. data/lib/rubydb/catalog/system_catalog.rb +698 -698
  142. data/lib/rubydb/catalog/table.rb +178 -178
  143. data/lib/rubydb/catalog/trigger.rb +102 -102
  144. data/lib/rubydb/catalog/view.rb +66 -66
  145. data/lib/rubydb/cli/application.rb +163 -163
  146. data/lib/rubydb/cli/commands/backup.rb +80 -81
  147. data/lib/rubydb/cli/commands/branch.rb +72 -72
  148. data/lib/rubydb/cli/commands/checkout.rb +54 -54
  149. data/lib/rubydb/cli/commands/create.rb +58 -58
  150. data/lib/rubydb/cli/commands/diff.rb +76 -77
  151. data/lib/rubydb/cli/commands/doctor.rb +74 -74
  152. data/lib/rubydb/cli/commands/drop.rb +57 -57
  153. data/lib/rubydb/cli/commands/init.rb +101 -102
  154. data/lib/rubydb/cli/commands/inspect.rb +95 -95
  155. data/lib/rubydb/cli/commands/merge.rb +63 -63
  156. data/lib/rubydb/cli/commands/migrate.rb +62 -62
  157. data/lib/rubydb/cli/commands/restart.rb +42 -39
  158. data/lib/rubydb/cli/commands/restore.rb +121 -121
  159. data/lib/rubydb/cli/commands/shell.rb +365 -365
  160. data/lib/rubydb/cli/commands/snapshot.rb +79 -79
  161. data/lib/rubydb/cli/commands/start.rb +88 -82
  162. data/lib/rubydb/cli/commands/status.rb +96 -92
  163. data/lib/rubydb/cli/commands/stop.rb +47 -47
  164. data/lib/rubydb/cli/commands/vacuum.rb +58 -58
  165. data/lib/rubydb/cli/formatter.rb +221 -221
  166. data/lib/rubydb/cli/output.rb +168 -168
  167. data/lib/rubydb/client/client.rb +302 -304
  168. data/lib/rubydb/client/connection.rb +414 -415
  169. data/lib/rubydb/client/connection_pool.rb +168 -168
  170. data/lib/rubydb/client/connection_url.rb +96 -96
  171. data/lib/rubydb/client/prepared_statement.rb +60 -60
  172. data/lib/rubydb/client/result.rb +123 -123
  173. data/lib/rubydb/client/statement.rb +52 -52
  174. data/lib/rubydb/client/transaction.rb +130 -130
  175. data/lib/rubydb/concurrency/concurrency.rb +19 -19
  176. data/lib/rubydb/concurrency/deadlock_detector.rb +148 -150
  177. data/lib/rubydb/concurrency/latch.rb +101 -101
  178. data/lib/rubydb/concurrency/lock_graph.rb +163 -165
  179. data/lib/rubydb/concurrency/mutex.rb +181 -183
  180. data/lib/rubydb/concurrency/rw_lock.rb +180 -180
  181. data/lib/rubydb/concurrency/scheduler.rb +248 -250
  182. data/lib/rubydb/concurrency/worker_pool.rb +145 -143
  183. data/lib/rubydb/configuration/config.rb +170 -170
  184. data/lib/rubydb/configuration/defaults.rb +179 -179
  185. data/lib/rubydb/configuration/environment.rb +152 -152
  186. data/lib/rubydb/configuration/parser.rb +185 -185
  187. data/lib/rubydb/configuration/validation.rb +221 -221
  188. data/lib/rubydb/constants.rb +74 -74
  189. data/lib/rubydb/constraints/check.rb +181 -181
  190. data/lib/rubydb/constraints/constraint.rb +101 -101
  191. data/lib/rubydb/constraints/foreign_key.rb +130 -130
  192. data/lib/rubydb/constraints/not_null.rb +64 -64
  193. data/lib/rubydb/constraints/primary_key.rb +99 -99
  194. data/lib/rubydb/constraints/unique.rb +106 -108
  195. data/lib/rubydb/constraints/validator.rb +349 -350
  196. data/lib/rubydb/errors/authentication_error.rb +10 -10
  197. data/lib/rubydb/errors/authorization_error.rb +23 -23
  198. data/lib/rubydb/errors/client_error.rb +10 -10
  199. data/lib/rubydb/errors/configuration_error.rb +10 -10
  200. data/lib/rubydb/errors/connection_error.rb +10 -10
  201. data/lib/rubydb/errors/constraint_error.rb +23 -23
  202. data/lib/rubydb/errors/corruption_error.rb +10 -10
  203. data/lib/rubydb/errors/database_error.rb +10 -10
  204. data/lib/rubydb/errors/error.rb +20 -20
  205. data/lib/rubydb/errors/execution_error.rb +10 -10
  206. data/lib/rubydb/errors/parser_error.rb +10 -10
  207. data/lib/rubydb/errors/recovery_error.rb +10 -10
  208. data/lib/rubydb/errors/replication_error.rb +10 -10
  209. data/lib/rubydb/errors/server_error.rb +6 -6
  210. data/lib/rubydb/errors/storage_error.rb +10 -10
  211. data/lib/rubydb/errors/transaction_error.rb +10 -10
  212. data/lib/rubydb/execution/aggregate_executor.rb +134 -138
  213. data/lib/rubydb/execution/delete_executor.rb +110 -112
  214. data/lib/rubydb/execution/distinct_executor.rb +131 -135
  215. data/lib/rubydb/execution/executor.rb +1182 -1188
  216. data/lib/rubydb/execution/expression.rb +191 -193
  217. data/lib/rubydb/execution/index_scan.rb +142 -142
  218. data/lib/rubydb/execution/insert_executor.rb +215 -217
  219. data/lib/rubydb/execution/join_executor.rb +243 -249
  220. data/lib/rubydb/execution/limit_executor.rb +83 -85
  221. data/lib/rubydb/execution/optimizer.rb +227 -215
  222. data/lib/rubydb/execution/plan.rb +355 -353
  223. data/lib/rubydb/execution/planner.rb +542 -536
  224. data/lib/rubydb/execution/predicate.rb +235 -235
  225. data/lib/rubydb/execution/scan.rb +49 -49
  226. data/lib/rubydb/execution/sequential_scan.rb +63 -63
  227. data/lib/rubydb/execution/sort_executor.rb +180 -185
  228. data/lib/rubydb/execution/update_executor.rb +160 -162
  229. data/lib/rubydb/functions/aggregate.rb +70 -70
  230. data/lib/rubydb/functions/date_functions.rb +274 -278
  231. data/lib/rubydb/functions/function.rb +85 -85
  232. data/lib/rubydb/functions/json_functions.rb +231 -215
  233. data/lib/rubydb/functions/numeric_functions.rb +346 -346
  234. data/lib/rubydb/functions/scalar.rb +52 -52
  235. data/lib/rubydb/functions/string_functions.rb +383 -383
  236. data/lib/rubydb/functions/system_functions.rb +258 -246
  237. data/lib/rubydb/history/as_of.rb +238 -238
  238. data/lib/rubydb/history/change.rb +105 -105
  239. data/lib/rubydb/history/history.rb +131 -131
  240. data/lib/rubydb/history/history_manager.rb +228 -229
  241. data/lib/rubydb/history/temporal_query.rb +202 -202
  242. data/lib/rubydb/history/timeline.rb +144 -144
  243. data/lib/rubydb/indexes/btree.rb +186 -186
  244. data/lib/rubydb/indexes/btree_cursor.rb +258 -258
  245. data/lib/rubydb/indexes/btree_node.rb +384 -385
  246. data/lib/rubydb/indexes/hash_index.rb +150 -150
  247. data/lib/rubydb/indexes/index.rb +71 -71
  248. data/lib/rubydb/indexes/index_manager.rb +408 -406
  249. data/lib/rubydb/indexes/index_scan.rb +466 -470
  250. data/lib/rubydb/migrations/migration.rb +253 -254
  251. data/lib/rubydb/migrations/migration_lock.rb +146 -146
  252. data/lib/rubydb/migrations/migration_manager.rb +187 -176
  253. data/lib/rubydb/migrations/migration_version.rb +71 -71
  254. data/lib/rubydb/migrations/schema_diff.rb +211 -211
  255. data/lib/rubydb/migrations/schema_version.rb +64 -64
  256. data/lib/rubydb/monitoring/events.rb +155 -160
  257. data/lib/rubydb/monitoring/health.rb +216 -222
  258. data/lib/rubydb/monitoring/logger.rb +188 -193
  259. data/lib/rubydb/monitoring/metrics.rb +363 -359
  260. data/lib/rubydb/monitoring/performance.rb +176 -176
  261. data/lib/rubydb/monitoring/statistics.rb +168 -170
  262. data/lib/rubydb/mvcc/garbage_collector.rb +199 -199
  263. data/lib/rubydb/mvcc/mvcc.rb +16 -16
  264. data/lib/rubydb/mvcc/snapshot.rb +146 -147
  265. data/lib/rubydb/mvcc/vacuum.rb +180 -180
  266. data/lib/rubydb/mvcc/version.rb +106 -106
  267. data/lib/rubydb/mvcc/version_store.rb +396 -398
  268. data/lib/rubydb/mvcc/visibility.rb +107 -109
  269. data/lib/rubydb/protocol/capabilities.rb +125 -125
  270. data/lib/rubydb/protocol/decoder.rb +142 -145
  271. data/lib/rubydb/protocol/encoder.rb +131 -136
  272. data/lib/rubydb/protocol/handshake.rb +306 -305
  273. data/lib/rubydb/protocol/message.rb +121 -121
  274. data/lib/rubydb/protocol/parameter_binder.rb +101 -0
  275. data/lib/rubydb/protocol/protocol.rb +276 -277
  276. data/lib/rubydb/protocol/version.rb +54 -54
  277. data/lib/rubydb/rails/adapter.rb +245 -239
  278. data/lib/rubydb/rails/connection.rb +312 -314
  279. data/lib/rubydb/rails/database_statements.rb +122 -122
  280. data/lib/rubydb/rails/migration.rb +131 -131
  281. data/lib/rubydb/rails/quoting.rb +109 -109
  282. data/lib/rubydb/rails/result.rb +117 -117
  283. data/lib/rubydb/rails/schema_statements.rb +339 -339
  284. data/lib/rubydb/rails/transaction.rb +105 -105
  285. data/lib/rubydb/rails/type.rb +126 -126
  286. data/lib/rubydb/recovery/checkpoint.rb +261 -257
  287. data/lib/rubydb/recovery/consistency.rb +457 -467
  288. data/lib/rubydb/recovery/corruption_detector.rb +5 -5
  289. data/lib/rubydb/recovery/crash_recovery.rb +381 -387
  290. data/lib/rubydb/recovery/recovery_manager.rb +204 -206
  291. data/lib/rubydb/recovery/redo.rb +235 -237
  292. data/lib/rubydb/recovery/undo.rb +204 -206
  293. data/lib/rubydb/replication/failover.rb +5 -5
  294. data/lib/rubydb/replication/fencing.rb +63 -63
  295. data/lib/rubydb/replication/primary.rb +461 -450
  296. data/lib/rubydb/replication/replica.rb +382 -384
  297. data/lib/rubydb/replication/replication_log.rb +194 -200
  298. data/lib/rubydb/replication/replication_manager.rb +307 -308
  299. data/lib/rubydb/replication/replication_slot.rb +293 -295
  300. data/lib/rubydb/replication/replication_stream.rb +198 -201
  301. data/lib/rubydb/rubydb.rb +564 -560
  302. data/lib/rubydb/security/access_control.rb +252 -254
  303. data/lib/rubydb/security/audit_log.rb +209 -213
  304. data/lib/rubydb/security/authentication.rb +302 -302
  305. data/lib/rubydb/security/authorization.rb +282 -282
  306. data/lib/rubydb/security/credentials.rb +192 -196
  307. data/lib/rubydb/security/password.rb +205 -215
  308. data/lib/rubydb/security/permissions.rb +74 -74
  309. data/lib/rubydb/security/role.rb +99 -101
  310. data/lib/rubydb/security/user.rb +86 -86
  311. data/lib/rubydb/server/connection.rb +383 -366
  312. data/lib/rubydb/server/connection_pool.rb +193 -193
  313. data/lib/rubydb/server/lifecycle.rb +227 -228
  314. data/lib/rubydb/server/listener.rb +139 -136
  315. data/lib/rubydb/server/request_handler.rb +277 -276
  316. data/lib/rubydb/server/server.rb +363 -364
  317. data/lib/rubydb/server/session.rb +371 -369
  318. data/lib/rubydb/server/worker.rb +206 -210
  319. data/lib/rubydb/server/worker_pool.rb +168 -168
  320. data/lib/rubydb/sql/ast/alter_table.rb +169 -169
  321. data/lib/rubydb/sql/ast/begin_transaction.rb +47 -47
  322. data/lib/rubydb/sql/ast/commit.rb +37 -37
  323. data/lib/rubydb/sql/ast/constraint.rb +92 -83
  324. data/lib/rubydb/sql/ast/create_database.rb +41 -41
  325. data/lib/rubydb/sql/ast/create_index.rb +61 -61
  326. data/lib/rubydb/sql/ast/create_schema.rb +52 -52
  327. data/lib/rubydb/sql/ast/create_table.rb +187 -187
  328. data/lib/rubydb/sql/ast/delete.rb +54 -54
  329. data/lib/rubydb/sql/ast/drop_database.rb +41 -41
  330. data/lib/rubydb/sql/ast/drop_index.rb +41 -41
  331. data/lib/rubydb/sql/ast/drop_schema.rb +49 -49
  332. data/lib/rubydb/sql/ast/drop_table.rb +49 -49
  333. data/lib/rubydb/sql/ast/explain.rb +64 -64
  334. data/lib/rubydb/sql/ast/expression.rb +617 -604
  335. data/lib/rubydb/sql/ast/insert.rb +66 -66
  336. data/lib/rubydb/sql/ast/node.rb +42 -42
  337. data/lib/rubydb/sql/ast/rollback.rb +63 -63
  338. data/lib/rubydb/sql/ast/savepoint.rb +59 -59
  339. data/lib/rubydb/sql/ast/select.rb +88 -88
  340. data/lib/rubydb/sql/ast/set_operation.rb +22 -20
  341. data/lib/rubydb/sql/ast/trigger.rb +35 -29
  342. data/lib/rubydb/sql/ast/update.rb +88 -88
  343. data/lib/rubydb/sql/ast/vacuum.rb +19 -19
  344. data/lib/rubydb/sql/ast/view.rb +38 -32
  345. data/lib/rubydb/sql/ast/with.rb +32 -32
  346. data/lib/rubydb/sql/grammar.rb +86 -86
  347. data/lib/rubydb/sql/keywords.rb +156 -156
  348. data/lib/rubydb/sql/lexer.rb +209 -214
  349. data/lib/rubydb/sql/operators.rb +100 -100
  350. data/lib/rubydb/sql/parser.rb +1167 -1170
  351. data/lib/rubydb/sql/planner/analyzer.rb +283 -302
  352. data/lib/rubydb/sql/planner/binder.rb +537 -550
  353. data/lib/rubydb/sql/planner/type_checker.rb +427 -431
  354. data/lib/rubydb/sql/token.rb +210 -210
  355. data/lib/rubydb/storage/buffer_frame.rb +44 -44
  356. data/lib/rubydb/storage/buffer_pool.rb +155 -155
  357. data/lib/rubydb/storage/database_lock.rb +74 -74
  358. data/lib/rubydb/storage/deserializer.rb +332 -342
  359. data/lib/rubydb/storage/engine.rb +2347 -2330
  360. data/lib/rubydb/storage/file_manager.rb +191 -187
  361. data/lib/rubydb/storage/free_space_map.rb +79 -81
  362. data/lib/rubydb/storage/page.rb +92 -94
  363. data/lib/rubydb/storage/page_allocator.rb +852 -855
  364. data/lib/rubydb/storage/page_header.rb +63 -67
  365. data/lib/rubydb/storage/page_manager.rb +127 -131
  366. data/lib/rubydb/storage/record.rb +58 -58
  367. data/lib/rubydb/storage/row.rb +78 -78
  368. data/lib/rubydb/storage/serializer.rb +51 -51
  369. data/lib/rubydb/storage/storage_layout.rb +151 -151
  370. data/lib/rubydb/storage/storage_manager.rb +114 -114
  371. data/lib/rubydb/storage/tuple.rb +458 -461
  372. data/lib/rubydb/storage/visibility_map.rb +964 -973
  373. data/lib/rubydb/transactions/commit_manager.rb +219 -220
  374. data/lib/rubydb/transactions/isolation.rb +98 -98
  375. data/lib/rubydb/transactions/lock.rb +76 -76
  376. data/lib/rubydb/transactions/lock_manager.rb +359 -362
  377. data/lib/rubydb/transactions/savepoint.rb +142 -143
  378. data/lib/rubydb/transactions/transaction.rb +214 -215
  379. data/lib/rubydb/transactions/transaction_id.rb +84 -84
  380. data/lib/rubydb/transactions/transaction_log.rb +256 -257
  381. data/lib/rubydb/transactions/transaction_manager.rb +434 -435
  382. data/lib/rubydb/types/bigint.rb +36 -36
  383. data/lib/rubydb/types/blob.rb +37 -37
  384. data/lib/rubydb/types/boolean.rb +34 -34
  385. data/lib/rubydb/types/date.rb +39 -39
  386. data/lib/rubydb/types/decimal.rb +48 -48
  387. data/lib/rubydb/types/float.rb +34 -34
  388. data/lib/rubydb/types/integer.rb +36 -36
  389. data/lib/rubydb/types/json.rb +41 -41
  390. data/lib/rubydb/types/null.rb +34 -34
  391. data/lib/rubydb/types/smallint.rb +36 -36
  392. data/lib/rubydb/types/text.rb +37 -37
  393. data/lib/rubydb/types/time.rb +46 -46
  394. data/lib/rubydb/types/timestamp.rb +39 -39
  395. data/lib/rubydb/types/type.rb +119 -119
  396. data/lib/rubydb/types/uuid.rb +47 -47
  397. data/lib/rubydb/types/varchar.rb +37 -37
  398. data/lib/rubydb/version.rb +32 -32
  399. data/lib/rubydb/wal/archive.rb +190 -193
  400. data/lib/rubydb/wal/checkpoint.rb +181 -183
  401. data/lib/rubydb/wal/lsn.rb +94 -94
  402. data/lib/rubydb/wal/reader.rb +259 -260
  403. data/lib/rubydb/wal/record.rb +105 -105
  404. data/lib/rubydb/wal/segment.rb +193 -193
  405. data/lib/rubydb/wal/wal.rb +480 -452
  406. data/lib/rubydb/wal/writer.rb +236 -236
  407. data/lib/rubydb.rb +7 -7
  408. data/packaging/docker/docker-compose.failover.yml +43 -43
  409. data/packaging/homebrew/rubydb.rb +19 -19
  410. data/rubydb.gemspec +60 -57
  411. data/scripts/benchmark +7 -7
  412. data/scripts/durability_drill +37 -37
  413. data/scripts/fuzz +63 -63
  414. data/scripts/release +45 -40
  415. data/scripts/release_check +43 -43
  416. data/scripts/replication_failover_drill +268 -250
  417. data/scripts/replication_network_failover_drill +287 -255
  418. data/scripts/restore_drill +45 -45
  419. data/scripts/security +45 -0
  420. metadata +54 -1
data/lib/rubydb/rubydb.rb CHANGED
@@ -1,560 +1,564 @@
1
- # frozen_string_literal: true
2
-
3
- # RubyDB - A developer-first relational database for Ruby and Rails
4
- #
5
- # This is the main entry point for the RubyDB library.
6
- # It provides the core database functionality and loads all required components.
7
-
8
- require_relative "version"
9
- require_relative "constants"
10
- require_relative "build_info"
11
-
12
- require_relative "errors/error"
13
- require_relative "errors/connection_error"
14
- require_relative "errors/database_error"
15
- require_relative "errors/storage_error"
16
- require_relative "errors/execution_error"
17
- require_relative "errors/parser_error"
18
- require_relative "errors/transaction_error"
19
- require_relative "errors/client_error"
20
- require_relative "errors/server_error"
21
-
22
- require_relative "storage/database_lock"
23
- require_relative "storage/engine"
24
- require_relative "storage/storage_manager"
25
- require_relative "storage/file_manager"
26
- require_relative "storage/page"
27
- require_relative "storage/page_header"
28
- require_relative "storage/page_manager"
29
- require_relative "storage/page_allocator"
30
- require_relative "storage/buffer_pool"
31
- require_relative "storage/buffer_frame"
32
- require_relative "storage/record"
33
- require_relative "storage/row"
34
- require_relative "storage/tuple"
35
- require_relative "storage/serializer"
36
- require_relative "storage/deserializer"
37
- require_relative "storage/free_space_map"
38
- require_relative "storage/visibility_map"
39
- require_relative "storage/storage_layout"
40
-
41
- require_relative "sql/lexer"
42
- require_relative "sql/token"
43
- require_relative "sql/parser"
44
- require_relative "sql/keywords"
45
- require_relative "sql/operators"
46
- require_relative "sql/ast/node"
47
- require_relative "sql/ast/expression"
48
- require_relative "sql/ast/select"
49
- require_relative "sql/ast/with"
50
- require_relative "sql/ast/set_operation"
51
- require_relative "sql/ast/insert"
52
- require_relative "sql/ast/update"
53
- require_relative "sql/ast/delete"
54
- require_relative "sql/ast/create_table"
55
- require_relative "sql/ast/constraint"
56
- require_relative "sql/ast/drop_table"
57
- require_relative "sql/ast/create_index"
58
- require_relative "sql/ast/drop_index"
59
- require_relative "sql/ast/alter_table"
60
- require_relative "sql/ast/create_database"
61
- require_relative "sql/ast/drop_database"
62
- require_relative "sql/ast/create_schema"
63
- require_relative "sql/ast/drop_schema"
64
- require_relative "sql/ast/view"
65
- require_relative "sql/ast/trigger"
66
- require_relative "sql/ast/vacuum"
67
- require_relative "sql/ast/begin_transaction"
68
- require_relative "sql/ast/commit"
69
- require_relative "sql/ast/rollback"
70
- require_relative "sql/ast/savepoint"
71
- require_relative "sql/ast/explain"
72
- require_relative "sql/planner/binder"
73
- require_relative "sql/planner/analyzer"
74
- require_relative "sql/planner/type_checker"
75
-
76
- require_relative "execution/executor"
77
- require_relative "execution/plan"
78
- require_relative "execution/planner"
79
- require_relative "execution/optimizer"
80
- require_relative "execution/expression"
81
- require_relative "execution/predicate"
82
- require_relative "execution/scan"
83
- require_relative "execution/sequential_scan"
84
- require_relative "execution/index_scan"
85
- require_relative "execution/insert_executor"
86
- require_relative "execution/update_executor"
87
- require_relative "execution/delete_executor"
88
- require_relative "execution/join_executor"
89
- require_relative "execution/aggregate_executor"
90
- require_relative "execution/sort_executor"
91
- require_relative "execution/limit_executor"
92
- require_relative "execution/distinct_executor"
93
-
94
- require_relative "catalog/catalog"
95
- require_relative "catalog/database"
96
- require_relative "catalog/schema"
97
- require_relative "catalog/table"
98
- require_relative "catalog/column"
99
- require_relative "catalog/index"
100
- require_relative "catalog/constraint"
101
- require_relative "catalog/sequence"
102
- require_relative "catalog/view"
103
- require_relative "catalog/trigger"
104
- require_relative "catalog/system_catalog"
105
-
106
- require_relative "transactions/transaction"
107
- require_relative "transactions/transaction_manager"
108
- require_relative "transactions/transaction_id"
109
- require_relative "transactions/lock_manager"
110
- require_relative "transactions/lock"
111
- require_relative "transactions/isolation"
112
- require_relative "transactions/savepoint"
113
- require_relative "errors/replication_error"
114
- require_relative "transactions/commit_manager"
115
- require_relative "transactions/transaction_log"
116
-
117
- require_relative "indexes/index"
118
- require_relative "indexes/btree"
119
- require_relative "indexes/btree_node"
120
- require_relative "indexes/btree_cursor"
121
- require_relative "indexes/hash_index"
122
- require_relative "indexes/index_scan"
123
- require_relative "indexes/index_manager"
124
-
125
- require_relative "wal/wal"
126
- require_relative "wal/record"
127
- require_relative "wal/writer"
128
- require_relative "wal/reader"
129
- require_relative "wal/segment"
130
- require_relative "wal/checkpoint"
131
- require_relative "wal/lsn"
132
- require_relative "wal/archive"
133
-
134
- require_relative "recovery/crash_recovery"
135
- require_relative "recovery/checkpoint"
136
- require_relative "recovery/redo"
137
- require_relative "recovery/undo"
138
- require_relative "recovery/consistency"
139
- require_relative "recovery/corruption_detector"
140
- require_relative "recovery/recovery_manager"
141
-
142
- require_relative "mvcc/version"
143
- require_relative "mvcc/visibility"
144
- require_relative "mvcc/snapshot"
145
- require_relative "mvcc/version_store"
146
- require_relative "mvcc/vacuum"
147
- require_relative "mvcc/garbage_collector"
148
-
149
- require_relative "concurrency/scheduler"
150
- require_relative "concurrency/latch"
151
- require_relative "concurrency/mutex"
152
- require_relative "concurrency/rw_lock"
153
- require_relative "concurrency/deadlock_detector"
154
- require_relative "concurrency/lock_graph"
155
- require_relative "concurrency/worker_pool"
156
-
157
- require_relative "constraints/constraint"
158
- require_relative "constraints/primary_key"
159
- require_relative "constraints/foreign_key"
160
- require_relative "constraints/unique"
161
- require_relative "constraints/not_null"
162
- require_relative "constraints/check"
163
- require_relative "constraints/validator"
164
-
165
- require_relative "functions/function"
166
- require_relative "functions/scalar"
167
- require_relative "functions/aggregate"
168
- require_relative "functions/string_functions"
169
- require_relative "functions/numeric_functions"
170
- require_relative "functions/date_functions"
171
- require_relative "functions/json_functions"
172
- require_relative "functions/system_functions"
173
-
174
- require_relative "types/type"
175
- require_relative "types/integer"
176
- require_relative "types/bigint"
177
- require_relative "types/smallint"
178
- require_relative "types/float"
179
- require_relative "types/decimal"
180
- require_relative "types/boolean"
181
- require_relative "types/text"
182
- require_relative "types/varchar"
183
- require_relative "types/blob"
184
- require_relative "types/date"
185
- require_relative "types/time"
186
- require_relative "types/timestamp"
187
- require_relative "types/json"
188
- require_relative "types/uuid"
189
- require_relative "types/null"
190
-
191
- require_relative "security/authentication"
192
- require_relative "security/authorization"
193
- require_relative "security/password"
194
- require_relative "security/credentials"
195
- require_relative "security/user"
196
- require_relative "security/role"
197
- require_relative "security/permissions"
198
- require_relative "security/access_control"
199
- require_relative "security/audit_log"
200
-
201
- require_relative "server/server"
202
- require_relative "server/listener"
203
- require_relative "server/connection"
204
- require_relative "server/session"
205
- require_relative "server/connection_pool"
206
- require_relative "server/worker"
207
- require_relative "server/request_handler"
208
- require_relative "server/lifecycle"
209
-
210
- require_relative "client/connection_url"
211
- require_relative "client/client"
212
- require_relative "client/connection"
213
- require_relative "client/result"
214
- require_relative "client/statement"
215
- require_relative "client/prepared_statement"
216
- require_relative "client/transaction"
217
- require_relative "client/connection_pool"
218
-
219
- require_relative "replication/primary"
220
- require_relative "replication/replica"
221
- require_relative "replication/replication_log"
222
- require_relative "replication/replication_stream"
223
- require_relative "replication/replication_manager"
224
- require_relative "replication/replication_slot"
225
- require_relative "replication/failover"
226
-
227
- require_relative "backup/backup"
228
- require_relative "backup/restore"
229
- require_relative "backup/snapshot"
230
- require_relative "backup/archive"
231
- require_relative "backup/incremental"
232
- require_relative "backup/verification"
233
-
234
- require_relative "branching/branch"
235
- require_relative "branching/branch_manager"
236
- require_relative "branching/copy_on_write"
237
- require_relative "branching/checkout"
238
- require_relative "branching/merge"
239
- require_relative "branching/diff"
240
- require_relative "branching/branch_metadata"
241
-
242
- require_relative "history/history"
243
- require_relative "history/change"
244
- require_relative "history/timeline"
245
- require_relative "history/temporal_query"
246
- require_relative "history/as_of"
247
- require_relative "history/history_manager"
248
-
249
- require_relative "migrations/migration"
250
- require_relative "migrations/migration_manager"
251
- require_relative "migrations/migration_version"
252
- require_relative "migrations/schema_diff"
253
- require_relative "migrations/schema_version"
254
- require_relative "migrations/migration_lock"
255
-
256
- require_relative "rails/adapter"
257
- require_relative "rails/connection"
258
- require_relative "rails/database_statements"
259
- require_relative "rails/schema_statements"
260
- require_relative "rails/quoting"
261
- require_relative "rails/type"
262
- require_relative "rails/migration"
263
- require_relative "rails/transaction"
264
- require_relative "rails/result"
265
-
266
- require_relative "configuration/config"
267
- require_relative "configuration/environment"
268
- require_relative "configuration/defaults"
269
- require_relative "configuration/parser"
270
- require_relative "configuration/validation"
271
-
272
- require_relative "monitoring/metrics"
273
- require_relative "monitoring/statistics"
274
- require_relative "monitoring/logger"
275
- require_relative "monitoring/health"
276
- require_relative "monitoring/performance"
277
- require_relative "monitoring/events"
278
-
279
- require_relative "cli/application"
280
- require_relative "cli/formatter"
281
- require_relative "cli/output"
282
- require_relative "cli/commands/init"
283
- require_relative "cli/commands/create"
284
- require_relative "cli/commands/drop"
285
- require_relative "cli/commands/start"
286
- require_relative "cli/commands/stop"
287
- require_relative "cli/commands/restart"
288
- require_relative "cli/commands/status"
289
- require_relative "cli/commands/shell"
290
- require_relative "cli/commands/migrate"
291
- require_relative "cli/commands/backup"
292
- require_relative "cli/commands/restore"
293
- require_relative "cli/commands/snapshot"
294
- require_relative "cli/commands/branch"
295
- require_relative "cli/commands/checkout"
296
- require_relative "cli/commands/merge"
297
- require_relative "cli/commands/diff"
298
- require_relative "cli/commands/inspect"
299
- require_relative "cli/commands/vacuum"
300
- require_relative "cli/commands/doctor"
301
-
302
- module RubyDB
303
- # Main database class
304
- class Database
305
- attr_reader :path, :config, :engine, :connection
306
-
307
- def initialize(path, config = {})
308
- @path = path
309
- @config = config
310
- @engine = nil
311
- @connection = nil
312
- @is_open = false
313
- @lock = Mutex.new
314
- end
315
-
316
- def connect
317
- @lock.synchronize do
318
- return self if @is_open
319
-
320
- # Initialize storage engine
321
- @engine = Storage::Engine.new(@path, @config)
322
-
323
- # Initialize client connection
324
- @connection = Client::Client.new(
325
- database: @path,
326
- host: @config[:host] || "localhost",
327
- port: @config[:port] || 7432,
328
- username: @config[:username] || "rubydb",
329
- password: @config[:password] || "",
330
- timeout: @config[:timeout] || 30,
331
- pool_size: @config[:pool_size] || 1,
332
- auto_connect: @config.fetch(:auto_connect, true)
333
- )
334
- @connection.connect if @config[:auto_connect] != false
335
-
336
- @is_open = true
337
- self
338
- end
339
- rescue => e
340
- raise ConnectionError, "Failed to connect to database: #{e.message}"
341
- end
342
-
343
- def execute(sql)
344
- ensure_connected
345
-
346
- # Parse SQL
347
- lexer = SQL::Lexer.new(sql)
348
- tokens = lexer.tokenize
349
- parser = SQL::Parser.new(tokens)
350
- statements = parser.parse
351
-
352
- results = []
353
- statements.each do |stmt|
354
- # Plan and execute
355
- planner = Execution::Planner.new(@engine)
356
- plan = planner.plan(stmt)
357
- executor = Execution::Executor.new(@engine)
358
- result = executor.execute(plan)
359
- results << result
360
- end
361
-
362
- results.size == 1 ? results.first : results
363
- rescue => e
364
- raise ExecutionError, "Failed to execute SQL: #{e.message}"
365
- end
366
-
367
- def query(sql)
368
- result = execute(sql)
369
- if result.is_a?(Hash) && result[:rows]
370
- result[:rows]
371
- elsif result.is_a?(Array)
372
- result.map { |r| r.is_a?(Hash) && r[:rows] ? r[:rows] : r }.flatten
373
- else
374
- []
375
- end
376
- end
377
-
378
- def close
379
- @lock.synchronize do
380
- return true unless @is_open
381
-
382
- @connection&.disconnect if @connection
383
- @engine&.close if @engine
384
-
385
- @is_open = false
386
- @engine = nil
387
- @connection = nil
388
- true
389
- end
390
- end
391
-
392
- def transaction(&block)
393
- ensure_connected
394
-
395
- begin
396
- # Begin transaction
397
- tx_id = @engine.begin_transaction
398
-
399
- # Execute block
400
- result = block.call if block_given?
401
-
402
- # Commit transaction
403
- @engine.commit_transaction(tx_id)
404
-
405
- result
406
- rescue => e
407
- # Rollback on error
408
- @engine.rollback_transaction(tx_id) if tx_id
409
- raise TransactionError, "Transaction failed: #{e.message}"
410
- end
411
- end
412
-
413
- def open?
414
- @is_open
415
- end
416
-
417
- def stats
418
- ensure_connected
419
- @engine.stats
420
- end
421
-
422
- def tables
423
- ensure_connected
424
- @engine.list_tables
425
- end
426
-
427
- def create_table(name, &block)
428
- ensure_connected
429
- @engine.create_table(name, &block)
430
- end
431
-
432
- def drop_table(name)
433
- ensure_connected
434
- @engine.drop_table(name)
435
- end
436
-
437
- def insert(table, data)
438
- ensure_connected
439
- columns = data.keys
440
- values = data.values
441
- @engine.insert_row(table, columns, values)
442
- end
443
-
444
- def select(table, conditions = {})
445
- ensure_connected
446
- columns = @engine.table_columns(table)
447
- @engine.select_rows(table, columns, conditions)
448
- end
449
-
450
- def update(table, id, data)
451
- ensure_connected
452
- @engine.update_row(table, id, data)
453
- end
454
-
455
- def delete(table, id)
456
- ensure_connected
457
- @engine.delete_row(table, id)
458
- end
459
-
460
- private
461
-
462
- def ensure_connected
463
- connect unless @is_open
464
- raise DatabaseError, "Database is not open" unless @is_open
465
- end
466
- end
467
-
468
- # Connect to a database
469
- def self.connect(url)
470
- # Parse URL: rubydb://local/./path/to/database.rdb
471
- # rubydb://user:pass@host:7432/database
472
- if url.start_with?("rubydb://local/")
473
- path = url.sub("rubydb://local/", "")
474
- Database.new(path).connect
475
- elsif url.start_with?("rubydb://")
476
- # Server mode
477
- uri = URI.parse(url)
478
- config = {
479
- host: uri.host,
480
- port: uri.port || 7432,
481
- username: uri.user,
482
- password: uri.password,
483
- database: uri.path.sub("/", "")
484
- }
485
- db = Database.new(config[:database], config)
486
- db.connect
487
- db
488
- else
489
- # Treat as local path
490
- Database.new(url).connect
491
- end
492
- rescue => e
493
- raise ConnectionError, "Failed to connect: #{e.message}"
494
- end
495
-
496
- # Open a database file
497
- def self.open(path, config = {})
498
- db = Database.new(path, config)
499
- db.connect
500
- db
501
- end
502
-
503
- # Create a new database
504
- def self.create(path, config = {})
505
- # Ensure directory exists
506
- dir = File.dirname(path)
507
- FileUtils.mkdir_p(dir) unless Dir.exist?(dir)
508
-
509
- # Create and initialize database
510
- db = Database.new(path, config)
511
- db.connect
512
-
513
- # Create default schema
514
- db.execute("CREATE TABLE IF NOT EXISTS schema_migrations (version TEXT PRIMARY KEY, applied_at TIMESTAMP)")
515
- db.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE, email TEXT UNIQUE, created_at TIMESTAMP, updated_at TIMESTAMP)")
516
-
517
- db
518
- rescue => e
519
- raise DatabaseError, "Failed to create database: #{e.message}"
520
- end
521
-
522
- # Version information
523
- def self.version
524
- VERSION
525
- end
526
-
527
- # Database information
528
- def self.info
529
- {
530
- name: "RubyDB",
531
- version: VERSION,
532
- description: "A developer-first relational database for Ruby and Rails",
533
- homepage: "https://github.com/rubydb/rubydb",
534
- license: "MIT"
535
- }
536
- end
537
-
538
- # Load a configuration file
539
- def self.load_config(path)
540
- Configuration::Config.load(path)
541
- end
542
-
543
- # Run migrations
544
- def self.migrate(database, options = {})
545
- manager = Migrations::MigrationManager.new(database, options)
546
- manager.migrate
547
- end
548
-
549
- # Create a backup
550
- def self.backup(database, options = {})
551
- backup = Backup::Backup.new(database, options)
552
- backup.create_backup
553
- end
554
-
555
- # Restore from backup
556
- def self.restore(backup_path, options = {})
557
- restore = Backup::Restore.new(nil, options)
558
- restore.restore(backup_path)
559
- end
560
- end
1
+ # frozen_string_literal: true
2
+
3
+ # RubyDB - A developer-first relational database for Ruby and Rails
4
+ #
5
+ # This is the main entry point for the RubyDB library.
6
+ # It provides the core database functionality and loads all required components.
7
+
8
+ # Ruby 3.3 does not ship Set as a built-in; keep the entrypoint standalone.
9
+ # rubocop:disable Lint/RedundantRequireStatement
10
+ require "set"
11
+ # rubocop:enable Lint/RedundantRequireStatement
12
+ require_relative "version"
13
+ require_relative "constants"
14
+ require_relative "build_info"
15
+
16
+ require_relative "errors/error"
17
+ require_relative "errors/connection_error"
18
+ require_relative "errors/database_error"
19
+ require_relative "errors/storage_error"
20
+ require_relative "errors/execution_error"
21
+ require_relative "errors/parser_error"
22
+ require_relative "errors/transaction_error"
23
+ require_relative "errors/client_error"
24
+ require_relative "errors/server_error"
25
+
26
+ require_relative "storage/database_lock"
27
+ require_relative "storage/engine"
28
+ require_relative "storage/storage_manager"
29
+ require_relative "storage/file_manager"
30
+ require_relative "storage/page"
31
+ require_relative "storage/page_header"
32
+ require_relative "storage/page_manager"
33
+ require_relative "storage/page_allocator"
34
+ require_relative "storage/buffer_pool"
35
+ require_relative "storage/buffer_frame"
36
+ require_relative "storage/record"
37
+ require_relative "storage/row"
38
+ require_relative "storage/tuple"
39
+ require_relative "storage/serializer"
40
+ require_relative "storage/deserializer"
41
+ require_relative "storage/free_space_map"
42
+ require_relative "storage/visibility_map"
43
+ require_relative "storage/storage_layout"
44
+
45
+ require_relative "sql/lexer"
46
+ require_relative "sql/token"
47
+ require_relative "sql/parser"
48
+ require_relative "sql/keywords"
49
+ require_relative "sql/operators"
50
+ require_relative "sql/ast/node"
51
+ require_relative "sql/ast/expression"
52
+ require_relative "sql/ast/select"
53
+ require_relative "sql/ast/with"
54
+ require_relative "sql/ast/set_operation"
55
+ require_relative "sql/ast/insert"
56
+ require_relative "sql/ast/update"
57
+ require_relative "sql/ast/delete"
58
+ require_relative "sql/ast/create_table"
59
+ require_relative "sql/ast/constraint"
60
+ require_relative "sql/ast/drop_table"
61
+ require_relative "sql/ast/create_index"
62
+ require_relative "sql/ast/drop_index"
63
+ require_relative "sql/ast/alter_table"
64
+ require_relative "sql/ast/create_database"
65
+ require_relative "sql/ast/drop_database"
66
+ require_relative "sql/ast/create_schema"
67
+ require_relative "sql/ast/drop_schema"
68
+ require_relative "sql/ast/view"
69
+ require_relative "sql/ast/trigger"
70
+ require_relative "sql/ast/vacuum"
71
+ require_relative "sql/ast/begin_transaction"
72
+ require_relative "sql/ast/commit"
73
+ require_relative "sql/ast/rollback"
74
+ require_relative "sql/ast/savepoint"
75
+ require_relative "sql/ast/explain"
76
+ require_relative "sql/planner/binder"
77
+ require_relative "sql/planner/analyzer"
78
+ require_relative "sql/planner/type_checker"
79
+
80
+ require_relative "execution/executor"
81
+ require_relative "execution/plan"
82
+ require_relative "execution/planner"
83
+ require_relative "execution/optimizer"
84
+ require_relative "execution/expression"
85
+ require_relative "execution/predicate"
86
+ require_relative "execution/scan"
87
+ require_relative "execution/sequential_scan"
88
+ require_relative "execution/index_scan"
89
+ require_relative "execution/insert_executor"
90
+ require_relative "execution/update_executor"
91
+ require_relative "execution/delete_executor"
92
+ require_relative "execution/join_executor"
93
+ require_relative "execution/aggregate_executor"
94
+ require_relative "execution/sort_executor"
95
+ require_relative "execution/limit_executor"
96
+ require_relative "execution/distinct_executor"
97
+
98
+ require_relative "catalog/catalog"
99
+ require_relative "catalog/database"
100
+ require_relative "catalog/schema"
101
+ require_relative "catalog/table"
102
+ require_relative "catalog/column"
103
+ require_relative "catalog/index"
104
+ require_relative "catalog/constraint"
105
+ require_relative "catalog/sequence"
106
+ require_relative "catalog/view"
107
+ require_relative "catalog/trigger"
108
+ require_relative "catalog/system_catalog"
109
+
110
+ require_relative "transactions/transaction"
111
+ require_relative "transactions/transaction_manager"
112
+ require_relative "transactions/transaction_id"
113
+ require_relative "transactions/lock_manager"
114
+ require_relative "transactions/lock"
115
+ require_relative "transactions/isolation"
116
+ require_relative "transactions/savepoint"
117
+ require_relative "errors/replication_error"
118
+ require_relative "transactions/commit_manager"
119
+ require_relative "transactions/transaction_log"
120
+
121
+ require_relative "indexes/index"
122
+ require_relative "indexes/btree"
123
+ require_relative "indexes/btree_node"
124
+ require_relative "indexes/btree_cursor"
125
+ require_relative "indexes/hash_index"
126
+ require_relative "indexes/index_scan"
127
+ require_relative "indexes/index_manager"
128
+
129
+ require_relative "wal/wal"
130
+ require_relative "wal/record"
131
+ require_relative "wal/writer"
132
+ require_relative "wal/reader"
133
+ require_relative "wal/segment"
134
+ require_relative "wal/checkpoint"
135
+ require_relative "wal/lsn"
136
+ require_relative "wal/archive"
137
+
138
+ require_relative "recovery/crash_recovery"
139
+ require_relative "recovery/checkpoint"
140
+ require_relative "recovery/redo"
141
+ require_relative "recovery/undo"
142
+ require_relative "recovery/consistency"
143
+ require_relative "recovery/corruption_detector"
144
+ require_relative "recovery/recovery_manager"
145
+
146
+ require_relative "mvcc/version"
147
+ require_relative "mvcc/visibility"
148
+ require_relative "mvcc/snapshot"
149
+ require_relative "mvcc/version_store"
150
+ require_relative "mvcc/vacuum"
151
+ require_relative "mvcc/garbage_collector"
152
+
153
+ require_relative "concurrency/scheduler"
154
+ require_relative "concurrency/latch"
155
+ require_relative "concurrency/mutex"
156
+ require_relative "concurrency/rw_lock"
157
+ require_relative "concurrency/deadlock_detector"
158
+ require_relative "concurrency/lock_graph"
159
+ require_relative "concurrency/worker_pool"
160
+
161
+ require_relative "constraints/constraint"
162
+ require_relative "constraints/primary_key"
163
+ require_relative "constraints/foreign_key"
164
+ require_relative "constraints/unique"
165
+ require_relative "constraints/not_null"
166
+ require_relative "constraints/check"
167
+ require_relative "constraints/validator"
168
+
169
+ require_relative "functions/function"
170
+ require_relative "functions/scalar"
171
+ require_relative "functions/aggregate"
172
+ require_relative "functions/string_functions"
173
+ require_relative "functions/numeric_functions"
174
+ require_relative "functions/date_functions"
175
+ require_relative "functions/json_functions"
176
+ require_relative "functions/system_functions"
177
+
178
+ require_relative "types/type"
179
+ require_relative "types/integer"
180
+ require_relative "types/bigint"
181
+ require_relative "types/smallint"
182
+ require_relative "types/float"
183
+ require_relative "types/decimal"
184
+ require_relative "types/boolean"
185
+ require_relative "types/text"
186
+ require_relative "types/varchar"
187
+ require_relative "types/blob"
188
+ require_relative "types/date"
189
+ require_relative "types/time"
190
+ require_relative "types/timestamp"
191
+ require_relative "types/json"
192
+ require_relative "types/uuid"
193
+ require_relative "types/null"
194
+
195
+ require_relative "security/authentication"
196
+ require_relative "security/authorization"
197
+ require_relative "security/password"
198
+ require_relative "security/credentials"
199
+ require_relative "security/user"
200
+ require_relative "security/role"
201
+ require_relative "security/permissions"
202
+ require_relative "security/access_control"
203
+ require_relative "security/audit_log"
204
+
205
+ require_relative "server/server"
206
+ require_relative "server/listener"
207
+ require_relative "server/connection"
208
+ require_relative "server/session"
209
+ require_relative "server/connection_pool"
210
+ require_relative "server/worker"
211
+ require_relative "server/request_handler"
212
+ require_relative "server/lifecycle"
213
+
214
+ require_relative "client/connection_url"
215
+ require_relative "client/client"
216
+ require_relative "client/connection"
217
+ require_relative "client/result"
218
+ require_relative "client/statement"
219
+ require_relative "client/prepared_statement"
220
+ require_relative "client/transaction"
221
+ require_relative "client/connection_pool"
222
+
223
+ require_relative "replication/primary"
224
+ require_relative "replication/replica"
225
+ require_relative "replication/replication_log"
226
+ require_relative "replication/replication_stream"
227
+ require_relative "replication/replication_manager"
228
+ require_relative "replication/replication_slot"
229
+ require_relative "replication/failover"
230
+
231
+ require_relative "backup/backup"
232
+ require_relative "backup/restore"
233
+ require_relative "backup/snapshot"
234
+ require_relative "backup/archive"
235
+ require_relative "backup/incremental"
236
+ require_relative "backup/verification"
237
+
238
+ require_relative "branching/branch"
239
+ require_relative "branching/branch_manager"
240
+ require_relative "branching/copy_on_write"
241
+ require_relative "branching/checkout"
242
+ require_relative "branching/merge"
243
+ require_relative "branching/diff"
244
+ require_relative "branching/branch_metadata"
245
+
246
+ require_relative "history/history"
247
+ require_relative "history/change"
248
+ require_relative "history/timeline"
249
+ require_relative "history/temporal_query"
250
+ require_relative "history/as_of"
251
+ require_relative "history/history_manager"
252
+
253
+ require_relative "migrations/migration"
254
+ require_relative "migrations/migration_manager"
255
+ require_relative "migrations/migration_version"
256
+ require_relative "migrations/schema_diff"
257
+ require_relative "migrations/schema_version"
258
+ require_relative "migrations/migration_lock"
259
+
260
+ require_relative "rails/adapter"
261
+ require_relative "rails/connection"
262
+ require_relative "rails/database_statements"
263
+ require_relative "rails/schema_statements"
264
+ require_relative "rails/quoting"
265
+ require_relative "rails/type"
266
+ require_relative "rails/migration"
267
+ require_relative "rails/transaction"
268
+ require_relative "rails/result"
269
+
270
+ require_relative "configuration/config"
271
+ require_relative "configuration/environment"
272
+ require_relative "configuration/defaults"
273
+ require_relative "configuration/parser"
274
+ require_relative "configuration/validation"
275
+
276
+ require_relative "monitoring/metrics"
277
+ require_relative "monitoring/statistics"
278
+ require_relative "monitoring/logger"
279
+ require_relative "monitoring/health"
280
+ require_relative "monitoring/performance"
281
+ require_relative "monitoring/events"
282
+
283
+ require_relative "cli/application"
284
+ require_relative "cli/formatter"
285
+ require_relative "cli/output"
286
+ require_relative "cli/commands/init"
287
+ require_relative "cli/commands/create"
288
+ require_relative "cli/commands/drop"
289
+ require_relative "cli/commands/start"
290
+ require_relative "cli/commands/stop"
291
+ require_relative "cli/commands/restart"
292
+ require_relative "cli/commands/status"
293
+ require_relative "cli/commands/shell"
294
+ require_relative "cli/commands/migrate"
295
+ require_relative "cli/commands/backup"
296
+ require_relative "cli/commands/restore"
297
+ require_relative "cli/commands/snapshot"
298
+ require_relative "cli/commands/branch"
299
+ require_relative "cli/commands/checkout"
300
+ require_relative "cli/commands/merge"
301
+ require_relative "cli/commands/diff"
302
+ require_relative "cli/commands/inspect"
303
+ require_relative "cli/commands/vacuum"
304
+ require_relative "cli/commands/doctor"
305
+
306
+ module RubyDB
307
+ # Main database class
308
+ class Database
309
+ attr_reader :path, :config, :engine, :connection
310
+
311
+ def initialize(path, config = {})
312
+ @path = path
313
+ @config = config
314
+ @engine = nil
315
+ @connection = nil
316
+ @is_open = false
317
+ @lock = Mutex.new
318
+ end
319
+
320
+ def connect
321
+ @lock.synchronize do
322
+ return self if @is_open
323
+
324
+ # Initialize storage engine
325
+ @engine = Storage::Engine.new(@path, @config)
326
+
327
+ # Initialize client connection
328
+ @connection = Client::Client.new(
329
+ database: @path,
330
+ host: @config[:host] || "localhost",
331
+ port: @config[:port] || 7432,
332
+ username: @config[:username] || "rubydb",
333
+ password: @config[:password] || "",
334
+ timeout: @config[:timeout] || 30,
335
+ pool_size: @config[:pool_size] || 1,
336
+ auto_connect: @config.fetch(:auto_connect, true)
337
+ )
338
+ @connection.connect if @config[:auto_connect] != false
339
+
340
+ @is_open = true
341
+ self
342
+ end
343
+ rescue => e
344
+ raise ConnectionError, "Failed to connect to database: #{e.message}"
345
+ end
346
+
347
+ def execute(sql)
348
+ ensure_connected
349
+
350
+ # Parse SQL
351
+ lexer = SQL::Lexer.new(sql)
352
+ tokens = lexer.tokenize
353
+ parser = SQL::Parser.new(tokens)
354
+ statements = parser.parse
355
+
356
+ results = []
357
+ statements.each do |stmt|
358
+ # Plan and execute
359
+ planner = Execution::Planner.new(@engine)
360
+ plan = planner.plan(stmt)
361
+ executor = Execution::Executor.new(@engine)
362
+ result = executor.execute(plan)
363
+ results << result
364
+ end
365
+
366
+ (results.size == 1) ? results.first : results
367
+ rescue => e
368
+ raise ExecutionError, "Failed to execute SQL: #{e.message}"
369
+ end
370
+
371
+ def query(sql)
372
+ result = execute(sql)
373
+ if result.is_a?(Hash) && result[:rows]
374
+ result[:rows]
375
+ elsif result.is_a?(Array)
376
+ result.map { |r| (r.is_a?(Hash) && r[:rows]) ? r[:rows] : r }.flatten
377
+ else
378
+ []
379
+ end
380
+ end
381
+
382
+ def close
383
+ @lock.synchronize do
384
+ return true unless @is_open
385
+
386
+ @connection&.disconnect
387
+ @engine&.close
388
+
389
+ @is_open = false
390
+ @engine = nil
391
+ @connection = nil
392
+ true
393
+ end
394
+ end
395
+
396
+ def transaction(&block)
397
+ ensure_connected
398
+
399
+ begin
400
+ # Begin transaction
401
+ tx_id = @engine.begin_transaction
402
+
403
+ # Execute block
404
+ result = block.call if block_given?
405
+
406
+ # Commit transaction
407
+ @engine.commit_transaction(tx_id)
408
+
409
+ result
410
+ rescue => e
411
+ # Rollback on error
412
+ @engine.rollback_transaction(tx_id) if tx_id
413
+ raise TransactionError, "Transaction failed: #{e.message}"
414
+ end
415
+ end
416
+
417
+ def open?
418
+ @is_open
419
+ end
420
+
421
+ def stats
422
+ ensure_connected
423
+ @engine.stats
424
+ end
425
+
426
+ def tables
427
+ ensure_connected
428
+ @engine.list_tables
429
+ end
430
+
431
+ def create_table(name, &)
432
+ ensure_connected
433
+ @engine.create_table(name, &)
434
+ end
435
+
436
+ def drop_table(name)
437
+ ensure_connected
438
+ @engine.drop_table(name)
439
+ end
440
+
441
+ def insert(table, data)
442
+ ensure_connected
443
+ columns = data.keys
444
+ values = data.values
445
+ @engine.insert_row(table, columns, values)
446
+ end
447
+
448
+ def select(table, conditions = {})
449
+ ensure_connected
450
+ columns = @engine.table_columns(table)
451
+ @engine.select_rows(table, columns, conditions)
452
+ end
453
+
454
+ def update(table, id, data)
455
+ ensure_connected
456
+ @engine.update_row(table, id, data)
457
+ end
458
+
459
+ def delete(table, id)
460
+ ensure_connected
461
+ @engine.delete_row(table, id)
462
+ end
463
+
464
+ private
465
+
466
+ def ensure_connected
467
+ connect unless @is_open
468
+ raise DatabaseError, "Database is not open" unless @is_open
469
+ end
470
+ end
471
+
472
+ # Connect to a database
473
+ def self.connect(url)
474
+ # Parse URL: rubydb://local/./path/to/database.rdb
475
+ # rubydb://user:pass@host:7432/database
476
+ if url.start_with?("rubydb://local/")
477
+ path = url.sub("rubydb://local/", "")
478
+ Database.new(path).connect
479
+ elsif url.start_with?("rubydb://")
480
+ # Server mode
481
+ uri = URI.parse(url)
482
+ config = {
483
+ host: uri.host,
484
+ port: uri.port || 7432,
485
+ username: uri.user,
486
+ password: uri.password,
487
+ database: uri.path.sub("/", "")
488
+ }
489
+ db = Database.new(config[:database], config)
490
+ db.connect
491
+ db
492
+ else
493
+ # Treat as local path
494
+ Database.new(url).connect
495
+ end
496
+ rescue => e
497
+ raise ConnectionError, "Failed to connect: #{e.message}"
498
+ end
499
+
500
+ # Open a database file
501
+ def self.open(path, config = {})
502
+ db = Database.new(path, config)
503
+ db.connect
504
+ db
505
+ end
506
+
507
+ # Create a new database
508
+ def self.create(path, config = {})
509
+ # Ensure directory exists
510
+ dir = File.dirname(path)
511
+ FileUtils.mkdir_p(dir) unless Dir.exist?(dir)
512
+
513
+ # Create and initialize database
514
+ db = Database.new(path, config)
515
+ db.connect
516
+
517
+ # Create default schema
518
+ db.execute("CREATE TABLE IF NOT EXISTS schema_migrations (version TEXT PRIMARY KEY, applied_at TIMESTAMP)")
519
+ db.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE, email TEXT UNIQUE, created_at TIMESTAMP, updated_at TIMESTAMP)")
520
+
521
+ db
522
+ rescue => e
523
+ raise DatabaseError, "Failed to create database: #{e.message}"
524
+ end
525
+
526
+ # Version information
527
+ def self.version
528
+ VERSION
529
+ end
530
+
531
+ # Database information
532
+ def self.info
533
+ {
534
+ name: "RubyDB",
535
+ version: VERSION,
536
+ description: "A developer-first relational database for Ruby and Rails",
537
+ homepage: "https://github.com/rubydb/rubydb",
538
+ license: "MIT"
539
+ }
540
+ end
541
+
542
+ # Load a configuration file
543
+ def self.load_config(path)
544
+ Configuration::Config.load(path)
545
+ end
546
+
547
+ # Run migrations
548
+ def self.migrate(database, options = {})
549
+ manager = Migrations::MigrationManager.new(database, options)
550
+ manager.migrate
551
+ end
552
+
553
+ # Create a backup
554
+ def self.backup(database, options = {})
555
+ backup = Backup::Backup.new(database, options)
556
+ backup.create_backup
557
+ end
558
+
559
+ # Restore from backup
560
+ def self.restore(backup_path, options = {})
561
+ restore = Backup::Restore.new(nil, options)
562
+ restore.restore(backup_path)
563
+ end
564
+ end