/**
  * 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;
 }