* Copyright (C) 2004-2010 Laurent Destailleur * Copyright (C) 2015 Cedric GROSS * Copyright (C) 2015 Raphaël Doursenaud * * 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 3 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, see . */ /** * \file htdocs/install/step2.php * \ingroup install * \brief Create tables, primary keys, foreign keys, indexes and functions into database and then load reference data */ include 'inc.php'; require_once $dolibarr_main_document_root.'/core/class/conf.class.php'; require_once $dolibarr_main_document_root.'/core/lib/admin.lib.php'; $step = 2; $ok = 0; // Cette page peut etre longue. On augmente le delai autorise. // Ne fonctionne que si on est pas en safe_mode. $err=error_reporting(); error_reporting(0); // Disable all errors //error_reporting(E_ALL); @set_time_limit(900); // Need 900 on some OS like Windows 7/64 error_reporting($err); $action=GETPOST('action'); $setuplang=(GETPOST('selectlang','',3)?GETPOST('selectlang','',3):'auto'); $langs->setDefaultLang($setuplang); $langs->load("admin"); $langs->load("install"); $choix=0; if ($dolibarr_main_db_type == "mysql") $choix=1; if ($dolibarr_main_db_type == "mysqli") $choix=1; if ($dolibarr_main_db_type == "pgsql") $choix=2; if ($dolibarr_main_db_type == "mssql") $choix=3; if ($dolibarr_main_db_type == "sqlite") $choix=4; if ($dolibarr_main_db_type == "sqlite3") $choix=5; //if (empty($choix)) dol_print_error('','Database type '.$dolibarr_main_db_type.' not supported into step2.php page'); // Now we load forced value from install.forced.php file. $useforcedwizard=false; $forcedfile="./install.forced.php"; if ($conffile == "/etc/dolibarr/conf.php") $forcedfile="/etc/dolibarr/install.forced.php"; if (@file_exists($forcedfile)) { $useforcedwizard=true; include_once $forcedfile; } dolibarr_install_syslog("--- step2: entering step2.php page"); /* * View */ pHeader($langs->trans("CreateDatabaseObjects"),"step4"); // Test if we can run a first install process if (! is_writable($conffile)) { print $langs->trans("ConfFileIsNotWritable",$conffiletoshow); pFooter(1,$setuplang,'jscheckparam'); exit; } if ($action == "set") { print '

'.$langs->trans("Database").'

