diff --git a/lib/Config/Database.php b/lib/Config/Database.php new file mode 100644 index 0000000000..1fba7cd9b3 --- /dev/null +++ b/lib/Config/Database.php @@ -0,0 +1,94 @@ +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); + } + } +} \ No newline at end of file diff --git a/lib/Config/Initializer.php b/lib/Config/Initializer.php index 73c93e5d4b..38f063396f 100644 --- a/lib/Config/Initializer.php +++ b/lib/Config/Initializer.php @@ -1,9 +1,9 @@ '', 'version' => '1.0.0' )) { - Env::init($params['file'], $params['version']); + Env::init($params['file'], $params['version']); } function init() { @@ -27,20 +27,38 @@ class Initializer { // abort initialization if PDO extension is missing 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(); // activation function register_activation_hook( Env::$file, - array('MailPoet\Config\Activator', 'activate') + array( + 'MailPoet\Config\Activator', + 'activate' + ) ); - add_action('plugins_loaded', array($this, 'setup')); - add_action('init', array($this, 'onInit')); - add_action('widgets_init', array($this, 'setupWidget')); - add_action('wp_loaded', array($this, 'setupHooks')); + add_action('plugins_loaded', array( + $this, + 'setup' + )); + add_action('init', array( + $this, + 'onInit' + )); + add_action('widgets_init', array( + $this, + 'setupWidget' + )); + add_action('wp_loaded', array( + $this, + 'setupHooks' + )); } function checkRequirements() { @@ -49,58 +67,8 @@ class Initializer { } function setupDB() { - \ORM::configure(Env::$db_source_name); - \ORM::configure('username', Env::$db_username); - \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); + $database = new Database(); + $database->init(); } function setup() { diff --git a/tests/unit/Config/DatabaseTest.php b/tests/unit/Config/DatabaseTest.php new file mode 100644 index 0000000000..4a7154f21e --- /dev/null +++ b/tests/unit/Config/DatabaseTest.php @@ -0,0 +1,54 @@ +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); + } +} \ No newline at end of file diff --git a/tests/unit/Config/InitializerTest.php b/tests/unit/Config/InitializerTest.php index f652927429..7b438de213 100644 --- a/tests/unit/Config/InitializerTest.php +++ b/tests/unit/Config/InitializerTest.php @@ -1,25 +1,6 @@ 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() { global $wp_filter; $is_hooked = false; @@ -29,4 +10,4 @@ class InitializerTest extends MailPoetTest { } expect($is_hooked)->true(); } -} \ No newline at end of file +}