Просмотр исходного кода

Install: add test PDO typing (#7651)

fix https://github.com/FreshRSS/FreshRSS/issues/7647
Alexandre Alapetite 10 месяцев назад
Родитель
Сommit
f620f16e2b
3 измененных файлов с 30 добавлено и 2 удалено
  1. 12 0
      app/Models/DatabaseDAO.php
  2. 13 1
      app/install.php
  3. 5 1
      lib/Minz/ModelPdo.php

+ 12 - 0
app/Models/DatabaseDAO.php

@@ -222,6 +222,18 @@ class FreshRSS_DatabaseDAO extends Minz_ModelPdo {
 		return str_contains($this->version(), 'MariaDB');
 	}
 
+	/**
+	 * @return bool true if the database PDO driver returns typed integer values as it should, false otherwise.
+	 */
+	final public function testTyping(): bool {
+		$sql = 'SELECT 2 + 3';
+		if (($stm = $this->pdo->query($sql)) !== false) {
+			$res = $stm->fetchAll(PDO::FETCH_COLUMN, 0);
+			return ($res[0] ?? null) === 5;
+		}
+		return false;
+	}
+
 	public function size(bool $all = false): int {
 		$db = FreshRSS_Context::systemConf()->db;
 

+ 13 - 1
app/install.php

@@ -234,6 +234,17 @@ function saveStep3(): bool {
 
 		$ok = false;
 		try {
+			Minz_ModelPdo::$usesSharedPdo = false;
+			$databaseDAO = FreshRSS_Factory::createDatabaseDAO(Minz_User::INTERNAL_USER);
+			if (!$databaseDAO->testTyping()) {
+				$message = 'Invalid PDO driver behaviour for selected database type!';
+				if (Minz_Session::paramString('bd_type') === 'mysql') {
+					$message .= ' MySQL requires mysqlnd.';
+				}
+				throw new Exception($message);
+			}
+			Minz_ModelPdo::$usesSharedPdo = true;
+
 			$ok = FreshRSS_user_Controller::createUser(
 				Minz_Session::paramString('default_user'),
 				'',	//TODO: Add e-mail
@@ -249,6 +260,7 @@ function saveStep3(): bool {
 			$ok = false;
 		}
 		if (!$ok) {
+			checkStep();
 			return false;
 		}
 
@@ -526,7 +538,7 @@ function printStep2(): void {
 	<p class="alert alert-success"><span class="alert-head"><?= _t('gen.short.ok') ?></span> <?= _t('install.bdd.conf.ok') ?></p>
 	<?php } elseif ($s2['conn'] == 'ko') { ?>
 	<p class="alert alert-error"><span class="alert-head"><?= _t('gen.short.damn') ?></span> <?= _t('install.bdd.conf.ko'),
-		(empty($_SESSION['bd_error']) || !is_string($_SESSION['bd_error']) ? '' : ' : ' . $_SESSION['bd_error']) ?></p>
+		(empty($_SESSION['bd_error']) || !is_string($_SESSION['bd_error']) ? '' : ' ' . $_SESSION['bd_error']) ?></p>
 	<?php } ?>
 
 	<h2><?= _t('install.bdd.conf') ?></h2>

+ 5 - 1
lib/Minz/ModelPdo.php

@@ -62,7 +62,11 @@ class Minz_ModelPdo {
 				$this->pdo->setPrefix($db['prefix'] . $this->current_user . '_');
 				break;
 			case 'sqlite':
-				$dsn = 'sqlite:' . DATA_PATH . '/users/' . $this->current_user . '/db.sqlite';
+				if (in_array($this->current_user, [null, '', Minz_User::INTERNAL_USER], true)) {
+					$dsn = 'sqlite::memory:';
+				} else {
+					$dsn = 'sqlite:' . DATA_PATH . '/users/' . $this->current_user . '/db.sqlite';
+				}
 				$this->pdo = new Minz_PdoSqlite($dsn . $dsnParams, null, null, $driver_options);
 				$this->pdo->setPrefix('');
 				break;