jenkins-bot has submitted this change and it was merged.

Change subject: Singleton PDO For the pending database
......................................................................


Singleton PDO For the pending database

More convenient for testing.  Note that we assume an app will only use one
pending database per run.

Change-Id: I3be06d1a2dad92661945baa9d5922eead7bfb603
---
M Core/DataStores/PendingDatabase.php
M Tests/PendingDatabaseTest.php
2 files changed, 38 insertions(+), 14 deletions(-)

Approvals:
  Ejegg: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/Core/DataStores/PendingDatabase.php 
b/Core/DataStores/PendingDatabase.php
index e0f5ad6..789938a 100644
--- a/Core/DataStores/PendingDatabase.php
+++ b/Core/DataStores/PendingDatabase.php
@@ -13,19 +13,23 @@
 
        /**
         * @var PDO
+        * We do the silly singleton thing for convenient testing with in-memory
+        * databases that would otherwise not be shared between components.
         */
-       protected $db;
+       protected static $db;
 
        protected function __construct() {
                $config = Context::get()->getConfiguration();
-               $this->db = $config->object( 'data-store/pending-db' );
+               if ( !self::$db ) {
+                       self::$db = $config->object( 'data-store/pending-db' );
+               }
        }
 
        /**
         * @return PDO
         */
        public function getDatabase() {
-               return $this->db;
+               return self::$db;
        }
 
        public static function get() {
@@ -80,7 +84,7 @@
                $paramList = ':' . implode( ', :', array_keys( $dbRecord ) );
 
                $insert = "INSERT INTO pending ( $fieldList ) values ( 
$paramList );";
-               $prepared = $this->db->prepare( $insert );
+               $prepared = self::$db->prepare( $insert );
 
                foreach ( $dbRecord as $field => $value ) {
                        $prepared->bindValue(
@@ -100,7 +104,7 @@
         * @return array|null Record related to a transaction, or null if 
nothing matches
         */
        public function fetchMessageByGatewayOrderId( $gatewayName, $orderId ) {
-               $prepared = $this->db->prepare( '
+               $prepared = self::$db->prepare( '
                        select * from pending
                        where gateway = :gateway
                                and order_id = :order_id
@@ -112,18 +116,17 @@
                if ( !$row ) {
                        return null;
                }
-               $message = json_decode( $row['message'], true );
-               return $message;
+               return $this->messageFromDbRow( $row );
        }
 
        /**
-        * Get the oldest message for a given gateway.
+        * Get the oldest message for a given gateway, by date
         *
         * @param $gatewayName string
         * @return array|null Message or null if nothing is found.
         */
        public function fetchMessageByGatewayOldest( $gatewayName ) {
-               $prepared = $this->db->prepare( '
+               $prepared = self::$db->prepare( '
                        select * from pending
                        where gateway = :gateway
                        order by date asc
@@ -134,8 +137,7 @@
                if ( !$row ) {
                        return null;
                }
-               $message = json_decode( $row['message'], true );
-               return $message;
+               return $this->messageFromDbRow( $row );
        }
 
        /**
@@ -146,7 +148,7 @@
         * @param array $message
         */
        public function deleteMessage( $message ) {
-               $prepared = $this->db->prepare( '
+               $prepared = self::$db->prepare( '
                        delete from pending
                        where gateway = :gateway
                                and order_id = :order_id' );
@@ -154,4 +156,13 @@
                $prepared->bindValue( ':order_id', $message['order_id'], 
PDO::PARAM_STR );
                $prepared->execute();
        }
+
+       /**
+        * Parse a database row and return the normalized message.
+        */
+       protected function messageFromDbRow( $row ) {
+               $message = json_decode( $row['message'], true );
+               $message['pending_id'] = $row['id'];
+               return $message;
+       }
 }
diff --git a/Tests/PendingDatabaseTest.php b/Tests/PendingDatabaseTest.php
index 3a236ec..bd87277 100644
--- a/Tests/PendingDatabaseTest.php
+++ b/Tests/PendingDatabaseTest.php
@@ -23,6 +23,16 @@
                $this->db->getDatabase()->exec( $sql );
        }
 
+       public function tearDown() {
+               // Reset PDO static member
+               $klass = new \ReflectionClass( 
'SmashPig\Core\DataStores\PendingDatabase' );
+               $dbProperty = $klass->getProperty( 'db' );
+               $dbProperty->setAccessible( true );
+               $dbProperty->setValue( null );
+
+               parent::tearDown();
+       }
+
        protected static function getTestMessage( $uniq = null ) {
                if ( !$uniq ) { 
                        $uniq = mt_rand();
@@ -74,7 +84,10 @@
                $this->assertNotNull( $fetched,
                        'Record retrieved by fetchMessageByGatewayOrderId.' );
 
-               $this->assertEquals( $message, $fetched,
+               $expected = $message + array(
+                       'pending_id' => 1,
+               );
+               $this->assertEquals( $expected, $fetched,
                        'Fetched record matches stored message.' );
        }
 
@@ -82,7 +95,7 @@
                $message1 = $this->getTestMessage();
                $message2 = $this->getTestMessage();
 
-               // Make the second message newer.
+               // Make the second message older.
                $message2['date'] = $message1['date'] - 100;
 
                $this->db->storeMessage( $message1 );

-- 
To view, visit https://gerrit.wikimedia.org/r/300745
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I3be06d1a2dad92661945baa9d5922eead7bfb603
Gerrit-PatchSet: 5
Gerrit-Project: wikimedia/fundraising/SmashPig
Gerrit-Branch: master
Gerrit-Owner: Awight <[email protected]>
Gerrit-Reviewer: Ejegg <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to