Einzelnen Beitrag anzeigen

QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.889 Beiträge
 
Delphi 12 Athens
 
#16

AW: SQLite mit passwort -303 unsupported feature

  Alt 11. Dez 2023, 10:39
Ich führe diesen Code noch vor dem Backup und Reorg der Sqlite Datenbank, beim start der App aus. Damit geht es.
Es befreit die Alte datenbank von dem Passwort und neue Datenbanken haben ja eh keins.
Delphi-Quellcode:
Function TDBHealth.CheckAndRemoveEncryption:Boolean;
Begin
  Result := False;
  TSync.DB_CS.Acquire;
  try
    var SQLiteSec := TFDSQLiteSecurity.Create(nil);
    try
      SQLiteSec.Database := FDatabase;
      SQLiteSec.Password := '';
      SQLiteSec.DriverLink := FPhysSQLiteDriverLink;
      var EncryptionStatus := SQliteSec.CheckEncryption;
      if EncryptionStatus = '<unencrypted>then
      Begin
        Result := true;
        TLog.d('TDBHealth.CheckAndRemoveEncryption: DB is unencrypted');
      End
      else if EncryptionStatus = '<encrypted>then
      Begin
        TLog.d('TDBHealth.CheckAndRemoveEncryption: Encrypted DB or corrupt file');
        TLog.d('TDBHealth.CheckAndRemoveEncryption: Check old DB-password start');
        SQLiteSec.Database := FDatabase;
        SQLiteSec.Password := TDBConstants.DBPASSWORD_OLD;
        EncryptionStatus := SQLiteSec.CheckEncryption;
        TLog.d('TDBHealth.CheckAndRemoveEncryption: Check old DB-password finish');
        if (EncryptionStatus <> '<unencrypted>') and
           (EncryptionStatus <> '<encrypted>') and
           (EncryptionStatus <> '') then
        Begin
          TLog.d('TDBHealth.CheckAndRemoveEncryption: DB is encrypted with old DB-password');
          TLog.d('TDBHealth.CheckAndRemoveEncryption: Decrypt DB start');
          try
            SQLiteSec.Database := FDatabase;
            SQLiteSec.Password := TDBConstants.DBPASSWORD_OLD;
            SQLiteSec.RemovePassword;
            Result := True;
          Except
            On E:Exception do
            Begin
              fCheckDBhealthError := 'Beim entschlüsseln der Datenbank ist folgender Fehler aufgetretetn:' +
                                     sLinebreak + e.message + slinebreak+
                                     'Die Datenbank ist vermutlich defekt.'  ;
             TLog.d('TDBHealth.CheckAndRemoveEncryption: Decrypt DB Error:' + e.message);
            End;
          end;
          TLog.d('TDBHealth.CheckAndRemoveEncryption: Decrypt DB finish');
        End
        else
        Begin
          //Fehler;
          fCheckDBhealthError := 'Beim Login in die SQLite Datenbank ist folgender Fehler aufgetretetn:' +
                                  sLinebreak + EncryptionStatus + slinebreak+
                                 'Die Datenbank ist vermutlich defekt.' ;
          TLog.d('TDBHealth.CheckAndRemoveEncryption: Error checking for encryption with old password returned:'+EncryptionStatus);
        End;
      End
      else if EncryptionStatus = 'then
      Begin
        //Fehler;// Sollte man es dann nochmal mit passwort versuchen?
        fCheckDBhealthError := 'Unknown error checking for unencrypted access. The DB is probably corrupt.';
        TLog.d('TDBHealth.CheckAndRemoveEncryption: Unknown error checking for unencrypted access. The DB is probably corrupt.');
      End;
    finally
      SQLiteSec.Free;
    end;
  finally
    TSync.DB_CS.Release;
  end;
End;
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat