单组表定期维护例程

背景与方法

本例程适应场景:数据维护的实时性不高,可以在特定时刻定期执行,一般以数小时或天为单位;总数据量不大,可以单组表存储;支持追加和更新两种模式。每次数据维护量可能较大,可以使用游标传入。

方法:设计一个当前组表用于查询,将接收到的新数据和当前组表归并成备份组表。归并结束后,将当前组表指向新产生的备份组表,对外提供查询服务。备份组表指向原当前组表,下次更新前删除。

约定与概念

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/falsefalse表示为更新模式。

"sortKey": 组表的排序字段,如果存在更新,也是更新时的主键字段,多个用英文逗号分隔

"deleteField": 删除标识字段名,如果无删除操作,则填null。该字段取值为true/false。如果addOnlytrue,则此参数值只能填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

说明:使用组表对象后必须关闭


例程代码下载:[code.zip]