/** * import a pm table * * @param string $httpData->id */ public function import($httpData) { require_once 'classes/model/AdditionalTables.php'; try { $errors = ''; $overWrite = isset($_POST['form']['OVERWRITE']) ? true : false; //save the file if ($_FILES['form']['error']['FILENAME'] !== 0) { throw new Exception(G::loadTranslation('ID_PMTABLE_UPLOADING_FILE_PROBLEM')); } $oAdditionalTables = new AdditionalTables(); $tableNameMap = array(); $processQueue = array(); $processQueueTables = array(); $PUBLIC_ROOT_PATH = PATH_DATA . 'sites' . PATH_SEP . SYS_SYS . PATH_SEP . 'public' . PATH_SEP; $filename = $_FILES['form']['name']['FILENAME']; $tempName = $_FILES['form']['tmp_name']['FILENAME']; G::uploadFile($tempName, $PUBLIC_ROOT_PATH, $filename); $fileContent = file_get_contents($PUBLIC_ROOT_PATH . $filename); if (strpos($fileContent, '-----== ProcessMaker Open Source Private Tables ==-----') === false) { throw new Exception(G::loadTranslation('ID_PMTABLE_INVALID_FILE')); } $fp = fopen($PUBLIC_ROOT_PATH . $filename, "rb"); $fsData = intval(fread($fp, 9)); //reading the metadata $sType = fread($fp, $fsData); // first create the tables structures while (!feof($fp)) { switch ($sType) { case '@META': $fsData = intval(fread($fp, 9)); $METADATA = fread($fp, $fsData); break; case '@SCHEMA': $fsUid = intval(fread($fp, 9)); $uid = fread($fp, $fsUid); $fsData = intval(fread($fp, 9)); $schema = fread($fp, $fsData); $contentSchema = unserialize($schema); $additionalTable = new additionalTables(); $tableExists = $additionalTable->loadByName($contentSchema['ADD_TAB_NAME']); $tableNameMap[$contentSchema['ADD_TAB_NAME']] = $contentSchema['ADD_TAB_NAME']; if ($overWrite) { if ($tableExists !== false) { $additionalTable->deleteAll($tableExists['ADD_TAB_UID']); } } else { if ($tableExists !== false) { // some table exists with the same name // renaming... $tNameOld = $contentSchema['ADD_TAB_NAME']; $newTableName = $contentSchema['ADD_TAB_NAME'] . '_' . date('YmdHis'); $contentSchema['ADD_TAB_UID'] = G::generateUniqueID(); $contentSchema['ADD_TAB_NAME'] = $newTableName; $contentSchema['ADD_TAB_CLASS_NAME'] = additionalTables::getPHPName($newTableName); //mapping the table name for posterior uses $tableNameMap[$tNameOld] = $contentSchema['ADD_TAB_NAME']; } } // validating invalid bds_uid in old tables definition -> mapped to workflow if (!$contentSchema['DBS_UID'] || $contentSchema['DBS_UID'] == '0' || !$contentSchema['DBS_UID']) { $contentSchema['DBS_UID'] = 'workflow'; } $columns = array(); foreach ($contentSchema['FIELDS'] as $field) { $column = array('uid' => '', 'field_uid' => '', 'field_name' => $field['FLD_NAME'], 'field_dyn' => isset($field['FLD_DYN_NAME']) ? $field['FLD_DYN_NAME'] : '', 'field_label' => isset($field['FLD_DESCRIPTION']) ? $field['FLD_DESCRIPTION'] : '', 'field_type' => $field['FLD_TYPE'], 'field_size' => $field['FLD_SIZE'], 'field_key' => isset($field['FLD_KEY']) ? $field['FLD_KEY'] : 0, 'field_null' => isset($field['FLD_NULL']) ? $field['FLD_NULL'] : 1, 'field_autoincrement' => isset($field['FLD_AUTO_INCREMENT']) ? $field['FLD_AUTO_INCREMENT'] : 0); $columns[] = $column; } $tableData = new stdClass(); $tableData->REP_TAB_UID = $contentSchema['ADD_TAB_UID']; $tableData->REP_TAB_NAME = $contentSchema['ADD_TAB_NAME']; $tableData->REP_TAB_DSC = $contentSchema['ADD_TAB_DESCRIPTION']; $tableData->REP_TAB_CONNECTION = $contentSchema['DBS_UID']; if (isset($_POST["form"]["PRO_UID"]) && !empty($_POST["form"]["PRO_UID"])) { $tableData->PRO_UID = $_POST["form"]["PRO_UID"]; } else { $tableData->PRO_UID = isset($contentSchema["PRO_UID"]) ? $contentSchema["PRO_UID"] : ""; } $tableData->REP_TAB_TYPE = isset($contentSchema['ADD_TAB_TYPE']) ? $contentSchema['ADD_TAB_TYPE'] : ''; $tableData->REP_TAB_GRID = isset($contentSchema['ADD_TAB_GRID']) ? $contentSchema['ADD_TAB_GRID'] : ''; $tableData->columns = G::json_encode($columns); $tableData->forceUid = true; //save the table $alterTable = false; $result = $this->save($tableData, $alterTable); if ($result->success) { $processQueueTables[$contentSchema['DBS_UID']][] = $contentSchema['ADD_TAB_NAME']; } else { $errors .= 'Error creating table: ' . $tableData->REP_TAB_NAME . '-> ' . $result->message . "\n\n"; } break; case '@DATA': $fstName = intval(fread($fp, 9)); $tableName = fread($fp, $fstName); $fsData = intval(fread($fp, 9)); if ($fsData > 0) { $data = fread($fp, $fsData); } break; } $fsData = intval(fread($fp, 9)); //reading the metadata if ($fsData > 0) { // reading next block type $sType = fread($fp, $fsData); } else { break; } } fclose($fp); G::loadClass('pmTable'); foreach ($processQueueTables as $dbsUid => $tables) { $pmTable = new pmTable(); ob_start(); $pmTable->buildModelFor($dbsUid, $tables); $buildResult = ob_get_contents(); ob_end_clean(); $errors .= $pmTable->upgradeDatabaseFor($pmTable->getDataSource(), $tables); } $fp = fopen($PUBLIC_ROOT_PATH . $filename, "rb"); $fsData = intval(fread($fp, 9)); $sType = fread($fp, $fsData); // data processing while (!feof($fp)) { switch ($sType) { case '@META': $fsData = intval(fread($fp, 9)); $METADATA = fread($fp, $fsData); break; case '@SCHEMA': $fsUid = intval(fread($fp, 9)); $uid = fread($fp, $fsUid); $fsData = intval(fread($fp, 9)); $schema = fread($fp, $fsData); $contentSchema = unserialize($schema); $additionalTable = new additionalTables(); $table = $additionalTable->loadByName($tableNameMap[$contentSchema['ADD_TAB_NAME']]); if ($table['PRO_UID'] != '') { // is a report table, try populate it $additionalTable->populateReportTable($table['ADD_TAB_NAME'], pmTable::resolveDbSource($table['DBS_UID']), $table['ADD_TAB_TYPE'], $table['PRO_UID'], $table['ADD_TAB_GRID'], $table['ADD_TAB_UID']); } break; case '@DATA': $fstName = intval(fread($fp, 9)); $tableName = fread($fp, $fstName); $fsData = intval(fread($fp, 9)); if ($fsData > 0) { $data = fread($fp, $fsData); $contentData = unserialize($data); $tableName = $tableNameMap[$tableName]; $oAdditionalTables = new AdditionalTables(); $table = $oAdditionalTables->loadByName($tableName); $isReport = $table['PRO_UID'] !== '' ? true : false; if ($table !== false) { if (!$isReport) { if (count($contentData) > 0) { foreach ($contentData as $row) { $data = new StdClass(); $data->id = $table['ADD_TAB_UID']; $data->rows = base64_encode(serialize($row)); $res = $this->dataCreate($data, 'base64'); if (!$res->success) { $errors .= $res->message; } } } } } } break; } $fsData = intval(fread($fp, 9)); if ($fsData > 0) { $sType = fread($fp, $fsData); } else { break; } } //////////// if ($errors == '') { $result->success = true; $msg = G::loadTranslation('ID_PMTABLE_IMPORT_SUCCESS', array($filename)); } else { $result->success = false; $result->errorType = 'warning'; $msg = G::loadTranslation('ID_PMTABLE_IMPORT_WITH_ERRORS', array($filename)) . "\n\n" . $errors; } $result->message = $msg; } catch (Exception $e) { $result->errorType = 'error'; $result->buildResult = ob_get_contents(); ob_end_clean(); $result->success = false; // if it is a propel exception message if (preg_match('/(.*)\\s\\[(.*):\\s(.*)\\]\\s\\[(.*):\\s(.*)\\]/', $e->getMessage(), $match)) { $result->message = $match[3]; $result->type = G::loadTranslation('ID_ERROR'); } else { $result->message = $e->getMessage(); $result->type = G::loadTranslation('ID_EXCEPTION'); } //$result->trace = $e->getTraceAsString(); } return $result; }