From fe6563b755fba5630cfc04990e5f66c317ecfbc4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur <eldy@users.sourceforge.net> Date: Sun, 25 Oct 2009 17:57:23 +0000 Subject: [PATCH] Qual: More portable SQL --- htdocs/includes/dolibarr_changes.txt | 3 ++ htdocs/install/etape2.php | 29 ++++++++++++++----- htdocs/install/mysql/tables/llx_boxes.key.sql | 6 ++-- .../mysql/tables/llx_c_type_contact.key.sql | 11 +------ .../mysql/tables/llx_c_type_contact.sql | 4 +-- .../mysql/tables/llx_dolibarr_modules.key.sql | 1 - .../mysql/tables/llx_element_contact.key.sql | 8 ++--- .../mysql/tables/llx_element_element.key.sql | 3 +- .../mysql/tables/llx_facturedet.key.sql | 2 +- htdocs/lib/databases/pgsql.lib.php | 22 +++++++++----- 10 files changed, 51 insertions(+), 38 deletions(-) diff --git a/htdocs/includes/dolibarr_changes.txt b/htdocs/includes/dolibarr_changes.txt index 69e50ee8803..c064c6cd102 100644 --- a/htdocs/includes/dolibarr_changes.txt +++ b/htdocs/includes/dolibarr_changes.txt @@ -2,6 +2,9 @@ This file describe changes made on external library after beeing included in Dolibarr root. +ALL: +---- +Replace "& new" by "new" FPDF: diff --git a/htdocs/install/etape2.php b/htdocs/install/etape2.php index a3db901cad2..6259a2d0501 100644 --- a/htdocs/install/etape2.php +++ b/htdocs/install/etape2.php @@ -122,7 +122,7 @@ if ($_POST["action"] == "set") $ok = 0; $handle=opendir($dir); - dolibarr_install_syslog("Ouverture repertoire ".$dir." handle=".$handle,LOG_DEBUG); + dolibarr_install_syslog("Open tables directory ".$dir." handle=".$handle,LOG_DEBUG); $tablefound = 0; while (($file = readdir($handle))!==false) { @@ -166,15 +166,16 @@ if ($_POST["action"] == "set") } else { - if ($db->errno() == 'DB_ERROR_TABLE_ALREADY_EXISTS') + if ($db->errno() == 'DB_ERROR_TABLE_ALREADY_EXISTS' || + $db->errno() == 'DB_ERROR_TABLE_OR_KEY_ALREADY_EXISTS') { //print "<td>Deja existante</td></tr>"; } else { print "<tr><td>".$langs->trans("CreateTableAndPrimaryKey",$name); - print "<br>".$langs->trans("Request").' '.$requestnb.' : '.$buffer; - print "</td>"; + print "<br>\n".$langs->trans("Request").' '.$requestnb.' : '.$buffer; + print "\n</td>"; print "<td>".$langs->trans("Error")." ".$db->errno()." ".$db->error()."</td></tr>"; $error++; } @@ -222,7 +223,7 @@ if ($_POST["action"] == "set") $okkeys = 0; $handle=opendir($dir); - dolibarr_install_syslog("Ouverture repertoire tables ".$dir." handle=".$handle,LOG_DEBUG); + dolibarr_install_syslog("Open keys directory ".$dir." handle=".$handle,LOG_DEBUG); while (($file = readdir($handle))!==false) { if (preg_match('/\.sql$/i',$file) && preg_match('/^llx_/i',$file) && preg_match('/\.key\.sql$/i',$file)) @@ -238,7 +239,7 @@ if ($_POST["action"] == "set") $buf = fgets($fp, 4096); // Cas special de lignes autorisees pour certaines versions uniquement - if (preg_match('/^--\sV([0-9\.]+)/i',$buf,$reg)) + if ($choix == 1 && preg_match('/^--\sV([0-9\.]+)/i',$buf,$reg)) { $versioncommande=explode('.',$reg[1]); //print var_dump($versioncommande); @@ -247,7 +248,20 @@ if ($_POST["action"] == "set") && versioncompare($versioncommande,$versionarray) <= 0) { // Version qualified, delete SQL comments - $buf=preg_replace('/^-- V([0-9\.]+)/i','',$buf); + $buf=preg_replace('/^--\sV([0-9\.]+)/i','',$buf); + //print "Ligne $i qualifiee par version: ".$buf.'<br>'; + } + } + 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 (sizeof($versioncommande) && sizeof($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.'<br>'; } } @@ -281,6 +295,7 @@ if ($_POST["action"] == "set") 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 "<td>Deja existante</td></tr>"; diff --git a/htdocs/install/mysql/tables/llx_boxes.key.sql b/htdocs/install/mysql/tables/llx_boxes.key.sql index 1b0530c37e5..09365976d78 100644 --- a/htdocs/install/mysql/tables/llx_boxes.key.sql +++ b/htdocs/install/mysql/tables/llx_boxes.key.sql @@ -1,5 +1,5 @@ -- =================================================================== --- Copyright (C) 2006-2007 Laurent Destailleur <eldy@users.sourceforge.net> +-- Copyright (C) 2006-2009 Laurent Destailleur <eldy@users.sourceforge.net> -- -- 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 @@ -21,8 +21,10 @@ ALTER TABLE llx_boxes ADD UNIQUE INDEX uk_boxes (box_id, position, fk_user); --- Supprime orphelins pour permettre mont�e de la cl� +-- Supprime orphelins pour permettre montee de la cle -- V4 DELETE llx_boxes FROM llx_boxes LEFT JOIN llx_boxes_def ON llx_boxes.box_id = llx_boxes_def.rowid WHERE llx_boxes_def.rowid IS NULL; +-- POSTGRESQL V8 DELETE FROM llx_boxes USING llx_boxes_def WHERE llx_boxes.box_id NOT IN (SELECT llx_boxes_def.rowid FROM llx_boxes_def); + ALTER TABLE llx_boxes ADD INDEX idx_boxes_boxid (box_id); ALTER TABLE llx_boxes ADD CONSTRAINT fk_boxes_box_id FOREIGN KEY (box_id) REFERENCES llx_boxes_def (rowid); diff --git a/htdocs/install/mysql/tables/llx_c_type_contact.key.sql b/htdocs/install/mysql/tables/llx_c_type_contact.key.sql index 526e6e3f2c1..dc284fc8cea 100644 --- a/htdocs/install/mysql/tables/llx_c_type_contact.key.sql +++ b/htdocs/install/mysql/tables/llx_c_type_contact.key.sql @@ -18,16 +18,7 @@ -- -- $Id$ -- ======================================================================== --- Defini les types de contact d'un element sert de reference pour --- la table llx_element_contact --- --- element est le nom de la table utilisant le type de contact. --- i.e. contact, facture, projet, societe (sans le llx_ devant). --- Libelle est un texte d�crivant le type de contact. --- active pr�cide si cette valeur est active ou 'archiv�'. - -ALTER TABLE llx_c_type_contact - ADD UNIQUE INDEX idx_c_type_contact_uk (element, source, code); +ALTER TABLE llx_c_type_contact ADD UNIQUE INDEX idx_c_type_contact_uk (element, source, code); diff --git a/htdocs/install/mysql/tables/llx_c_type_contact.sql b/htdocs/install/mysql/tables/llx_c_type_contact.sql index bde65bb8ea6..7ca83bee2ac 100644 --- a/htdocs/install/mysql/tables/llx_c_type_contact.sql +++ b/htdocs/install/mysql/tables/llx_c_type_contact.sql @@ -21,8 +21,8 @@ -- -- element est le nom de la table utilisant le type de contact. -- i.e. contact, facture, projet, societe (sans le llx_ devant). --- Libelle est un texte d�crivant le type de contact. --- active pr�cide si cette valeur est active ou 'archiv�'. +-- Libelle est un texte decrivant le type de contact. +-- active precise si cette valeur est 'active' ou 'archive'. -- -- $Id$ -- ======================================================================== diff --git a/htdocs/install/mysql/tables/llx_dolibarr_modules.key.sql b/htdocs/install/mysql/tables/llx_dolibarr_modules.key.sql index 92458721321..e4eb41f3bb4 100644 --- a/htdocs/install/mysql/tables/llx_dolibarr_modules.key.sql +++ b/htdocs/install/mysql/tables/llx_dolibarr_modules.key.sql @@ -18,5 +18,4 @@ -- $Id$ -- =========================================================================== - ALTER TABLE llx_dolibarr_modules ADD PRIMARY KEY pk_dolibarr_modules (numero, entity); diff --git a/htdocs/install/mysql/tables/llx_element_contact.key.sql b/htdocs/install/mysql/tables/llx_element_contact.key.sql index 3c25b2e6463..575930a728c 100644 --- a/htdocs/install/mysql/tables/llx_element_contact.key.sql +++ b/htdocs/install/mysql/tables/llx_element_contact.key.sql @@ -20,13 +20,9 @@ -- ============================================================================ -ALTER TABLE llx_element_contact - ADD UNIQUE INDEX idx_element_contact_idx1 (element_id, fk_c_type_contact, fk_socpeople); +ALTER TABLE llx_element_contact ADD UNIQUE INDEX idx_element_contact_idx1 (element_id, fk_c_type_contact, fk_socpeople); -ALTER TABLE llx_element_contact - ADD CONSTRAINT fk_element_contact_fk_c_type_contact - FOREIGN KEY (fk_c_type_contact) REFERENCES llx_c_type_contact(rowid); - +ALTER TABLE llx_element_contact ADD CONSTRAINT fk_element_contact_fk_c_type_contact FOREIGN KEY (fk_c_type_contact) REFERENCES llx_c_type_contact(rowid); ALTER TABLE llx_element_contact ADD INDEX idx_element_contact_fk_socpeople (fk_socpeople); -- Pas de contraite sur fk_socpeople car point sur llx_socpeople mais aussi llx_user diff --git a/htdocs/install/mysql/tables/llx_element_element.key.sql b/htdocs/install/mysql/tables/llx_element_element.key.sql index 046b8125421..d065c0f2136 100644 --- a/htdocs/install/mysql/tables/llx_element_element.key.sql +++ b/htdocs/install/mysql/tables/llx_element_element.key.sql @@ -19,8 +19,7 @@ -- ============================================================================ -ALTER TABLE llx_element_element - ADD UNIQUE INDEX idx_element_element_idx1 (sourceid, sourcetype, targetid, targettype); +ALTER TABLE llx_element_element ADD UNIQUE INDEX idx_element_element_idx1 (sourceid, sourcetype, targetid, targettype); ALTER TABLE llx_element_element ADD INDEX idx_element_element_targetid (targetid); diff --git a/htdocs/install/mysql/tables/llx_facturedet.key.sql b/htdocs/install/mysql/tables/llx_facturedet.key.sql index 3421ae46655..44df288c94d 100644 --- a/htdocs/install/mysql/tables/llx_facturedet.key.sql +++ b/htdocs/install/mysql/tables/llx_facturedet.key.sql @@ -19,7 +19,7 @@ -- =================================================================== --- Supprimme orhpelins pour permettre mont�e de la cl� +-- Supprimme orhpelins pour permettre montee de la cle -- V4 DELETE llx_facturedet FROM llx_facturedet LEFT JOIN llx_facture ON llx_facturedet.fk_facture = llx_facture.rowid WHERE llx_facture.rowid IS NULL; ALTER TABLE llx_facturedet ADD INDEX idx_facturedet_fk_facture (fk_facture); diff --git a/htdocs/lib/databases/pgsql.lib.php b/htdocs/lib/databases/pgsql.lib.php index fe8895516e2..bbbde427996 100644 --- a/htdocs/lib/databases/pgsql.lib.php +++ b/htdocs/lib/databases/pgsql.lib.php @@ -217,15 +217,23 @@ class DoliDb $line=preg_replace('/unique index\s*\((\w+\s*,\s*\w+)\)/i','UNIQUE\(\\1\)',$line); } - # alter table create [unique] index (field1, field2 ...) + # alter table add primary key (field1, field2 ...) -> We remove the primary key name not accepted by PostGreSQL + # ALTER TABLE llx_dolibarr_modules ADD PRIMARY KEY pk_dolibarr_modules (numero, entity); + if (preg_match('/ALTER\s+TABLE\s*(.*)\s*ADD\s+PRIMARY\s+KEY\s*(.*)\s*\((.*)$/i',$line,$reg)) + { + $line = "-- ".$line." replaced by --\n"; + $line.= "ALTER TABLE ".$reg[1]." ADD PRIMARY KEY (".$reg[3]; + } + + # alter table add [unique] [index] (field1, field2 ...) # ALTER TABLE llx_accountingaccount ADD INDEX idx_accountingaccount_fk_pcg_version (fk_pcg_version) - if (preg_match('/ALTER\s*TABLE\s*(.*)\s*ADD\s*(UNIQUE)?\s*(INDEX)?\s*(.*)\s*\(([\w,\s]+)\)/i',$line,$reg)) + if (preg_match('/ALTER\s+TABLE\s*(.*)\s*ADD\s+(UNIQUE INDEX|INDEX|UNIQUE)\s+(.*)\s*\(([\w,\s]+)\)/i',$line,$reg)) { - $fieldlist=$reg[5]; - $idxname=$reg[4]; + $fieldlist=$reg[4]; + $idxname=$reg[3]; $tablename=$reg[1]; $line = "-- ".$line." replaced by --\n"; - $line.= "CREATE ".($reg[2]?$reg[2].' ':'')."INDEX ".$idxname." ON ".$tablename." (".$fieldlist.")"; + $line.= "CREATE ".(preg_match('/UNIQUE/',$reg[2])?'UNIQUE ':'')."INDEX ".$idxname." ON ".$tablename." (".$fieldlist.")"; } } # END of if ($create_sql ne "") i.e. were inside create table statement so processed datatypes else { # not inside create table @@ -686,7 +694,7 @@ class DoliDb 1044 => 'DB_ERROR_ACCESSDENIED', 1046 => 'DB_ERROR_NODBSELECTED', 1048 => 'DB_ERROR_CONSTRAINT', - '42P07' => 'DB_ERROR_TABLE_ALREADY_EXISTS', + '42P07' => 'DB_ERROR_TABLE_OR_KEY_ALREADY_EXISTS', 1051 => 'DB_ERROR_NOSUCHTABLE', 1054 => 'DB_ERROR_NOSUCHFIELD', 1060 => 'DB_ERROR_COLUMN_ALREADY_EXISTS', @@ -694,7 +702,7 @@ class DoliDb 1062 => 'DB_ERROR_RECORD_ALREADY_EXISTS', '42704' => 'DB_ERROR_SYNTAX', '42601' => 'DB_ERROR_SYNTAX', - 1068 => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS', + '42P16' => 'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS', 1075 => 'DB_ERROR_CANT_DROP_PRIMARY_KEY', 1091 => 'DB_ERROR_NOSUCHFIELD', 1100 => 'DB_ERROR_NOT_LOCKED', -- GitLab