@cruba/crubal-postgres (英语)
在 Postgres 上持续存在的 CRUBAL 商店: 日志作为真理, 所有其他的表格都从它重建出缓存. 设计在 文件/设计/储存;此软件包是其第一个版本.
它会做什么
- 一个主人,一个连锁店
PgStore。 。 。 .commit(by, mutate, at?, extra?)运行草稿操作 将所有者状态, 转换成一个条目, 应用引擎自己的applyEntry, (中文(简体) ), 粘接差异并附加条目,所有交易都与链行相锁。 A 类 拒绝让一切回落.append(entry)使用在别处制作的条目,并以同样方式链接. - 计划 (单位:千美元)
src/schema.sql)是设计表,每张由所有者键入. 只有日志表 更新是编辑;一个触发器拒绝其他更新和每个删除. rebuild()空出所有者的状态表并再次应用日志 .verify(keys?)检查 链条的链接和签名.redact(logId, writeIndex?)以散列取代一个写法,或 以散列(spec 8.5.2)输入,然后重建,所以缓存会忘记日志所忘记的东西.- 这里什么也做不了决定. 折叠、规则、访问、生命周期和观点
@cruba/crubal是因为 并运行不变;此软件包加载工作集,坚持差异并保持链条.
证据
test/pg.test.ts 运行于真实的 Postgres 时 CRUBAL_PG_URL 设置( 本地邮局 17 是
足够: CRUBAL_PG_URL=postgres:///postgres npm test在它自己的计谋中,
却被忽略了 它检查每个血清记录 重建到与Postgres相同的状态
内存,该日记操作(attach, 合并, 有级联的归档) 写入与该
内存日记并离开同一状态, 编辑一个写入会保持链条有效, 重建
状态中,当触发器拒绝其他任何更改时,没有值,并且所有者永远不会相见.
工作内容
操作运行在需要装载的一组工作设备上(src/working.ts) (中文(简体) ). 发动机是
同步而纯洁,所以操作运行在一个集合上,以解答它所拥有的,并注意它的缺乏(a)
按身份证记录,记录在一个级别,记录的孩子,a for目标 钥匙的持有者 a
装订,运行); 商店装入所缺少的东西,然后在一份新副本上再次运行操作,直到
运行要求什么新的。 边缘,指令和定义被装入整体,是小的. 这个条目
应用程序的结算方式相同,所以在60个记录中有一个附件可以装入它碰到的两个记录和它们的
邻居,从来不是六十岁. store.trace 说上个手术装了什么 手术传到
commit 因此,它必须作为草案的一个纯粹的功能:它可能不止运行一次.
预测和流量
给定的商店 projecting: { dict, views, perms? } 标记,在每笔交易中,行
记录显示,每张记录 都改变了引擎的特性 staleAfter 名称, 工作
输入前的状态( o)src/projector.ts) (中文(简体) ). project(view?, audience?) 在任何外部出版
写入交易:它第一次(并在新版本之后)重建了每行,之后只重建
标记的,通过引擎 Views 以装入视图内容的一组工作设备进行对比
它们与已存储的投影, 附加每行已更改或左侧的一个流条目, 按视图编号
和观众,并清除标记. entriesSince(view, seq) 是一个从光标读取的索引.
与 fresh: "write" 每一个承诺一回来就公布 测试重放血压
(views/010)和去除(views/013)并获得内存 Views.stream 用于字节的条目字节.
边界
PgBorder 管理商店的合同(src/border.ts:每跑会构建引擎的 Exchange 结束
承诺的草稿,有商店的边缘,它的运行计数 和它已经采取行动的钥匙,所以运行是一
进入并永远不要在重启时两次行动. receive 财务报告和审定财务报表 arrive 使用它的字节保留录入记录
{\fn黑体\fs20\shad2\2ah82\3ah20\4ah33\fscx95\3ch592001\be1}和散沙一样 intake 表格; send 每项合同、记录和有效载荷最多一次; streamRun
读取商店表格中的投影流,因为索引的光标(或呼叫者)拒绝
上方对无 run每批记录为运行; ack 保持光标;
tick 运行一个预定的合同 到期的勾 schedules 表,按合同键和
勾选. store.erase(record) 将每个值都写到日志的全记录中,并留下其外壳.
命令
bin/crubal-pg.ts,与 CRUBAL_PG_URL 设定 : migrate, (中文(简体) ), rebuild <owner>, (中文(简体) ), verify <owner>, (中文(简体) ),
export <owner>, (中文(简体) ), redact <owner> <log> [<write>], (中文(简体) ), erase <owner> <record>, (中文(简体) ), project <owner> --defs <file>… 财务报告和审定财务报表 tick <owner> <contract> --now <moment> --defs <file>…。 。 。 .
从商店安装和定义
store.install(bundle, keys) 取出已公布的版本( docs/design/publishing.md):它拒绝未签名的
捆绑,除非商店允许它们开发, 捆绑的散列或签名不能验证, a
语言版在商店之上, 和捆绑谁 extends 没有安装在他们的被钉上
版本; 它检查每次发布检查后产生的定义; 然后写一个
install 条目,将捆绑放入 bundles,当安装了更早版本的软件包时,
把每张唱片 都从那个版本的食谱中复制出来 by: migration,以及
留下每个视图重建. store.define(member) 是所有者自己的零钱:与其余部分核对,
然后一个 define 写作. store.definitions() 从安装的捆绑中构建引擎运行的功能
顺序,然后定义写入,每个链头缓存;投影器和 PgBorder.over(store) 带
他们的字典、观点、合同和权限,所以除了
测试.
以真实行为发送
商店的寄件是两个条目,它们之间的行为(docs/design/runs.md): prepare 日志
started 与一能键和有效载荷的散列,有效载荷本身保存在内 outtake; 数据
合同适配器adapters: { [contract]: (contract, payload, run) => … },主机代码,从不
包件)在任何交易之外进行;然后 acted 或者说 failed 和它的尝试。 跑步还开着
(单位:千美元)started,或 failed 尝试 retry被播种在每一个新边界 从跑道
表格,所以一个重启 永远不会两次 retry(run) 重新从保存的有效载荷中行动,而不进行再绘图.
最后一次尝试之后,有一个审查项目 run:<contract> 打开。 适配器带回的答案会关闭
以收件方式运行 via 运行; undo(run) 执行倒置合同,指明其原因; erase
以记录的值排出行数.
审查决定和重播
store.review() 列出未打开的项目; store.decide(decision, by) 将一个条目作为一个条目(审查)
使用定义、值或释放来写,然后重放每个决定所达到的连续输入(a)
sacet的新值,一个合同的未知字段,一个单位的拼写,每个单位自己的条目 by: migration: replay取代之前的摄入量 剩下的留给信托机构 A 类 units
定义将所有者的扩展输入生效的单元表格(目前每个进程有一个所有者)。 一个死人
运行 retry 释放出它的钥匙,所以一个新鲜的边框再次发送有效载荷. 观察运行装入
除草案外,还支持记录及其上级以及其中开放式的拆分项目的意见;
在包裹 split 打开边框的阈值 split:<record>和决定 split 薄荷
版本并移动实例.
犯什么罪拒绝
每个条目都在同一运行中被检查并应用它(所以检查会读出负载):
拥有软件包的 ownership 不允许(14.1) 唱片穿的课不是同类的
成绩为空的班级(5.5), within 形成一个周期或跨越的拥有者(14.2)和每一边
书写(14.12)。 应急边缘是宿主对照已公布的术语(14.13.
东道国(14.1)
拥有记录 <owner>:<id> 是主人的: 给它写的信离开主人的入会
一人在一人的链条上连通并签名(与 hostedSigner 显示主机手
在同一交易中; 锁在固定顺序中。 重建应用所有者的链条
和主的铁链,按著他们的书写顺序排列log.ord);去除每条链条中的修饰.
store.drain(rate) 财务报告和审定财务报表 crubal-pg drain <owner> [--rate N] 最多对
每个电话都有很多记录,每个记录都有 by: migration: drain。 。 。 .
还没到呢
主机:认证,秘密,命名适配器,签名,回路和HTTP表面 (文件/设计/host.md);表格作为数据(文件/设计/索引-和表格.md).