/** * update pm tables record * * @param string $httpData->id */ public function dataUpdate($httpData) { require_once 'classes/model/AdditionalTables.php'; $oAdditionalTables = new AdditionalTables(); $table = $oAdditionalTables->load($httpData->id, true); $primaryKeys = $oAdditionalTables->getPrimaryKeys('keys'); $this->className = $table['ADD_TAB_CLASS_NAME']; $this->classPeerName = $this->className . 'Peer'; $sPath = PATH_DB . SYS_SYS . PATH_SEP . 'classes' . PATH_SEP; if (!file_exists($sPath . $this->className . '.php')) { throw new Exception('Update:: ' . G::loadTranslation('ID_PMTABLE_CLASS_DOESNT_EXIST', $this->className)); } require_once $sPath . $this->className . '.php'; $rows = G::json_decode(stripslashes($httpData->rows)); if (is_array($rows)) { foreach ($rows as $row) { $row = (array) $row; $result = $this->_dataUpdate($row, $primaryKeys); } } else { //then is object $row = (array) $rows; $result = $this->_dataUpdate($row, $primaryKeys); } $this->success = $result; $this->message = $result ? G::loadTranslation('ID_UPDATED_SUCCESSFULLY') : G::loadTranslation('ID_UPDATE_FAILED'); }
/** * import a pm table * * @param string $httpData->id */ public function import ($httpData) { $fromAdmin = false; if (isset( $_POST["form"]["TYPE_TABLE"] ) && ! empty( $_POST["form"]["TYPE_TABLE"] )) { if($_POST["form"]["TYPE_TABLE"] == 'admin') { $fromAdmin = true; } } require_once 'classes/model/AdditionalTables.php'; try { $result = new stdClass(); $errors = ''; $fromConfirm = false; $overWrite = isset( $_POST['form']['OVERWRITE'] ) ? true : false; if (isset( $_POST["form"]["FROM_CONFIRM"] ) && ! empty( $_POST["form"]["FROM_CONFIRM"] )) { $fromConfirm = $_POST["form"]["FROM_CONFIRM"]; $_FILES['form'] = $_SESSION['FILES_FORM']; } //save the file if ($_FILES['form']['error']['FILENAME'] !== 0) { throw new Exception( G::loadTranslation( 'ID_PMTABLE_UPLOADING_FILE_PROBLEM' ) ); } $_SESSION['FILES_FORM'] = $_FILES['form']; $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']; if(!$fromConfirm) { G::uploadFile( $tempName, $PUBLIC_ROOT_PATH, $filename ); } if ($fromConfirm == 'clear') { $fromConfirm = true; } $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 ); $pmTables = $this->getList(''); $proUids = Array(); if($pmTables['count']) { $pmTables = $pmTables['rows']; foreach($pmTables as $val) { if($val['PRO_UID'] != '') { $proUids[] = $val['PRO_UID']; } } } // 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']; $tableData = new stdClass(); 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"] : ""; } $isPmTable = false; /*is a report table*/ if($contentSchema["PRO_UID"] == "" ) { $isPmTable = true; } if (isset( $_POST["form"]["PRO_UID_HELP"] ) && !empty($_POST["form"]["PRO_UID_HELP"])) { $currentPRO_UID = $_POST["form"]["PRO_UID_HELP"]; } else { $currentPRO_UID = (isset( $_SESSION['PROCESS'] ) && !empty( $_SESSION['PROCESS'] )) ? $_SESSION['PROCESS'] : ''; } if($fromAdmin) { /* from admin tab */ if ($tableExists !== false && !$fromConfirm) { $validationType = 1; throw new Exception( G::loadTranslation( 'ID_OVERWRITE_PMTABLE' ) ); } if(!in_array($tableData->PRO_UID, $proUids) && !$isPmTable) { $validationType = 2; throw new Exception( G::loadTranslation( 'ID_NO_RELATED_PROCESS' ) ); } } else { /* from designer tab */ if($isPmTable){ $validationType = ''; throw new Exception( G::loadTranslation( 'ID_NO_REPORT_TABLE' ) ); } if ($tableExists !== false && !$fromConfirm) { $validationType = 1; throw new Exception( G::loadTranslation( 'ID_OVERWRITE_PMTABLE' ) ); } if($currentPRO_UID != $tableData->PRO_UID) { if(!in_array($tableData->PRO_UID, $proUids)) { $validationType = 2; if(($fromConfirm == $validationType || !$fromConfirm) && !$isPmTable) { throw new Exception( G::loadTranslation( 'ID_OVERWRITE_RELATED_PROCESS' ) ); } else { $tableData->PRO_UID = $currentPRO_UID; } } else { $validationType = 3; throw new Exception( G::loadTranslation( 'ID_ALREADY_RELATED_TABLE ' ) ); } } } 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->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']; $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'] ); } G::auditLog("ImportTable", $table['ADD_TAB_NAME']." (".$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) { $oAdditionalTables->load( $table['ADD_TAB_UID'], true ); $primaryKeys = $oAdditionalTables->getPrimaryKeys(); // Obtain a list of columns $primaryKeyColumn = array(); foreach ($contentData as $key => $row) { $primaryKeyColumn[$key] = $row[$primaryKeys[0]['FLD_NAME']]; } unset($row); array_multisort($primaryKeyColumn, SORT_ASC, $contentData); 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 = new stdClass(); $result->fromAdmin = $fromAdmin; $result->validationType = $validationType; $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; }