예제 #1
0
 public function export($format, $select = array(), $options = array())
 {
     if ($format == self::FORMAT_SQL) {
         $wherePart = '';
         if ($select) {
             if (!is_object($select)) {
                 if (is_string($select)) {
                     $select = array($select);
                 }
                 $select = $this->select($select);
             }
             $dbSelect = $this->_getDbSelect($select);
             $whereParts = $dbSelect->getPart(Zend_Db_Select::WHERE);
             $wherePart = implode(' ', $whereParts);
             // check if a row is exported and quit, if none
             $dbSelect->limit(1);
             $hasRows = $dbSelect->query()->fetchAll();
             if (!count($hasRows)) {
                 return '';
             }
         }
         if ($wherePart) {
             $wherePart = '--where="' . $wherePart . '" ';
         }
         $systemData = $this->_getSystemData();
         $filename = tempnam('/tmp', 'modelimport');
         $cmd = "{$systemData['mysqlDir']}mysqldump --add-drop-table=false ";
         $cmd .= "--skip-add-locks --complete-insert ";
         $cmd .= "--no-create-info=true " . $wherePart . "{$systemData['mysqlOptions']} {$systemData['tableName']} | gzip -c > {$filename}";
         exec($cmd, $output, $ret);
         if ($ret != 0) {
             throw new Kwf_Exception("SQL export failed");
         }
         $ret = file_get_contents($filename);
         unlink($filename);
         return $ret;
     } else {
         if ($format == self::FORMAT_CSV) {
             if (!is_object($select)) {
                 if (is_string($select)) {
                     $select = array($select);
                 }
                 $select = $this->select($select);
             }
             $tmpExportFolder = realpath('temp') . '/modelcsvex' . uniqid();
             $filename = $tmpExportFolder . '/csvexport';
             $dbSelect = $this->_createDbSelectWithColumns($select, $options);
             $sqlString = $dbSelect->assembleIntoOutfile($filename);
             $dbSelect->limit(1);
             $fieldResult = $dbSelect->query()->fetchAll();
             $columnsCsv = '';
             if (count($fieldResult)) {
                 mkdir($tmpExportFolder, 0777);
                 $columns = array_keys($fieldResult[0]);
                 $columnsCsv = '"' . implode('","', $columns) . '"';
                 $this->executeSql($sqlString);
                 $cmd = "{ echo '{$columnsCsv}'; cat {$filename}; } | gzip -c > {$filename}.gz";
                 exec($cmd, $output, $ret);
                 if ($ret != 0) {
                     throw new Kwf_Exception("CSV-SQL export failed");
                 }
                 if (!file_exists($filename . '.gz')) {
                     throw new Kwf_Exception("Error exporting csv from model - target file has not been created");
                 }
                 unlink($filename);
                 $ret = file_get_contents($filename . '.gz');
                 unlink($filename . '.gz');
                 rmdir($tmpExportFolder);
                 return $ret;
             } else {
                 return '';
             }
         } else {
             if ($format == self::FORMAT_ARRAY) {
                 if (!is_object($select)) {
                     if (is_string($select)) {
                         $select = array($select);
                     }
                     $select = $this->select($select);
                 }
                 if ($select->hasPart(Kwf_Model_Select::UNION)) {
                     $select = clone $select;
                     $unions = $select->getPart(Kwf_Model_Select::UNION);
                     $select->unsetPart(Kwf_Model_Select::UNION);
                     $selects = array($select);
                     $selects = array_merge($selects, $unions);
                     $ret = array();
                     while ($selects) {
                         //split up into blocks of 150, mysql doesn't take more
                         $curSelects = array_splice($selects, 0, min(150, count($selects)));
                         $unions = array();
                         foreach ($curSelects as $s) {
                             $unions[] = $this->_createDbSelectWithColumns($s, $options);
                         }
                         $ret = array_merge($ret, $this->getAdapter()->query(implode(" UNION ", $unions))->fetchAll());
                     }
                     return $ret;
                 } else {
                     $dbSelect = $this->_createDbSelectWithColumns($select, $options);
                     if (!$dbSelect) {
                         return array();
                     }
                     return $this->getAdapter()->query($dbSelect)->fetchAll();
                 }
             } else {
                 return parent::export($format, $select);
             }
         }
     }
 }