- Extracts database configuration into a separate class
- Conditionally sets the session wait_timeout value - Updates unit tests
This commit is contained in:
94
lib/Config/Database.php
Normal file
94
lib/Config/Database.php
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
<?php
|
||||||
|
namespace MailPoet\Config;
|
||||||
|
|
||||||
|
use ORM as ORM;
|
||||||
|
use PDO as PDO;
|
||||||
|
|
||||||
|
if(!defined('ABSPATH')) exit;
|
||||||
|
|
||||||
|
require_once(ABSPATH . 'wp-admin/includes/plugin.php');
|
||||||
|
|
||||||
|
class Database {
|
||||||
|
public $driver_option_wait_timeout = 60;
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
$this->setupConnection();
|
||||||
|
$this->setupLogging();
|
||||||
|
$this->setupDriverOptions();
|
||||||
|
$this->defineTables();
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupConnection() {
|
||||||
|
ORM::configure(Env::$db_source_name);
|
||||||
|
ORM::configure('username', Env::$db_username);
|
||||||
|
ORM::configure('password', Env::$db_password);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupLogging() {
|
||||||
|
ORM::configure('logging', WP_DEBUG);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupDriverOptions() {
|
||||||
|
$driver_options = array(
|
||||||
|
'TIME_ZONE = "' . Env::$db_timezone_offset . '"',
|
||||||
|
'sql_mode=(SELECT REPLACE(@@sql_mode,"ONLY_FULL_GROUP_BY",""))',
|
||||||
|
);
|
||||||
|
$current_options = ORM::for_table("")
|
||||||
|
->raw_query('SELECT @@session.wait_timeout as wait_timeout')
|
||||||
|
->findOne();
|
||||||
|
if($current_options && (int)$current_options->wait_timeout < $this->driver_option_wait_timeout) {
|
||||||
|
$driver_options[] = 'SESSION wait_timeout = ' . $this->driver_option_wait_timeout;
|
||||||
|
}
|
||||||
|
// reset the database
|
||||||
|
ORM::set_db(null);
|
||||||
|
ORM::configure('driver_options', array(
|
||||||
|
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET ' . implode(', ', $driver_options)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
function defineTables() {
|
||||||
|
if(!defined('MP_SETTINGS_TABLE')) {
|
||||||
|
$settings = Env::$db_prefix . 'settings';
|
||||||
|
$segments = Env::$db_prefix . 'segments';
|
||||||
|
$forms = Env::$db_prefix . 'forms';
|
||||||
|
$custom_fields = Env::$db_prefix . 'custom_fields';
|
||||||
|
$subscribers = Env::$db_prefix . 'subscribers';
|
||||||
|
$subscriber_segment = Env::$db_prefix . 'subscriber_segment';
|
||||||
|
$subscriber_custom_field = Env::$db_prefix . 'subscriber_custom_field';
|
||||||
|
$newsletter_segment = Env::$db_prefix . 'newsletter_segment';
|
||||||
|
$sending_queues = Env::$db_prefix . 'sending_queues';
|
||||||
|
$newsletters = Env::$db_prefix . 'newsletters';
|
||||||
|
$newsletter_templates = Env::$db_prefix . 'newsletter_templates';
|
||||||
|
$newsletter_option_fields = Env::$db_prefix . 'newsletter_option_fields';
|
||||||
|
$newsletter_option = Env::$db_prefix . 'newsletter_option';
|
||||||
|
$newsletter_links = Env::$db_prefix . 'newsletter_links';
|
||||||
|
$newsletter_posts = Env::$db_prefix . 'newsletter_posts';
|
||||||
|
$statistics_newsletters = Env::$db_prefix . 'statistics_newsletters';
|
||||||
|
$statistics_clicks = Env::$db_prefix . 'statistics_clicks';
|
||||||
|
$statistics_opens = Env::$db_prefix . 'statistics_opens';
|
||||||
|
$statistics_unsubscribes = Env::$db_prefix . 'statistics_unsubscribes';
|
||||||
|
$statistics_forms = Env::$db_prefix . 'statistics_forms';
|
||||||
|
|
||||||
|
define('MP_SETTINGS_TABLE', $settings);
|
||||||
|
define('MP_SEGMENTS_TABLE', $segments);
|
||||||
|
define('MP_FORMS_TABLE', $forms);
|
||||||
|
define('MP_CUSTOM_FIELDS_TABLE', $custom_fields);
|
||||||
|
define('MP_SUBSCRIBERS_TABLE', $subscribers);
|
||||||
|
define('MP_SUBSCRIBER_SEGMENT_TABLE', $subscriber_segment);
|
||||||
|
define('MP_SUBSCRIBER_CUSTOM_FIELD_TABLE', $subscriber_custom_field);
|
||||||
|
define('MP_SENDING_QUEUES_TABLE', $sending_queues);
|
||||||
|
define('MP_NEWSLETTERS_TABLE', $newsletters);
|
||||||
|
define('MP_NEWSLETTER_TEMPLATES_TABLE', $newsletter_templates);
|
||||||
|
define('MP_NEWSLETTER_SEGMENT_TABLE', $newsletter_segment);
|
||||||
|
define('MP_NEWSLETTER_OPTION_FIELDS_TABLE', $newsletter_option_fields);
|
||||||
|
define('MP_NEWSLETTER_LINKS_TABLE', $newsletter_links);
|
||||||
|
define('MP_NEWSLETTER_POSTS_TABLE', $newsletter_posts);
|
||||||
|
define('MP_NEWSLETTER_OPTION_TABLE', $newsletter_option);
|
||||||
|
define('MP_STATISTICS_NEWSLETTERS_TABLE', $statistics_newsletters);
|
||||||
|
define('MP_STATISTICS_CLICKS_TABLE', $statistics_clicks);
|
||||||
|
define('MP_STATISTICS_OPENS_TABLE', $statistics_opens);
|
||||||
|
define('MP_STATISTICS_UNSUBSCRIBES_TABLE', $statistics_unsubscribes);
|
||||||
|
define('MP_STATISTICS_FORMS_TABLE', $statistics_forms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,9 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace MailPoet\Config;
|
namespace MailPoet\Config;
|
||||||
|
|
||||||
|
use MailPoet\API;
|
||||||
use MailPoet\Cron\CronTrigger;
|
use MailPoet\Cron\CronTrigger;
|
||||||
use MailPoet\Router;
|
use MailPoet\Router;
|
||||||
use MailPoet\API;
|
|
||||||
use MailPoet\Util\ConflictResolver;
|
use MailPoet\Util\ConflictResolver;
|
||||||
use MailPoet\WP\Notice as WPNotice;
|
use MailPoet\WP\Notice as WPNotice;
|
||||||
|
|
||||||
@ -19,7 +19,7 @@ class Initializer {
|
|||||||
'file' => '',
|
'file' => '',
|
||||||
'version' => '1.0.0'
|
'version' => '1.0.0'
|
||||||
)) {
|
)) {
|
||||||
Env::init($params['file'], $params['version']);
|
Env::init($params['file'], $params['version']);
|
||||||
}
|
}
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
@ -27,20 +27,38 @@ class Initializer {
|
|||||||
|
|
||||||
// abort initialization if PDO extension is missing
|
// abort initialization if PDO extension is missing
|
||||||
if(!$requirements_check_results[RequirementsChecker::TEST_PDO_EXTENSION] ||
|
if(!$requirements_check_results[RequirementsChecker::TEST_PDO_EXTENSION] ||
|
||||||
!$requirements_check_results[RequirementsChecker::TEST_VENDOR_SOURCE]) return;
|
!$requirements_check_results[RequirementsChecker::TEST_VENDOR_SOURCE]
|
||||||
|
) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$this->setupDB();
|
$this->setupDB();
|
||||||
|
|
||||||
// activation function
|
// activation function
|
||||||
register_activation_hook(
|
register_activation_hook(
|
||||||
Env::$file,
|
Env::$file,
|
||||||
array('MailPoet\Config\Activator', 'activate')
|
array(
|
||||||
|
'MailPoet\Config\Activator',
|
||||||
|
'activate'
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
add_action('plugins_loaded', array($this, 'setup'));
|
add_action('plugins_loaded', array(
|
||||||
add_action('init', array($this, 'onInit'));
|
$this,
|
||||||
add_action('widgets_init', array($this, 'setupWidget'));
|
'setup'
|
||||||
add_action('wp_loaded', array($this, 'setupHooks'));
|
));
|
||||||
|
add_action('init', array(
|
||||||
|
$this,
|
||||||
|
'onInit'
|
||||||
|
));
|
||||||
|
add_action('widgets_init', array(
|
||||||
|
$this,
|
||||||
|
'setupWidget'
|
||||||
|
));
|
||||||
|
add_action('wp_loaded', array(
|
||||||
|
$this,
|
||||||
|
'setupHooks'
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkRequirements() {
|
function checkRequirements() {
|
||||||
@ -49,58 +67,8 @@ class Initializer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setupDB() {
|
function setupDB() {
|
||||||
\ORM::configure(Env::$db_source_name);
|
$database = new Database();
|
||||||
\ORM::configure('username', Env::$db_username);
|
$database->init();
|
||||||
\ORM::configure('password', Env::$db_password);
|
|
||||||
\ORM::configure('logging', WP_DEBUG);
|
|
||||||
\ORM::configure('driver_options', array(
|
|
||||||
\PDO::MYSQL_ATTR_INIT_COMMAND =>
|
|
||||||
'SET SESSION wait_timeout = 60, ' .
|
|
||||||
'TIME_ZONE = "' . Env::$db_timezone_offset . '", ' .
|
|
||||||
'sql_mode=(SELECT REPLACE(@@sql_mode,"ONLY_FULL_GROUP_BY",""))'
|
|
||||||
));
|
|
||||||
|
|
||||||
$settings = Env::$db_prefix . 'settings';
|
|
||||||
$segments = Env::$db_prefix . 'segments';
|
|
||||||
$forms = Env::$db_prefix . 'forms';
|
|
||||||
$custom_fields = Env::$db_prefix . 'custom_fields';
|
|
||||||
$subscribers = Env::$db_prefix . 'subscribers';
|
|
||||||
$subscriber_segment = Env::$db_prefix . 'subscriber_segment';
|
|
||||||
$subscriber_custom_field = Env::$db_prefix . 'subscriber_custom_field';
|
|
||||||
$newsletter_segment = Env::$db_prefix . 'newsletter_segment';
|
|
||||||
$sending_queues = Env::$db_prefix . 'sending_queues';
|
|
||||||
$newsletters = Env::$db_prefix . 'newsletters';
|
|
||||||
$newsletter_templates = Env::$db_prefix . 'newsletter_templates';
|
|
||||||
$newsletter_option_fields = Env::$db_prefix . 'newsletter_option_fields';
|
|
||||||
$newsletter_option = Env::$db_prefix . 'newsletter_option';
|
|
||||||
$newsletter_links = Env::$db_prefix . 'newsletter_links';
|
|
||||||
$newsletter_posts = Env::$db_prefix . 'newsletter_posts';
|
|
||||||
$statistics_newsletters = Env::$db_prefix . 'statistics_newsletters';
|
|
||||||
$statistics_clicks = Env::$db_prefix . 'statistics_clicks';
|
|
||||||
$statistics_opens = Env::$db_prefix . 'statistics_opens';
|
|
||||||
$statistics_unsubscribes = Env::$db_prefix . 'statistics_unsubscribes';
|
|
||||||
$statistics_forms = Env::$db_prefix . 'statistics_forms';
|
|
||||||
|
|
||||||
define('MP_SETTINGS_TABLE', $settings);
|
|
||||||
define('MP_SEGMENTS_TABLE', $segments);
|
|
||||||
define('MP_FORMS_TABLE', $forms);
|
|
||||||
define('MP_CUSTOM_FIELDS_TABLE', $custom_fields);
|
|
||||||
define('MP_SUBSCRIBERS_TABLE', $subscribers);
|
|
||||||
define('MP_SUBSCRIBER_SEGMENT_TABLE', $subscriber_segment);
|
|
||||||
define('MP_SUBSCRIBER_CUSTOM_FIELD_TABLE', $subscriber_custom_field);
|
|
||||||
define('MP_SENDING_QUEUES_TABLE', $sending_queues);
|
|
||||||
define('MP_NEWSLETTERS_TABLE', $newsletters);
|
|
||||||
define('MP_NEWSLETTER_TEMPLATES_TABLE', $newsletter_templates);
|
|
||||||
define('MP_NEWSLETTER_SEGMENT_TABLE', $newsletter_segment);
|
|
||||||
define('MP_NEWSLETTER_OPTION_FIELDS_TABLE', $newsletter_option_fields);
|
|
||||||
define('MP_NEWSLETTER_LINKS_TABLE', $newsletter_links);
|
|
||||||
define('MP_NEWSLETTER_POSTS_TABLE', $newsletter_posts);
|
|
||||||
define('MP_NEWSLETTER_OPTION_TABLE', $newsletter_option);
|
|
||||||
define('MP_STATISTICS_NEWSLETTERS_TABLE', $statistics_newsletters);
|
|
||||||
define('MP_STATISTICS_CLICKS_TABLE', $statistics_clicks);
|
|
||||||
define('MP_STATISTICS_OPENS_TABLE', $statistics_opens);
|
|
||||||
define('MP_STATISTICS_UNSUBSCRIBES_TABLE', $statistics_unsubscribes);
|
|
||||||
define('MP_STATISTICS_FORMS_TABLE', $statistics_forms);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function setup() {
|
function setup() {
|
||||||
|
54
tests/unit/Config/DatabaseTest.php
Normal file
54
tests/unit/Config/DatabaseTest.php
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use MailPoet\Config\Database;
|
||||||
|
use MailPoet\Config\Env;
|
||||||
|
|
||||||
|
class DatabaseTestTest extends MailPoetTest {
|
||||||
|
public $database;
|
||||||
|
|
||||||
|
function __construct() {
|
||||||
|
$this->database = new Database();
|
||||||
|
}
|
||||||
|
|
||||||
|
function _before() {
|
||||||
|
\ORM::set_db(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItDefinesTables() {
|
||||||
|
expect(defined('MP_SETTINGS_TABLE'))->true();
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItConfiguresLogging() {
|
||||||
|
expect(\ORM::get_config('logging'))->equals(WP_DEBUG);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItSetsUpConnection() {
|
||||||
|
expect(\ORM::get_config('username'))->equals(Env::$db_username);
|
||||||
|
expect(\ORM::get_config('password'))->equals(Env::$db_password);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItSelectivelyUpdatesDriverTimeoutOption() {
|
||||||
|
$database = $this->database;
|
||||||
|
$database->driver_option_wait_timeout = 99999;
|
||||||
|
$database->setupDriverOptions();
|
||||||
|
$result = ORM::for_table("")
|
||||||
|
->raw_query('SELECT @@session.wait_timeout as wait_timeout')
|
||||||
|
->findOne();
|
||||||
|
expect($result->wait_timeout)->equals(99999);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testItSetsDBDriverOptions() {
|
||||||
|
$this->database->init();
|
||||||
|
$result = ORM::for_table("")
|
||||||
|
->raw_query(
|
||||||
|
'SELECT ' .
|
||||||
|
'@@sql_mode as sql_mode, ' .
|
||||||
|
'@@session.time_zone as time_zone'
|
||||||
|
)
|
||||||
|
->findOne();
|
||||||
|
// disable ONLY_FULL_GROUP_BY
|
||||||
|
expect($result->sql_mode)->notContains('ONLY_FULL_GROUP_BY');
|
||||||
|
// time zone should be set based on WP's time zone
|
||||||
|
expect($result->time_zone)->equals(Env::$db_timezone_offset);
|
||||||
|
}
|
||||||
|
}
|
@ -1,25 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use MailPoet\Config\Env;
|
|
||||||
|
|
||||||
class InitializerTest extends MailPoetTest {
|
class InitializerTest extends MailPoetTest {
|
||||||
function testItSetsDBDriverOptions() {
|
|
||||||
$result = ORM::for_table("")
|
|
||||||
->raw_query(
|
|
||||||
'SELECT ' .
|
|
||||||
'@@sql_mode as sql_mode, ' .
|
|
||||||
'@@session.time_zone as time_zone, ' .
|
|
||||||
'@@session.wait_timeout as wait_timeout'
|
|
||||||
)
|
|
||||||
->findOne();
|
|
||||||
// disable ONLY_FULL_GROUP_BY
|
|
||||||
expect($result->sql_mode)->notContains('ONLY_FULL_GROUP_BY');
|
|
||||||
// time zone should be set based on WP's time zone
|
|
||||||
expect($result->time_zone)->equals(Env::$db_timezone_offset);
|
|
||||||
// connection timeout should be set to 60 seconds
|
|
||||||
expect($result->wait_timeout)->equals(60);
|
|
||||||
}
|
|
||||||
|
|
||||||
function testItConfiguresHooks() {
|
function testItConfiguresHooks() {
|
||||||
global $wp_filter;
|
global $wp_filter;
|
||||||
$is_hooked = false;
|
$is_hooked = false;
|
||||||
@ -29,4 +10,4 @@ class InitializerTest extends MailPoetTest {
|
|||||||
}
|
}
|
||||||
expect($is_hooked)->true();
|
expect($is_hooked)->true();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user