* Copyright (C) 2005-2007 Regis Houssin * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * or see http://www.gnu.org/ */ /** \file htdocs/lib/admin.lib.php \brief Library of admin functions \version $Id$ */ /** \brief Renvoi une version en chaine depuis une version en tableau \param versionarray Tableau de version (vermajeur,vermineur,autre) \return string Chaine version */ function versiontostring($versionarray) { $string='?'; if (isset($versionarray[0])) $string=$versionarray[0]; if (isset($versionarray[1])) $string.='.'.$versionarray[1]; if (isset($versionarray[2])) $string.='.'.$versionarray[2]; return $string; } /** \brief Compare 2 versions \param versionarray1 Tableau de version (vermajeur,vermineur,autre) \param versionarray2 Tableau de version (vermajeur,vermineur,autre) \return int <0 si versionarray10 si versionarray1>versionarray2 */ function versioncompare($versionarray1,$versionarray2) { $ret=0; $i=0; while ($i < max(sizeof($versionarray1),sizeof($versionarray1))) { $operande1=isset($versionarray1[$i])?$versionarray1[$i]:0; $operande2=isset($versionarray2[$i])?$versionarray2[$i]:0; if ($operande1 < $operande2) { $ret = -1; break; } if ($operande1 > $operande2) { $ret = 1; break; } $i++; } return $ret; } /** \brief Return version PHP \return array Tableau de version (vermajeur,vermineur,autre) */ function versionphparray() { return split('\.',PHP_VERSION); } /** \brief Return version Dolibarr \return array Tableau de version (vermajeur,vermineur,autre) */ function versiondolibarrarray() { return split('\.',DOL_VERSION); } /** * \brief Launch a sql file * \param sqlfile Full path to sql file * \return int <0 if ko, >0 if ok */ function run_sql($sqlfile,$silent=1) { global $db, $conf, $langs, $user; dolibarr_syslog("Admin.lib::run_sql run sql file ".$sqlfile, LOG_DEBUG); $ok=0; $error=0; $i=0; $buffer = ''; $arraysql = Array(); // Get version of database $versionarray=$db->getVersionArray(); $fp = fopen($sqlfile,"r"); if ($fp) { while (!feof ($fp)) { $buf = fgets($fp, 4096); // Cas special de lignes autorisees pour certaines versions uniquement if (eregi('^-- V([0-9\.]+)',$buf,$reg)) { $versioncommande=split('\.',$reg[1]); //print var_dump($versioncommande); //print var_dump($versionarray); if (sizeof($versioncommande) && sizeof($versionarray) && versioncompare($versioncommande,$versionarray) <= 0) { // Version qualified, delete SQL comments $buf=eregi_replace('^-- V([0-9\.]+)','',$buf); //print "Ligne $i qualifi?e par version: ".$buf.'
'; } } // Ajout ligne si non commentaire if (! eregi('^--',$buf)) $buffer .= $buf; // print $buf.'
'; if (eregi(';',$buffer)) { // Found new request $arraysql[$i]=trim($buffer); $i++; $buffer=''; } } if ($buffer) $arraysql[$i]=trim($buffer); fclose($fp); } // Loop on each request foreach($arraysql as $i=>$sql) { if ($sql) { // Ajout trace sur requete (eventuellement ? commenter si beaucoup de requetes) if (! $silent) print ''.$langs->trans("Request").' '.($i+1)." sql='".$sql."'\n"; dolibarr_syslog('Admin.lib::run_sql Request '.($i+1)." sql='".$sql); if ($db->query($sql)) { // print 'OK'; } else { $errno=$db->errno(); $okerror=array( 'DB_ERROR_TABLE_ALREADY_EXISTS', 'DB_ERROR_COLUMN_ALREADY_EXISTS', 'DB_ERROR_KEY_NAME_ALREADY_EXISTS', 'DB_ERROR_RECORD_ALREADY_EXISTS', 'DB_ERROR_NOSUCHTABLE', 'DB_ERROR_NOSUCHFIELD', 'DB_ERROR_NO_FOREIGN_KEY_TO_DROP', 'DB_ERROR_CANNOT_CREATE', // Qd contrainte deja existante 'DB_ERROR_CANT_DROP_PRIMARY_KEY', 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS' ); if (in_array($errno,$okerror)) { //if (! $silent) print $langs->trans("OK"); } else { if (! $silent) print ''; if (! $silent) print '
'.$langs->trans("Error")." ".$db->errno().": ".$sql."
".$db->error().""; if (! $silent) print ''; dolibarr_syslog('Admin.lib::run_sql Request '.($i+1)." Error ".$db->errno()." ".$sql."
".$db->error()); $error++; } } if (! $silent) print ''; } } if ($error == 0) { if (! $silent) print ''.$langs->trans("ProcessMigrateScript").''; if (! $silent) print ''.$langs->trans("OK").''; $ok = 1; } else { if (! $silent) print ''.$langs->trans("ProcessMigrateScript").''; if (! $silent) print ''.$langs->trans("KO").''; $ok = 0; } return $ok; } ?>