今日eygle发现一个AUL的小问题, 在没有SYSTEM表空间时运行"SCAN TABLE"命令的输出中的UNLOAD命令居然没有列的类型信息, 按理说应当是有的. 在仔细思考后, 在本机成功地模拟出类似情况. 这是因为SCAN TABLE命令在跑时, 总是从文件头读到文件未, 当发现有一个块是表的数据或IOT的数据后, 就根据块中记录的记录条数字节来确定是否用这个块为猜测的样本块, 而实际上, 这个记录条数字节中的记录数也包括了已经删除的记录.

    假设有一前一后两个数据块都属于同一个表, 在前一个块中的记录都已经被全部清楚掉了, 只有后面一个数据块有真实的数据, 这时运行SCAN TABLE将不能得到列的信息, 因为AUL只扫描了第一个数据块, 并将这个块对应的Data Object ID记录在完成列表中, 下次遇到同样的Data Object ID的块时, 就跳过去了, 因此当扫描到第二个数据块时, AUL就不作这个块的分析了.

    为此我在程序中新增了一个计算有效记录数的函数. 有效记录必须是:

1, 字段数大于0的, 以防止所有字段全为空的记录.
2, 不能是标记为已被删除的记录.
3, 必须是整个记录的第一段, 记录可能存在链接(Chain)的情况.

    接下来在扫描块之前检查一下这个块有没有有效记录, 如果有分析它, 否则跳过这个块, 这样输出的信息将有用很多. 鉴于这个改进, 将版本升级到了3.2.4.

    对于AUL 4也作了同样的改进, 并将版本改成了4.0.1.