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 120 by alloc, Fri Mar 23 00:59:01 2007 UTC vs.
Revision 137 by alloc, Fri Mar 30 00:00:10 2007 UTC

# Line 1 | Line 1
1 {$A8,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}
2 {$MINSTACKSIZE $00004000}
3 {$MAXSTACKSIZE $00100000}
4 {$IMAGEBASE $00400000}
5 {$APPTYPE GUI}
6 {$WARN SYMBOL_DEPRECATED ON}
7 {$WARN SYMBOL_LIBRARY ON}
8 {$WARN SYMBOL_PLATFORM ON}
9 {$WARN SYMBOL_EXPERIMENTAL ON}
10 {$WARN UNIT_LIBRARY ON}
11 {$WARN UNIT_PLATFORM ON}
12 {$WARN UNIT_DEPRECATED ON}
13 {$WARN UNIT_EXPERIMENTAL ON}
14 {$WARN HRESULT_COMPAT ON}
15 {$WARN HIDING_MEMBER ON}
16 {$WARN HIDDEN_VIRTUAL ON}
17 {$WARN GARBAGE ON}
18 {$WARN BOUNDS_ERROR ON}
19 {$WARN ZERO_NIL_COMPAT ON}
20 {$WARN STRING_CONST_TRUNCED ON}
21 {$WARN FOR_LOOP_VAR_VARPAR ON}
22 {$WARN TYPED_CONST_VARPAR ON}
23 {$WARN ASG_TO_TYPED_CONST ON}
24 {$WARN CASE_LABEL_RANGE ON}
25 {$WARN FOR_VARIABLE ON}
26 {$WARN CONSTRUCTING_ABSTRACT ON}
27 {$WARN COMPARISON_FALSE ON}
28 {$WARN COMPARISON_TRUE ON}
29 {$WARN COMPARING_SIGNED_UNSIGNED ON}
30 {$WARN COMBINING_SIGNED_UNSIGNED ON}
31 {$WARN UNSUPPORTED_CONSTRUCT ON}
32 {$WARN FILE_OPEN ON}
33 {$WARN FILE_OPEN_UNITSRC ON}
34 {$WARN BAD_GLOBAL_SYMBOL ON}
35 {$WARN DUPLICATE_CTOR_DTOR ON}
36 {$WARN INVALID_DIRECTIVE ON}
37 {$WARN PACKAGE_NO_LINK ON}
38 {$WARN PACKAGED_THREADVAR ON}
39 {$WARN IMPLICIT_IMPORT ON}
40 {$WARN HPPEMIT_IGNORED ON}
41 {$WARN NO_RETVAL ON}
42 {$WARN USE_BEFORE_DEF ON}
43 {$WARN FOR_LOOP_VAR_UNDEF ON}
44 {$WARN UNIT_NAME_MISMATCH ON}
45 {$WARN NO_CFG_FILE_FOUND ON}
46 {$WARN IMPLICIT_VARIANTS ON}
47 {$WARN UNICODE_TO_LOCALE ON}
48 {$WARN LOCALE_TO_UNICODE ON}
49 {$WARN IMAGEBASE_MULTIPLE ON}
50 {$WARN SUSPICIOUS_TYPECAST ON}
51 {$WARN PRIVATE_PROPACCESSOR ON}
52 {$WARN UNSAFE_TYPE OFF}
53 {$WARN UNSAFE_CODE OFF}
54 {$WARN UNSAFE_CAST OFF}
55 {$WARN OPTION_TRUNCATED ON}
56 {$WARN WIDECHAR_REDUCED ON}
57 {$WARN DUPLICATES_IGNORED ON}
58 {$WARN UNIT_INIT_SEQ ON}
59 {$WARN LOCAL_PINVOKE ON}
60 {$WARN MESSAGE_DIRECTIVE ON}
1   unit LevelDB;
2   interface
3   uses
# Line 125 | Line 65 | var
65    Stream_Body, Stream_Names:          TMemoryStream;
66    Stream_Dat, Stream_Raw, Stream_Sep: TFileStream;
67  
128 //  Data, rawdata: Tdata;
68    BeginTime, FileTime: Double;
69    Step:     Integer;
131 //  rawlist:  TRawDataList;
132 //  datlinks: TDatLinks;
70    OniImage:   TOniImage;
71    LevelID:    Integer;
72    TimeFormat: TFormatSettings;
# Line 150 | Line 87 | var
87    RawLinks:   TRawDataList;
88  
89    DatFileStream, RawFileStream: TMemoryStream;
90 +
91 + // ###########################
92 +  datsum, linksum, rawsum: Int64;
93 +  freq: Int64;
94 +  tempticks1, tempticks2: Int64;
95 + // ###########################
96   const
97    Steps: Byte = 3;
98  
# Line 211 | Line 154 | begin
154        begin
155          ShowMessage('Couldn''t delete file. Aborting');
156          Exit;
214      end else if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.raw')) then
215      begin
216        ShowMessage('Couldn''t delete file. Aborting');
217        Exit;
218      end else if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.sep')) then
219      begin
220        ShowMessage('Couldn''t delete file. Aborting');
221        Exit;
157        end;
158 +      if FileExists(AnsiReplaceStr(Target, '.dat', '.raw')) then
159 +        if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.raw')) then
160 +        begin
161 +          ShowMessage('Couldn''t delete file. Aborting');
162 +          Exit;
163 +        end;
164 +      if FileExists(AnsiReplaceStr(Target, '.dat', '.sep')) then
165 +        if Connection.DataOS in [DOS_WINDEMO, DOS_MAC, DOS_MACBETA] then
166 +          if not DeleteFile(AnsiReplaceStr(Target, '.dat', '.sep')) then
167 +          begin
168 +            ShowMessage('Couldn''t delete file. Aborting');
169 +            Exit;
170 +          end;
171      end else begin
172        ShowMessage('Aborting');
173        Exit;
# Line 335 | Line 283 | begin
283    lbl_estimation.Caption := 'Estimated finishing time: unknown';
284    Application.ProcessMessages;
285  
286 +  QueryPerformanceFrequency(freq);
287 +  datsum := 0;
288 +  linksum := 0;
289 +  rawsum := 0;
290 +
291    FileTime := Time;
292    for FileID := 0 to DatHeader.Files - 1 do
293    begin
# Line 343 | Line 296 | begin
296        FilesHeader[FileID].Extension[j] := FileInfo.Extension[4 - j];
297      if FileInfo.Size > 0 then
298      begin
299 +      QueryPerformanceCounter(tempticks1);
300 +
301        FilesHeader[FileID].DataAddr := Stream_Body.Size + 8;
302        DatFileStream := TMemoryStream.Create;
303        Connection.LoadDatFile(FileID, TStream(DatFileStream));
304 <      DatFileStream.Seek(4, soFromBeginning);
304 >      DatFileStream.Seek(0, soFromBeginning);
305 >      tempi := FileID * 256 + 1;
306 >      DatFileStream.Write(tempi, 4);
307        DatFileStream.Write(LevelID, 4);
308  
309 +      QueryPerformanceCounter(tempticks2);
310 +      datsum := datsum + (tempticks2 - tempticks1);
311 +
312        DatLinks := Connection.GetDatLinks(FileID);
313        if Length(DatLinks) > 0 then
314        begin
# Line 363 | Line 323 | begin
323          end;
324        end;
325  
326 +      QueryPerformanceCounter(tempticks1);
327 +      linksum := linksum + (tempticks1 - tempticks2);
328 +
329        RawLinks := Connection.GetRawList(FileID);
330        if Length(RawLinks) > 0 then
331        begin
# Line 371 | Line 334 | begin
334            if RawLinks[i].RawSize > 0 then
335            begin
336              RawFileStream := TMemoryStream.Create;
337 <            if UpperCase(fileinfo.Extension) = 'TXMP' then
337 >            Connection.LoadRawFile(FileID, RawLinks[i].SrcOffset, TStream(RawFileStream));
338 >            RawFileStream.Seek(0, soFromBeginning);
339 >            if RawLinks[i].LocSep then
340              begin
341 <              DatFileStream.Seek($88, soFromBeginning);
342 <              DatFileStream.Read(tempb, 1);
378 <              if (tempb and $01) > 0 then
379 <              begin
380 <                OniImage.Load(Connection.ConnectionID, FileID);
381 <                if not OniImage.GetMipMappedImage(TStream(RawFileStream)) then
382 <                begin
383 <                  ShowMessage('MipMapping-Error');
384 <                  RawFileStream.Seek(0, soFromBeginning);
385 <                  tempb := tempb and $FE;
386 <                  DatFileStream.Seek($88, soFromBeginning);
387 <                  DatFileStream.Write(tempb, 1);
388 <                  OniImage.Load(Connection.ConnectionID, FileID);
389 <                  OniImage.GetAsData(TStream(RawFileStream));
390 <                end else
391 <                begin
392 <                  // Change of Depth($89), Storetype ($90)
393 <                  DatFileStream.Seek($89, soFromBeginning);
394 <                  DatFileStream.Read(tempb, 1);
395 <
396 <                  DatFileStream.Seek($90, soFromBeginning);
397 <                  DatFileStream.Read(tempb, 1);
398 <                  Exit;
399 <                end;
400 <              end else
401 <                OniImage.GetAsData(TStream(RawFileStream));
341 >              RawLinks[i].RawAddr := Stream_Sep.Size;
342 >              Stream_sep.CopyFrom(RawFileStream, RawFileStream.Size);
343              end else begin
344 <              Connection.LoadRawFile(FileID, RawLinks[i].SrcOffset, TStream(RawFileStream));
344 >              RawLinks[i].RawAddr := Stream_Raw.Size;
345 >              Stream_Raw.CopyFrom(RawFileStream, RawFileStream.Size);
346              end;
405            RawFileStream.Seek(0, soFromBeginning);
347            end else
348              RawLinks[i].RawAddr := 0;
349 +          DatFileStream.Seek(RawLinks[i].SrcOffset, soFromBeginning);
350 +          DatFileStream.Write(RawLinks[i].RawAddr, 4);
351          end;
352        end;
353 +      DatFileStream.Seek(0, soFromBeginning);
354 +      Stream_Body.CopyFrom(DatFileStream, DatFileStream.Size);
355  
356 < {
357 <            if rawlist[j].raw_size > 0 then
413 <            begin
414 <              if (UpperCase(fileinfo.Extension) = 'TXMP') and
415 <                ((Data[$88] and $01) > 0) then
416 <              begin
417 <                OniImage.LoadFromTXMP(Connection, i);
418 <                OniImage.GetMipMappedImage(rawdata);
419 <                rawlist[j].raw_size := OniImage.GetImageDataSize(True);
420 <                Data[$90] := $08;
421 <                Data[$89] := 32;
422 < (*                  if data[$90]<>OniImage.StoreType then begin
423 <                    data[$90]:=OniImage.StoreType;
424 <                    data[$89]:=(data[$89] and $CF) or $20;
425 <                  end;
426 < *)                end
427 <              else
428 <              begin
429 <                SetLength(rawdata, rawlist[j].raw_size);
430 <                OniDataConnection.LoadRawFile(i, rawlist[j].src_offset, @rawdata[0]);
431 <              end;
432 <              //                data[$88]:=data[$88] and $FE;
433 <
434 <              if rawlist[j].loc_sep then
435 <              begin
436 <                rawlist[j].raw_addr := Stream_Sep.Size;
437 <                Stream_Sep.Write(rawdata[0], Length(rawdata));
438 <              end
439 <              else
440 <              begin
441 <                rawlist[j].raw_addr := Stream_Raw.Size;
442 <                Stream_Raw.Write(rawdata[0], Length(rawdata));
443 <              end;
444 <            end
445 <            else
446 <              rawlist[j].raw_addr := 0;
447 <            Data[rawlist[j].src_offset + 0] := (rawlist[j].raw_addr) and $FF;
448 <            Data[rawlist[j].src_offset + 1] := (rawlist[j].raw_addr shr 8) and $FF;
449 <            Data[rawlist[j].src_offset + 2] := (rawlist[j].raw_addr shr 16) and $FF;
450 <            Data[rawlist[j].src_offset + 3] := (rawlist[j].raw_addr shr 24) and $FF;
451 < }
452 <      Stream_Body.Write(Data[0], Length(Data));
453 <      //
356 >      QueryPerformanceCounter(tempticks2);
357 >      rawsum := rawsum + (tempticks2 - tempticks1);
358      end
359      else
360 <      FilesHeader[i].DataAddr := 0;
360 >      FilesHeader[FileID].DataAddr := 0;
361      if Length(fileinfo.Name) > 0 then
362      begin
363 <      FilesHeader[i].NameAddr := Stream_Names.Size;
363 >      FilesHeader[FileID].NameAddr := Stream_Names.Size;
364        temps := fileinfo.Extension + fileinfo.Name + Chr(0);
365        Stream_Names.Write(temps[1], Length(temps));
366      end
367      else
368 <      FilesHeader[i].NameAddr := 0;
369 <    FilesHeader[i].FileSize := fileinfo.Size;
370 <    FilesHeader[i].FileType := fileinfo.FileType;
368 >      FilesHeader[FileID].NameAddr := 0;
369 >    FilesHeader[FileID].FileSize := fileinfo.Size;
370 >    FilesHeader[FileID].FileType := fileinfo.FileType;
371  
372 <    if ((i mod 10) = 0) and (i >= 100) then
372 >    if ((FileID mod 10) = 0) and (FileID >= 100) then
373        lbl_estimation.Caption := 'Estimated time left: ' + TimeToStr(
374 <        (Time - FileTime) / i * (progress.Max - i + 1) * 1.1, TimeFormat );
375 <    progress.Position := i + 1;
376 <    lbl_progress.Caption := 'Files done: ' + IntToStr(i + 1) + '/' + IntToStr(progress.Max);
374 >        (Time - FileTime) / FileID * (progress.Max - FileID + 1) * 1.1, TimeFormat );
375 >    progress.Position := FileID + 1;
376 >    lbl_progress.Caption := 'Files done: ' + IntToStr(FileID + 1) + '/' + IntToStr(progress.Max);
377      Application.ProcessMessages;
378    end;
379  
380 +  ShowMessage('AvgDats: ' + FloatToStr((datsum / progress.Max) / freq) + #13#10 +
381 +      'AvgLinks: ' + FloatToStr((linksum / progress.Max) / freq) + #13#10 +
382 +      'AvgRaws: ' + FloatToStr((rawsum / progress.Max) / freq)
383 +   );
384 +
385    Stream_Dat.Write(DatHeader, SizeOf(DatHeader));
386    for i := 0 to High(FilesHeader) do
387      Stream_Dat.Write(FilesHeader[i], SizeOf(FilesHeader[i]));
# Line 484 | Line 393 | begin
393    DatHeader.DataSize  := Stream_Body.Size;
394    DatHeader.NamesSize := Stream_Names.Size;
395    DatHeader.DataAddr  := Stream_Dat.Size;
396 +
397    Stream_Body.Seek(0, soFromBeginning);
398    Stream_Dat.CopyFrom(Stream_Body, Stream_Body.Size);
399    DatHeader.NamesAddr := Stream_Dat.Size;
# Line 497 | Line 407 | begin
407    Stream_Body.Free;
408    Stream_Names.Free;
409    Stream_Raw.Free;
410 <  if OniDataConnection.OSisMac then
410 >
411 >  if Connection.DataOS in [DOS_WINDEMO, DOS_MAC, DOS_MACBETA] then
412      Stream_Sep.Free;
413  
414    progress.Position      := progress.Max;
# Line 513 | Line 424 | begin
424  
425    converting := False;
426  
427 <  CloseDataConnection(DataConnections[conIndex]);
427 > //  CloseDataConnection(DataConnections[conIndex]);
428   end;
429  
430  
# Line 523 | Line 434 | procedure TForm_LevelDB.HandleFile;
434   var
435    i: Byte;
436   begin
437 <  for i := 1 to Length(ConvertHandlers) do
437 > {  for i := 1 to Length(ConvertHandlers) do
438      if UpperCase(ConvertHandlers[i].Ext) = UpperCase(ext) then
439        if ConvertHandlers[i].needed then
440        begin
# Line 532 | Line 443 | begin
443        end
444        else
445          Break;
446 < end;
446 > }end;
447  
448  
449  
450  
451   procedure TForm_LevelDB.CreateDatabase(Source, target: String);
452   var
453 +  DataBase:  TABSDatabase;
454 + {
455 + var
456    DataBase:    TABSDatabase;
457    Query:       TABSQuery;
458    MimeCoder:   TStringFormat_MIME64;
# Line 569 | Line 483 | const
483      else
484        group_progress.Caption := 'Creating DB (FINISHED)';
485    end;
486 + }
487  
488   begin
489 <  if CreateDataConnection(Source, ODB_Dat) = nil then
489 > {  if CreateDataConnection(Source, ODB_Dat) = nil then
490    begin
491      ShowMessage('Could not connect to .dat-file');
492      Exit;
# Line 597 | Line 512 | begin
512    absolutebegintime := Time;
513  
514    DataBase := TABSDatabase.Create(Self);
515 + }
516 +  DataBase.MaxConnections := 1;
517 +  DataBase.PageSize := 8112;
518 +  DataBase.PageCountInExtent := 8;
519 + {
520    DataBase.DatabaseName := 'OLDB';
521    DataBase.DatabaseFileName := target;
522    DataBase.CreateDatabase;
# Line 610 | Line 530 | begin
530    Query := TABSQuery.Create(Self);
531    Query.DatabaseName := 'OLDB';
532    Query.SQL.Text :=
533 <    'CREATE TABLE globals  ( id AUTOINC PRIMARY KEY, name STRING(128), value STRING(128) );';
533 >    'CREATE TABLE globals  ( id AUTOINC PRIMARY KEY, name STRING(128), ' +
534 >    'value STRING(128) );';
535    Query.ExecSQL;
536    Query.SQL.Text :=
537 <    'CREATE TABLE linkmap  ( id AUTOINC PRIMARY KEY, src_id INTEGER, src_link_offset INTEGER, target_id INTEGER );';
537 >    'CREATE TABLE linkmap  ( id AUTOINC PRIMARY KEY, src_id INTEGER, ' +
538 >    'src_link_offset INTEGER, target_id INTEGER,  INDEX idsrcid src_id, ' +
539 >    'INDEX iddestid target_id);';
540    Query.ExecSQL;
541    Query.SQL.Text :=
542 <    '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 );';
542 >    'CREATE TABLE rawmap  ( id AUTOINC PRIMARY KEY, src_id INTEGER, ' +
543 >    'src_link_offset INTEGER, sep BOOLEAN, size INTEGER, ' +
544 >    'data BLOB BlobCompressionMode 9 BlobBlockSize 1024 BlobCompressionAlgorithm ZLib, ' +
545 >    'INDEX idsrcid src_id);';
546    //    Query.SQL.Text:='CREATE TABLE rawmap  ( id AUTOINC PRIMARY KEY, src_id INTEGER, src_link_offset INTEGER, size INTEGER, data BLOB BlobCompressionAlgorithm None );';
547    Query.ExecSQL;
548    Query.SQL.Text :=
549 <    'CREATE TABLE datfiles  ( id INTEGER PRIMARY KEY, extension CHAR(4), name STRING(128), contenttype INTEGER, size INTEGER, data BLOB BlobCompressionMode 9 BlobBlockSize 1024 BlobCompressionAlgorithm ZLib );';
549 >    'CREATE TABLE datfiles  ( id INTEGER PRIMARY KEY, extension CHAR(4), ' +
550 >    'name STRING(128), contenttype INTEGER, size INTEGER, ' +
551 >    'data BLOB BlobCompressionMode 9 BlobBlockSize 1024 BlobCompressionAlgorithm ZLib );';
552    //    Query.SQL.Text:='CREATE TABLE datfiles  ( id INTEGER PRIMARY KEY, extension CHAR(4), name STRING(128), contenttype INTEGER, size INTEGER, data BLOB BlobCompressionAlgorithm None );';
553    Query.ExecSQL;
554 <  Query.SQL.Text :=
555 <    'CREATE TABLE extlist  ( id AUTOINC PRIMARY KEY, ext CHAR(4), ident CHAR(16) );';
556 <  Query.ExecSQL;
554 > //  Query.SQL.Text :=
555 > //    'CREATE TABLE extlist  ( id AUTOINC PRIMARY KEY, ext CHAR(4), ident CHAR(16) );';
556 > //  Query.ExecSQL;
557  
558    Query.SQL.Text := 'INSERT INTO globals (name,value) VALUES ("dbversion","' +
559      dbversion + '");';
# Line 634 | Line 562 | begin
562    for i := 0 to High(OniDataConnection.LevelInfo.Ident) do
563      Data[i] := OniDataConnection.LevelInfo.Ident[i];
564    temps := CreateHexString(Data, True);
565 <  Query.SQL.Text := 'INSERT INTO globals (name,value) VALUES ("ident","' + temps + '");';
566 <  Query.ExecSQL;
565 > //  Query.SQL.Text := 'INSERT INTO globals (name,value) VALUES ("ident","' + temps + '");';
566 > //  Query.ExecSQL;
567    Query.SQL.Text := 'INSERT INTO globals (name,value) VALUES ("lvl","' +
568      IntToStr(OniDataConnection.LevelInfo.LevelNumber) + '");';
569    Query.ExecSQL;
# Line 774 | Line 702 | begin
702    database.Free;
703  
704    CloseDataConnection(DataConnections[conIndex]);
705 + }
706   end;
707  
708  
709  
710  
711 < procedure TForm_LevelDB.stop_convert;
711 > procedure TForm_LevelDB.StopConvert;
712   begin
713 <  btn_abortok.Caption := '&Close';
713 > {  btn_abortok.Caption := '&Close';
714    btn_abortok.Default := True;
715    converting := False;
716    lbl_estimation.Caption := 'ABORTED';
# Line 792 | Line 721 | begin
721    begin
722      DeleteFile(loaded_filename);
723    end;
724 < end;
724 > }end;
725  
726  
727  
# Line 815 | Line 744 | end;
744  
745  
746  
747 <
747 > {
748   procedure InsertDatLinkToDB(fileid: LongWord; offset: LongWord);
749   var
750    link: LongWord;
# Line 1847 | Line 1776 | begin
1776    begin
1777    end;
1778   end;
1779 + }
1780  
1781  
1782 <
1853 <
1782 > {
1783   procedure InsertHandler(ext: String; needed: Boolean; handler: THandler);
1784   begin
1785    SetLength(ConvertHandlers, Length(ConvertHandlers) + 1);
# Line 1858 | Line 1787 | begin
1787    ConvertHandlers[High(ConvertHandlers)].needed  := needed;
1788    ConvertHandlers[High(ConvertHandlers)].handler := handler;
1789   end;
1790 <
1790 > }
1791   begin
1792 <  InsertHandler('ABNA', False, nil);
1792 > {  InsertHandler('ABNA', False, nil);
1793    //  InsertHandler('AGDB',True,AGDB);
1794    InsertHandler('AGDB', False, nil);
1795    InsertHandler('AGQC', False, nil);
# Line 1958 | Line 1887 | begin
1887    InsertHandler('WMM_', False, nil);
1888    InsertHandler('WMMB', True, WMMB);
1889    InsertHandler('WPGE', True, WPGE);
1890 < end.
1890 > }end.

Diff Legend

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