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

Comparing:
oup/rewrite/Helper/Helper_LevelDB.pas (file contents), Revision 97 by alloc, Mon Jan 22 23:05:45 2007 UTC vs.
oup/current/Helper/LevelDB.pas (file contents), Revision 137 by alloc, Fri Mar 30 00:00:10 2007 UTC

# Line 1 | Line 1
1 < unit Helper_LevelDB;
2 <
1 > unit LevelDB;
2   interface
4
3   uses
4    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
5    Dialogs, ComCtrls, StdCtrls, StrUtils;
# Line 15 | Line 13 | type
13      lbl_estimation: TLabel;
14      procedure btn_abortokClick(Sender: TObject);
15    private
16 <    procedure HandleFile(ext: String; fileid: Integer; dir_dat2db: Boolean);
17 <    procedure stop_convert;
16 >    procedure HandleFile(Ext: String; FileID: Integer);
17 >    procedure StopConvert;
18    public
19      procedure CreateDatabase(Source, Target: String);
20      procedure CreateLevel(Source, Target: String);
# Line 27 | Line 25 | var
25    Form_LevelDB: TForm_LevelDB;
26  
27   implementation
30
28   {$R *.dfm}
29 <
30 < uses ABSMain, ABSDecUtil, Main, Functions, Data, OniImgClass, DataStructures, ConnectionManager;
29 > uses ABSMain, ABSDecUtil, Main,
30 >    ConnectionManager, TypeDefs, DataAccess, OniImgClass, Data;
31  
32   type
33 <  THandler = procedure(fileid: LongWord; dir_dat2db: Boolean);
34 <
38 <  TConvertHandlers = record
33 >  THandler = procedure(FileID: Integer);
34 >  TConvertHandler = record
35      Ext:     String[4];
40    needed:  Boolean;
36      Handler: THandler;
37    end;
38  
39   var
40 <  ConvertHandlers: array of TConvertHandlers;
41 <  loaded_filename: String;
42 <  converting: Boolean = False;
43 <  abort:     Boolean = False;
49 <  DataBase:  TABSDatabase;
50 <  Query:     TABSQuery;
51 <  MimeCoder: TStringFormat_MIME64;
52 <
53 < var
54 <  DatHeader:   THeader;
55 <  FilesHeader: TFilesMap;
56 <  NamedFilesHeader: TNamedFilesMap;
57 <  ExtensionsHeader: TExtensionsMap;
58 <  Stream_Body, Stream_Names: TMemoryStream;
59 <  Stream_Dat, Stream_Raw, Stream_Sep: TFileStream;
60 <  OniDataConnection: TOniData;
40 >  ConvertHandlers: array of TConvertHandler;
41 > //  loaded_filename: String;
42 >  Converting:  Boolean = False;
43 >  Abort:       Boolean = False;
44  
45  
46 + function GetOpenMsg(msg: TStatusMessages): String;
47 + begin
48 +  case msg of
49 +    SM_AlreadyOpened:    Result := 'File already opened.';
50 +    SM_FileNotFound:     Result := 'File not found.';
51 +    SM_UnknownExtension: Result := 'Unknown extension.';
52 +    SM_IncompatibleFile: Result := 'Incompatible file format.';
53 +    SM_UnknownError:     Result := 'Unknown error.';
54 +  end;
55 + end;
56  
57  
58 < procedure TForm_LevelDB.CreateLevel(Source, target: String);
58 > procedure TForm_LevelDB.CreateLevel(Source, Target: String);
59   var
60 <  files: LongWord;
60 >  DatHeader:        THeader;
61 >  FilesHeader:      TFilesMap;
62 >  NamedFilesHeader: TNamedFilesMap;
63 >  ExtensionsHeader: TExtensionsMap;
64  
65 <  i, j:     LongWord;
66 <  temps, temps2: String;
71 <  Data, rawdata: Tdata;
72 <  absolutebegintime, begintime: Double;
73 <  step:     Byte;
74 <  rawlist:  TRawList;
75 <  extlist:  TExtensionsMap;
76 <  fileinfo: TFileInfo;
77 <  datlinks: TDatLinks;
78 <  OniImage: TOniImage;
79 <  levelid:  LongWord;
80 <  timeformat: TFormatSettings;
65 >  Stream_Body, Stream_Names:          TMemoryStream;
66 >  Stream_Dat, Stream_Raw, Stream_Sep: TFileStream;
67  
68 <  conIndex: Integer;
69 <  connection: TOniData;
68 >  BeginTime, FileTime: Double;
69 >  Step:     Integer;
70 >  OniImage:   TOniImage;
71 >  LevelID:    Integer;
72 >  TimeFormat: TFormatSettings;
73 >
74 >  ConID:      Integer;
75 >  Connection: TDataAccess;
76 >  ConRepMsg:  TStatusMessages;
77 >
78 >  FileID:     Integer;
79 >
80 >  Strings:    TStrings;
81 >  i, j:       Integer;
82 >  temps:      String;
83 >  tempi:      Integer;
84 >  tempb:      Byte;
85 >  FileInfo:   TFileInfo;
86 >  DatLinks:   TDatLinkList;
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;
86 <
97 >  Steps: Byte = 3;
98  
99  
100 <
90 <  procedure DoStep(stepname: String);
100 >  procedure DoStep(StepName: String);
101    begin
102 <    Inc(step);
103 <    if stepname <> 'FIN' then
102 >    Inc(Step);
103 >    if StepName <> 'FIN' then
104        group_progress.Caption :=
105 <        'Creating Dat (Step ' + IntToStr(step) + '/' + IntToStr(steps) + ': ' + stepname + ')'
105 >        'Creating Dat (Step ' + IntToStr(Step) + '/' + IntToStr(Steps) + ': ' + StepName + ')'
106      else
107        group_progress.Caption := 'Creating Dat (FINISHED)';
108    end;
# Line 103 | Line 113 | begin
113    // FILE EXISTS CHECK FÜR DAT/RAW/SEP!!!
114    //
115  
116 <  timeformat.ShortTimeFormat := 'hh:nn:ss';
117 <  timeformat.LongTimeFormat := 'hh:nn:ss';
118 <  timeformat.TimeSeparator := ':';
116 >  TimeFormat.ShortTimeFormat := 'hh:nn:ss';
117 >  TimeFormat.LongTimeFormat  := 'hh:nn:ss';
118 >  TimeFormat.TimeSeparator   := ':';
119  
120 <  connection := ConnectionExists(target);
121 <  if connection <> nil then
120 >  ConID := ConManager.OpenConnection(Source, ConRepMsg);
121 >  if not (ConRepMsg in [SM_OK, SM_AlreadyOpened]) then
122    begin
123 <    ShowMessage('Destination-file is opened, close it in order to proceed conversion?');
123 >    ShowMessage('Source-file couldn''t be opened! Aborting' + CrLf + GetOpenMsg(ConRepMsg));
124      Exit;
125 <  end;
125 >  end else
126 >    Connection := ConManager.Connection[ConID];
127  
128 <  connection := ConnectionExists(source);
129 <  if connection <> nil then
128 >  ConID := ConManager.FileOpened(Target);
129 >  if ConID >= 0 then
130    begin
131 <    ShowMessage('Source-file is opened, close it in order to proceed conversion?');
132 <    Exit;
131 >    if MessageBox(Self.Handle, PChar('Destination-file is opened, close it in ' +
132 >          'order to proceed conversion?'), PChar('Destination-file opened'),
133 >          MB_YESNO + MB_ICONQUESTION) = ID_YES then
134 >    begin
135 >      if Form_Main.CheckConnectionCloseable(ConID) then
136 >        if not ConManager.CloseConnection(ConID, ConRepMsg) then
137 >        begin
138 >          ShowMessage('Couldn''t close destination-file. Aborting');
139 >          Exit;
140 >        end;
141 >    end else begin
142 >      ShowMessage('Aborting');
143 >      Exit;
144 >    end;
145    end;
146  
147 <
125 <  if CreateDataConnection(Source, ODB_ADB) = nil then
147 >  if FileExists(Target) then
148    begin
149 <    ShowMessage('Could not connect to .oldb-file');
150 <    Exit;
149 >    if MessageBox(Self.Handle, PChar('Destination-file exists. ' +
150 >          'Overwrite it?'), PChar('Destination-file exists'),
151 >          MB_YESNO + MB_ICONWARNING) = ID_YES then
152 >    begin
153 >      if not DeleteFile(Target) then
154 >      begin
155 >        ShowMessage('Couldn''t delete file. Aborting');
156 >        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;
174 >    end;
175    end;
130  levelid  := OniDataConnection.LevelInfo.LevelNumber;
131  levelid  := (levelid * 2) * 256 * 256 * 256 + $01;
132  OniImage := TOniImage.Create;
176  
177 <  absolutebegintime := Time;
177 >  LevelID  := Connection.LevelNumber;
178 >  LevelID  := (LevelID * 2) * 256 * 256 * 256 + $01;
179 >  OniImage := TOniImage.Create;
180  
181    Self.Visible := True;
182    Form_Main.Visible := False;
183 <  step  := 0;
184 <  converting := True;
185 <  abort := False;
183 >  Step := 0;
184 >  Converting := True;
185 >  Abort := False;
186    btn_abortok.Caption := '&Abort...';
187    btn_abortok.Default := False;
188 <  absolutebegintime := Time;
188 >  BeginTime := Time;
189  
190    Stream_Body  := TMemoryStream.Create;
191    Stream_Names := TMemoryStream.Create;
192 <  Stream_Dat   := TFileStream.Create(target, fmCreate);
193 <  Stream_Raw   := TFileStream.Create(AnsiReplaceStr(target, '.dat', '.raw'), fmCreate);
194 <  if OniDataConnection.OSisMac then
195 <    Stream_Sep := TFileStream.Create(AnsiReplaceStr(target, '.dat', '.sep'), fmCreate);
192 >  Stream_Dat   := TFileStream.Create(Target, fmCreate);
193 >  Stream_Raw   := TFileStream.Create(AnsiReplaceStr(Target, '.dat', '.raw'), fmCreate);
194 >  if Connection.DataOS in [DOS_WINDEMO, DOS_MAC, DOS_MACBETA] then
195 >    Stream_Sep := TFileStream.Create(AnsiReplaceStr(Target, '.dat', '.sep'), fmCreate);
196  
197    DoStep('Creating header');
198    progress.Position      := 0;
# Line 155 | Line 200 | begin
200    lbl_estimation.Caption := 'Estimated finishing time: unknown';
201    Application.ProcessMessages;
202  
203 <  NamedFilesHeader := TOniDataADB(OniDataConnection).GetNamedFilesMap;
204 <  extlist := OniDataConnection.GetExtendedExtensionsList;
205 <  for i := 0 to High(DatHeader.Ident) do
206 <    DatHeader.Ident[i] := OniDataConnection.LevelInfo.Ident[i];
207 <  DatHeader.Files := OniDataConnection.GetFilesCount;
203 >  SetLength(NamedFilesHeader, 0);
204 >  Strings := TStringList.Create;
205 >  Strings := Connection.GetFilesList('', '', False, ST_ExtNameAsc);
206 >  for i := 0 to Strings.Count - 1 do
207 >  begin
208 >    if MidStr(Strings.Strings[i],
209 >          Pos('-', Strings.Strings[i]) + 1,
210 >          Length(Strings.Strings[i]) -
211 >            Pos('.', ReverseString(Strings.Strings[i])) -
212 >            Pos('-', Strings.Strings[i])
213 >        ) <> '' then
214 >    begin
215 >      SetLength(NamedFilesHeader, Length(NamedFilesHeader) + 1);
216 >      NamedFilesHeader[High(NamedFilesHeader)].FileNumber := StrToInt(MidStr(Strings.Strings[i], 1, 5));
217 >      NamedFilesHeader[High(NamedFilesHeader)].blubb := 0;
218 >    end;
219 >  end;
220 >
221 >  for i := 0 to High(DatHeader.OSIdent) do
222 >    case Connection.DataOS of
223 >      DOS_WIN: DatHeader.OSIdent[i] := HeaderOSIdentWin[i];
224 >      DOS_MAC: DatHeader.OSIdent[i] := HeaderOSIdentMac[i];
225 >      DOS_MACBETA: DatHeader.OSIdent[i] := HeaderOSIdentMacBeta[i];
226 >    end;
227 >  for i := 0 to High(DatHeader.GlobalIdent) do
228 >    DatHeader.GlobalIdent[i] := HeaderGlobalIdent[i];
229 >  DatHeader.Files := Connection.GetFileCount;
230    DatHeader.NamedFiles := Length(NamedFilesHeader);
231 <  DatHeader.Extensions := Length(extlist);
231 >
232 >  Strings := Connection.GetExtensionsList(EF_ExtCount);
233 >
234 >  DatHeader.Extensions := Strings.Count;
235    DatHeader.DataAddr   := 0;
236    DatHeader.DataSize   := 0;
237    DatHeader.NamesAddr  := 0;
# Line 171 | Line 241 | begin
241    SetLength(FilesHeader, DatHeader.Files);
242    SetLength(ExtensionsHeader, DatHeader.Extensions);
243  
244 +
245    DoStep('Writing extensions-header');
246 <  progress.Max := Length(OniDataConnection.GetExtensionsList);
246 >  progress.Max := Strings.Count;
247    Application.ProcessMessages;
248 <
178 <  for i := 0 to High(ExtensionsHeader) do
248 >  for i := 0 to Strings.Count - 1 do
249    begin
250 <    ExtensionsHeader[i].Ident     := extlist[i].Ident;
251 <    ExtensionsHeader[i].Extension := extlist[i].Extension;
252 <    SetLength(temps, 4);
250 >    temps := Strings.Strings[i];
251 >    ExtensionsHeader[i].ExtCount := StrToInt( MidStr(
252 >            temps,
253 >            Pos('(', temps) + 1,
254 >            Pos(')', temps) - Pos('(', temps) - 1 ) );
255 >    temps := MidStr(temps, 1, 4);
256      for j := 0 to 3 do
257 <      temps[j + 1] := ExtensionsHeader[i].Extension[3 - j];
258 <    ExtensionsHeader[i].ExtCount :=
259 <      Length(OniDataConnection.GetFilesList(temps, '', False, stIDAsc));
257 >      ExtensionsHeader[i].Extension[j] := temps[4-j];
258 >    for j := 0 to High(FileTypes) do
259 >      if FileTypes[j].Extension = temps then
260 >        Break;
261 >    if j < Length(FileTypes) then
262 >    begin
263 >      case Connection.DataOS of
264 >        DOS_WIN:     ExtensionsHeader[i].Ident := FileTypes[j].IdentWin;
265 >        DOS_WINDEMO: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
266 >        DOS_MAC:     ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
267 >        DOS_MACBETA: ExtensionsHeader[i].Ident := FileTypes[j].IdentMac;
268 >      end;
269 >    end else begin
270 >      ShowMessage('Unknown Extension: ' + Strings.Strings[i]);
271 >      Exit;
272 >    end;
273      progress.Position    := i + 1;
274      lbl_progress.Caption := 'Extensions done: ' + IntToStr(i + 1) + '/' +
275 <      IntToStr(Length(extlist));
275 >      IntToStr(Strings.Count);
276      Application.ProcessMessages;
277    end;
278  
# Line 197 | Line 283 | begin
283    lbl_estimation.Caption := 'Estimated finishing time: unknown';
284    Application.ProcessMessages;
285  
286 <  begintime := Time;
287 <  for i := 0 to DatHeader.Files - 1 do
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
294 <    fileinfo := OniDataConnection.GetFileInfo(i);
294 >    FileInfo := Connection.GetFileInfo(FileID);
295      for j := 0 to 3 do
296 <      FilesHeader[i].Extension[j] := fileinfo.Extension[4 - j];
297 <    if fileinfo.Size > 0 then
296 >      FilesHeader[FileID].Extension[j] := FileInfo.Extension[4 - j];
297 >    if FileInfo.Size > 0 then
298      begin
299 <      //        DatLinks:=;
300 <      FilesHeader[i].DataAddr := Stream_Body.Size + 8;
301 <      Data    := OniDataConnection.LoadDatFile(i);
302 <      Data[4] := (levelid) and $FF;
303 <      Data[5] := (levelid shr 8) and $FF;
304 <      Data[6] := (levelid shr 16) and $FF;
305 <      Data[7] := (levelid shr 24) and $FF;
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(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 <      if (Pos(UpperCase(fileinfo.Extension), UpperCase(raws)) mod 4) = 1 then
312 >      DatLinks := Connection.GetDatLinks(FileID);
313 >      if Length(DatLinks) > 0 then
314        begin
315 <        rawlist := OniDataConnection.GetRawList(i);
219 <        if Length(rawlist) > 0 then
315 >        for i := 0 to High(DatLinks) do
316          begin
317 <          for j := 0 to High(rawlist) do
317 >          DatFileStream.Seek(DatLinks[i].SrcOffset, soFromBeginning);
318 >          if DatLinks[i].DestID < 0 then
319 >            tempi := 0
320 >          else
321 >            tempi := DatLinks[i].DestID * 256 + 1;
322 >          DatFileStream.Write(tempi, 4);
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
332 >        for i := 0 to High(RawLinks) do
333 >        begin
334 >          if RawLinks[i].RawSize > 0 then
335            begin
336 <            if rawlist[j].raw_size > 0 then
336 >            RawFileStream := TMemoryStream.Create;
337 >            Connection.LoadRawFile(FileID, RawLinks[i].SrcOffset, TStream(RawFileStream));
338 >            RawFileStream.Seek(0, soFromBeginning);
339 >            if RawLinks[i].LocSep then
340              begin
341 <              if (UpperCase(fileinfo.Extension) = 'TXMP') and
342 <                ((Data[$88] and $01) > 0) then
343 <              begin
344 <                OniImage.LoadFromTXMP(Connection, i);
345 <                OniImage.GetMipMappedImage(rawdata);
346 <                rawlist[j].raw_size := OniImage.GetImageDataSize(True);
347 <                Data[$90] := $08;
348 <                Data[$89] := 32;
349 < {                  if data[$90]<>OniImage.StoreType then begin
350 <                    data[$90]:=OniImage.StoreType;
235 <                    data[$89]:=(data[$89] and $CF) or $20;
236 <                  end;
237 < }                end
238 <              else
239 <              begin
240 <                SetLength(rawdata, rawlist[j].raw_size);
241 <                OniDataConnection.LoadRawFile(i, rawlist[j].src_offset, @rawdata[0]);
242 <              end;
243 <              //                data[$88]:=data[$88] and $FE;
244 <
245 <              if rawlist[j].loc_sep then
246 <              begin
247 <                rawlist[j].raw_addr := Stream_Sep.Size;
248 <                Stream_Sep.Write(rawdata[0], Length(rawdata));
249 <              end
250 <              else
251 <              begin
252 <                rawlist[j].raw_addr := Stream_Raw.Size;
253 <                Stream_Raw.Write(rawdata[0], Length(rawdata));
254 <              end;
255 <            end
256 <            else
257 <              rawlist[j].raw_addr := 0;
258 <            Data[rawlist[j].src_offset + 0] := (rawlist[j].raw_addr) and $FF;
259 <            Data[rawlist[j].src_offset + 1] := (rawlist[j].raw_addr shr 8) and $FF;
260 <            Data[rawlist[j].src_offset + 2] := (rawlist[j].raw_addr shr 16) and $FF;
261 <            Data[rawlist[j].src_offset + 3] := (rawlist[j].raw_addr shr 24) and $FF;
262 <          end;
341 >              RawLinks[i].RawAddr := Stream_Sep.Size;
342 >              Stream_sep.CopyFrom(RawFileStream, RawFileStream.Size);
343 >            end else begin
344 >              RawLinks[i].RawAddr := Stream_Raw.Size;
345 >              Stream_Raw.CopyFrom(RawFileStream, RawFileStream.Size);
346 >            end;
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 <      Stream_Body.Write(Data[0], Length(Data));
357 <      //
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 - begintime) / 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 298 | 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 311 | 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;
415    lbl_progress.Caption   := 'Files done: ' + IntToStr(progress.Max) + '/' +
416      IntToStr(progress.Max);
417 <  lbl_estimation.Caption := 'FINISHED (duration: ' + TimeToStr(Time - absolutebegintime, timeformat) + ')';
417 >  lbl_estimation.Caption := 'FINISHED (duration: ' + TimeToStr(Time - Begintime, TimeFormat) + ')';
418  
419    DoStep('FIN');
420    btn_abortok.Caption := '&OK';
# Line 327 | Line 424 | begin
424  
425    converting := False;
426  
427 <  CloseDataConnection(DataConnections[conIndex]);
427 > //  CloseDataConnection(DataConnections[conIndex]);
428   end;
429  
430  
# Line 337 | 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 346 | 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;
459 +
460    i, j:     LongWord;
461    temps, temps2: String;
462    Data:     Tdata;
# Line 379 | 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 407 | 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 420 | 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 444 | 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 584 | 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 602 | Line 721 | begin
721    begin
722      DeleteFile(loaded_filename);
723    end;
724 < end;
724 > }end;
725  
726  
727  
# Line 625 | Line 744 | end;
744  
745  
746  
747 <
747 > {
748   procedure InsertDatLinkToDB(fileid: LongWord; offset: LongWord);
749   var
750    link: LongWord;
# Line 1657 | Line 1776 | begin
1776    begin
1777    end;
1778   end;
1779 + }
1780  
1781  
1782 <
1663 <
1782 > {
1783   procedure InsertHandler(ext: String; needed: Boolean; handler: THandler);
1784   begin
1785    SetLength(ConvertHandlers, Length(ConvertHandlers) + 1);
# Line 1668 | 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 1768 | 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)