--- oup/current/DataAccess/Access_OUP_ADB.pas 2007/02/22 00:37:39 112 +++ oup/current/DataAccess/Access_OUP_ADB.pas 2007/08/10 17:26:03 243 @@ -18,7 +18,6 @@ type procedure UpdateListCache; function GetLinksToFile(FileID: Integer): TLinks; - function GetLinksFromFile(FileID: Integer): TLinks; function GetFileInfo(FileID: Integer): TFileInfo; override; function GetFilesList(Ext: String; Pattern: String; @@ -31,8 +30,11 @@ type procedure LoadDatFilePart(FileID, Offset, Size: Integer; var Target: TStream); overload; override; procedure UpdateDatFilePart(FileID, Offset, Size: Integer; Src: TStream); overload; override; + function GetDatLinks(FileID: Integer): TDatLinkList; override; + function GetDatLink(FileID, DatOffset: Integer): TDatLink; override; function GetRawList(FileID: Integer): TRawDataList; override; function GetRawInfo(FileID, DatOffset: Integer): TRawDataInfo; override; + function GetRawsForType(RawType: String): TRawDataList; override; procedure LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); overload; override; procedure UpdateRawFile(FileID, DatOffset: Integer; Src: TStream); overload; override; @@ -45,7 +47,7 @@ type implementation uses - SysUtils, Data, Functions, ABSDecUtil, DB; + SysUtils, Data, Functions, ABSDecUtil, DB, DatLinks, StrUtils; (* @@ -55,8 +57,6 @@ uses constructor TAccess_OUP_ADB.Create(DBFilename: String; ConnectionID: Integer; var Msg: TStatusMessages); -var - i: Integer; begin Msg := SM_UnknownError; if not FileExists(DBFilename) then @@ -67,10 +67,14 @@ begin FFileName := DBFilename; FDatabase := TABSDatabase.Create(nil); + FDatabase.Exclusive := True; + FDatabase.MultiUser := False; FDatabase.DatabaseName := 'OLDBcon' + IntToStr(ConnectionID); FDatabase.DatabaseFileName := DBFilename; FDatabase.Open; FQuery := TABSQuery.Create(FDatabase); + FQuery.DisableControls; + FQuery.RequestLive := False; FQuery.DatabaseName := 'OLDBcon' + IntToStr(ConnectionID); FQuery.SQL.Text := 'SELECT [name],[value] FROM globals ORDER BY [name] ASC'; FQuery.Open; @@ -87,7 +91,7 @@ begin end; if FQuery.FieldByName('name').AsString = 'lvl' then FLevelNumber := StrToInt(FQuery.FieldByName('value').AsString); - if FQuery.FieldByName('name').AsString = 'DataOS' then + if FQuery.FieldByName('name').AsString = 'os' then begin if FQuery.FieldByName('value').AsString = 'WIN' then FDataOS := DOS_WIN @@ -109,6 +113,8 @@ begin FChangeRights := [CR_EditDat, CR_EditRaw, CR_ResizeDat, CR_ResizeRaw]; UpdateListCache; + + inherited; end; @@ -141,7 +147,7 @@ begin Fdat_files[i].Name := FQuery.FieldByName('name').AsString; Fdat_files[i].Extension := FQuery.FieldByName('extension').AsString; Fdat_files[i].Size := FQuery.FieldByName('size').AsInteger; - Fdat_files[i].FileType := HexToLong(FQuery.FieldByName('contenttype').AsString); + Fdat_files[i].FileType := StrToInt('$'+FQuery.FieldByName('contenttype').AsString); Fdat_files[i].DatAddr := 0; Inc(i); FQuery.Next; @@ -193,27 +199,6 @@ begin FQuery.Close; end; -function TAccess_OUP_ADB.GetLinksFromFile(FileID: Integer): TLinks; -var - i: Integer; -begin - SetLength(Result.ByName, 0); - FQuery.SQL.Text := 'SELECT src_link_offset, target_id FROM linkmap WHERE src_id = ' + IntToStr(FileID) + ' ORDER BY target_id ASC;'; - FQuery.Open; - SetLength(Result.ByID, FQuery.RecordCount); - if FQuery.RecordCount > 0 then - begin - i := 0; - repeat - Result.ByID[i].SrcOffset := FQuery.FieldByName('src_link_offset').AsInteger; - Result.ByID[i].Destination := FQuery.FieldByName('target_id').AsInteger; - Inc(i); - FQuery.Next; - until FQuery.EOF; - end; - FQuery.Close; -end; - function TAccess_OUP_ADB.GetFileInfo(fileid: Integer): TFileInfo; @@ -231,6 +216,14 @@ end; + function CompareItems(List: TStringList; I1, I2: Integer): Integer; + var + s1, s2: String; + begin + s1 := MidStr(List[I1], 1, PosEx(';', List[I1], 6) - 1); + s2 := MidStr(List[I2], 1, PosEx(';', List[I2], 6) - 1); + Result := CompareStr(s1, s2); + end; function TAccess_OUP_ADB.GetFilesList(ext: String; pattern: String; NoEmptyFiles: Boolean; SortType: TSortType): TStrings; @@ -271,7 +264,12 @@ var begin list := TStringList.Create; - list.Sorted := True; + if SortType in [ST_ExtNameAsc, ST_ExtNameDesc] then + list.Sorted := False + else + list.Sorted := True; + if ext = '*' then + ext := ''; for i := 0 to GetFileCount - 1 do begin if ((Length(ext) = 0) or (Pos(Fdat_files[i].Extension, ext) > 0)) and @@ -288,12 +286,15 @@ begin ST_IDAsc, ST_IDDesc: list.Add(id + ';' + name + ';' + extension); ST_NameAsc, ST_NameDesc: list.Add(name + ';' + id + ';' + extension); ST_ExtAsc, ST_ExtDesc: list.Add(extension + ';' + id + ';' + name); - ST_ExtNameAsc, ST_ExtNameDesc: list.Add(name + ';' + extension + ';' + id); + ST_ExtNameAsc, ST_ExtNameDesc: list.Add(extension + ';' + name + ';' + id); end; end; end; end; - Result := TStringList.Create; + if SortType in [ST_ExtNameAsc, ST_ExtNameDesc] then + list.CustomSort(CompareItems); + if not Assigned(Result) then + Result := TStringList.Create; if list.Count > 0 then begin fields := TStringList.Create; @@ -327,7 +328,10 @@ function TAccess_OUP_ADB.GetExtensionsLi var i: Integer; begin - Result := TStringList.Create; + if not Assigned(Result) then + Result := TStringList.Create; + if Result is TStringList then + TStringList(Result).Sorted := True; for i := 0 to Length(Fdat_extensionsmap) - 1 do begin with Fdat_extensionsmap[i] do @@ -441,12 +445,54 @@ begin end; + +function TAccess_OUP_ADB.GetDatLink(FileID, DatOffset: Integer): TDatLink; +begin + Result := DatLinksManager.GetDatLink(FConnectionID, FileID, DatOffset); + FQuery.SQL.Text := 'SELECT target_id FROM linkmap WHERE src_id = ' + IntToStr(FileID) + ' and src_link_offset = ' + IntToStr(DatOffset) + ';'; + FQuery.Open; + if FQuery.RecordCount > 0 then + Result.DestID := FQuery.FieldByName('target_id').AsInteger; + FQuery.Close; +end; + + +function TAccess_OUP_ADB.GetDatLinks(FileID: Integer): TDatLinkList; +var + i: Integer; + SrcOffset, DestID: Integer; +begin + Result := DatLinksManager.GetDatLinks(FConnectionID, FileID); + if Length(Result) > 0 then + begin + FQuery.SQL.Text := 'SELECT src_link_offset, target_id FROM linkmap WHERE src_id = ' + IntToStr(FileID) + ' ORDER BY src_link_offset ASC;'; + FQuery.Open; + if FQuery.RecordCount > 0 then + begin + repeat + SrcOffset := FQuery.FieldByName('src_link_offset').AsInteger; + DestID := FQuery.FieldByName('target_id').AsInteger; + for i := 0 to High(Result) do + if Result[i].SrcOffset = SrcOffset then + Break; + if i < Length(Result) then + Result[i].DestID := DestID + else + Result[i].DestID := -1; + FQuery.Next; + until FQuery.EOF; + end; + FQuery.Close; + end; +end; + + function TAccess_OUP_ADB.GetRawList(FileID: Integer): TRawDataList; var i: Integer; begin SetLength(Result, 0); - FQuery.SQL.Text := 'SELECT [src_link_offset],[size],[sep] FROM rawmap WHERE [src_id]=' + + FQuery.SQL.Text := 'SELECT [src_link_offset],[name],[size],[sep],[type] FROM rawmap WHERE [src_id]=' + IntToStr(fileid) + ' ORDER BY src_link_offset ASC;'; FQuery.Open; if FQuery.RecordCount > 0 then @@ -455,11 +501,13 @@ begin SetLength(Result, FQuery.RecordCount); i := 0; repeat + Result[i].Name := FQuery.FieldByName('name').AsString; Result[i].SrcID := fileid; Result[i].SrcOffset := FQuery.FieldByName('src_link_offset').AsInteger; Result[i].RawAddr := 0; Result[i].RawSize := FQuery.FieldByName('size').AsInteger; Result[i].LocSep := FQuery.FieldByName('sep').AsBoolean; + Result[i].RawType := FQuery.FieldByName('type').AsString; Inc(i); FQuery.Next; until FQuery.EOF; @@ -482,15 +530,48 @@ begin if i < Length(rawlist) then Result := rawlist[i] else begin + Result.Name := ''; Result.SrcID := -1; Result.SrcOffset := -1; Result.RawAddr := -1; Result.RawSize := -1; + Result.RawType := ''; end; end; end; +function TAccess_OUP_ADB.GetRawsForType(RawType: String): TRawDataList; +var + i: Integer; + rawlist: TRawDataList; +begin + SetLength(Result, 0); + FQuery.SQL.Text := 'SELECT [src_id],[src_link_offset],[name],[size],[sep] FROM rawmap ' + + 'WHERE [type]="' + RawType + '" and [size]>0 ORDER BY src_id ASC, src_link_offset ASC;'; + FQuery.Open; + if FQuery.RecordCount > 0 then + begin + FQuery.First; + SetLength(Result, FQuery.RecordCount); + i := 0; + repeat + Result[i].Name := FQuery.FieldByName('name').AsString; + Result[i].SrcID := FQuery.FieldByName('src_id').AsInteger; + Result[i].SrcOffset := FQuery.FieldByName('src_link_offset').AsInteger; + Result[i].RawAddr := 0; + Result[i].RawSize := FQuery.FieldByName('size').AsInteger; + Result[i].LocSep := FQuery.FieldByName('sep').AsBoolean; + Result[i].RawType := RawType; + Inc(i); + FQuery.Next; + until FQuery.EOF; + end; + FQuery.Close; +end; + + + procedure TAccess_OUP_ADB.LoadRawFile(FileID, DatOffset: Integer; var Target: TStream); var