/**
  * 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');
 }
Beispiel #2
0
    /**
     * 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;
    }