--- oup/rewrite/DataAccess/Access_OUP_ADB.pas 2007/02/20 20:43:29 101 +++ oup/current/DataAccess/Access_OUP_ADB.pas 2007/03/28 17:53:54 134 @@ -17,6 +17,8 @@ type procedure UpdateListCache; + function GetLinksToFile(FileID: Integer): TLinks; + function GetFileInfo(FileID: Integer): TFileInfo; override; function GetFilesList(Ext: String; Pattern: String; NoEmptyFiles: Boolean; SortType: TSortType): TStrings; override; @@ -28,6 +30,8 @@ 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; @@ -42,7 +46,7 @@ type implementation uses - SysUtils, Data, Functions, ABSDecUtil, DB; + SysUtils, Data, Functions, ABSDecUtil, DB, DatLinks; (* @@ -52,8 +56,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 @@ -64,10 +66,13 @@ 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.DatabaseName := 'OLDBcon' + IntToStr(ConnectionID); FQuery.SQL.Text := 'SELECT [name],[value] FROM globals ORDER BY [name] ASC'; FQuery.Open; @@ -102,6 +107,7 @@ begin Msg := SM_OK; FBackend := DB_ADB; + FConnectionID := ConnectionID; FChangeRights := [CR_EditDat, CR_EditRaw, CR_ResizeDat, CR_ResizeRaw]; UpdateListCache; @@ -137,7 +143,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; @@ -167,6 +173,30 @@ begin end; + +function TAccess_OUP_ADB.GetLinksToFile(FileID: Integer): TLinks; +var + i: Integer; +begin + SetLength(Result.ByName, 0); + FQuery.SQL.Text := 'SELECT src_link_offset, src_id FROM linkmap WHERE target_id = ' + IntToStr(FileID) + ' ORDER BY src_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('src_id').AsInteger; + Inc(i); + FQuery.Next; + until FQuery.EOF; + end; + FQuery.Close; +end; + + + function TAccess_OUP_ADB.GetFileInfo(fileid: Integer): TFileInfo; begin if fileid = -1 then @@ -212,6 +242,12 @@ var name := fields.Strings[2]; extension := fields.Strings[0]; end; + if SortType in [ST_ExtNameAsc, ST_ExtNameDesc] then + begin + id := fields.Strings[2]; + name := fields.Strings[1]; + extension := fields.Strings[0]; + end; end; begin @@ -225,10 +261,7 @@ begin begin if (NoEmptyFiles = False) or ((Fdat_files[i].FileType and $02) = 0) then begin - if AppSettings.FilenumbersAsHex then - id := IntToHex(Fdat_files[i].ID, 4) - else - id := FormatNumber(Fdat_files[i].ID, 5, '0'); + id := FormatNumber(Fdat_files[i].ID, 5, '0'); name := Fdat_files[i].Name; extension := Fdat_files[i].Extension; @@ -236,15 +269,17 @@ 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); end; end; end; end; - Result := TStringList.Create; + if not Assigned(Result) then + Result := TStringList.Create; if list.Count > 0 then begin fields := TStringList.Create; - if SortType in [ST_IDAsc, ST_NameAsc, ST_ExtAsc] then + if SortType in [ST_IDAsc, ST_NameAsc, ST_ExtAsc, ST_ExtNameAsc] then for i := 0 to list.Count - 1 do begin getfields; @@ -274,7 +309,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 @@ -387,6 +425,48 @@ begin end; 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