--- oup/current/DataAccess/Access_OniArchive.pas 2007/11/26 11:02:28 248 +++ oup/current/DataAccess/Access_OniArchive.pas 2008/10/18 23:27:59 256 @@ -11,8 +11,15 @@ type Fsep_file: TFileStream; Fdat_files: TFiles; Fdat_extensionsmap: TExtensionsMap; + FUnloadWhenUnused: Boolean; + FDatOpened: Boolean; + FRawOpened: Boolean; + FSepOpened: Boolean; + procedure SetUnloadWhenUnused(doit: Boolean); protected public + property UnloadWhenUnused: Boolean Read FUnloadWhenUnused Write SetUnloadWhenUnused; + constructor Create(DatFilename: String; ConnectionID: Integer; var Msg: TStatusMessages); override; procedure Close; override; @@ -64,6 +71,9 @@ var Fdat_filesmap: TFilesMap; Fdat_namedfilesmap: TNamedFilesMap; begin + FUnloadWhenUnused := True; + FDatOpened := False; + FRawOpened := False; Msg := SM_UnknownError; if not FileExists(DatFilename) then begin @@ -145,11 +155,7 @@ begin Fdat_file.Read(FLevelNumber, 1); FLevelNumber := FLevelNumber div 2; - Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), - fmOpenReadWrite); - if not (FDataOS = DOS_WIN) then - Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), - fmOpenReadWrite); + Fdat_file.Free; Msg := SM_OK; FBackend := DB_ONI; @@ -162,13 +168,60 @@ end; +procedure TAccess_OniArchive.SetUnloadWhenUnused(doit: Boolean); +begin + FUnloadWhenUnused := doit; + if FUnloadWhenUnused then + begin + if FDatOpened then + begin + FDatOpened := False; + Fdat_file.Free; + end; + if FRawOpened then + begin + FRawOpened := False; + Fraw_file.Free; + end; + if FSepOpened then + begin + FSepOpened := False; + Fsep_file.Free; + end; + end + else + begin + if not FDatOpened then + begin + Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); + FDatOpened := True; + end; + if not FRawOpened then + begin + Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), + fmOpenReadWrite); + FRawOpened := True; + end; + if (not FSepOpened) and (FDataOS <> DOS_WIN) then + begin + Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), + fmOpenReadWrite); + FSepOpened := True; + end; + end; +end; + + + + + procedure TAccess_OniArchive.Close; begin - if Assigned(Fdat_file) then + if FDatOpened then Fdat_file.Free; - if Assigned(Fraw_file) then + if FRawOpened then Fraw_file.Free; - if Assigned(Fsep_file) then + if FSepOpened then Fsep_file.Free; Self.Free; end; @@ -323,10 +376,19 @@ begin Target := TMemoryStream.Create; if GetFileInfo(FileID).Size > 0 then begin + if not FDatOpened then + Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning); streampos := Target.Position; Target.CopyFrom(Fdat_file, Fdat_files[fileid].Size); Target.Seek(streampos, soFromBeginning); + if UnloadWhenUnused then + begin + Fdat_file.Free; + FDatOpened := False; + end + else + FDatOpened := True; end; end; end; @@ -335,8 +397,17 @@ procedure TAccess_OniArchive.UpdateDatFi begin if fileid < GetFileCount then begin + if not FDatOpened then + Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); Fdat_file.Seek(Fdat_files[fileid].DatAddr, soFromBeginning); Fdat_file.CopyFrom(Src, Fdat_files[fileid].Size); + if UnloadWhenUnused then + begin + Fdat_file.Free; + FDatOpened := False; + end + else + FDatOpened := True; end; end; @@ -348,10 +419,19 @@ begin begin if not Assigned(Target) then Target := TMemoryStream.Create; + if not FDatOpened then + Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); Fdat_file.Seek(Fdat_files[fileid].DatAddr + offset, soFromBeginning); streampos := Target.Position; Target.CopyFrom(Fdat_file, size); Target.Seek(streampos, soFromBeginning); + if UnloadWhenUnused then + begin + FDatOpened := False; + Fdat_file.Free; + end + else + FDatOpened := True; end; end; @@ -359,8 +439,17 @@ procedure TAccess_OniArchive.UpdateDatFi begin if fileid < GetFileCount then begin + if not FDatOpened then + Fdat_file := TFileStream.Create(FFileName, fmOpenReadWrite); Fdat_file.Seek(Fdat_files[fileid].DatAddr + offset, soFromBeginning); Fdat_file.CopyFrom(Src, Size); + if UnloadWhenUnused then + begin + Fdat_file.Free; + FDatOpened := False; + end + else + FDatOpened := True; end; end; @@ -441,21 +530,41 @@ begin Target := TMemoryStream.Create; if not LocSep then begin + if not FRawOpened then + Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), + fmOpenReadWrite); if RawAddr <= Fraw_file.Size then begin Fraw_file.Seek(RawAddr, soFromBeginning); Target.CopyFrom(Fraw_file, size); Target.Seek(0, soFromBeginning); end; + if UnloadWhenUnused then + begin + FRawOpened := False; + Fraw_file.Free; + end + else + FRawOpened := True; end else begin + if not FSepOpened then + Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), + fmOpenReadWrite); if RawAddr <= Fsep_file.Size then begin Fsep_file.Seek(RawAddr, soFromBeginning); Target.CopyFrom(Fsep_file, size); Target.Seek(0, soFromBeginning); end; + if UnloadWhenUnused then + begin + FSepOpened := False; + Fsep_file.Free; + end + else + FSepOpened := True; end; end; @@ -481,17 +590,37 @@ begin raw_info := Self.GetRawInfo(FileID, DatOffset); if not raw_info.LocSep then begin + if not FRawOpened then + Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), + fmOpenReadWrite); Fraw_file.Seek(raw_info.RawAddr, soFromBeginning); streampos := Target.Position; Target.CopyFrom(Fraw_file, raw_info.RawSize); Target.Seek(streampos, soFromBeginning); + if UnloadWhenUnused then + begin + FRawOpened := False; + Fraw_file.Free; + end + else + FRawOpened := True; end else begin + if FUnloadWhenUnused or not FSepOpened then + Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), + fmOpenReadWrite); Fsep_file.Seek(raw_info.RawAddr, soFromBeginning); streampos := Target.Position; Target.CopyFrom(Fsep_file, raw_info.RawSize); Target.Seek(streampos, soFromBeginning); + if UnloadWhenUnused then + begin + FSepOpened := False; + Fsep_file.Free; + end + else + FSepOpened := True; end; end; end; @@ -505,13 +634,33 @@ begin raw_info := GetRawInfo(FileID, DatOffset); if not raw_info.LocSep then begin + if not FRawOpened then + Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), + fmOpenReadWrite); Fraw_file.Seek(raw_info.RawAddr, soFromBeginning); Fraw_file.CopyFrom(Src, Min(raw_info.RawSize, Src.Size)); + if UnloadWhenUnused then + begin + FRawOpened := False; + Fraw_file.Free; + end + else + FRawOpened := True; end else begin + if not FSepOpened then + Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), + fmOpenReadWrite); Fsep_file.Seek(raw_info.RawAddr, soFromBeginning); Fsep_file.CopyFrom(Src, raw_info.RawSize); + if UnloadWhenUnused then + begin + FSepOpened := False; + Fsep_file.Free; + end + else + FSepOpened := True; end; end; end; @@ -544,13 +693,33 @@ begin raw_info := GetRawInfo(FileID, DatOffset); if not raw_info.LocSep then begin + if not FRawOpened then + Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), + fmOpenReadWrite); Fraw_file.Seek(raw_info.RawAddr + Offset, soFromBeginning); Fraw_file.CopyFrom(Src, Size); + if UnloadWhenUnused then + begin + FRawOpened := False; + Fraw_file.Free; + end + else + FRawOpened := True; end else begin + if not FSepOpened then + Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), + fmOpenReadWrite); Fsep_file.Seek(raw_info.RawAddr + Offset, soFromBeginning); Fsep_file.CopyFrom(Src, Size); + if UnloadWhenUnused then + begin + FSepOpened := False; + Fsep_file.Free; + end + else + FSepOpened := True; end; end; end; @@ -562,6 +731,9 @@ const begin if not LocSep then begin + if not FRawOpened then + Fraw_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.raw'), + fmOpenReadWrite); if (Fraw_file.Size mod 32) > 0 then Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32)); Result := Fraw_file.Size; @@ -569,9 +741,19 @@ begin Fraw_file.CopyFrom(Src, Src.Size); if (Fraw_file.Size mod 32) > 0 then Fraw_file.Write(EmptyBytes[0], 32 - (Fraw_file.Size mod 32)); + if UnloadWhenUnused then + begin + FRawOpened := False; + Fraw_file.Free; + end + else + FRawOpened := True; end else begin + if not FSepOpened then + Fsep_file := TFileStream.Create(AnsiReplaceStr(FFileName, '.dat', '.sep'), + fmOpenReadWrite); if (Fsep_file.Size mod 32) > 0 then Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32)); Result := Fsep_file.Size; @@ -579,6 +761,13 @@ begin Fsep_file.CopyFrom(Src, Src.Size); if (Fsep_file.Size mod 32) > 0 then Fsep_file.Write(EmptyBytes[0], 32 - (Fsep_file.Size mod 32)); + if UnloadWhenUnused then + begin + FSepOpened := False; + Fsep_file.Free; + end + else + FSepOpened := True; end; end;