1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
function PackTable(aNomDeLaTable : String; aReindexer : Boolean) : Boolean;
var
Tbl : TTable;
cProps : CURProps;
hDb : hDBIDb;
TblDesc : CRTblDesc;
begin
Result := False;
Tbl := TTable.Create(nil);
try
with Tbl do
begin
Active := False;
// Le chemin d'accès de la table
DatabaseName := ExtractFilePath(aNomDeLaTable);
// Le nom de la table paradox
TableName := ExtractFileName(aNomDeLaTable);
// Ouverture en mode exclusif
Exclusive := True;
Open;
end;
// Le chemin courant est utilisé de façon temporaire pour le pack
SetCurrentDir(ExtractFilePath(aNomDeLaTable));
// Il faut être sûr que la table soit ouverte (et de manière exclusive)
if not tbl.Active then
begin
// La fonction renverra false
// raise EDatabaseError.Create('La table doit être ouverte pour la compacter');
Exit;
end;
if not tbl.Exclusive then
begin
// La fonction renverra false
// raise EDatabaseError.Create('La table doit être ouverte de manière exclusive pour la compacter');
Exit;
end;
// Recherche les propriétés de la table pour déterminer son type
// Check(DbiGetCursorProps(tbl.Handle, cProps));
if DbiGetCursorProps(tbl.Handle, cProps) <> DBIERR_NONE then
begin
// La fonction renverra false
Exit;
end;
// Si la table est une table Paradox, on la compacte
if (cProps.szTableType = szPARADOX) then
begin
// Préparation d'une structure vide...
FillChar(TblDesc, SizeOf(TblDesc), 0);
// Obtient le handle de la table
// Check(DbiGetObjFromObj(hDBIObj(tbl.Handle), objDATABASE, hDBIObj(hDb)));
if (DbiGetObjFromObj(hDBIObj(tbl.Handle), objDATABASE, hDBIObj(hDb)) <> DBIERR_NONE) then
begin
// La fonction renverra false
Exit;
end;
// On remplit le nom de la table dans la description de table...
StrPCopy(TblDesc.szTblName, tbl.TableName);
// On remplit le type de la table dans la description de table...
StrPCopy(TblDesc.szTblType, cProps.szTableType);
// Coche l'option de compactage dans la description de table...
TblDesc.bPack := True;
// Ferme la table pour que la restructuration soit effective...
Tbl.Close;
// Appel de DbiDoRestructure qui effectue le compactage demandé...
// Check(DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, aReindexer));
Result := (DbiDoRestructure(hDb, 1, @TblDesc, nil, nil, nil, aReindexer) = DBIERR_NONE);
end
else
// Compactage de table Paradox uniquement
Result := False; // raise EDatabaseError.Create('Compactage de table paradox uniquement !');
finally
if Tbl.Active then
Tbl.Close;
Tbl.Free;
end;
end; |
Partager