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 |
|
|