Răsfoiți Sursa

SQLite: Bug creation new users

Not tested much yet. Some MySQL parts changed a bit too to double-check.
https://github.com/marienfressinaud/FreshRSS/issues/574
Alexandre Alapetite 11 ani în urmă
părinte
comite
d477373ef2
3 a modificat fișierele cu 35 adăugiri și 21 ștergeri
  1. 22 13
      app/Models/UserDAO.php
  2. 1 0
      app/SQL/install.sql.sqlite.php
  3. 12 8
      lib/Minz/ModelPdo.php

+ 22 - 13
app/Models/UserDAO.php

@@ -4,18 +4,21 @@ class FreshRSS_UserDAO extends Minz_ModelPdo {
 	public function createUser($username) {
 		$db = Minz_Configuration::dataBase();
 		require_once(APP_PATH . '/SQL/install.sql.' . $db['type'] . '.php');
-		
-		if (defined('SQL_CREATE_TABLES')) {
+
+		$userPDO = new Minz_ModelPdo($username);
+
+		$ok = false;
+		if (defined('SQL_CREATE_TABLES')) {	//E.g. MySQL
 			$sql = sprintf(SQL_CREATE_TABLES, $db['prefix'] . $username . '_', Minz_Translate::t('default_category'));
-			$stm = $this->bd->prepare($sql);
+			$stm = $userPDO->bd->prepare($sql);
 			$ok = $stm && $stm->execute();
-		} else {
+		} else {	//E.g. SQLite
 			global $SQL_CREATE_TABLES;
 			if (is_array($SQL_CREATE_TABLES)) {
 				$ok = true;
 				foreach ($SQL_CREATE_TABLES as $instruction) {
 					$sql = sprintf($instruction, '', Minz_Translate::t('default_category'));
-					$stm = $c->prepare($sql);
+					$stm = $userPDO->bd->prepare($sql);
 					$ok &= ($stm && $stm->execute());
 				}
 			}
@@ -24,7 +27,7 @@ class FreshRSS_UserDAO extends Minz_ModelPdo {
 		if ($ok) {
 			return true;
 		} else {
-			$info = $stm == null ? array(2 => 'syntax error') : $stm->errorInfo();
+			$info = empty($stm) ? array(2 => 'syntax error') : $stm->errorInfo();
 			Minz_Log::record ('SQL error : ' . $info[2], Minz_Log::ERROR);
 			return false;
 		}
@@ -34,14 +37,20 @@ class FreshRSS_UserDAO extends Minz_ModelPdo {
 		$db = Minz_Configuration::dataBase();
 		require_once(APP_PATH . '/SQL/install.sql.' . $db['type'] . '.php');
 
-		$sql = sprintf(SQL_DROP_TABLES, $db['prefix'] . $username . '_');
-		$stm = $this->bd->prepare($sql);
-		if ($stm && $stm->execute()) {
-			return true;
+		if ($db['type'] === 'sqlite') {
+			return unlink(DATA_PATH . '/' . $username . '.sqlite');
 		} else {
-			$info = $stm == null ? array(2 => 'syntax error') : $stm->errorInfo();
-			Minz_Log::record ('SQL error : ' . $info[2], Minz_Log::ERROR);
-			return false;
+			$userPDO = new Minz_ModelPdo($username);
+
+			$sql = sprintf(SQL_DROP_TABLES, $db['prefix'] . $username . '_');
+			$stm = $userPDO->bd->prepare($sql);
+			if ($stm && $stm->execute()) {
+				return true;
+			} else {
+				$info = $stm == null ? array(2 => 'syntax error') : $stm->errorInfo();
+				Minz_Log::record ('SQL error : ' . $info[2], Minz_Log::ERROR);
+				return false;
+			}
 		}
 	}
 }

+ 1 - 0
app/SQL/install.sql.sqlite.php

@@ -1,4 +1,5 @@
 <?php
+global $SQL_CREATE_TABLES;
 $SQL_CREATE_TABLES = array(
 'CREATE TABLE IF NOT EXISTS `%1$scategory` (
 	`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,

+ 12 - 8
lib/Minz/ModelPdo.php

@@ -33,8 +33,8 @@ class Minz_ModelPdo {
 	 * Créé la connexion à la base de données à l'aide des variables
 	 * HOST, BASE, USER et PASS définies dans le fichier de configuration
 	 */
-	public function __construct() {
-		if (self::$useSharedBd && self::$sharedBd != null) {
+	public function __construct($currentUser = null) {
+		if (self::$useSharedBd && self::$sharedBd != null && $currentUser === null) {
 			$this->bd = self::$sharedBd;
 			$this->prefix = self::$sharedPrefix;
 			return;
@@ -42,6 +42,10 @@ class Minz_ModelPdo {
 
 		$db = Minz_Configuration::dataBase();
 
+		if ($currentUser === null) {
+			$currentUser = Minz_Session::param('currentUser', '_');
+		}
+
 		try {
 			$type = $db['type'];
 			if ($type === 'mysql') {
@@ -51,9 +55,9 @@ class Minz_ModelPdo {
 				$driver_options = array(
 					PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
 				);
-				$this->prefix = $db['prefix'] . Minz_Session::param('currentUser', '_') . '_';
+				$this->prefix = $db['prefix'] . $currentUser . '_';
 			} elseif ($type === 'sqlite') {
-				$string = 'sqlite:' . DATA_PATH . '/' . Minz_Session::param('currentUser', '_') . '.sqlite';
+				$string = 'sqlite:' . DATA_PATH . '/' . $currentUser . '.sqlite';
 				$driver_options = array(
 					//PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
 				);
@@ -67,7 +71,7 @@ class Minz_ModelPdo {
 			self::$sharedDbType = $type;
 			self::$sharedPrefix = $this->prefix;
 
-			$this->bd = new FreshPDO(
+			$this->bd = new MinzPDO(
 				$string,
 				$db['user'],
 				$db['password'],
@@ -98,7 +102,7 @@ class Minz_ModelPdo {
 	}
 }
 
-class FreshPDO extends PDO {
+class MinzPDO extends PDO {
 	private static function check($statement) {
 		if (preg_match('/^(?:UPDATE|INSERT|DELETE)/i', $statement)) {
 			invalidateHttpCache();
@@ -106,12 +110,12 @@ class FreshPDO extends PDO {
 	}
 
 	public function prepare($statement, $driver_options = array()) {
-		FreshPDO::check($statement);
+		MinzPDO::check($statement);
 		return parent::prepare($statement, $driver_options);
 	}
 
 	public function exec($statement) {
-		FreshPDO::check($statement);
+		MinzPDO::check($statement);
 		return parent::exec($statement);
 	}
 }