--- oup/current/Helper/LevelDB.pas 2007/03/30 00:49:02 138 +++ oup/current/Helper/LevelDB.pas 2007/04/03 02:59:20 167 @@ -24,7 +24,8 @@ var implementation {$R *.dfm} uses ABSMain, ABSDecUtil, Main, - ConnectionManager, TypeDefs, DataAccess, OniImgClass, Data, RawList; + ConnectionManager, TypeDefs, DataAccess, OniImgClass, Data, RawList, + Access_OniArchive; var Converting: Boolean = False; @@ -44,6 +45,9 @@ end; procedure TForm_LevelDB.CreateLevel(Source, Target: String); +const + EmptyBytes: Array[0..31] of Byte = ( + 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 ); var DatHeader: THeader; FilesHeader: TFilesMap; @@ -74,12 +78,6 @@ var RawLinks: TRawDataList; DatFileStream, RawFileStream: TMemoryStream; - -// ########################### - datsum, linksum, rawsum: Int64; - freq: Int64; - tempticks1, tempticks2: Int64; -// ########################### const Steps: Byte = 3; @@ -205,8 +203,13 @@ begin Stream_Names := TMemoryStream.Create; Stream_Dat := TFileStream.Create(Target, fmCreate); Stream_Raw := TFileStream.Create(AnsiReplaceStr(Target, '.dat', '.raw'), fmCreate); + Stream_Raw.Write(EmptyBytes[0], 32); if Connection.DataOS in [DOS_WINDEMO, DOS_MAC, DOS_MACBETA] then + begin Stream_Sep := TFileStream.Create(AnsiReplaceStr(Target, '.dat', '.sep'), fmCreate); + Stream_Sep.Write(EmptyBytes[0], 32); + end; + DoStep('Creating header'); progress.Position := 0; @@ -297,11 +300,6 @@ begin lbl_estimation.Caption := 'Estimated finishing time: unknown'; Application.ProcessMessages; - QueryPerformanceFrequency(freq); - datsum := 0; - linksum := 0; - rawsum := 0; - FileTime := Time; for FileID := 0 to DatHeader.Files - 1 do begin @@ -310,8 +308,6 @@ begin FilesHeader[FileID].Extension[j] := FileInfo.Extension[4 - j]; if FileInfo.Size > 0 then begin - QueryPerformanceCounter(tempticks1); - FilesHeader[FileID].DataAddr := Stream_Body.Size + 8; DatFileStream := TMemoryStream.Create; Connection.LoadDatFile(FileID, TStream(DatFileStream)); @@ -320,9 +316,6 @@ begin DatFileStream.Write(tempi, 4); DatFileStream.Write(LevelID, 4); - QueryPerformanceCounter(tempticks2); - datsum := datsum + (tempticks2 - tempticks1); - DatLinks := Connection.GetDatLinks(FileID); if Length(DatLinks) > 0 then begin @@ -337,9 +330,6 @@ begin end; end; - QueryPerformanceCounter(tempticks1); - linksum := linksum + (tempticks1 - tempticks2); - RawLinks := Connection.GetRawList(FileID); if Length(RawLinks) > 0 then begin @@ -354,9 +344,13 @@ begin begin RawLinks[i].RawAddr := Stream_Sep.Size; Stream_sep.CopyFrom(RawFileStream, RawFileStream.Size); + if (Stream_Sep.Size mod 32) > 0 then + Stream_Sep.Write(EmptyBytes[0], 32 - (Stream_Sep.Size mod 32)); end else begin RawLinks[i].RawAddr := Stream_Raw.Size; Stream_Raw.CopyFrom(RawFileStream, RawFileStream.Size); + if (Stream_Raw.Size mod 32) > 0 then + Stream_Raw.Write(EmptyBytes[0], 32 - (Stream_Raw.Size mod 32)); end; end else RawLinks[i].RawAddr := 0; @@ -366,9 +360,14 @@ begin end; DatFileStream.Seek(0, soFromBeginning); Stream_Body.CopyFrom(DatFileStream, DatFileStream.Size); - - QueryPerformanceCounter(tempticks2); - rawsum := rawsum + (tempticks2 - tempticks1); + if (Stream_Body.Size mod 32) > 0 then + begin + ShowMessage( + IntToStr(FileID) + '-' + FileInfo.Name + '.' + FileInfo.Extension + #13#10 + + IntToStr(FileInfo.Size) + ' - 0x' + IntToHex(FileInfo.Size, 6) + ' - real: ' + IntToStr(DatFileStream.Size) + ' - 0x' + IntToHex(DatFileStream.Size, 6) + #13#10 + + IntToStr(Stream_Body.Size) + ' - 0x' + IntToHex(Stream_Body.Size, 6) ); + Stream_Body.Write(EmptyBytes[0], 32 - (Stream_Body.Size mod 32)); + end; end else FilesHeader[FileID].DataAddr := 0; @@ -391,11 +390,6 @@ begin Application.ProcessMessages; end; - ShowMessage('AvgDats: ' + FloatToStr((datsum / progress.Max) / freq) + #13#10 + - 'AvgLinks: ' + FloatToStr((linksum / progress.Max) / freq) + #13#10 + - 'AvgRaws: ' + FloatToStr((rawsum / progress.Max) / freq) - ); - Stream_Dat.Write(DatHeader, SizeOf(DatHeader)); for i := 0 to High(FilesHeader) do Stream_Dat.Write(FilesHeader[i], SizeOf(FilesHeader[i])); @@ -404,12 +398,19 @@ begin for i := 0 to High(ExtensionsHeader) do Stream_Dat.Write(ExtensionsHeader[i], SizeOf(ExtensionsHeader[i])); + if (Stream_Dat.Size mod 32) > 0 then + Stream_Dat.Write(EmptyBytes[0], 32 - (Stream_Dat.Size mod 32)); + DatHeader.DataSize := Stream_Body.Size; DatHeader.NamesSize := Stream_Names.Size; DatHeader.DataAddr := Stream_Dat.Size; Stream_Body.Seek(0, soFromBeginning); Stream_Dat.CopyFrom(Stream_Body, Stream_Body.Size); + + if (Stream_Dat.Size mod 32) > 0 then + Stream_Dat.Write(EmptyBytes[0], 32 - (Stream_Dat.Size mod 32)); + DatHeader.NamesAddr := Stream_Dat.Size; Stream_Names.Seek(0, soFromBeginning); Stream_Dat.CopyFrom(Stream_Names, Stream_Names.Size); @@ -450,7 +451,6 @@ var BeginTime, FileTime: Double; Step: Integer; - LevelID: Integer; TimeFormat: TFormatSettings; ConID: Integer; @@ -459,11 +459,8 @@ var FileID: Integer; - Strings: TStrings; i: Integer; temps: String; - tempi: Integer; - tempb: Byte; tempdata: TByteData; FileInfo: TFileInfo; DatLinks: TDatLinkList; @@ -585,16 +582,20 @@ begin Query.ExecSQL; Query.SQL.Text := 'CREATE TABLE linkmap ( id AUTOINC PRIMARY KEY, src_id INTEGER, ' + - 'src_link_offset INTEGER, target_id INTEGER, INDEX idsrcid src_id, ' + - 'INDEX iddestid target_id);'; + 'src_link_offset INTEGER, target_id INTEGER);'; + Query.ExecSQL; + Query.SQL.Text := 'CREATE INDEX idsrcid ON linkmap (src_id);'; + Query.ExecSQL; + Query.SQL.Text := 'CREATE INDEX idtargetid ON linkmap (target_id);'; Query.ExecSQL; Query.SQL.Text := 'CREATE TABLE rawmap ( id AUTOINC PRIMARY KEY, src_id INTEGER, ' + 'src_link_offset INTEGER, sep BOOLEAN, size INTEGER, ' + - 'data BLOB BlobCompressionMode 9 BlobBlockSize 1024 BlobCompressionAlgorithm ZLib, ' + - 'INDEX idsrcid src_id);'; + 'data BLOB BlobCompressionMode 9 BlobBlockSize 1024 BlobCompressionAlgorithm ZLib);'; // Query.SQL.Text:='CREATE TABLE rawmap ( id AUTOINC PRIMARY KEY, src_id INTEGER, src_link_offset INTEGER, size INTEGER, data BLOB BlobCompressionAlgorithm None );'; Query.ExecSQL; + Query.SQL.Text := 'CREATE INDEX idsrcid ON rawmap (src_id);'; + Query.ExecSQL; Query.SQL.Text := 'CREATE TABLE datfiles ( id INTEGER PRIMARY KEY, extension CHAR(4), ' + 'name STRING(128), contenttype INTEGER, size INTEGER, ' + @@ -631,6 +632,9 @@ begin DoStep('Writing .dat-fileslist'); Application.ProcessMessages; + TAccess_OniArchive(Connection).UnloadWhenUnused := False; + + FileTime := Time; Database.StartTransaction; for FileID := 0 to Connection.GetFileCount - 1 do begin @@ -705,7 +709,7 @@ begin end; if ((FileID mod 10) = 0) and (FileID >= 100) then lbl_estimation.Caption := 'Estimated time left: ' + TimeToStr( - (Time - BeginTime) / FileID * (progress.Max - FileID + 1) * 1.1, timeformat ); + (Time - FileTime) / FileID * (progress.Max - FileID + 1) * 1.1, timeformat ); progress.Position := FileID; lbl_progress.Caption := 'Files done: ' + IntToStr(FileID) + '/' + IntToStr(progress.Max); Application.ProcessMessages; @@ -727,6 +731,7 @@ begin btn_abortok.Default := True; converting := False; + TAccess_OniArchive(Connection).UnloadWhenUnused := True; Query.Close; Query.Free;