From 84547358ec38473cc1725affbebde7fe7c945bd1 Mon Sep 17 00:00:00 2001 From: Jaime Perez Crespo <jaime.perez@uninett.no> Date: Wed, 17 Feb 2016 15:13:15 +0100 Subject: [PATCH] Bugfix. While SimpleSAML\Database::query() returns a PDOStatement, SimpleSAML\Database::exec() doesn't. Make both return an integer with the amount of rows affected. Add a return value to SimpleSAML_Metadata_MetadataStorageHandlerPdo::initDatabase(). --- lib/SimpleSAML/Database.php | 5 +++-- .../Metadata/MetaDataStorageHandlerPdo.php | 21 +++++++++++++++---- tests/lib/SimpleSAML/DatabaseTest.php | 2 +- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/lib/SimpleSAML/Database.php b/lib/SimpleSAML/Database.php index e66288b2d..1012e116e 100644 --- a/lib/SimpleSAML/Database.php +++ b/lib/SimpleSAML/Database.php @@ -260,14 +260,15 @@ class Database * @param string $stmt Prepared SQL statement * @param array $params Parameters * - * @return \PDOStatement object + * @return int The number of rows affected by the query. */ public function write($stmt, $params = array()) { $db = $this->dbMaster; if (is_array($params)) { - return $this->query($db, $stmt, $params); + $obj = $this->query($db, $stmt, $params); + return $obj->rowCount(); } else { return $this->exec($db, $stmt); } diff --git a/lib/SimpleSAML/Metadata/MetaDataStorageHandlerPdo.php b/lib/SimpleSAML/Metadata/MetaDataStorageHandlerPdo.php index cb66c36ca..e8981169d 100644 --- a/lib/SimpleSAML/Metadata/MetaDataStorageHandlerPdo.php +++ b/lib/SimpleSAML/Metadata/MetaDataStorageHandlerPdo.php @@ -196,18 +196,18 @@ class SimpleSAML_Metadata_MetaDataStorageHandlerPdo extends SimpleSAML_Metadata_ ); if ($retrivedEntityIDs !== false && count($retrivedEntityIDs) > 0) { - $stmt = $this->db->write( + $rows = $this->db->write( "UPDATE $tableName SET entity_data = :entity_data WHERE entity_id = :entity_id", $params ); } else { - $stmt = $this->db->write( + $rows = $this->db->write( "INSERT INTO $tableName (entity_id, entity_data) VALUES (:entity_id, :entity_data)", $params ); } - return 1 === $stmt->rowCount(); + return $rows === 1; } @@ -229,16 +229,29 @@ class SimpleSAML_Metadata_MetaDataStorageHandlerPdo extends SimpleSAML_Metadata_ /** * Initialize the configured database + * + * @return int|false The number of SQL statements successfully executed, false if some error occurred. */ public function initDatabase() { + $stmt = 0; + $fine = true; foreach ($this->supportedSets as $set) { $tableName = $this->getTableName($set); - $this->db->write( + $rows = $this->db->write( "CREATE TABLE IF NOT EXISTS $tableName (entity_id VARCHAR(255) PRIMARY KEY NOT NULL, entity_data ". "TEXT NOT NULL)" ); + if ($rows === 0) { + $fine = false; + } else { + $stmt += $rows; + } + } + if (!$fine) { + return false; } + return $stmt; } } diff --git a/tests/lib/SimpleSAML/DatabaseTest.php b/tests/lib/SimpleSAML/DatabaseTest.php index 7ab129fd2..833d2e0ae 100644 --- a/tests/lib/SimpleSAML/DatabaseTest.php +++ b/tests/lib/SimpleSAML/DatabaseTest.php @@ -251,7 +251,7 @@ class SimpleSAML_DatabaseTest extends PHPUnit_Framework_TestCase "INSERT INTO $table (ssp_key, ssp_value) VALUES (:ssp_key, :ssp_value)", array('ssp_key' => array($ssp_key, PDO::PARAM_INT), 'ssp_value' => $ssp_value) ); - $this->assertEquals(1, $stmt->rowCount(), "Could not insert data into $table."); + $this->assertEquals(1, $stmt, "Could not insert data into $table."); $query2 = $this->db->read("SELECT * FROM $table WHERE ssp_key = :ssp_key", array('ssp_key' => $ssp_key)); $data = $query2->fetch(); -- GitLab