TurboPower B-Tree Filer и Delphi XE2 - кто-нибудь делал это? - PullRequest
1 голос
/ 12 января 2012

Я могу быть последним парнем на планете, который полагается на B-Tree Filer, но я сделал переход с Delphi 2007 на XE2.

После преодоления всех проблем AnsiChar и PAnsiChar, код теперь падаетПроверка диапазона с нулевым количеством элементов на странице.

Кто-нибудь успешно запускает B-Tree Filer под Delphi XE2?Если так, как ты это сделал?:)

Обновление Ошибка проверки диапазона здесь:

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 ]

1 голос
/ 13 января 2012

Я сделал быстрый порт , и в настоящее время у меня он в основном работает , этого вполне достаточно для работы включенной демонстрации Delphi. Моя первая попытка потерпела неудачу, когда я пропустил некоторые изменения строки -> ansistring в ДЕМО-КОДЕ, что привело к сбою функции демонстрационного кода PadCH. После того, как я это исправил, демонстрационная и лежащая в ее основе библиотека кажутся функциональными, по крайней мере, для чтения, но я еще не тестировал написание, изменение и создание файлов. Приведенный выше файл в демоверсии был создан в более ранней версии, поэтому, по крайней мере, он совместим с бинарным чтением. Я не удивлюсь, если будет много ошибок, проблем с повреждением данных и т. Д., Поэтому, пожалуйста, не используйте этот код в производстве, или если вы это сделаете, вы делаете это на свой страх и риск.

enter image description here

Моя работа здесь: размещена на Microsoft Skydrive (4,3 мегабайта, ZIP) (имя файла tpbtreefiler_xe2_v2.zip)

Обновление Функция IsamUnpack находится в ISAMWORK.INC.

Update2 Похоже, что ОП обнаружил, что добавление некоторой поддержки 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 в моем демонстрационном приложении) сообщается как число> 1 миллион, что явно недопустимо.

enter image description here

0 голосов
/ 13 ноября 2013

После того, как все это заработало, я обнаружил, что переиндексация из приложения 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;

Я надеюсь, что Уоррен (выше) обновил свою работу с этим дополнительным исправлением. Я также разместил этот файл в расположении TurboPower BTreeFiler SourceForge.

0 голосов
/ 12 января 2012

Еще два элемента для проверки

  1. замените "строку" на "AnsiString"
  2. Если целевая сборка имеет 64 бита, ваши изменения не будут готовы к этому

Приветствия

...