[Javalist] DOS BTrieve adat kinyerese

Szomor Attila aszomor at szomor.hu
2016. Ápr. 26., K, 10:21:33 CEST


Szia!

A PervasiveSQL nem jó a kinyeréshez mert az már a BTrieve-re épülő SQL 
adatbázis kezelő, valakitől aki még használja kell szerezned egy 
BTrieve-et ez létezik DOS és Windows verzióban is sőt szerintem a Magic 
alatt is ott kell legyen hiszen ezzel dolgozik az is.

Általában a C:\BTI\WIN32\BIN könyvtárban van és több DLL-ből áll pl 
WBTRCALL.DLL .. WBTRV32.DLL van egy konfiguráló W32MKSET.EXE és egy tool 
BUTIL.EXE is hozzá.

Sajnos azonban a rekord szerkezetet meg kell fejtened, mert a régi 
programokban egy struktúrát húztak egy memória területre és úgy 
dolgoztak vele, segít ha a BUTIL-al infót kérsz le a DAT-ról.
- Ha nem változó rekordhosszúsággal készítették már tudod is mennyi 
byte-ból áll a struktúra, ha változó akkor a maximális struktúra hosszat 
ismered.
- A kulcsinfók alapján ki tudod szedni a kulcs mezők pozícióját és 
hosszát a struktúrában, ha teljes hosszban használták.
- A többit ki kell találnod általában egyszerű típusokból áll a 
struktúra ezeknek ismert a hossza és egy általad ismert adatú rekorddal 
elkezdhetsz játszani.

Egy hasonló problémánál több évvel ezelőtt játszogattam, én akkor 
Delphi-vel nyertem ki az adatokat már amiket tudtam, ahhoz volt BTrive 
kezelőm, de létezik más nyelvekhez is C++ stb.

Attila.

SZOMOR ATTILA
+36-20/478-8436
attila at szomor.hu
aszomor at gmail.com

Ez egy példa hogy próbáltam a fenti infók és egyéb ismeretek alapján 
elérni a 87 byte-os struktúra szerkezetét:

{$APPTYPE CONSOLE}
Program PECSIDIB;
uses
   Windows,
   BtrvErr in '..\BTrieve\BtrvErr.pas',
   BtrvWin in '..\BTrieve\BtrvWin.pas';

type
   PBizBuffer = ^TBizBuffer;
   TBizBuffer = Packed Record {id}   {naplo} {fszla} {afa}
     { 1}  Id    : Longint;   {k0}
     { 5}  Dat   : BDateRec;         {k1,s1}
     { 9}  Biz   : String[10];       {k1,s2} {k2,s3} {k3,s2}
     {20}  TDate : BDateRec;                 {k2,s4} {k3,s1}
     {24}  FSzla : Longint;                  {k2.s1}
     {28}  Fid   : Longint;                  {k2,s2}
     {32}  Afa   : Byte;      {=> 0,15,25}
     {33}  Netto : Real48;
     {39}  Naplo : Byte;
     {40}  Munka : Word;
     {42}  Nev   : String[20];
     {63}  free  : Word;
     {65}  ostat : Byte;
     {66}  free1 : Byte;
     {67}  dev   : Real48;
     {73}  dnem  : String[3];
     {77}  FDate : BDateRec;
     {81}  XDate : BDateRec;
     {85}  free2 : Word;
     {87}  free3 : Byte;
   end; {L=87}

const
   BizBufferLength = SizeOf(TBizBuffer);

var
   BizFile: BtiFileType;
   BizBuffer: PBizBuffer;
begin
   BizFile := BtiFileType.Create('C:\BTI\Data\PECSIDIB.B11', 
BizBufferLength);
   try
     GetMem(BizFile.BtiFileProp.RecPtr, BizBufferLength+1);
     try
       BizBuffer := PBizBuffer(BizFile.BtiFileProp.RecPtr);
       if BizFile.OpenBtiFile then
       try
         BizFile.GetFromBtiFile(bGetFirst);
         WriteLn('Id':12, ', ', 'Dat':10, ', ', 'Biz':10, ', ', 
'TDate':10, ', ', 'FSzla':12, ', ', 'Fid':12, ', ', 'Afa':3, ', ', 
'Netto':15, ', ', 'Naplo':6, ', ', 'Munka':6, ', ', 'Nev':20, ', ', 
'free':6, ', ', 'ostat':5, ', ', 'free1':5, ', ', 'Dev':15, ', ', 
'dnem':4, ', ', 'FDate':10, ', ', 'XDate':10, ', ', 'free2':6, ', ', 
'free3':5);
         while BizFile.Status = bOkay do
         begin
           with BizBuffer^ do
           begin
             OemToAnsiBuff(@Nev[1], at Nev[1], Ord(Nev[0]));
             WriteLn(Id:12, ', ', Dat.Year:4, '.', Dat.Month:2, '.', 
Dat.Day:2, ', ', Biz:10, ', ', TDate.Year:4, '.', TDate.Month:2, '.', 
TDate.Day:2, ', ', FSzla:12, ', ', Fid:12, ', ', Afa:3, ', ', 
Netto:15:2, ', ', Naplo:6, ', ', Munka:6, ', ', Nev:20, ', ', free:6, ', 
', ostat:5, ', ', free1:5, ', ', Dev:15:2, ', ', dnem:4, ', ', 
FDate.Year:4, '.', FDate.Month:2, '.', FDate.Day:2, ', ', XDate.Year:4, 
'.', XDate.Month:2, '.', XDate.Day:2, ', ', free2:6, ', ', free3:5);
           end;
           BizFile.GetFromBtiFile(bGetNext);
         end
       finally
         BizFile.CloseBtiFile;
       end
       else
          WriteLn(BtiErrorMsg({StrPas(}BizFile.BtiFileProp.Name{)}, 
BizFile.Status), ' Length=', BizBufferLength);
     finally
       FreeMem(BizFile.BtiFileProp.RecPtr, BizBufferLength+1);
       BizFile.BtiFileProp.RecPtr := nil;
     end;
   finally
     BizFile.Free;
   end;
end.



További információk a(z) Javalist levelezőlistáról