单组表定期维护例程
背景与方法
本例程适应场景:数据维护的实时性不高,可以在特定时刻定期执行,一般以数小时或天为单位;总数据量不大,可以单组表存储;支持追加和更新两种模式。每次数据维护量可能较大,可以使用游标传入。
方法:设计一个当前组表用于查询,将接收到的新数据和当前组表归并成备份组表。归并结束后,将当前组表指向新产生的备份组表,对外提供查询服务。备份组表指向原当前组表,下次更新前删除。
约定与概念
1. 当前组表和备份组表:当前组表为正在使用的组表,备份组表为上一次弃用的当前组表,在下次更新前删除,更新时将新数据和当前组表归并后写入备份组表。仅在config中配置当前组表和备份组表的文件名。更新完毕时,把config中的当前组表和备份组表对调,即相当于弃用原当前组表。
2. addOnly: 是否仅追加,如果false,表示不仅仅追加数据,还存在修改/删除数据的情况
配置文件说明
配置文件ubc.json
该文件缺省位于集算器的主目录下(如想存到别的目录,请自行修改代码为绝对路径),内容如下:
[{ "addOnly":true, "sortKey":"account,tdate", "deleteField":null, "otherFields":"ColName1,ColName2", "dataDir":"data/", "dataFilename":"data.splx", "backup":"data1.splx" }] |
"addOnly": 是否仅追加,取值true/false,false表示为更新模式。
"sortKey": 组表的排序字段,如果存在更新,也是更新时的主键字段,多个用英文逗号分隔
"deleteField": 删除标识字段名,如果无删除操作,则填null。该字段取值为true/false。如果addOnly为true,则此参数值只能填null
"otherFields": 组表的其它字段,多个用英文逗号分隔
"dataDir": 组表存储路径,相对于主目录。
"dataFilename": 当前组表文件名,如"data.ctx"。
"backup": 备份组表文件名,如"data1.ctx"。
存储结构
主目录下的文件及子目录:
data:组表存储路径,目录名在ubc.json中配置,参见前面介绍
ubc.json:配置文件
data目录下的文件如下所示:
组表文件名在ubc.json中配置,参见前面介绍。
全局变量
current: 当前组表文件
代码解析
init.splx
服务器启动时执行,如果服务器是第一次启动,则需要初始化参数,创建初始组表。
A |
B |
|
1 |
>config=json(file("ubc.json").read()) |
|
2 |
=file(config.dataDir/config.dataFilename) |
|
3 |
if(!A2.exists()) |
|
4 |
=config.sortKey.split@c().("#"+trim(~)).concat@c() |
|
5 |
=if(config.deleteField && !config.addOnly, A2.create@d(${B4},${config.deleteField},${config.otherFields}), A2.create(${B4},${config.otherFields}) ) |
|
6 |
=B5.close() |
|
7 |
>env(current,A2) |
A1 读配置文件
A3-B5 如果当前组表文件不存在,则创建一个新的
B5 如果有删除标识字段且非仅追加,则创建组表文件时加上删除标识字段,且用@d选项
A7 将当前组表文件设为全局变量
update.splx
被外部程序调用执行,将接收到的新数据归并入当前组表。
输入参数:
cs 数据游标
A |
|
1 |
>config=json(file("ubc.json").read()) |
2 |
=movefile(config.dataDir/config.backup) |
3 |
=file(config.dataDir/config.dataFilename) |
4 |
=file(config.dataDir/config.backup) |
5 |
=A3.reset${if(config.addOnly,"","@w")}(A4;cs) |
6 |
=config.dataFilename |
7 |
>config.dataFilename=config.backup,current=file(config.dataDir/config.dataFilename) |
8 |
>config.backup=A6 |
9 |
=file("ubc.json").write(json(config)) |
A1 读配置文件
A2 删除备份组表
A3-A5 将当前组表和传入的游标数据归并后写入备份组表
A6-A8 将备份组表和当前组表对调,更新全局变量current
query.splx
查询数据时使用,返回组表对象
A |
|
1 |
return current |
说明:使用组表对象后必须关闭
英文版