From 3445244487c7b6148e7e68986c71774592fca53e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur <eldy@users.sourceforge.net> Date: Mon, 26 Oct 2009 03:10:12 +0000 Subject: [PATCH] Fix: Errors in postgreSQL support --- htdocs/admin/tools/dolibarr_export.php | 255 +++++++++++++++---------- htdocs/admin/tools/export.php | 99 ++++++++-- htdocs/langs/en_US/admin.lang | 4 +- htdocs/langs/en_US/install.lang | 2 +- htdocs/langs/fr_FR/admin.lang | 3 +- htdocs/langs/fr_FR/install.lang | 2 +- 6 files changed, 251 insertions(+), 114 deletions(-) diff --git a/htdocs/admin/tools/dolibarr_export.php b/htdocs/admin/tools/dolibarr_export.php index f434c025c48..1f3b7ce8bd4 100644 --- a/htdocs/admin/tools/dolibarr_export.php +++ b/htdocs/admin/tools/dolibarr_export.php @@ -73,10 +73,7 @@ if ($_GET["msg"]) //<![CDATA[ function hide_them_all() { document.getElementById("mysql_options").style.display = 'none'; -// document.getElementById("csv_options").style.display = 'none'; -// document.getElementById("latex_options").style.display = 'none'; -// document.getElementById("pdf_options").style.display = 'none'; -// document.getElementById("none_options").style.display = 'none'; + document.getElementById("postgresql_options").style.display = 'none'; } function show_checked_option() { @@ -85,19 +82,9 @@ function show_checked_option() { if (document.getElementById('radio_dump_mysql')) { document.getElementById('mysql_options').style.display = 'block'; } -// if (document.getElementById('radio_dump_latex').checked) { -// document.getElementById('latex_options').style.display = 'block'; -// } -// if (document.getElementById('radio_dump_pdf').checked) { -// document.getElementById('pdf_options').style.display = 'block'; -// } -// if (document.getElementById('radio_dump_xml').checked) { -// document.getElementById('none_options').style.display = 'block'; -// } -// if (document.getElementById('radio_dump_csv')) { -// document.getElementById('csv_options').style.display = 'block'; -// } - + if (document.getElementById('radio_dump_postgresql')) { + document.getElementById('postgresql_options').style.display = 'block'; + } } //]]> @@ -117,7 +104,10 @@ print '<br>'; <div id="div_container_exportoptions"> <fieldset id="exportoptions"> <legend><?php echo $langs->trans("ExportMethod"); ?></legend> - +<?php +if ($db->label == 'MySQL') +{ +?> <div class="formelementrow"> <input type="radio" name="what" value="mysql" id="radio_dump_mysql" onclick=" @@ -126,56 +116,30 @@ print '<br>'; document.getElementById('mysql_options').style.display = 'block'; }; return true" /> - <label for="radio_dump_mysql">MySQLDump</label> - </div> - -<!-- - <div class="formelementrow"> - <input type="radio" name="what" value="latex" id="radio_dump_latex" - onclick=" - if (this.checked) { - hide_them_all(); - document.getElementById('latex_options').style.display = 'block'; - }; return true" - /> - <label for="radio_dump_latex">LaTeX</label> - - </div> - - <div class="formelementrow"> - <input type="radio" name="what" value="pdf" id="radio_dump_pdf" - onclick=" - if (this.checked) { - hide_them_all(); - document.getElementById('pdf_options').style.display = 'block'; - }; return true" - /> - <label for="radio_dump_pdf">PDF</label> + <label for="radio_dump_mysql">MySQL Dump (mysqldump)</label> </div> - - <div class="formelementrow"> - <input type="radio" name="what" value="csv" id="radio_dump_csv" - onclick="if - (this.checked) { - hide_them_all(); - document.getElementById('csv_options').style.display = 'block'; - }; return true" - /> - <label for="radio_dump_csv">CSV</label> - </div> - +<?php +} +else if ($db->label == 'PostgreSQL') +{ +?> <div class="formelementrow"> - <input type="radio" name="what" value="xml" id="radio_dump_xml" + <input type="radio" name="what" value="postgresql" id="radio_dump_postgresql" onclick=" if (this.checked) { hide_them_all(); - document.getElementById('none_options').style.display = 'block'; + document.getElementById('postgresql_options').style.display = 'block'; }; return true" /> - <label for="radio_dump_xml">XML</label> - + <label for="radio_dump_postgresql">PostgreSQL Dump (pg_dump)</label> </div> ---> +<?php +} +else +{ + print 'No method available with database '.$db->label; +} +?> </fieldset> </div> @@ -186,6 +150,7 @@ print '<br>'; <div id="div_container_sub_exportoptions"> +<!-- Fieldset mysqldump --> <fieldset id="mysql_options"> <legend><?php echo $langs->trans("MySqlExportParameters"); ?></legend> @@ -214,41 +179,46 @@ print '<br>'; value="<?php echo $fullpathofmysqldump; ?>" /> </div> - <div class="formelementrow"> - <input type="checkbox" name="use_transaction" value="yes" - id="checkbox_use_transaction" - /> - <label for="checkbox_use_transaction"> - <?php echo $langs->trans("UseTransactionnalMode"); ?></label> - - </div> - - <div class="formelementrow"> - <input type="checkbox" name="disable_fk" value="yes" id="checkbox_disable_fk" checked="true" /> - <label for="checkbox_disable_fk"> - <?php echo $langs->trans("CommandsToDisableForeignKeysForImport"); ?></label> - </div> - <label for="select_sql_compat"> - <?php echo $langs->trans("ExportCompatibility"); ?></label> - - <select name="sql_compat" id="select_sql_compat"> - <option value="NONE" selected="selected">NONE</option> -<option value="ANSI">ANSI</option> -<option value="DB2">DB2</option> -<option value="MAXDB">MAXDB</option> -<option value="MYSQL323">MYSQL323</option> -<option value="MYSQL40">MYSQL40</option> -<option value="MSSQL">MSSQL</option> -<option value="ORACLE">ORACLE</option> -<option value="POSTGRESQL">POSTGRESQL</option> - </select> + <br> <fieldset> <legend><?php echo $langs->trans("ExportOptions"); ?></legend> + <div class="formelementrow"> + <input type="checkbox" name="use_transaction" value="yes" + id="checkbox_use_transaction" + /> + <label for="checkbox_use_transaction"> + <?php echo $langs->trans("UseTransactionnalMode"); ?></label> + + </div> + + <div class="formelementrow"> + <input type="checkbox" name="disable_fk" value="yes" id="checkbox_disable_fk" checked="true" /> + <label for="checkbox_disable_fk"> + <?php echo $langs->trans("CommandsToDisableForeignKeysForImport"); ?></label> + </div> + <label for="select_sql_compat"> + <?php echo $langs->trans("ExportCompatibility"); ?></label> + + <select name="sql_compat" id="select_sql_compat"> + <option value="NONE" selected="selected">NONE</option> + <option value="ANSI">ANSI</option> + <option value="DB2">DB2</option> + <option value="MAXDB">MAXDB</option> + <option value="MYSQL323">MYSQL323</option> + <option value="MYSQL40">MYSQL40</option> + <option value="MSSQL">MSSQL</option> + <option value="ORACLE">ORACLE</option> + <option value="POSTGRESQL">POSTGRESQL</option> + </select> + + <br> <input type="checkbox" name="drop_database" value="yes" id="checkbox_drop_database" /> <label for="checkbox_drop_database"><?php echo $langs->trans("AddDropDatabase"); ?></label> </fieldset> + + <br> <fieldset> <legend> <input type="checkbox" name="sql_structure" value="structure" @@ -264,8 +234,9 @@ print '<br>'; <input type="checkbox" name="drop" value="1" id="checkbox_dump_drop" /> <label for="checkbox_dump_drop"><?php echo $langs->trans("AddDropTable"); ?></label><br /> - </fieldset> + + <br> <fieldset> <legend> @@ -311,6 +282,89 @@ print '<br>'; </fieldset> </fieldset> + +<!-- Fieldset pg_dump --> +<fieldset id="postgresql_options"> + <legend><?php echo $langs->trans("PostgreSqlExportParameters"); ?></legend> + + <div class="formelementrow"> + <?php echo $langs->trans("FullPathToPostgreSQLdumpCommand"); + if (empty($conf->global->SYSTEMTOOLS_POSTGRESQLDUMP)) + { + $resql=$db->query('SHOW data_directory'); + if ($resql) + { + $liste=$db->fetch_array($resql); + $basedir=$liste['data_directory']; + $fullpathofpgdump=preg_replace('/data$/','bin',$basedir).'/pg_dump'; + } + else + { + $fullpathofpgdump='/pathtopgdump/pg_dump'; + } + } + else + { + $fullpathofpgdump=$conf->global->SYSTEMTOOLS_POSTGRESQLDUMP; + } + ?><br /> + <input type="text" name="postgresqldump" size="80" + value="<?php echo $fullpathofpgdump; ?>" /> + </div> + + + <br> + <fieldset> + <legend><?php echo $langs->trans("ExportOptions"); ?></legend> + <label for="select_sql_compat"> + <?php echo $langs->trans("ExportCompatibility"); ?></label> + <select name="sql_compat" id="select_sql_compat"> + <option value="POSTGRESQL" selected="selected">POSTGRESQL</option> + <option value="ANSI">ANSI</option> + </select><br> + <input type="checkbox" name="drop_database" value="yes" + id="checkbox_drop_database" + /> + <label for="checkbox_drop_database"><?php echo $langs->trans("AddDropDatabase"); ?></label> + </fieldset> + + <br> + <fieldset> + <legend> + <input type="checkbox" name="sql_structure" value="structure" + id="checkbox_sql_structure" + checked="checked" onclick=" + if (!this.checked && !document.getElementById('checkbox_sql_data').checked) + return false; + else return true;" /> + <label for="checkbox_sql_structure"> + Structure</label> + </legend> + </fieldset> + + <br> + <fieldset> + <legend> + + <input type="checkbox" name="sql_data" value="data" + id="checkbox_sql_data" checked="checked" onclick=" + if (!this.checked && (!document.getElementById('checkbox_sql_structure') || !document.getElementById('checkbox_sql_structure').checked)) + return false; + else return true;" /> + <label for="checkbox_sql_data"> + <?php echo $langs->trans("Datas"); ?></label> + </legend> + <input type="checkbox" name="showcolumns" value="yes" + id="checkbox_dump_showcolumns" + /> + <label for="checkbox_dump_showcolumns"> + <?php echo $langs->trans("NameColumn"); ?></label><br /> + + </fieldset> +</fieldset> + + + <!-- <fieldset id="latex_options"> <legend>Parametres export LaTeX</legend> @@ -516,7 +570,10 @@ print '<br>'; <?php echo $langs->trans("FileNameToGenerate"); ?></label> : <input type="text" name="filename_template" size="60" id="filename_template" value="<?php -$file='mysqldump_'.$dolibarr_main_db_name.'_'.dol_sanitizeFileName(DOL_VERSION).'_'.strftime("%Y%m%d%H%M").'.sql'; +$prefix='dump'; +if ($db->label == 'MySQL') $prefix='mysqldump'; +if ($db->label == 'PostgreSQL') $prefix='pg_dump'; +$file=$prefix.'_'.$dolibarr_main_db_name.'_'.dol_sanitizeFileName(DOL_VERSION).'_'.strftime("%Y%m%d%H%M").'.sql'; echo $file; ?>" /> @@ -524,17 +581,23 @@ echo $file; <?php -print '<div class="formelementrow">'; -print "\n"; - -print $langs->trans("Compression").': '; - +// Define compressions array $compression=array( 'none' => array('function' => '', 'id' => 'radio_compression_none', 'label' => $langs->trans("None")), // 'zip' => array('function' => 'zip_open', 'id' => 'radio_compression_zip', 'label' => $langs->trans("Zip")), Not open source 'gz' => array('function' => 'gzopen', 'id' => 'radio_compression_gzip', 'label' => $langs->trans("Gzip")), - 'bz' => array('function' => 'bzopen', 'id' => 'radio_compression_bzip', 'label' => $langs->trans("Bzip2")) ); +if ($db->label == 'MySQL') +{ + $compression['bz']=array('function' => 'bzopen', 'id' => 'radio_compression_bzip', 'label' => $langs->trans("Bzip2")); +} + + +// Show compression choices +print '<div class="formelementrow">'; +print "\n"; + +print $langs->trans("Compression").': '; foreach($compression as $key => $val) { diff --git a/htdocs/admin/tools/export.php b/htdocs/admin/tools/export.php index 9d27dde70d3..3faba263135 100644 --- a/htdocs/admin/tools/export.php +++ b/htdocs/admin/tools/export.php @@ -77,25 +77,32 @@ $dump_buffer_len = 0; $time_start = time(); +// MYSQL if ($what == 'mysql') { - $mysqldump=$_POST["mysqldump"]; - if ($mysqldump) + $cmddump=$_POST["mysqldump"]; + if ($cmddump) { - dolibarr_set_const($db, 'SYSTEMTOOLS_MYSQLDUMP', $mysqldump,'chaine',0,'',$conf->entity); + dolibarr_set_const($db, 'SYSTEMTOOLS_MYSQLDUMP', $cmddump,'chaine',0,'',$conf->entity); } + $outputdir = $conf->admin->dir_temp; + $outputfile = $outputdir.'/'.$file; + // for compression format, we add extension + $compression=isset($_POST['compression']) ? $_POST['compression'] : 'none'; + if ($compression == 'gz') $outputfile.='.gz'; + if ($compression == 'bz') $outputfile.='.bz2'; + $outputerror = $outputfile.'.err'; create_exdir($conf->admin->dir_temp); // Parameteres execution - $command=$mysqldump; + $command=$cmddump; if (preg_match("/\s/",$command)) $command=$command=escapeshellarg($command); // Use quotes on command //$param=escapeshellarg($dolibarr_main_db_name)." -h ".escapeshellarg($dolibarr_main_db_host)." -u ".escapeshellarg($dolibarr_main_db_user)." -p".escapeshellarg($dolibarr_main_db_pass); $param=$dolibarr_main_db_name." -h ".$dolibarr_main_db_host; $param.=" -u ".$dolibarr_main_db_user; if (! empty($dolibarr_main_db_port)) $param.=" -P ".$dolibarr_main_db_port; - $compression=isset($_POST['compression']) ? $_POST['compression'] : 'none'; if (! $_POST["use_transaction"]) $param.=" -l --single-transaction"; if ($_POST["disable_fk"]) $param.=" -K"; if ($_POST["sql_compat"] && $_POST["sql_compat"] != 'NONE') $param.=" --compatible=".$_POST["sql_compat"]; @@ -129,18 +136,13 @@ if ($what == 'mysql') $paramclear.=" -p".$dolibarr_main_db_pass; } - $outputdir = $conf->admin->dir_temp; - $outputfile = $outputdir.'/'.$file; - // for compression format, we add extension - if ($compression == 'gz') $outputfile.='.gz'; - if ($compression == 'bz') $outputfile.='.bz2'; - $outputerror = $outputfile.'.err'; - print $langs->trans("RunCommandSummary").':<br>'."\n"; - print '<textarea rows="1" cols="120">'.$command." ".$paramcrypted.'</textarea><br>'."\n"; + print '<textarea rows="'.ROWS_2.'" cols="120">'.$command." ".$paramcrypted.'</textarea><br>'."\n"; print '<br>'; + + // Now run command and show result print $langs->trans("BackupResult").': '; $errormsg=''; @@ -175,7 +177,7 @@ if ($what == 'mysql') else { $langs->load("errors"); - dol_syslog("Failed to open file $outputfile",LOG_ERR); + dol_syslog("Failed to open file ".$outputfile,LOG_ERR); $errormsg=$langs->trans("ErrorFailedToWriteInDir"); } // Get errorstring @@ -200,9 +202,78 @@ if ($what == 'mysql') } } // Fin execution commande +} + +// POSTGRESQL +if ($what == 'postgresql') +{ + $cmddump=$_POST["postgresqldump"]; + if ($cmddump) + { + dolibarr_set_const($db, 'SYSTEMTOOLS_POSTGRESQLDUMP', $cmddump,'chaine',0,'',$conf->entity); + } + + $outputdir = $conf->admin->dir_temp; + $outputfile = $outputdir.'/'.$file; + // for compression format, we add extension + $compression=isset($_POST['compression']) ? $_POST['compression'] : 'none'; + if ($compression == 'gz') $outputfile.='.gz'; + if ($compression == 'bz') $outputfile.='.bz2'; + $outputerror = $outputfile.'.err'; + create_exdir($conf->admin->dir_temp); + // Parameteres execution + $command=$cmddump; + if (preg_match("/\s/",$command)) $command=$command=escapeshellarg($command); // Use quotes on command + + //$param=escapeshellarg($dolibarr_main_db_name)." -h ".escapeshellarg($dolibarr_main_db_host)." -u ".escapeshellarg($dolibarr_main_db_user)." -p".escapeshellarg($dolibarr_main_db_pass); + $param=" --no-tablespaces --inserts -h ".$dolibarr_main_db_host; + $param.=" -U ".$dolibarr_main_db_user; + if (! empty($dolibarr_main_db_port)) $param.=" -p ".$dolibarr_main_db_port; + if ($_POST["sql_compat"] && $_POST["sql_compat"] == 'ANSI') $param.=" --disable-dollar-quoting"; + if ($_POST["drop_database"]) $param.=" -c -C"; + if ($_POST["sql_structure"]) + { + if ($_POST["drop"]) $param.=" --add-drop-table"; + if (empty($_POST["sql_data"])) $param.=" -s"; + } + if ($_POST["sql_data"]) + { + if (empty($_POST["sql_structure"])) $param.=" -a"; + if ($_POST["showcolumns"]) $param.=" -c"; + } + $param.=' -f "'.$outputfile.'"'; + //if ($compression == 'none') + if ($compression == 'gz') $param.=' -Z 9'; + //if ($compression == 'bz') + $paramcrypted=$param; + $paramclear=$param; + if (! empty($dolibarr_main_db_pass)) + { + //$paramcrypted.=" -W".preg_replace('/./i','*',$dolibarr_main_db_pass); + //$paramclear.=" -W".$dolibarr_main_db_pass; + } + $paramcrypted.=" -w ".$dolibarr_main_db_name; + $paramclear.=" -w ".$dolibarr_main_db_name; + + print $langs->trans("RunCommandSummary").':<br>'."\n"; + print '<textarea rows="'.ROWS_3.'" cols="120">'.$command." ".$paramcrypted.'</textarea><br>'."\n"; + + print '<br>'; + + + // Now show to ask to run command + print $langs->trans("YouMustRunCommandFromCommandLineAfterLoginToUser",$dolibarr_main_db_user); + + print '<br>'; + print '<br>'; + + $what=''; } + + + // Si on a demande une generation if ($what) { diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index bb009eb4e26..820731a59e3 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -723,7 +723,9 @@ RestoreDesc3=* Restore the data, from a backup dump file, into the database of t ForcedToByAModule = This rule is forced to <b>%s</b> by an activated module PreviousDumpFiles=Available database backup dump files WeekStartOnDay=First day of week -RunningUpdateProcessMayBeRequired=Le lancement du processus de mise a jour semble requis (La version des programme %s differe de la version de la base %s) +RunningUpdateProcessMayBeRequired=Running the upgrade process seems to be required (Programs version %s differs from database version %s) +YouMustRunCommandFromCommandLineAfterLoginToUser=You must run this command from command line after login to a shell with user <b>%s</b>. + ##### Module password generation PasswordGenerationStandard=Return a password generated according to internal Dolibarr algorithm: 8 characters containing shared numbers and characters in lowercase. PasswordGenerationNone=Do not suggest any generated password. Password must be type in manually. diff --git a/htdocs/langs/en_US/install.lang b/htdocs/langs/en_US/install.lang index 5fff434257a..a9c27a29369 100644 --- a/htdocs/langs/en_US/install.lang +++ b/htdocs/langs/en_US/install.lang @@ -57,7 +57,7 @@ CreateUser=Create user DatabaseSuperUserAccess=Database - Superuser access CheckToCreateDatabase=Check box if database does not exist and must be created.<br>In this case, you must fill the login/password for superuser account at the bottom of this page. CheckToCreateUser=Check box if login does not exist and must be created.<br>In this case, you must fill the login/password for superuser account at the bottom of this page. -Experimental=(experimental, non operational) +Experimental=(experimental) DatabaseRootLoginDescription=Login of the user allowed to create new databases or new users, useless if your database and your database login already exists (like when you're hosted by a web hosting provider). KeepEmptyIfNoPassword=Leave empty if user has no password (avoid this) SaveConfigurationFile=Save values diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index cd3a04796a7..94fd01785f0 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -723,7 +723,8 @@ RestoreDesc3 = * Recharger depuis le fichier dump sauvegardé, la base de donné ForcedToByAModule = Cette règle est forcée à <b>%s</b> par un des modules activés PreviousDumpFiles=Fichiers disponibles de sauvegarde de la base de donnée WeekStartOnDay=Premier jour de la semaine -RunningUpdateProcessMayBeRequired=Running the upgrade process seems to be required (Programs version %s differs from database version %s) +RunningUpdateProcessMayBeRequired=Le lancement du processus de mise a jour semble requis (La version des programme %s differe de la version de la base %s) +YouMustRunCommandFromCommandLineAfterLoginToUser=Vous devez exécuter la commande sous un shell après vous etres logués avec le compte <b>%s</b>. ##### Module password generation = undefined PasswordGenerationStandard = Renvoie un mot de passe généré selon algorithme interne Dolibarr: 8 caractères, chiffres et caractères en minuscules mélangés. diff --git a/htdocs/langs/fr_FR/install.lang b/htdocs/langs/fr_FR/install.lang index d5658329ac9..cabcc148d97 100644 --- a/htdocs/langs/fr_FR/install.lang +++ b/htdocs/langs/fr_FR/install.lang @@ -57,7 +57,7 @@ CreateUser=Créer l'utilisateur DatabaseSuperUserAccess=Base de données - Accès super utilisateur CheckToCreateDatabase=Cochez cette option si la base de données n'existe pas et doit être créée.<br>Dans ce cas, il faut renseigner le login/mot de passe du superutilisateur au bas de cette page. CheckToCreateUser=Cochez cette option si le login n'existe pas et doit être créé.<br>Dans ce cas, il faut renseigner le login/mot de passe du superutilisateur au bas de cette page. -Experimental=(expérimental, non opérationnel) +Experimental=(expérimental) DatabaseRootLoginDescription=Login de l'utilisateur de la base ayant les droits de création de bases de données ou de comptes pour la base, inutile si la base et son compte d'accès existe déjà (comme lorsque vous êtes chez un hébergeur). KeepEmptyIfNoPassword=Laissez vide si l'utilisateur n'a pas de mot de passe (à éviter) SaveConfigurationFile=Enregistrement du fichier de configuration -- GitLab