procedure TMyThread.Execute;
var
cmd: TSQLQuery;
i: Integer;
attr: DWord;
sql, sattr, md5code, accfp, filePath: String;
lastProgress: Integer;
trans: TSQLTransaction;
c, m, a: FileTime;
csh, csl, msh, msl, ash, asl, ats: String;
begin
connAccess := TODBCConnection.Create(pForm);
connAccess.Driver := RegistryGetAccessDriver();
connAccess.Params.Add('DBQ=' + dbpath);
connAccess.Params.Add('DSN=test');
connAccess.Params.Add('Locale Identifier=1031');
connAccess.Params.Add('ExtendedAnsiSQL=1');
connAccess.Params.Add('CHARSET=ansi');
connAccess.Connected := True;
connAccess.KeepConnection := True;
trans := TSQLTransaction.Create(pForm);
trans.DataBase := connAccess;
trans.Active := True;
cmd := TSQLQuery.Create(pForm);
cmd.DataBase := connAccess;
cmd.Transaction := trans;
cmd.UsePrimaryKeyAsKey := False;
// vytvoření tabulky – čistý Access SQL
cmd.SQL.Text :=
'CREATE TABLE fHash('+
'id COUNTER NOT NULL,'+
'path String,'+
'hash String,'+
'attr TEXT(20),'+
'dcreatedh TEXT(20), dcreatedl TEXT(20),'+
'dmodifiedh TEXT(20), dmodifiedl TEXT(20),'+
'daccessh TEXT(20), daccessl TEXT(20))';
cmd.ExecSQL;
trans.Commit;
trans.Active := True;
// můžeš optional udělat trans.Commit + trans.Active := True, ale pro Access to není nutné, pokud zůstaneš v jedné session
self.progress := 1;
Synchronize(@Showstatus);
cmd.SQL.Text :=
'INSERT INTO fHash(path,hash,attr,dcreatedh,dcreatedl,dmodifiedh,dmodifiedl,daccessh,daccessl) '+
'VALUES (?,?,?,?,?,?,?,?,?)';
cmd.Params.Clear;
cmd.Params.CreateParam(ftString, 'p1', ptInput);
cmd.Params.CreateParam(ftString, 'p2', ptInput);
cmd.Params.CreateParam(ftString, 'p3', ptInput).Size := 20; // attr
cmd.Params.CreateParam(ftString, 'p4', ptInput).Size := 20;
cmd.Params.CreateParam(ftString, 'p5', ptInput).Size := 20;
cmd.Params.CreateParam(ftString, 'p6', ptInput).Size := 20;
cmd.Params.CreateParam(ftString, 'p7', ptInput).Size := 20;
cmd.Params.CreateParam(ftString, 'p8', ptInput).Size := 20;
cmd.Params.CreateParam(ftString, 'p9', ptInput).Size := 20;
for i := 0 to work.Count - 1 do
begin
filePath := work[i];
md5code := MurmurHash3File(filePath);
GetFileDates2(filePath, c, m, a, attr);
if Length(filePath) > 255 then
ShowMessage('PATH TOO LONG: ' + IntToStr(Length(filePath)));
str(c.dwHighDateTime, csh); str(c.dwLowDateTime, csl);
str(m.dwHighDateTime, msh); str(m.dwLowDateTime, msl);
str(a.dwHighDateTime, ash); str(a.dwLowDateTime, asl);
str(attr, ats);
cmd.Params[0].AsString := filePath;
cmd.Params[1].AsString := md5code;
cmd.Params[2].AsString := ats;
cmd.Params[3].AsString := csh;
cmd.Params[4].AsString := csl;
cmd.Params[5].AsString := msh;
cmd.Params[6].AsString := msl;
cmd.Params[7].AsString := ash;
cmd.Params[8].AsString := asl;
cmd.Prepare;
cmd.ExecSQL;
lastProgress := self.progress;
self.progress := (1000 * i) div (work.Count - 1);
if lastProgress <> self.progress then
Synchronize(@Showstatus);
end;
cmd.Free;
trans.Commit;
trans.Free;
connAccess.Free;
Synchronize(@Finished);
end;