Question

Je pourrais être le dernier homme sur la planète en s'appuyant sur B-Tree Filer mais je fait le saut de Delphi 2007 à XE2.

Après avoir obtenu sur toutes les questions AnsiChar et PAnsiChar, le code se bloque maintenant avec une vérification gamme avec zéro éléments sur une page.

Quelqu'un est-il en cours d'exécution B-Tree Filer avec succès sous Delphi XE2? Si oui, ya Comment as-le faire? :)

Mise à jour Erreur de contrôle Gamme ici:

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; 

Alors que Page.ItemsOnPage ne doit jamais être égale à zéro (l'erreur Check Range est valable ici), il peut avoir été causé par des problèmes d'alignement des données. Ce code, ajouté à BTDEFINE.INC semble faire l'affaire ...

{$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}
Était-ce utile?

La solution

Je l'ai fait un port rapide , et j'ai actuellement qu'il est fondamentalement travail , assez pour la démo Delphi inclus au travail. Mon premier essai a échoué quand j'ai omis une chaîne -> ANSIString changements dans la démo CODE, qui a causé la fonction de code de démonstration PadCH dysfonctionnement. Après avoir fixé cela, la démonstration et la bibliothèque sous-jacente semble fonctionnelle, au moins pour la lecture, mais je ne l'écriture test, la modification et la création de fichiers encore. Le fichier ci-dessus dans la démo a été créé dans une version antérieure, donc au moins il est binaire compatible en lecture. Je ne serais pas surpris s'il y avait beaucoup de bugs, des problèmes de corruption de données, et ainsi de suite, donc s'il vous plaît ne pas utiliser ce code dans la production, ou si vous le faites, vous le faites à vos propres risques.

entrer image description ici

Mon travail est ici: hébergé chez Microsoft skydrive (4,3 Mo, ZIP) (Nom de fichier tpbtreefiler_xe2_v2.zip)

Mise à jour Fonction IsamUnpack est ISAMWORK.INC.

Update2 Il semble que l'OP a maintenant découvert que l'ajout d'un certain soutien ifdef version constante provoque la {$ R-} et quelques drapeaux d'alignement à commutées sur lequel sont également nécessaires pour la bibliothèque fonctionne correctement. Puis-je suggérer la manière différente suivante de déclarer dans BTDEFINE.INC, qui obtient autour d'un Delphi classique « versions briser chaque fois que nous changeons de compilateur Delphi » en utilisant une comparaison qui ne cassera pas sur la prochaine version de 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}

Mise à jour 3 Je soupçonne qu'il ya encore des problèmes dans le portage du code, qui pourrait causer la perte de données et la corruption de fichiers de données. Voici un exemple où le nombre d'enregistrements (qui devrait être un nombre compris entre environ 50 dans mon application de démonstration) est indiquée par un> 1 million, ce qui est manifestement non valide.

entrer image description ici

Autres conseils

Deux autres éléments à vérifier

  1. changement "chaîne" à "AnsiString"
  2. Si la construction cible est de 64 bits, vos modifications ne font encore prêt

Vive

Après que je l'avais tout travail, je trouve que réindexation à partir d'une application XE2 a cassé les tables BTreeFiler (BTreeFiler) avec une erreur ISAM # 10122 ( « La taille de la page pour le bloc de fichier est supérieure à la MaxPageSize » ). Voici la solution:

Ce dont on a besoin d'être changé en Filer.pas pour réindexation au travail:

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

J'espère que Warren (ci-dessus) a mis à jour son travail avec ce correctif supplémentaire. J'ai également posté celui-ci sur l'emplacement TurboPower BTreeFiler SourceForge.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top