'; print ''; $error=0; $db=getDoliDBInstance($conf->db->type,$conf->db->host,$conf->db->user,$conf->db->pass,$conf->db->name,$conf->db->port); if ($db->connected) { print "'; $ok = 1 ; } else { print "'; } if ($ok) { if($db->database_selected) { dolibarr_install_syslog("step2: successful connection to database: " . $conf->db->name); } else { dolibarr_install_syslog("step2: failed connection to database :" . $conf->db->name, LOG_ERR); print "'; $ok = 0 ; } } // Affiche version if ($ok) { $version=$db->getVersion(); $versionarray=$db->getVersionArray(); print ''; print ''; //print ''; print ''; print ''; //print ''; } $requestnb=0; // To disable some code, so you can call step2 with url like // http://localhost/dolibarrnew/install/step2.php?action=set&createtables=0&createkeys=0&createfunctions=0&createdata=llx_20_c_departements $createtables=isset($_GET['createtables'])?GETPOST('createtables'):1; $createkeys=isset($_GET['createkeys'])?GETPOST('createkeys'):1; $createfunctions=isset($_GET['createfunctions'])?GETPOST('createfunction'):1; $createdata=isset($_GET['createdata'])?GETPOST('createdata'):1; // To say sql requests are escaped for mysql so we need to unescape them $db->unescapeslashquot=true; /************************************************************************************** * * Chargement fichiers tables/*.sql (non *.key.sql) * A faire avant les fichiers *.key.sql * ***************************************************************************************/ if ($ok && $createtables) { // We always choose in mysql directory (Conversion is done by driver to translate SQL syntax) $dir = "mysql/tables/"; $ok = 0; $handle=opendir($dir); dolibarr_install_syslog("step2: open tables directory " . $dir . " handle=" . $handle); $tablefound = 0; $tabledata=array(); if (is_resource($handle)) { while (($file = readdir($handle))!==false) { if (preg_match('/\.sql$/i',$file) && preg_match('/^llx_/i',$file) && ! preg_match('/\.key\.sql$/i',$file)) { $tablefound++; $tabledata[]=$file; } } closedir($handle); } // Sort list of sql files on alphabetical order (load order is important) sort($tabledata); foreach($tabledata as $file) { $name = substr($file, 0, dol_strlen($file) - 4); $buffer = ''; $fp = fopen($dir.$file,"r"); if ($fp) { while (!feof($fp)) { $buf = fgets($fp, 4096); if (substr($buf, 0, 2) <> '--') { $buf=preg_replace('/--(.+)*/','',$buf); $buffer .= $buf; } } fclose($fp); $buffer=trim($buffer); if ($conf->db->type == 'mysql' || $conf->db->type == 'mysqli') // For Mysql 5.5+, we must replace type=innodb with ENGINE=innodb { $buffer=preg_replace('/type=innodb/i','ENGINE=innodb',$buffer); } else if ($conf->db->type == 'mssql') { $buffer=preg_replace('/type=innodb/i','',$buffer); $buffer=preg_replace('/ENGINE=innodb/i','',$buffer); } // Replace the prefix tables if ($dolibarr_main_db_prefix != 'llx_') { $buffer=preg_replace('/llx_/i',$dolibarr_main_db_prefix,$buffer); } //print ""; $db->free($resql); } else { if ($db->errno() == 'DB_ERROR_TABLE_ALREADY_EXISTS' || $db->errno() == 'DB_ERROR_TABLE_OR_KEY_ALREADY_EXISTS') { //print ""; } else { print ""; print ''; $error++; } } } else { print ""; print ''; $error++; dolibarr_install_syslog("step2: failed to open file " . $dir . $file, LOG_ERR); } } if ($tablefound) { if ($error == 0) { print ''; $ok = 1; } } else { print ''; dolibarr_install_syslog("step2: failed to find files to create database in directory " . $dir, LOG_ERR); } } /*************************************************************************************** * * Chargement fichiers tables/*.key.sql * A faire apres les fichiers *.sql * ***************************************************************************************/ if ($ok && $createkeys) { // We always choose in mysql directory (Conversion is done by driver to translate SQL syntax) $dir = "mysql/tables/"; $okkeys = 0; $handle=opendir($dir); dolibarr_install_syslog("step2: open keys directory " . $dir . " handle=" . $handle); $tablefound = 0; $tabledata=array(); if (is_resource($handle)) { while (($file = readdir($handle))!==false) { if (preg_match('/\.sql$/i',$file) && preg_match('/^llx_/i',$file) && preg_match('/\.key\.sql$/i',$file)) { $tablefound++; $tabledata[]=$file; } } closedir($handle); } // Sort list of sql files on alphabetical order (load order is important) sort($tabledata); foreach($tabledata as $file) { $name = substr($file, 0, dol_strlen($file) - 4); //print ""; $buffer = ''; $fp = fopen($dir.$file,"r"); if ($fp) { while (!feof($fp)) { $buf = fgets($fp, 4096); // Cas special de lignes autorisees pour certaines versions uniquement if ($choix == 1 && preg_match('/^--\sV([0-9\.]+)/i',$buf,$reg)) { $versioncommande=explode('.',$reg[1]); //print var_dump($versioncommande); //print var_dump($versionarray); if (count($versioncommande) && count($versionarray) && versioncompare($versioncommande,$versionarray) <= 0) { // Version qualified, delete SQL comments $buf=preg_replace('/^--\sV([0-9\.]+)/i','',$buf); //print "Ligne $i qualifiee par version: ".$buf.'
'; } } if ($choix == 2 && preg_match('/^--\sPOSTGRESQL\sV([0-9\.]+)/i',$buf,$reg)) { $versioncommande=explode('.',$reg[1]); //print var_dump($versioncommande); //print var_dump($versionarray); if (count($versioncommande) && count($versionarray) && versioncompare($versioncommande,$versionarray) <= 0) { // Version qualified, delete SQL comments $buf=preg_replace('/^--\sPOSTGRESQL\sV([0-9\.]+)/i','',$buf); //print "Ligne $i qualifiee par version: ".$buf.'
'; } } // Ajout ligne si non commentaire if (! preg_match('/^--/i',$buf)) $buffer .= $buf; } fclose($fp); // Si plusieurs requetes, on boucle sur chaque $listesql=explode(';',$buffer); foreach ($listesql as $req) { $buffer=trim($req); if ($buffer) { // Replace the prefix tables if ($dolibarr_main_db_prefix != 'llx_') { $buffer=preg_replace('/llx_/i',$dolibarr_main_db_prefix,$buffer); } //print ""; $requestnb++; dolibarr_install_syslog("step2: request: " . $buffer); $resql=$db->query($buffer,0,'dml'); if ($resql) { //print ""; $db->free($resql); } else { if ($db->errno() == 'DB_ERROR_KEY_NAME_ALREADY_EXISTS' || $db->errno() == 'DB_ERROR_CANNOT_CREATE' || $db->errno() == 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS' || $db->errno() == 'DB_ERROR_TABLE_OR_KEY_ALREADY_EXISTS' || preg_match('/duplicate key name/i',$db->error())) { //print ""; $key_exists = 1; } else { print ""; print ''; $error++; } } } } } else { print ""; print '"; $error++; dolibarr_install_syslog("step2: failed to open file " . $dir . $file, LOG_ERR); } } if ($tablefound && $error == 0) { print ''; $okkeys = 1; } } /*************************************************************************************** * * Chargement fichier functions.sql * ***************************************************************************************/ if ($ok && $createfunctions) { // For this file, we use directory according to database type if ($choix==1) $dir = "mysql/functions/"; elseif ($choix==2) $dir = "pgsql/functions/"; elseif ($choix==3) $dir = "mssql/functions/"; elseif ($choix==4) { $dir = "sqlite3/functions/"; } // Creation donnees $file = "functions.sql"; if (file_exists($dir.$file)) { $fp = fopen($dir.$file,"r"); dolibarr_install_syslog("step2: open function file " . $dir . $file . " handle=" . $fp); if ($fp) { $buffer=''; while (!feof($fp)) { $buf = fgets($fp, 4096); if (substr($buf, 0, 2) <> '--') { $buffer .= $buf."§"; } } fclose($fp); } //$buffer=preg_replace('/;\';/',";'§",$buffer); // If several requests, we loop on each of them $listesql=explode('§',$buffer); foreach ($listesql as $buffer) { $buffer=trim($buffer); if ($buffer) { dolibarr_install_syslog("step2: request: " . $buffer); print "\n"; $resql=$db->query($buffer,0,'dml'); if ($resql) { $ok = 1; $db->free($resql); } else { if ($db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS' || $db->errno() == 'DB_ERROR_KEY_NAME_ALREADY_EXISTS') { //print "Insert line : ".$buffer."
\n"; } else { $ok = 0; print ""; print ''; $error++; } } } } print ""; if ($ok) { print ''; } else { print ''; $ok = 1 ; } } } /*************************************************************************************** * * Load files data/*.sql * ***************************************************************************************/ if ($ok && $createdata) { // We always choose in mysql directory (Conversion is done by driver to translate SQL syntax) $dir = "mysql/data/"; // Insert data $handle=opendir($dir); dolibarr_install_syslog("step2: open directory data " . $dir . " handle=" . $handle); $tablefound = 0; $tabledata=array(); if (is_resource($handle)) { while (($file = readdir($handle))!==false) { if (preg_match('/\.sql$/i',$file) && preg_match('/^llx_/i',$file)) { //print 'x'.$file.'-'.$createdata.'
'; if (is_numeric($createdata) || preg_match('/'.preg_quote($createdata).'/i',$file)) { $tablefound++; $tabledata[]=$file; } } } closedir($handle); } // Sort list of data files on alphabetical order (load order is important) sort($tabledata); foreach($tabledata as $file) { $name = substr($file, 0, dol_strlen($file) - 4); $fp = fopen($dir.$file,"r"); dolibarr_install_syslog("step2: open data file " . $dir . $file . " handle=" . $fp); if ($fp) { $arrayofrequests=array(); $linefound=0; $linegroup=0; $sizeofgroup=1; // Grouping request to have 1 query for several requests does not works with mysql, so we use 1. // Load all requests while (!feof($fp)) { $buffer = fgets($fp, 4096); $buffer = trim($buffer); if ($buffer) { if (substr($buffer, 0, 2) == '--') continue; if ($linefound && ($linefound % $sizeofgroup) == 0) { $linegroup++; } if (empty($arrayofrequests[$linegroup])) $arrayofrequests[$linegroup]=$buffer; else $arrayofrequests[$linegroup].=" ".$buffer; $linefound++; } } fclose($fp); dolibarr_install_syslog("step2: found " . $linefound . " records, defined " . count($arrayofrequests) . " group(s)."); $okallfile=1; $db->begin(); // We loop on each requests of file foreach($arrayofrequests as $buffer) { // Replace the prefix tables if ($dolibarr_main_db_prefix != 'llx_') { $buffer=preg_replace('/llx_/i',$dolibarr_main_db_prefix,$buffer); } //dolibarr_install_syslog("step2: request: " . $buffer); $resql=$db->query($buffer,1); if ($resql) { //$db->free($resql); // Not required as request we launch here does not return memory needs. } else { if ($db->lasterrno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') { //print ""; if ($ok) { print ''; } else { print ''; $ok = 1; // Data loading are not blocking errors } } print '
"; print $langs->trans("ServerConnection")." : ".$conf->db->host.'Ok
Failed to connect to server : ".$conf->db->host.'Error
Failed to select database ".$conf->db->name.'Error
'.$langs->trans("DatabaseVersion").''.$version.'
'.join('.',$versionarray).'
'.$langs->trans("DatabaseName").''.$db->database_name.'
'.join('.',$versionarray).'
Creation de la table $name/td>"; $requestnb++; dolibarr_install_syslog("step2: request: " . $buffer); $resql=$db->query($buffer,0,'dml'); if ($resql) { // print "OK requete ==== $buffer
Deja existante
".$langs->trans("CreateTableAndPrimaryKey",$name); print "
\n".$langs->trans("Request").' '.$requestnb.' : '.$buffer.'
Executed query : '.$db->lastquery; print "\n
'.$langs->trans("ErrorSQL")." ".$db->errno()." ".$db->error().'
".$langs->trans("CreateTableAndPrimaryKey",$name); print "'.$langs->trans("Error").' Failed to open file '.$dir.$file.'
'; print $langs->trans("TablesAndPrimaryKeysCreation").'Ok
'.$langs->trans("ErrorFailedToFindSomeFiles",$dir).'Error
Creation de la table $name
Creation des cles et index de la table $name: '$buffer'OK requete ==== $buffer
Deja existante
".$langs->trans("CreateOtherKeysForTable",$name); print "
\n".$langs->trans("Request").' '.$requestnb.' : '.$db->lastqueryerror(); print "\n
'.$langs->trans("ErrorSQL")." ".$db->errno()." ".$db->error().'
".$langs->trans("CreateOtherKeysForTable",$name); print "'.$langs->trans("Error")." Failed to open file ".$dir.$file."
'; print $langs->trans("OtherKeysCreation").'Ok
".$langs->trans("FunctionsCreation"); print "
\n".$langs->trans("Request").' '.$requestnb.' : '.$buffer; print "\n
'.$langs->trans("ErrorSQL")." ".$db->errno()." ".$db->error().'
".$langs->trans("FunctionsCreation")."Ok
Error
Insertion ligne : $buffer"; } else { $ok = 0; $okallfile = 0; print ''.$langs->trans("ErrorSQL")." : ".$db->lasterrno()." - ".$db->lastqueryerror()." - ".$db->lasterror()."
"; } } } if ($okallfile) $db->commit(); else $db->rollback(); } } print "
".$langs->trans("ReferenceDataLoading")."Ok
Error
'; } else { print 'Parameter action=set not defined'; } dolibarr_install_syslog("--- step2: end"); pFooter(!$ok,$setuplang); if (isset($db) && is_object($db)) $db->close();