Overview
Comment:Vérification des clés étrangères à l'import
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | dev
Files: files | file ages | folders
SHA1: 9d57ccacf4d9bff39dab7ebd92eb178b5bf9358c
User & Date: bohwaz on 2019-02-15 10:13:29
Original Comment: Suppression espaces supplémentaires
Other Links: branch diff | manifest | tags
Context
2019-02-15
10:15
Suppression espaces supplémentaires check-in: 11ae7223d0 user: bohwaz tags: dev
10:13
Vérification des clés étrangères à l'import check-in: 9d57ccacf4 user: bohwaz tags: dev
2019-02-14
17:11
Débuts de la màj 0.10.0 check-in: 636b063ed2 user: bohwaz tags: dev
Changes

Modified src/include/lib/Garradin/Sauvegarde.php from [66b6709354] to [df83bd896f].

   223    223   			}
   224    224   			elseif ($integrity === false)
   225    225   			{
   226    226   				throw new UserException('Le fichier fourni a été modifié par un programme externe.', self::INTEGRITY_FAIL);
   227    227   			}
   228    228   		}
   229    229   
   230         -		$r = $this->restoreDB($file['tmp_name'], $user_id);
          230  +		$r = $this->restoreDB($file['tmp_name'], $user_id, true);
   231    231   
   232    232   		if ($r)
   233    233   		{
   234    234   			Utils::safe_unlink($file['tmp_name']);
   235    235   		}
   236    236   
   237    237   		return $r;
................................................................................
   285    285   
   286    286   	/**
   287    287   	 * Restauration de base de données, la fonction qui le fait vraiment
   288    288   	 * @param  string $file Chemin absolu vers la base de données à utiliser
   289    289   	 * @return mixed 		true si rien ne va plus, ou self::NEED_UPGRADE si la version de la DB
   290    290   	 * ne correspond pas à la version de Garradin (mise à jour nécessaire).
   291    291   	 */
   292         -	protected function restoreDB($file, $user_id = false)
          292  +	protected function restoreDB($file, $user_id = false, $check_foreign_keys = false)
   293    293   	{
   294    294   		$return = 1;
   295    295   
   296    296   		// Essayons déjà d'ouvrir la base de données à restaurer en lecture
   297    297   		try {
   298         -			$db = new \SQLite3($file, SQLITE3_OPEN_READONLY);
          298  +			$db = new \SQLite3($file, \SQLITE3_OPEN_READONLY);
   299    299   		}
   300    300   		catch (\Exception $e)
   301    301   		{
   302    302   			throw new UserException('Le fichier fourni n\'est pas une base de données valide. ' .
   303    303   				'Message d\'erreur de SQLite : ' . $e->getMessage(), self::NOT_A_DB);
   304    304   		}
   305    305   
................................................................................
   314    314   				'Message d\'erreur de SQLite : ' . $e->getMessage(), self::NOT_A_DB);
   315    315   		}
   316    316   
   317    317   		if (strtolower(trim($check)) != 'ok')
   318    318   		{
   319    319   			throw new UserException('Le fichier fourni est corrompu. SQLite a trouvé ' . $check . ' erreurs.');
   320    320   		}
          321  +
          322  +		if ($check_foreign_keys)
          323  +		{
          324  +			$check = $db->querySingle('PRAGMA foreign_key_check;');
          325  +
          326  +			if ($check)
          327  +			{
          328  +				throw new UserException('Le fichier fourni est corrompu. Certaines clés étrangères référencent des lignes qui n\'existent pas.');
          329  +			}
          330  +		}
   321    331   
   322    332   		// On ne peut pas faire de vérifications très poussées sur la structure de la base de données,
   323    333   		// celle-ci pouvant changer d'une version à l'autre et on peut vouloir importer une base
   324    334   		// un peu vieille, mais on vérifie quand même que ça ressemble un minimum à une base garradin
   325    335   		$table = $db->querySingle('SELECT 1 FROM sqlite_master WHERE type=\'table\' AND tbl_name=\'config\';');
   326    336   
   327    337   		if (!$table)