+
+ // TODO: error checking
+ while(!feof($ahPipes[1]))
+ {
+ echo fread($ahPipes[1], 4096);
+ }
+ fclose($ahPipes[1]);
+
+ $iReturn = proc_close($hProcess);
+ if ($iReturn > 0)
+ {
+ fail("pgsql returned with error code ($iReturn)");
+ }
+ if ($ahGzipPipes)
+ {
+ fclose($ahGzipPipes[1]);
+ proc_close($hGzipProcess);
+ }
+
+ }
+
+ function pgsqlRunScript($sScript, $bfatal = true)
+ {
+ global $aCMDResult;
+ // Convert database DSN to psql parameters
+ $aDSNInfo = DB::parseDSN(CONST_Database_DSN);
+ if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
+ $sCMD = 'psql -p '.$aDSNInfo['port'].' -d '.$aDSNInfo['database'];
+ if ($bfatal && !$aCMDResult['ignore-errors'])
+ $sCMD .= ' -v ON_ERROR_STOP=1';
+ $aDescriptors = array(
+ 0 => array('pipe', 'r'),
+ 1 => STDOUT,
+ 2 => STDERR
+ );
+ $ahPipes = null;
+ $hProcess = @proc_open($sCMD, $aDescriptors, $ahPipes);
+ if (!is_resource($hProcess)) fail('unable to start pgsql');
+
+ while(strlen($sScript))
+ {
+ $written = fwrite($ahPipes[0], $sScript);
+ if ($written <= 0) break;
+ $sScript = substr($sScript, $written);
+ }
+ fclose($ahPipes[0]);
+ $iReturn = proc_close($hProcess);
+ if ($bfatal && $iReturn > 0)
+ {
+ fail("pgsql returned with error code ($iReturn)");
+ }
+ }
+
+ function pgsqlRunPartitionScript($sTemplate)
+ {
+ global $aCMDResult;
+ $oDB =& getDB();
+
+ $sSQL = 'select distinct partition from country_name';
+ $aPartitions = chksql($oDB->getCol($sSQL));
+ if (!$aCMDResult['no-partitions']) $aPartitions[] = 0;
+
+ preg_match_all('#^-- start(.*?)^-- end#ms', $sTemplate, $aMatches, PREG_SET_ORDER);
+ foreach($aMatches as $aMatch)
+ {
+ $sResult = '';
+ foreach($aPartitions as $sPartitionName)
+ {
+ $sResult .= str_replace('-partition-', $sPartitionName, $aMatch[1]);
+ }
+ $sTemplate = str_replace($aMatch[0], $sResult, $sTemplate);
+ }
+
+ pgsqlRunScript($sTemplate);
+ }
+
+ function pgsqlRunRestoreData($sDumpFile)
+ {
+ // Convert database DSN to psql parameters
+ $aDSNInfo = DB::parseDSN(CONST_Database_DSN);
+ if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
+ $sCMD = 'pg_restore -p '.$aDSNInfo['port'].' -d '.$aDSNInfo['database'].' -Fc -a '.$sDumpFile;
+
+ $aDescriptors = array(
+ 0 => array('pipe', 'r'),
+ 1 => array('pipe', 'w'),
+ 2 => array('file', '/dev/null', 'a')
+ );
+ $ahPipes = null;
+ $hProcess = proc_open($sCMD, $aDescriptors, $ahPipes);
+ if (!is_resource($hProcess)) fail('unable to start pg_restore');
+