TurboPower B-Tree Filer和Delphi XE2 - 有人做过吗?

时间:2012-01-12 14:59:58

标签: delphi delphi-xe2 b-tree

我可能是这个星球上依靠B-Tree Filer的最后一个人,但我从Delphi 2007跳到了XE2。

在克服了所有AnsiChar和PAnsiChar问题后,代码现在崩溃,并在页面上显示零项目的范围检查。

是否有人在Delphi XE2下成功运行B-Tree Filer?如果是这样,你怎么做的? :)

更新范围检查错误:

procedure IsamUnPack(var Page : IsamPage; KeyL : Word); 
var 
  I, K, S : Word; 
  P : Array [0..0] Of Byte absolute Page; {Real bounds [0..65535]} 
begin 
 K := KeyL + 9; 
 S := Pred (Page.ItemsOnPage) * K + 6; 
 if KeyL <> MaxKeyLen then begin 
    for I := Page.ItemsOnPage downto 2 do begin 
     Move(P[S], Page.ItemArray[I], K); // Range Check error in Warren P's suggestion 
     S := S - K;  
     end; 
 end; 
end; 

虽然Page.ItemsOnPage永远不应为零(范围检查错误在此处有效),但它可能是由数据对齐问题引起的。这段代码,添加到BTDEFINE.INC似乎正在做的伎俩...

{$IFDEF VER230}
{$DEFINE UsingDelphi}
{$ENDIF}

{$IFDEF VER230} {Delphi XE2}
{$A-} {align data on byte boundaries}
{$B-} {short circuit boolean evaluation}
{$H+} {long string support}
{$I-} {suppress I/O checking}
{$J+} {writeable typed constants}
{$P-} {do not allow open string parameters}
{$Q-} {overflow checking off}
{$R-} {range checking off}
{$T-} {no type checked pointers with @}
{$V-} {no var string checking}
{$X+} {extended syntax on}
{$DEFINE Delphi2006}
{$DEFINE Delphi1Plus}
{$DEFINE Delphi2Plus}
{$DEFINE Delphi3Plus}
{$DEFINE Delphi4Plus}
{$DEFINE Delphi5Plus}
{$DEFINE Delphi6Plus}
{$DEFINE Delphi7Plus}
{$DEFINE Delphi2005Plus}
{$DEFINE Delphi2006Plus}
{$ENDIF}

3 个答案:

答案 0 :(得分:1)

我做了一个快速端口,我目前基本上已经正常工作,足以让所包含的Delphi演示工作。当我忽略一些字符串时,我的第一次尝试失败了 - &gt; DEMO代码中的ansistring更改,导致演示代码函数PadCH出现故障。在我修复之后,演示和底层库看起来很有用,至少对于阅读而言,但我还没有测试编写,修改和创建文件。演示中的上述文件是在早期版本中创建的,因此至少它与二进制读取兼容。如果存在大量错误,数据损坏等问题,我不会感到惊讶,所以请不要在生产中使用此代码,否则请自行承担风险。

enter image description here

我的工作在这里:托管在microsoft skydrive(4.3 megs,ZIP) (filename tpbtreefiler_xe2_v2.zip)

更新功能IsamUnpack位于ISAMWORK.INC中。

Update2 OP似乎现在发现添加一些ifdef-version-constant支持导致{$ R-}和一些对齐标志被打开,这也是必需的,对于图书馆工作正常。我可以建议在BTDEFINE.INC中使用以下不同方式声明,通过使用在下一个delphi版本中不会破坏的比较来解决经典Delphi“每次更改Delphi编译器版本时中断”:

{$IF CompilerVersion > 20.0 } 
{ Keep working from Delphi 2009 UP}
{$DEFINE UsingDelphi}
{$A-} {align data on byte boundaries}
{$B-} {short circuit boolean evaluation}
{$H+} {long string support}
{$I-} {suppress I/O checking}
{$J+} {writeable typed constants}
{$P-} {do not allow open string parameters}
{$Q-} {overflow checking off}
{$R-} {range checking off}
{$T-} {no type checked pointers with @}
{$V-} {no var string checking}
{$X+} {extended syntax on}
{$DEFINE Delphi2006}
{$DEFINE Delphi1Plus}
{$DEFINE Delphi2Plus}
{$DEFINE Delphi3Plus}
{$DEFINE Delphi4Plus}
{$DEFINE Delphi5Plus}
{$DEFINE Delphi6Plus}
{$DEFINE Delphi7Plus}
{$DEFINE Delphi2005Plus}
{$DEFINE Delphi2006Plus}
{$ENDIF}

更新3 我怀疑代码中仍然存在移植问题,这可能会导致数据丢失和数据文件损坏。这是一个示例,其中记录的数量(应该是我的演示应用程序中大约50的范围内的数字)被报告为数字&gt; 100万,这显然是无效的。

enter image description here

答案 1 :(得分:0)

还有两件要检查的项目

  1. 将“string”更改为“AnsiString”
  2. 如果目标版本是64位,那么您的更改将无法使其准备就绪
  3. 干杯

答案 2 :(得分:0)

在我完成所有工作之后,我发现从XE2应用程序重新索引打破了B-TreeFiler(BTreeFiler)表,其中包含isam错误#10122(“文件块的页面大小大于MaxPageSize” )。这是修复:

需要在Filer.pas中更改此版本以便重新编制索引:

IsamInfoRec = packed Record
    InfoRec : IsamSmallInfoRec;
    DummyFill : AnsiChar; <<<<<<<< Here!
    KeysUsed : LongInt;{Must start on an even offset for C-compatibility}
    PageSizeUsed : Word; {!!.42}
End;

我希望Warren(上图)通过这个额外的修复更新了他的工作。我还在TurboPower BTreeFiler SourceForge位置发布了这个。