ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/oup/current/Helper/LevelDB.pas
(Generate patch)

Comparing oup/current/Helper/LevelDB.pas (file contents):
Revision 141 by alloc, Fri Mar 30 01:16:54 2007 UTC vs.
Revision 248 by alloc, Mon Nov 26 11:02:28 2007 UTC

# Line 24 | Line 24 | var
24   implementation
25   {$R *.dfm}
26   uses ABSMain, ABSDecUtil, Main,
27 <    ConnectionManager, TypeDefs, DataAccess, OniImgClass, Data, RawList;
27 >    ConnectionManager, TypeDefs, DataAccess, OniImgClass, Data, RawList,
28 >  Access_OniArchive;
29  
30   var
31    Converting:  Boolean = False;
# Line 44 | Line 45 | end;
45  
46  
47   procedure TForm_LevelDB.CreateLevel(Source, Target: String);
48 + const
49 +  EmptyBytes: Array[0..31] of Byte = (
50 +      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 );
51   var
52    DatHeader:        THeader;
53    FilesHeader:      TFilesMap;
# Line 74 | Line 78 | var
78    RawLinks:   TRawDataList;
79  
80    DatFileStream, RawFileStream: TMemoryStream;
77
78 // ###########################
79  datsum, linksum, rawsum: Int64;
80  freq: Int64;
81  tempticks1, tempticks2: Int64;
82 // ###########################
81   const
82    Steps: Byte = 3;
83  
# Line 205 | Line 203 | begin
203    Stream_Names := TMemoryStream.Create;
204    Stream_Dat   := TFileStream.Create(Target, fmCreate);
205    Stream_Raw   := TFileStream.Create(AnsiReplaceStr(Target, '.dat', '.raw'), fmCreate);
206 +  Stream_Raw.Write(EmptyBytes[0], 32);
207    if Connection.DataOS in [DOS_WINDEMO, DOS_MAC, DOS_MACBETA] then
208 +  begin
209      Stream_Sep := TFileStream.Create(AnsiReplaceStr(Target, '.dat', '.sep'), fmCreate);
210 +    Stream_Sep.Write(EmptyBytes[0], 32);
211 +  end;
212 +
213  
214    DoStep('Creating header');
215    progress.Position      := 0;
# Line 235 | Line 238 | begin
238    for i := 0 to High(DatHeader.OSIdent) do
239      case Connection.DataOS of
240        DOS_WIN: DatHeader.OSIdent[i] := HeaderOSIdentWin[i];
241 <      DOS_MAC: DatHeader.OSIdent[i] := HeaderOSIdentMac[i];
241 >      DOS_MAC, DOS_WINDEMO: DatHeader.OSIdent[i] := HeaderOSIdentMac[i];
242        DOS_MACBETA: DatHeader.OSIdent[i] := HeaderOSIdentMacBeta[i];
243      end;
244    for i := 0 to High(DatHeader.GlobalIdent) do
# Line 276 | Line 279 | begin
279      begin
280        case Connection.DataOS of
281          DOS_WIN:     ExtensionsHeader[i].Ident := FileTypes[j].IdentWin;
282 <        DOS_WINDEMO: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
282 >        DOS_WINDEMO:
283 >            if FileTypes[j].Extension = 'SNDD' then
284 >              ExtensionsHeader[i].Ident := FileTypes[j].IdentWin
285 >            else
286 >              ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
287          DOS_MAC:     ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
288          DOS_MACBETA: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
289        end;
# Line 297 | Line 304 | begin
304    lbl_estimation.Caption := 'Estimated finishing time: unknown';
305    Application.ProcessMessages;
306  
300  QueryPerformanceFrequency(freq);
301  datsum := 0;
302  linksum := 0;
303  rawsum := 0;
304
307    FileTime := Time;
308    for FileID := 0 to DatHeader.Files - 1 do
309    begin
# Line 310 | Line 312 | begin
312        FilesHeader[FileID].Extension[j] := FileInfo.Extension[4 - j];
313      if FileInfo.Size > 0 then
314      begin
313      QueryPerformanceCounter(tempticks1);
314
315        FilesHeader[FileID].DataAddr := Stream_Body.Size + 8;
316        DatFileStream := TMemoryStream.Create;
317        Connection.LoadDatFile(FileID, TStream(DatFileStream));
# Line 320 | Line 320 | begin
320        DatFileStream.Write(tempi, 4);
321        DatFileStream.Write(LevelID, 4);
322  
323      QueryPerformanceCounter(tempticks2);
324      datsum := datsum + (tempticks2 - tempticks1);
325
323        DatLinks := Connection.GetDatLinks(FileID);
324        if Length(DatLinks) > 0 then
325        begin
# Line 337 | Line 334 | begin
334          end;
335        end;
336  
340      QueryPerformanceCounter(tempticks1);
341      linksum := linksum + (tempticks1 - tempticks2);
342
337        RawLinks := Connection.GetRawList(FileID);
338        if Length(RawLinks) > 0 then
339        begin
# Line 354 | Line 348 | begin
348              begin
349                RawLinks[i].RawAddr := Stream_Sep.Size;
350                Stream_sep.CopyFrom(RawFileStream, RawFileStream.Size);
351 +              if (Stream_Sep.Size mod 32) > 0 then
352 +                Stream_Sep.Write(EmptyBytes[0], 32 - (Stream_Sep.Size mod 32));
353              end else begin
354                RawLinks[i].RawAddr := Stream_Raw.Size;
355                Stream_Raw.CopyFrom(RawFileStream, RawFileStream.Size);
356 +              if (Stream_Raw.Size mod 32) > 0 then
357 +                Stream_Raw.Write(EmptyBytes[0], 32 - (Stream_Raw.Size mod 32));
358              end;
359            end else
360              RawLinks[i].RawAddr := 0;
# Line 366 | Line 364 | begin
364        end;
365        DatFileStream.Seek(0, soFromBeginning);
366        Stream_Body.CopyFrom(DatFileStream, DatFileStream.Size);
367 <
368 <      QueryPerformanceCounter(tempticks2);
369 <      rawsum := rawsum + (tempticks2 - tempticks1);
367 >      if (Stream_Body.Size mod 32) > 0 then
368 >      begin
369 >        ShowMessage(
370 >            IntToStr(FileID) + '-' + FileInfo.Name + '.' + FileInfo.Extension + #13#10 +
371 >            IntToStr(FileInfo.Size) + ' - 0x' + IntToHex(FileInfo.Size, 6) + ' - real: ' + IntToStr(DatFileStream.Size) + ' - 0x' + IntToHex(DatFileStream.Size, 6) + #13#10 +
372 >            IntToStr(Stream_Body.Size) + ' - 0x' + IntToHex(Stream_Body.Size, 6) );
373 >        Stream_Body.Write(EmptyBytes[0], 32 - (Stream_Body.Size mod 32));
374 >      end;
375      end
376      else
377        FilesHeader[FileID].DataAddr := 0;
# Line 391 | Line 394 | begin
394      Application.ProcessMessages;
395    end;
396  
394  ShowMessage('AvgDats: ' + FloatToStr((datsum / progress.Max) / freq) + #13#10 +
395      'AvgLinks: ' + FloatToStr((linksum / progress.Max) / freq) + #13#10 +
396      'AvgRaws: ' + FloatToStr((rawsum / progress.Max) / freq)
397   );
398
397    Stream_Dat.Write(DatHeader, SizeOf(DatHeader));
398    for i := 0 to High(FilesHeader) do
399      Stream_Dat.Write(FilesHeader[i], SizeOf(FilesHeader[i]));
# Line 404 | Line 402 | begin
402    for i := 0 to High(ExtensionsHeader) do
403      Stream_Dat.Write(ExtensionsHeader[i], SizeOf(ExtensionsHeader[i]));
404  
405 +  if (Stream_Dat.Size mod 32) > 0 then
406 +    Stream_Dat.Write(EmptyBytes[0], 32 - (Stream_Dat.Size mod 32));
407 +
408    DatHeader.DataSize  := Stream_Body.Size;
409    DatHeader.NamesSize := Stream_Names.Size;
410    DatHeader.DataAddr  := Stream_Dat.Size;
411  
412    Stream_Body.Seek(0, soFromBeginning);
413    Stream_Dat.CopyFrom(Stream_Body, Stream_Body.Size);
414 +
415 +  if (Stream_Dat.Size mod 32) > 0 then
416 +    Stream_Dat.Write(EmptyBytes[0], 32 - (Stream_Dat.Size mod 32));
417 +
418    DatHeader.NamesAddr := Stream_Dat.Size;
419    Stream_Names.Seek(0, soFromBeginning);
420    Stream_Dat.CopyFrom(Stream_Names, Stream_Names.Size);
# Line 450 | Line 455 | var
455  
456    BeginTime, FileTime: Double;
457    Step:       Integer;
453  LevelID:    Integer;
458    TimeFormat: TFormatSettings;
459  
460    ConID:      Integer;
# Line 459 | Line 463 | var
463  
464    FileID:     Integer;
465  
462  Strings:    TStrings;
466    i:          Integer;
467    temps:      String;
465  tempi:      Integer;
466  tempb:      Byte;
468    tempdata:   TByteData;
469    FileInfo:   TFileInfo;
470    DatLinks:   TDatLinkList;
# Line 494 | Line 495 | const
495      begin
496        DeleteFile(target);
497      end;
498 < end;
498 >  end;
499  
500  
501  
# Line 592 | Line 593 | begin
593    Query.SQL.Text := 'CREATE INDEX idtargetid ON linkmap (target_id);';
594    Query.ExecSQL;
595    Query.SQL.Text :=
596 <    'CREATE TABLE rawmap  ( id AUTOINC PRIMARY KEY, src_id INTEGER, ' +
597 <    'src_link_offset INTEGER, sep BOOLEAN, size INTEGER, ' +
596 >    'CREATE TABLE rawmap  ( id AUTOINC PRIMARY KEY, name STRING(32), src_id INTEGER, ' +
597 >    'src_link_offset INTEGER, sep BOOLEAN, type STRING(8), size INTEGER, ' +
598      'data BLOB BlobCompressionMode 9 BlobBlockSize 1024 BlobCompressionAlgorithm ZLib);';
599    //    Query.SQL.Text:='CREATE TABLE rawmap  ( id AUTOINC PRIMARY KEY, src_id INTEGER, src_link_offset INTEGER, size INTEGER, data BLOB BlobCompressionAlgorithm None );';
600    Query.ExecSQL;
601    Query.SQL.Text := 'CREATE INDEX idsrcid ON rawmap (src_id);';
602    Query.ExecSQL;
603 +  Query.SQL.Text := 'CREATE INDEX idtype ON rawmap (type);';
604 +  Query.ExecSQL;
605    Query.SQL.Text :=
606      'CREATE TABLE datfiles  ( id INTEGER PRIMARY KEY, extension CHAR(4), ' +
607      'name STRING(128), contenttype INTEGER, size INTEGER, ' +
# Line 635 | Line 638 | begin
638    DoStep('Writing .dat-fileslist');
639    Application.ProcessMessages;
640  
641 +  FileTime := Time;
642    Database.StartTransaction;
643    for FileID := 0 to Connection.GetFileCount - 1 do
644    begin
# Line 662 | Line 666 | begin
666              Connection.LoadRawFile(FileID, RawLinks[i].SrcOffset, tempdata);
667              mimecoder      := TStringFormat_MIME64.Create;
668              Query.SQL.Text :=
669 <              'INSERT INTO rawmap (src_id,src_link_offset,sep,size,data) VALUES (' +
669 >              'INSERT INTO rawmap (name,src_id,src_link_offset,sep,type,size,data) VALUES (' +
670 >              '"' + RawLinks[i].Name + '", ' +
671                IntToStr(FileID) + ', ' + IntToStr(RawLinks[i].SrcOffset) + ',' +
672                BoolToStr(RawLinks[i].LocSep) + ', ' +
673 +              '"' + RawLinks[i].RawType + '", ' +
674                IntToStr(RawLinks[i].RawSize) + ', ' +
675                'MimeToBin("' + MimeCoder.StrTo(@tempdata[0], RawLinks[i].RawSize) + '") );';
676              Query.ExecSQL;
# Line 673 | Line 679 | begin
679            else
680            begin
681              Query.SQL.Text :=
682 <              'INSERT INTO rawmap (src_id,src_link_offset,sep,size) VALUES (' +
682 >              'INSERT INTO rawmap (name,src_id,src_link_offset,sep,type,size) VALUES (' +
683 >              '"' + RawLinks[i].Name + '", ' +
684                IntToStr(FileID) + ', ' + IntToStr(RawLinks[i].SrcOffset) + ', ' +
685 <              BoolToStr(RawLinks[i].LocSep) + ', 0);';
685 >              BoolToStr(RawLinks[i].LocSep) + ', ' +
686 >              '"' + RawLinks[i].RawType + '", ' +
687 >              '0);';
688              Query.ExecSQL;
689            end;
690          end;
# Line 709 | Line 718 | begin
718      end;
719      if ((FileID mod 10) = 0) and (FileID >= 100) then
720        lbl_estimation.Caption := 'Estimated time left: ' + TimeToStr(
721 <        (Time - BeginTime) / FileID * (progress.Max - FileID + 1) * 1.1, timeformat );
721 >        (Time - FileTime) / FileID * (progress.Max - FileID + 1) * 1.1, timeformat );
722      progress.Position := FileID;
723      lbl_progress.Caption := 'Files done: ' + IntToStr(FileID) + '/' + IntToStr(progress.Max);
724      Application.ProcessMessages;

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)