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