| 1 |
|
unit OniDataClass; |
| 2 |
|
interface |
| 3 |
|
uses Data, DataStructures, Classes, SysUtils, StrUtils, |
| 4 |
< |
Dialogs, ABSDecUtil, ABSMain, DB; |
| 4 |
> |
Dialogs, ABSDecUtil, ABSMain, DB, Windows; |
| 5 |
|
|
| 6 |
|
type |
| 7 |
|
TOniData = class |
| 102 |
|
private |
| 103 |
|
FDatabase: TABSDatabase; |
| 104 |
|
FQuery: TABSQuery; |
| 105 |
+ |
Fdat_files: TFiles; |
| 106 |
+ |
Fdat_extensionsmap: TExtensionsMap; |
| 107 |
|
protected |
| 108 |
|
public |
| 109 |
|
constructor Create(OLDBFilename: String; var Result: Boolean); override; |
| 110 |
|
procedure Close; override; |
| 111 |
|
|
| 112 |
+ |
procedure UpdateListCache; |
| 113 |
|
// function GetDatLinks(srcid:LongWord):TDatLinks; |
| 114 |
|
function GetFileInfo(fileid: LongWord): TFileInfo; override; |
| 115 |
|
function GetFilesList(ext: String; pattern: String; |
| 851 |
|
until FQuery.EOF; |
| 852 |
|
FQuery.Close; |
| 853 |
|
|
| 854 |
+ |
UpdateListCache; |
| 855 |
+ |
|
| 856 |
|
Result := True; |
| 857 |
|
FBackend := ODB_ADB; |
| 858 |
|
end; |
| 869 |
|
|
| 870 |
|
|
| 871 |
|
|
| 872 |
+ |
procedure TOniDataADB.UpdateListCache; |
| 873 |
+ |
var |
| 874 |
+ |
i: LongWord; |
| 875 |
+ |
temps: String; |
| 876 |
+ |
begin |
| 877 |
+ |
FQuery.SQL.Text := 'SELECT id,name,extension,[size],contenttype FROM datfiles ORDER BY id ASC;'; |
| 878 |
+ |
FQuery.Open; |
| 879 |
+ |
if FQuery.RecordCount > 0 then |
| 880 |
+ |
begin |
| 881 |
+ |
FQuery.First; |
| 882 |
+ |
SetLength(Fdat_files, FQuery.RecordCount); |
| 883 |
+ |
i := 0; |
| 884 |
+ |
repeat |
| 885 |
+ |
Fdat_files[i].ID := FQuery.FieldByName('id').AsInteger; |
| 886 |
+ |
Fdat_files[i].Name := FQuery.FieldByName('name').AsString; |
| 887 |
+ |
Fdat_files[i].Extension := FQuery.FieldByName('extension').AsString; |
| 888 |
+ |
Fdat_files[i].FileName := FormatNumber(Fdat_files[i].ID, 5, '0') + '-' + |
| 889 |
+ |
Fdat_files[i].Name + '.' + Fdat_files[0].Extension; |
| 890 |
+ |
Fdat_files[i].FileNameHex := IntToHex(Fdat_files[i].ID, 4) + '-' + |
| 891 |
+ |
Fdat_files[i].Name + '.' + Fdat_files[0].Extension; |
| 892 |
+ |
Fdat_files[i].Size := FQuery.FieldByName('size').AsInteger; |
| 893 |
+ |
Fdat_files[i].FileType := HexToLong(FQuery.FieldByName('contenttype').AsString); |
| 894 |
+ |
Fdat_files[i].DatAddr := 0; |
| 895 |
+ |
Fdat_files[i].opened := False; |
| 896 |
+ |
Inc(i); |
| 897 |
+ |
FQuery.Next; |
| 898 |
+ |
until FQuery.EOF; |
| 899 |
+ |
end; |
| 900 |
+ |
FQuery.Close; |
| 901 |
+ |
|
| 902 |
+ |
SetLength(Fdat_extensionsmap, 0); |
| 903 |
+ |
FQuery.SQL.Text := |
| 904 |
+ |
'SELECT extension,count(extension) AS x FROM datfiles GROUP BY extension ORDER BY extension ASC;'; |
| 905 |
+ |
FQuery.Open; |
| 906 |
+ |
if FQuery.RecordCount > 0 then |
| 907 |
+ |
begin |
| 908 |
+ |
SetLength(Fdat_extensionsmap, FQuery.RecordCount); |
| 909 |
+ |
i := 0; |
| 910 |
+ |
repeat |
| 911 |
+ |
temps := FQuery.FieldByName('extension').AsString[1]; |
| 912 |
+ |
Fdat_extensionsmap[i].Extension[3] := temps[1]; |
| 913 |
+ |
Fdat_extensionsmap[i].Extension[2] := temps[2]; |
| 914 |
+ |
Fdat_extensionsmap[i].Extension[1] := temps[3]; |
| 915 |
+ |
Fdat_extensionsmap[i].Extension[0] := temps[4]; |
| 916 |
+ |
Fdat_extensionsmap[i].ExtCount := FQuery.FieldByName('x').AsInteger; |
| 917 |
+ |
Inc(i); |
| 918 |
+ |
FQuery.Next; |
| 919 |
+ |
until FQuery.EOF; |
| 920 |
+ |
end; |
| 921 |
+ |
FQuery.Close; |
| 922 |
+ |
end; |
| 923 |
+ |
|
| 924 |
|
|
| 925 |
|
function TOniDataADB.GetFileInfo(fileid: LongWord): TFileInfo; |
| 926 |
+ |
var |
| 927 |
+ |
i: Integer; |
| 928 |
|
begin |
| 929 |
|
if fileid < Self.GetFilesCount then |
| 930 |
|
begin |
| 931 |
< |
FQuery.SQL.Text := 'SELECT * FROM datfiles WHERE id=' + IntToStr( |
| 932 |
< |
fileid) + ' ORDER BY id ASC;'; |
| 933 |
< |
FQuery.Open; |
| 934 |
< |
if FQuery.RecordCount = 1 then |
| 935 |
< |
begin |
| 936 |
< |
FQuery.First; |
| 937 |
< |
Result.ID := FQuery.FieldByName('id').AsInteger; |
| 879 |
< |
Result.Name := FQuery.FieldByName('name').AsString; |
| 880 |
< |
Result.Extension := FQuery.FieldByName('extension').AsString; |
| 881 |
< |
Result.FileName := FormatNumber(Result.ID, 5, '0') + '-' + Result.Name + '.' + |
| 882 |
< |
Result.Extension; |
| 883 |
< |
Result.Size := FQuery.FieldByName('size').AsInteger; |
| 884 |
< |
Result.FileType := HexToLong(FQuery.FieldByName('contenttype').AsString); |
| 885 |
< |
Result.DatAddr := 0; |
| 886 |
< |
Result.opened := False; |
| 887 |
< |
end; |
| 888 |
< |
FQuery.Close; |
| 931 |
> |
for i := 0 to High(Fdat_files) do |
| 932 |
> |
if Fdat_files[i].ID = fileid then |
| 933 |
> |
Break; |
| 934 |
> |
if i < Length(Fdat_files) then |
| 935 |
> |
Result := Fdat_files[i] |
| 936 |
> |
else |
| 937 |
> |
Result.ID := -1; |
| 938 |
|
end |
| 939 |
|
else |
| 940 |
|
begin |
| 948 |
|
function TOniDataADB.GetFilesList(ext: String; pattern: String; |
| 949 |
|
NoEmptyFiles: Boolean; sort: TSortType): TStringArray; |
| 950 |
|
var |
| 951 |
< |
i: LongWord; |
| 952 |
< |
where: String; |
| 953 |
< |
where_ext: String; |
| 954 |
< |
order: String; |
| 955 |
< |
begin |
| 956 |
< |
where := ''; |
| 957 |
< |
if Length(ext) > 0 then |
| 958 |
< |
begin |
| 959 |
< |
if Length(where) > 0 then |
| 911 |
< |
where := where + ' AND '; |
| 912 |
< |
if Pos(',', ext) > 0 then |
| 913 |
< |
begin |
| 914 |
< |
i := 1; |
| 915 |
< |
where_ext := ''; |
| 916 |
< |
while i < Length(ext) do |
| 917 |
< |
begin |
| 918 |
< |
if Length(where_ext) > 0 then |
| 919 |
< |
where_ext := where_ext + ' OR '; |
| 920 |
< |
where_ext := where_ext + '(extension="' + MidStr(ext, i, 4) + '")'; |
| 921 |
< |
i := i + 5; |
| 922 |
< |
end; |
| 923 |
< |
where := where + '(' + where_ext + ')'; |
| 924 |
< |
end |
| 925 |
< |
else |
| 951 |
> |
i: LongWord; |
| 952 |
> |
list: TStringList; |
| 953 |
> |
id, name, extension: String; |
| 954 |
> |
fields: TStrings; |
| 955 |
> |
|
| 956 |
> |
procedure getfields; |
| 957 |
> |
begin |
| 958 |
> |
fields.CommaText := StringReplace(AnsiQuotedStr(list.Strings[i], '"'), ';', '","', [rfReplaceAll]); |
| 959 |
> |
if sort in [stIDAsc, stIDDesc] then |
| 960 |
|
begin |
| 961 |
< |
where := where + '(extension="' + ext + '")'; |
| 961 |
> |
id := fields.Strings[0]; |
| 962 |
> |
name := fields.Strings[1]; |
| 963 |
> |
extension := fields.Strings[2]; |
| 964 |
> |
end; |
| 965 |
> |
if sort in [stNameAsc, stNameDesc] then |
| 966 |
> |
begin |
| 967 |
> |
id := fields.Strings[1]; |
| 968 |
> |
name := fields.Strings[0]; |
| 969 |
> |
extension := fields.Strings[2]; |
| 970 |
> |
end; |
| 971 |
> |
if sort in [stExtAsc, stExtDesc] then |
| 972 |
> |
begin |
| 973 |
> |
id := fields.Strings[1]; |
| 974 |
> |
name := fields.Strings[2]; |
| 975 |
> |
extension := fields.Strings[0]; |
| 976 |
|
end; |
| 977 |
|
end; |
| 978 |
< |
if Length(pattern) > 0 then |
| 979 |
< |
begin |
| 980 |
< |
if Length(where) > 0 then |
| 981 |
< |
where := where + ' AND '; |
| 982 |
< |
where := where + '(name LIKE "%' + pattern + '%")'; |
| 935 |
< |
end; |
| 936 |
< |
if NoEmptyFiles then |
| 937 |
< |
begin |
| 938 |
< |
if Length(where) > 0 then |
| 939 |
< |
where := where + ' AND '; |
| 940 |
< |
where := where + '(contenttype<>2)'; |
| 941 |
< |
end; |
| 942 |
< |
if Length(where) > 0 then |
| 943 |
< |
where := ' WHERE ' + where; |
| 944 |
< |
case sort of |
| 945 |
< |
stIDAsc: order := ' ORDER BY id ASC'; |
| 946 |
< |
stIDDesc: order := ' ORDER BY id DESC'; |
| 947 |
< |
stNameAsc: order := ' ORDER BY name ASC, id ASC'; |
| 948 |
< |
stNameDesc: order := ' ORDER BY name DESC, id ASC'; |
| 949 |
< |
stExtAsc: order := ' ORDER BY extension ASC, id ASC'; |
| 950 |
< |
stExtDesc: order := ' ORDER BY extension DESC, id ASC'; |
| 951 |
< |
end; |
| 952 |
< |
FQuery.SQL.Text := 'SELECT id,name,extension FROM datfiles' + where + order + ';'; |
| 953 |
< |
FQuery.Open; |
| 954 |
< |
if FQuery.RecordCount > 0 then |
| 978 |
> |
|
| 979 |
> |
begin |
| 980 |
> |
list := TStringList.Create; |
| 981 |
> |
list.Sorted := True; |
| 982 |
> |
for i := 0 to High(Fdat_files) do |
| 983 |
|
begin |
| 984 |
< |
FQuery.First; |
| 985 |
< |
SetLength(Result, FQuery.RecordCount); |
| 986 |
< |
i := 0; |
| 987 |
< |
repeat |
| 988 |
< |
Result[i] := FormatNumber(FQuery.FieldByName('id').AsInteger, 5, '0') + '-' + |
| 989 |
< |
FQuery.FieldByName('name').AsString + '.' + FQuery.FieldByName('extension').AsString; |
| 990 |
< |
Inc(i); |
| 991 |
< |
FQuery.Next; |
| 992 |
< |
until FQuery.EOF; |
| 984 |
> |
if ((Length(ext) = 0) or (Pos(Fdat_files[i].Extension, ext) > 0)) and |
| 985 |
> |
((Length(pattern) = 0) or |
| 986 |
> |
(Pos(UpperCase(pattern), UpperCase(Fdat_files[i].Name)) > 0)) then |
| 987 |
> |
begin |
| 988 |
> |
if (NoEmptyFiles = False) or ((Fdat_files[i].FileType and $02) = 0) then |
| 989 |
> |
begin |
| 990 |
> |
if AppSettings.FilenumbersAsHex then |
| 991 |
> |
id := IntToHex(Fdat_files[i].ID, 4) |
| 992 |
> |
else |
| 993 |
> |
id := FormatNumber(Fdat_files[i].ID, 5, '0'); |
| 994 |
> |
name := Fdat_files[i].Name; |
| 995 |
> |
extension := Fdat_files[i].Extension; |
| 996 |
> |
|
| 997 |
> |
case sort of |
| 998 |
> |
stIDAsc, stIDDesc: list.Add(id + ';' + name + ';' + extension); |
| 999 |
> |
stNameAsc, stNameDesc: list.Add(name + ';' + id + ';' + extension); |
| 1000 |
> |
stExtAsc, stExtDesc: list.Add(extension + ';' + id + ';' + name); |
| 1001 |
> |
end; |
| 1002 |
> |
end; |
| 1003 |
> |
end; |
| 1004 |
|
end; |
| 1005 |
< |
FQuery.Close; |
| 1005 |
> |
SetLength(Result, list.Count); |
| 1006 |
> |
fields := TStringList.Create; |
| 1007 |
> |
if sort in [stIDAsc, stNameAsc, stExtAsc] then |
| 1008 |
> |
for i := 0 to list.Count - 1 do |
| 1009 |
> |
begin |
| 1010 |
> |
getfields; |
| 1011 |
> |
Result[i] := id + '-' + name + '.' + extension; |
| 1012 |
> |
end |
| 1013 |
> |
else |
| 1014 |
> |
for i := list.Count - 1 downto 0 do |
| 1015 |
> |
begin |
| 1016 |
> |
getfields; |
| 1017 |
> |
Result[list.Count - i - 1] := id + '-' + name + '.' + extension; |
| 1018 |
> |
end; |
| 1019 |
> |
list.Free; |
| 1020 |
> |
fields.Free; |
| 1021 |
|
end; |
| 1022 |
|
|
| 1023 |
|
|
| 1025 |
|
|
| 1026 |
|
function TOniDataADB.GetFilesCount: LongWord; |
| 1027 |
|
begin |
| 1028 |
< |
FQuery.SQL.Text := 'SELECT Count(*) AS cnumber FROM datfiles;'; |
| 975 |
< |
FQuery.Open; |
| 976 |
< |
if FQuery.RecordCount > 0 then |
| 977 |
< |
begin |
| 978 |
< |
FQuery.First; |
| 979 |
< |
Result := FQuery.FieldByName('cnumber').AsInteger; |
| 980 |
< |
end |
| 981 |
< |
else |
| 982 |
< |
Result := 0; |
| 983 |
< |
FQuery.Close; |
| 1028 |
> |
Result := Length(Fdat_files); |
| 1029 |
|
end; |
| 1030 |
|
|
| 1031 |
|
|
| 1035 |
|
var |
| 1036 |
|
i: LongWord; |
| 1037 |
|
begin |
| 1038 |
< |
SetLength(Result, 0); |
| 1039 |
< |
FQuery.SQL.Text := |
| 995 |
< |
'SELECT extension,count(extension) AS x FROM datfiles GROUP BY extension ORDER BY extension ASC;'; |
| 996 |
< |
FQuery.Open; |
| 997 |
< |
if FQuery.RecordCount > 0 then |
| 1038 |
> |
SetLength(Result, Length(Fdat_extensionsmap)); |
| 1039 |
> |
for i := 0 to High(Result) do |
| 1040 |
|
begin |
| 1041 |
< |
SetLength(Result, FQuery.RecordCount); |
| 1042 |
< |
i := 0; |
| 1043 |
< |
repeat |
| 1044 |
< |
Result[i] := FQuery.FieldByName('extension').AsString + ' (' + |
| 1045 |
< |
IntToStr(FQuery.FieldByName('x').AsInteger) + ')'; |
| 1004 |
< |
Inc(i); |
| 1005 |
< |
FQuery.Next; |
| 1006 |
< |
until FQuery.EOF; |
| 1041 |
> |
with Fdat_extensionsmap[i] do |
| 1042 |
> |
begin |
| 1043 |
> |
Result[i] := Extension[3] + Extension[2] + Extension[1] + Extension[0] + |
| 1044 |
> |
' (' + IntToStr(ExtCount) + ')'; |
| 1045 |
> |
end; |
| 1046 |
|
end; |
| 1008 |
– |
FQuery.Close; |
| 1047 |
|
end; |
| 1048 |
|
|
| 1049 |
|
|
| 1176 |
|
mem.Write(Data[0], Length(Data)); |
| 1177 |
|
mem.Seek(0, soFromBeginning); |
| 1178 |
|
FQuery.SQL.Text := 'UPDATE datfiles SET data=MimeToBin("' + |
| 1179 |
< |
MimeCoder.StrTo(mem.Memory, mem.Size) + '") WHERE id=' + IntToStr(fileid) + ';'; |
| 1179 |
> |
MimeCoder.StrTo(mem.Memory, mem.Size) + '"), size=' + IntToStr(mem.Size) + |
| 1180 |
> |
' WHERE id=' + IntToStr(fileid) + ';'; |
| 1181 |
|
FQuery.ExecSQL; |
| 1182 |
|
mem.Free; |
| 1183 |
|
mimecoder.Free; |
| 1184 |
|
end; |
| 1185 |
+ |
UpdateListCache; |
| 1186 |
|
end; |
| 1187 |
|
|
| 1188 |
|
|