Windows: release SQLite (#6285)

* Windows: release SQLite
fix https://github.com/FreshRSS/FreshRSS/issues/6275

* Do not use sharedPdo for deleting user

* Case of same user

* Help PHPStan
This commit is contained in:
Alexandre Alapetite 2024-04-21 16:25:37 +02:00 committed by GitHub
parent b37404cce7
commit 90fbb524ce
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 20 additions and 4 deletions

View File

@ -389,8 +389,10 @@ class FreshRSS_user_Controller extends FreshRSS_ActionController {
$ok &= is_dir($user_data); $ok &= is_dir($user_data);
if ($ok) { if ($ok) {
FreshRSS_fever_Util::deleteKey($username); FreshRSS_fever_Util::deleteKey($username);
Minz_ModelPdo::$usesSharedPdo = false;
$oldUserDAO = FreshRSS_Factory::createUserDao($username); $oldUserDAO = FreshRSS_Factory::createUserDao($username);
$ok &= $oldUserDAO->deleteUser(); $ok &= $oldUserDAO->deleteUser();
Minz_ModelPdo::$usesSharedPdo = true;
$ok &= recursive_unlink($user_data); $ok &= recursive_unlink($user_data);
$filenames = glob(PSHB_PATH . '/feeds/*/' . $username . '.txt'); $filenames = glob(PSHB_PATH . '/feeds/*/' . $username . '.txt');
if (!empty($filenames)) { if (!empty($filenames)) {

View File

@ -32,6 +32,7 @@ class FreshRSS_UserDAO extends Minz_ModelPdo {
$ok = $this->pdo->exec($GLOBALS['SQL_DROP_TABLES']) !== false; $ok = $this->pdo->exec($GLOBALS['SQL_DROP_TABLES']) !== false;
if ($ok) { if ($ok) {
$this->close();
return true; return true;
} else { } else {
$info = $this->pdo->errorInfo(); $info = $this->pdo->errorInfo();

View File

@ -18,7 +18,7 @@ class Minz_ModelPdo {
private static ?Minz_Pdo $sharedPdo = null; private static ?Minz_Pdo $sharedPdo = null;
private static ?string $sharedCurrentUser; private static string $sharedCurrentUser = '';
protected Minz_Pdo $pdo; protected Minz_Pdo $pdo;
@ -78,7 +78,9 @@ class Minz_ModelPdo {
$db['user'], Minz_Exception::ERROR $db['user'], Minz_Exception::ERROR
); );
} }
self::$sharedPdo = $this->pdo; if (self::$usesSharedPdo) {
self::$sharedPdo = $this->pdo;
}
} }
/** /**
@ -97,7 +99,7 @@ class Minz_ModelPdo {
$this->pdo = $currentPdo; $this->pdo = $currentPdo;
return; return;
} }
if ($currentUser == '') { if ($currentUser == null) {
throw new Minz_PDOConnectionException('Current user must not be empty!', '', Minz_Exception::ERROR); throw new Minz_PDOConnectionException('Current user must not be empty!', '', Minz_Exception::ERROR);
} }
if (self::$usesSharedPdo && self::$sharedPdo !== null && $currentUser === self::$sharedCurrentUser) { if (self::$usesSharedPdo && self::$sharedPdo !== null && $currentUser === self::$sharedCurrentUser) {
@ -106,7 +108,9 @@ class Minz_ModelPdo {
return; return;
} }
$this->current_user = $currentUser; $this->current_user = $currentUser;
self::$sharedCurrentUser = $currentUser; if (self::$usesSharedPdo) {
self::$sharedCurrentUser = $currentUser;
}
$ex = null; $ex = null;
//Attempt a few times to connect to database //Attempt a few times to connect to database
@ -155,6 +159,15 @@ class Minz_ModelPdo {
self::$sharedCurrentUser = ''; self::$sharedCurrentUser = '';
} }
public function close(): void {
if ($this->current_user === self::$sharedCurrentUser) {
self::clean();
}
$this->current_user = '';
unset($this->pdo);
gc_collect_cycles();
}
/** /**
* @param array<string,int|string|null> $values * @param array<string,int|string|null> $values
* @phpstan-return ($mode is PDO::FETCH_ASSOC ? array<array<string,int|string|null>>|null : array<int|string|null>|null) * @phpstan-return ($mode is PDO::FETCH_ASSOC ? array<array<string,int|string|null>>|null : array<int|string|null>|null)