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