Merge pull request #23723 from mattwire/ufmatchsearchkit
[civicrm-core.git] / CRM / Import / DataSource / SQL.php
index 6ac730faf39f3ce983369ba5018d29d5df77d287..78b20839f9be3f4bb87f7a2799c143d1076af521 100644 (file)
@@ -74,38 +74,40 @@ class CRM_Import_DataSource_SQL extends CRM_Import_DataSource {
   }
 
   /**
-   * Process the form submission.
-   *
-   * @param array $params
-   * @param string $db
-   * @param \CRM_Core_Form $form
+   * Initialize the datasource, based on the submitted values stored in the user job.
    *
    * @throws \API_Exception
    * @throws \CRM_Core_Exception
-   * @throws \Civi\API\Exception\UnauthorizedException
    */
-  public function postProcess(&$params, &$db, &$form) {
-    $importJob = new CRM_Contact_Import_ImportJob(
-      NULL,
-      $params['sqlQuery'], TRUE
-    );
-    $tableName = $importJob->getTableName();
+  public function initialize(): void {
+    $table = CRM_Utils_SQL_TempTable::build()->setDurable();
+    $tableName = $table->getName();
+    $table->createWithQuery($this->getSubmittedValue('sqlQuery'));
 
-    $form->set('importTableName', $tableName);
     // Get the names of the fields to be imported. Any fields starting with an
     // underscore are considered to be internal to the import process)
     $columnsResult = CRM_Core_DAO::executeQuery(
-      'SHOW FIELDS FROM ' . $importJob->getTableName() . "
+      'SHOW FIELDS FROM ' . $tableName . "
       WHERE Field NOT LIKE '\_%'");
 
     $columnNames = [];
     while ($columnsResult->fetch()) {
-      $columnNames[] = $columnsResult->Field;
+      if (strpos($columnsResult->Field, ' ') !== FALSE) {
+        // Remove spaces as the Database object does this
+        // $keys = str_replace(array(".", " "), "_", array_keys($array));
+        // https://lab.civicrm.org/dev/core/-/issues/1337
+        $usableColumnName = str_replace(' ', '_', $columnsResult->Field);
+        CRM_Core_DAO::executeQuery('ALTER TABLE ' . $tableName . ' CHANGE `' . $columnsResult->Field . '` ' . $usableColumnName . ' ' . $columnsResult->Type);
+        $columnNames[] = $usableColumnName;
+      }
+      else {
+        $columnNames[] = $columnsResult->Field;
+      }
     }
 
     $this->addTrackingFieldsToTable($tableName);
     $this->updateUserJobMetadata('DataSource', [
-      'table_name' => $importJob->getTableName(),
+      'table_name' => $tableName,
       'column_headers' => $columnNames,
       'number_of_columns' => count($columnNames),
     ]);