CRM-19027 clean up use of slow query to get tables.
authoreileen <emcnaughton@wikimedia.org>
Wed, 29 Jun 2016 02:46:56 +0000 (14:46 +1200)
committereileen <emcnaughton@wikimedia.org>
Wed, 29 Jun 2016 02:49:55 +0000 (14:49 +1200)
This is mainly targetting the MyISam DB check - but I also cleaned up the function that gets the code to render the list of tables on the screen civicrm/admin/setting/uf?reset=1 (on drupal when views is enabled

CRM/Admin/Form/Setting/UF.php
CRM/Core/DAO.php
tests/phpunit/CRM/Core/DAOTest.php

index 7b014d3543c521baab2b4a66c79c97b7f9fe01ab..029d77eb92e7b0f76859aa4905c16a3f8c3c9a83 100644 (file)
@@ -79,14 +79,14 @@ class CRM_Admin_Form_Setting_UF extends CRM_Admin_Form_Setting {
       )
     ) {
       $dsnArray = DB::parseDSN($config->dsn);
-      $tableNames = CRM_Core_DAO::GetStorageValues(NULL, 0, 'Name');
+      $tableNames = CRM_Core_DAO::getTableNames();
       $tablePrefixes = '$databases[\'default\'][\'default\'][\'prefix\']= array(';
       $tablePrefixes .= "\n  'default' => '$drupal_prefix',"; // add default prefix: the drupal database prefix
       $prefix = "";
       if ($config->dsn != $config->userFrameworkDSN) {
         $prefix = "`{$dsnArray['database']}`.";
       }
-      foreach ($tableNames as $tableName => $value) {
+      foreach ($tableNames as $tableName) {
         $tablePrefixes .= "\n  '" . str_pad($tableName . "'", 41) . " => '{$prefix}',";
       }
       $tablePrefixes .= "\n);";
index a168da8b3e3b318e5ab760b579a7e2c8b3a097ea..70f7245ffbf9bbd1baeef78f4d21e78bcfdf2a6e 100644 (file)
@@ -766,48 +766,22 @@ LIKE %1
   }
 
   /**
-   * Returns the storage engine used by given table-name(optional).
-   * Otherwise scans all the tables and return an array of all the
-   * distinct storage engines being used.
-   *
-   * @param string $tableName
-   *
-   * @param int $maxTablesToCheck
-   * @param string $fieldName
+   * Scans all the tables using a slow query and table name.
    *
    * @return array
    */
-  public static function getStorageValues($tableName = NULL, $maxTablesToCheck = 10, $fieldName = 'Engine') {
-    $values = array();
-    $query = "SHOW TABLE STATUS LIKE %1";
-
-    $params = array();
+  public static function getTableNames() {
+    $dao = CRM_Core_DAO::executeQuery(
+      "SELECT TABLE_NAME
+       FROM information_schema.TABLES
+       WHERE TABLE_SCHEMA = '" . CRM_Core_DAO::getDatabaseName() . "'
+         AND TABLE_NAME LIKE 'civicrm_%'
+         AND TABLE_NAME NOT LIKE 'civicrm_import_job_%'
+         AND TABLE_NAME NOT LIKE '%temp'
+      ");
 
-    if (isset($tableName)) {
-      $params = array(1 => array($tableName, 'String'));
-    }
-    else {
-      $params = array(1 => array('civicrm_%', 'String'));
-    }
-
-    $dao = CRM_Core_DAO::executeQuery($query, $params);
-
-    $count = 0;
     while ($dao->fetch()) {
-      if (isset($values[$dao->$fieldName]) ||
-        // ignore import and other temp tables
-        strpos($dao->Name, 'civicrm_import_job_') !== FALSE ||
-        strpos($dao->Name, '_temp') !== FALSE
-      ) {
-        continue;
-      }
-      $values[$dao->$fieldName] = 1;
-      $count++;
-      if ($maxTablesToCheck &&
-        $count >= $maxTablesToCheck
-      ) {
-        break;
-      }
+      $values[] = $dao->TABLE_NAME;
     }
     $dao->free();
     return $values;
@@ -819,12 +793,25 @@ LIKE %1
    * @return bool
    */
   public static function isDBMyISAM($maxTablesToCheck = 10) {
-    // show error if any of the tables, use 'MyISAM' storage engine.
-    $engines = self::getStorageValues(NULL, $maxTablesToCheck);
-    if (array_key_exists('MyISAM', $engines)) {
-      return TRUE;
-    }
-    return FALSE;
+    return CRM_Core_DAO::singleValueQuery(
+      "SELECT count(*)
+       FROM information_schema.TABLES
+       WHERE ENGINE = 'MyISAM'
+         AND TABLE_SCHEMA = '" . CRM_Core_DAO::getDatabaseName() . "'
+         AND TABLE_NAME LIKE 'civicrm_%'
+         AND TABLE_NAME NOT LIKE 'civicrm_import_job_%'
+         AND TABLE_NAME NOT LIKE '%temp'
+      ");
+  }
+
+  /**
+   * Get the name of the CiviCRM database.
+   *
+   * @return string
+   */
+  public static function getDatabaseName() {
+    $daoObj = new CRM_Core_DAO();
+    return $daoObj->database();
   }
 
   /**
index c2f67a04c7b8b5f6a9274543f60df340cfb3618d..be89d34efc975687540b50d433bc0df64fe2e749 100644 (file)
@@ -249,4 +249,14 @@ class CRM_Core_DAOTest extends CiviUnitTestCase {
     }
   }
 
+  /**
+   * Test the function designed to find myIsam tables.
+   */
+  public function testMyISAMCheck() {
+    $this->assertEquals(0, CRM_Core_DAO::isDBMyISAM());
+    CRM_Core_DAO::executeQuery('CREATE TABLE civicrm_my_isam (`id` int(10) unsigned NOT NULL) ENGINE = MyISAM');
+    $this->assertEquals(1, CRM_Core_DAO::isDBMyISAM());
+    CRM_Core_DAO::executeQuery('DROP TABLE civicrm_my_isam');
+  }
+
 }