diff --git a/htdocs/install/etape0.php b/htdocs/install/etape0.php index 7486be2841a29fb8eb96935e87535f00d5287aaa..783817c062dbf599db96c2f1a5a64451e5ebad8e 100644 --- a/htdocs/install/etape0.php +++ b/htdocs/install/etape0.php @@ -125,7 +125,7 @@ if (! $error) $databasefortest=$_POST["db_name"]; if (! empty($_POST["db_create_database"])) { - if ($_POST["db_type"] == 'mysql' ||$_POST["db_type"] == 'mysqli') + if ($_POST["db_type"] == 'mysql' || $_POST["db_type"] == 'mysqli') { $databasefortest='mysql'; } @@ -255,7 +255,7 @@ if (! $error && $db->connected) { // We keep only utf8 and iso $linedisabled=false; - if (! eregi('(utf8|latin1)',$characterSet['charset'])) $linedisabled=true; + if (($_POST["db_type"] == 'mysql' ||$_POST["db_type"] == 'mysqli') && ! eregi('(utf8|latin1)',$characterSet['charset'])) $linedisabled=true; if ($defaultCharacterSet == $characterSet['charset'] ) { @@ -298,7 +298,7 @@ if (! $error && $db->connected) { // We keep only utf8 and iso $linedisabled=false; - if (! eregi('(utf8_general|latin1_swedish)',$collation['collation'])) $linedisabled=true; + if (($_POST["db_type"] == 'mysql' ||$_POST["db_type"] == 'mysqli') && ! eregi('(utf8_general|latin1_swedish)',$collation['collation'])) $linedisabled=true; if ($defaultCollationConnection == $collation['collation']) { diff --git a/htdocs/install/etape1.php b/htdocs/install/etape1.php index dd5ad448cd0785b7a35351ef0f770900526121bf..833a4b953031f89af6aeb499ee21d98823002d49 100644 --- a/htdocs/install/etape1.php +++ b/htdocs/install/etape1.php @@ -321,7 +321,7 @@ if ($_POST["action"] == "set") if ($db->connected) { - if ($db->DDLCreateDb($dolibarr_main_db_name, $dolibarr_main_db_character_set, $dolibarr_main_db_collation)) + if ($db->DDLCreateDb($dolibarr_main_db_name, $dolibarr_main_db_character_set, $dolibarr_main_db_collation, $dolibarr_main_db_user)) { print '<tr><td>'; print $langs->trans("DatabaseCreation").' : '; @@ -378,7 +378,7 @@ if ($_POST["action"] == "set") /* - * On test maintenant l'acc�s par le user admin dolibarr + * On test maintenant l'acces par le user admin dolibarr */ if (! $error) { diff --git a/htdocs/lib/databases/mysql.lib.php b/htdocs/lib/databases/mysql.lib.php index 6c837ea225cd3e5da6fc70399bfd6c0ff98ed885..256777555e81eaef1ce2dd084f26d7dd941d264d 100644 --- a/htdocs/lib/databases/mysql.lib.php +++ b/htdocs/lib/databases/mysql.lib.php @@ -749,11 +749,12 @@ class DoliDb * \param database Database name to create * \param charset Charset used to store data * \param collation Charset used to sort data - * \return resource resource defined if OK, null if KO + * \param owner Username of database owner + * \return resource resource defined if OK, null if KO * \remarks Do not use function xxx_create_db (xxx=mysql, ...) as they are deprecated * We force to create database with charset this->forcecharset and collate this->forcecollate */ - function DDLCreateDb($database,$charset='',$collation='') + function DDLCreateDb($database,$charset='',$collation='',$owner='') { if (empty($charset)) $charset=$this->forcecharset; if (empty($collation)) $collation=$this->collation; @@ -963,12 +964,12 @@ class DoliDb /** - * \brief Create a user - * \param dolibarr_main_db_host Ip serveur - * \param dolibarr_main_db_user Nom user a creer - * \param dolibarr_main_db_pass Mot de passe user a creer + * \brief Create a user and privileges to connect to database (even if database does not exists yet) + * \param dolibarr_main_db_host Ip server + * \param dolibarr_main_db_user Username to create + * \param dolibarr_main_db_pass Password * \param dolibarr_main_db_name Database name where user must be granted - * \return int <0 si KO, >=0 si OK + * \return int <0 if KO, >=0 if OK */ function DDLCreateUser($dolibarr_main_db_host,$dolibarr_main_db_user,$dolibarr_main_db_pass,$dolibarr_main_db_name) { diff --git a/htdocs/lib/databases/mysqli.lib.php b/htdocs/lib/databases/mysqli.lib.php index cd0d702e58f92f3dd438cff79c7744467d13712c..d0d9f3bfee8ee6d71b325dd164913fe8d809542d 100644 --- a/htdocs/lib/databases/mysqli.lib.php +++ b/htdocs/lib/databases/mysqli.lib.php @@ -761,11 +761,12 @@ class DoliDb * \param database Database name to create * \param charset Charset used to store data * \param collation Charset used to sort data + * \param owner Username of database owner * \return resource resource defined if OK, null if KO * \remarks Do not use function xxx_create_db (xxx=mysql, ...) as they are deprecated * We force to create database with charset this->forcecharset and collate this->forcecollate */ - function DDLCreateDb($database,$charset='',$collation='') + function DDLCreateDb($database,$charset='',$collation='',$owner='') { if (empty($charset)) $charset=$this->forcecharset; if (empty($collation)) $collation=$this->collation; @@ -976,12 +977,12 @@ class DoliDb /** - * \brief Create a user - * \param dolibarr_main_db_host Ip serveur - * \param dolibarr_main_db_user Nom user a creer - * \param dolibarr_main_db_pass Mot de passe user a creer + * \brief Create a user and privileges to connect to database (even if database does not exists yet) + * \param dolibarr_main_db_host Ip server + * \param dolibarr_main_db_user Username to create + * \param dolibarr_main_db_pass Password * \param dolibarr_main_db_name Database name where user must be granted - * \return int <0 si KO, >=0 si OK + * \return int <0 if KO, >=0 if OK */ function DDLCreateUser($dolibarr_main_db_host,$dolibarr_main_db_user,$dolibarr_main_db_pass,$dolibarr_main_db_name) { diff --git a/htdocs/lib/databases/pgsql.lib.php b/htdocs/lib/databases/pgsql.lib.php index 2892e344b2d8f3f9f81bd14340b6d064814d356c..85f6acbc75ed3e748111908441470c6990e1c8af 100644 --- a/htdocs/lib/databases/pgsql.lib.php +++ b/htdocs/lib/databases/pgsql.lib.php @@ -22,129 +22,129 @@ */ /** - \file htdocs/lib/databases/pgsql.lib.php - \brief Fichier de la classe permettant de gerer une base pgsql - \version $Id$ -*/ + \file htdocs/lib/databases/pgsql.lib.php + \brief Fichier de la classe permettant de gerer une base pgsql + \version $Id$ + */ // For compatibility during upgrade if (! defined('DOL_DOCUMENT_ROOT')) define('DOL_DOCUMENT_ROOT', '../..'); if (! defined('ADODB_DATE_VERSION')) include_once(DOL_DOCUMENT_ROOT."/includes/adodbtime/adodb-time.inc.php"); /** - \class DoliDb - \brief Classe permettant de gerer la database de dolibarr -*/ + \class DoliDb + \brief Classe permettant de gerer la database de dolibarr + */ class DoliDb { - var $db; // Handler de base - var $type='pgsql'; // Nom du gestionnaire - //! Charset - var $forcecharset='latin1'; + var $db; // Handler de base + var $type='pgsql'; // Nom du gestionnaire + //! Charset + var $forcecharset='latin1'; var $versionmin=array(8,1,0); // Version min database - var $results; // Resultset de la derniere requete + var $results; // Resultset de la derniere requete - var $connected; // 1 si connecte, 0 sinon - var $database_selected; // 1 si base selectionne, 0 sinon - var $database_name; // Nom base selectionnee - var $database_user; //! Nom user base - var $transaction_opened; // 1 si une transaction est en cours, 0 sinon - var $lastquery; + var $connected; // 1 si connecte, 0 sinon + var $database_selected; // 1 si base selectionne, 0 sinon + var $database_name; // Nom base selectionnee + var $database_user; //! Nom user base + var $transaction_opened; // 1 si une transaction est en cours, 0 sinon + var $lastquery; var $lastqueryerror; // Ajout d'une variable en cas d'erreur - var $ok; - var $error; - var $lasterror; + var $ok; + var $error; + var $lasterror; - /** - * \brief Ouverture d'une connexion vers le serveur et une database. - * \param type type de base de donnees (mysql ou pgsql) - * \param host addresse de la base de donnees - * \param user nom de l'utilisateur autorise - * \param pass mot de passe - * \param name nom de la database - * \param port Port of database server - * \return int 1 en cas de succes, 0 sinon - */ - function DoliDb($type='pgsql', $host, $user, $pass, $name='', $port=0) - { - global $conf,$langs; + /** + * \brief Ouverture d'une connexion vers le serveur et une database. + * \param type type de base de donnees (mysql ou pgsql) + * \param host addresse de la base de donnees + * \param user nom de l'utilisateur autorise + * \param pass mot de passe + * \param name nom de la database + * \param port Port of database server + * \return int 1 en cas de succes, 0 sinon + */ + function DoliDb($type='pgsql', $host, $user, $pass, $name='', $port=0) + { + global $conf,$langs; $this->forcecharset=$conf->file->character_set_client; - $this->forcecollate=$conf->db->dolibarr_main_db_collation; - $this->database_user=$user; - - $this->transaction_opened=0; - - //print "Name DB: $host,$user,$pass,$name<br>"; - - if (! function_exists("pg_connect")) - { - $this->connected = 0; - $this->ok = 0; - $this->error="Pgsql PHP functions are not available in this version of PHP"; - dol_syslog("DoliDB::DoliDB : Pgsql PHP functions are not available in this version of PHP",LOG_ERR); - return $this->ok; - } - - if (! $host) - { - $this->connected = 0; - $this->ok = 0; - $this->error=$langs->trans("ErrorWrongHostParameter"); - dol_syslog("DoliDB::DoliDB : Erreur Connect, wrong host parameters",LOG_ERR); - return $this->ok; - } - - // Essai connexion serveur - $this->db = $this->connect($host, $user, $pass, $name, $port); - - if ($this->db) - { - $this->connected = 1; - $this->ok = 1; - } - else - { - // host, login ou password incorrect - $this->connected = 0; - $this->ok = 0; + $this->forcecollate=$conf->db->dolibarr_main_db_collation; + $this->database_user=$user; + + $this->transaction_opened=0; + + //print "Name DB: $host,$user,$pass,$name<br>"; + + if (! function_exists("pg_connect")) + { + $this->connected = 0; + $this->ok = 0; + $this->error="Pgsql PHP functions are not available in this version of PHP"; + dol_syslog("DoliDB::DoliDB : Pgsql PHP functions are not available in this version of PHP",LOG_ERR); + return $this->ok; + } + + if (! $host) + { + $this->connected = 0; + $this->ok = 0; + $this->error=$langs->trans("ErrorWrongHostParameter"); + dol_syslog("DoliDB::DoliDB : Erreur Connect, wrong host parameters",LOG_ERR); + return $this->ok; + } + + // Essai connexion serveur + //print "$host, $user, $pass, $name, $port"; + $this->db = $this->connect($host, $user, $pass, $name, $port); + if ($this->db) + { + $this->connected = 1; + $this->ok = 1; + } + else + { + // host, login ou password incorrect + $this->connected = 0; + $this->ok = 0; $this->error='Host, login or password incorrect'; - dol_syslog("DoliDB::DoliDB : Erreur Connect ".$this->error,LOG_ERR); - } - - // Si connexion serveur ok et si connexion base demandee, on essaie connexion base - if ($this->connected && $name) - { - if ($this->select_db($name)) - { - $this->database_selected = 1; - $this->database_name = $name; - $this->ok = 1; - } - else - { - $this->database_selected = 0; - $this->database_name = ''; - $this->ok = 0; - $this->error=$this->error(); - dol_syslog("DoliDB::DoliDB : Erreur Select_db ".$this->error,LOG_ERR); - } - } - else - { - // Pas de selection de base demandee, ok ou ko - $this->database_selected = 0; - } - - return $this->ok; - } - - - /** + dol_syslog("DoliDB::DoliDB : Erreur Connect ".$this->error,LOG_ERR); + } + + // Si connexion serveur ok et si connexion base demandee, on essaie connexion base + if ($this->connected && $name) + { + if ($this->select_db($name)) + { + $this->database_selected = 1; + $this->database_name = $name; + $this->ok = 1; + } + else + { + $this->database_selected = 0; + $this->database_name = ''; + $this->ok = 0; + $this->error=$this->error(); + dol_syslog("DoliDB::DoliDB : Erreur Select_db ".$this->error,LOG_ERR); + } + } + else + { + // Pas de selection de base demandee, ok ou ko + $this->database_selected = 0; + } + + return $this->ok; + } + + + /** * \brief Convert a SQL request in mysql syntax to database syntax * \param line SQL request line to convert * \return string SQL request line converted @@ -152,239 +152,239 @@ class DoliDb function convertSQLFromMysql($line) { # comments or empty lines - if (eregi('^-- \$Id',$line)) { - return ''; + if (eregi('^-- \$Id',$line)) { + return ''; } # comments or empty lines - if (preg_match('/^#/i',$line) || preg_match('/^$/i',$line) || preg_match('/^--/i',$line)) - { - return $line; - } - if ($create_sql != "") - { # we are inside create table statement so lets process datatypes - if (preg_match('/(ISAM|innodb)/i',$line)) { # end of create table sequence - $line=preg_replace('/\) *type=(MyISAM|innodb);/i',');'); - $line=preg_replace('/\) *engine=(MyISAM|innodb);/i',');'); - } - - # int, auto_increment -> serial -// } elsif (/^[\s\t]*(\w*)\s*.*int.*auto_increment/i) { -// $seq = qq~${table}_${1}_seq~; -// s/[\s\t]*([a-zA-Z_0-9]*)\s*.*int.*auto_increment[^,]*/ $1 SERIAL PRIMARY KEY/ig; -// $create_sql.=$_; - - # int type conversion -/* } elsif (/(\w*)int\(\d+\)/i) { - $size=$1; - $size =~ tr [A-Z] [a-z]; - if ($size eq "tiny" || $size eq "small") { - $out = "int2"; - } elsif ($size eq "big") { - $out = "int8"; - } else { - $out = "int4"; - } - s/\w*int\(\d+\)/$out/g; - } -*/ - $line=str_replace('tinyint','smallint',$line); - - # nuke unsigned - if (preg_replace('/(int\w+|smallint)\s+unsigned/i','smallint',$reg)) - { - $line=preg_replace('/(int\w+|smallint)\s+unsigned/i',$reg[1]); - } - - - # blob -> text - $line=preg_replace('/\w*blob/i','text'); - - # tinytext/mediumtext -> text - $line=preg_replace('/tinytext/i','text'); - $line=preg_replace('/mediumtext/i','text'); - - # char -> varchar - # PostgreSQL would otherwise pad with spaces as opposed - # to MySQL! Your user interface may depend on this! -// s/(\s+)char/${1}varchar/gi; - - # nuke date representation (not supported in PostgreSQL) -// s/datetime default '[^']+'/datetime/i; -// s/date default '[^']+'/datetime/i; -// s/time default '[^']+'/datetime/i; - - # change not null datetime field to null valid ones - # (to support remapping of "zero time" to null - $line=preg_replace('/datetime not null/i','datetime'); - $line=preg_replace('/datetime/i','timestamp'); - - # nuke size of timestamp -// s/timestamp\([^)]*\)/timestamp/i; - - # double -> real -// s/^double/real/i; -// s/(\s*)double/${1}real/i; - - # unique key(field1,field2) -/* if (/unique key\s*\((\w+\s*,\s*\w+)\)/i) { - s/unique key\s*\((\w+\s*,\s*\w+)\)/UNIQUE\($1\)/i; - $create_sql.=$_; - next; - } -*/ - # unique index(field1,field2) -/* if (/unique index\s*\((\w+\s*,\s*\w+)\)/i) { - s/unique index\s*\((\w+\s*,\s*\w+)\)/UNIQUE\($1\)/i; - $create_sql.=$_; - next; - } -*/ - # unique key [name] (field) -/* if (/unique key\s*(\w*)\s*\((\w+)\)/i) { - s/unique key\s*(\w*)\s*\((\w+)\)/UNIQUE\($2\)/i; - my $idxname=($1?"$1":"idx_${table}_$2"); - $create_sql.=$_; - $create_index .= "CREATE INDEX $idxname ON $table ($2);\n"; - next; - } -*/ - # unique index [name] (field) -/* if (/unique index\s*(\w*)\s*\((\w+)\)/i) { - s/unique index\s*(\w*)\s*\((\w+)\)/UNIQUE\($2\)/i; - my $idxname=($1?"$1":"idx_${table}_$2"); - $create_sql.=$_; - $create_index .= "CREATE INDEX $idxname ON $table ($2);\n"; - next; - } -*/ - # unique (field) et unique (field1, field2 ...) -/* if (/unique\s*\(([\w,\s]+)\)/i) { - s/unique\s*\(([\w,\s]+)\)/UNIQUE\($1\)/i; - my $fieldlist="$1"; - my $idxname="idx_${table}_${fieldlist}"; - $idxname =~ s/\W/_/g; $idxname =~ tr/_/_/s; - $create_sql.=$_; - $create_index .= "CREATE INDEX $idxname ON $table ($fieldlist);\n"; - next; - } -*/ - # index(field) -/* if (/index\s*(\w*)\s*\((\w+)\)/i) { - my $idxname=($1?"$1":"idx_${table}_$2"); - $create_index .= "CREATE INDEX $idxname ON $table ($2);\n"; - next; - } -*/ - # primary key -/* if (/\bkey\b/i && !/^\s+primary key\s+/i) { - s/KEY(\s+)[^(]*(\s+)/$1 UNIQUE $2/i; # hack off name of the non-primary key - } -*/ - # key(xxx) -/* if (/key\s*\((\w+)\)/i) { - my $idxname="idx_${table}_$1"; - $create_index .= "CREATE INDEX $idxname ON $table ($1);\n"; - next; - } -*/ - # Quote column names -/* s/(^\s*)([^\s\-\(]+)(\s*)/$1"$2"$3/gi if (!/\bkey\b/i); -*/ - # Remap colums with names of existing system attribute -/* if (/"oid"/i) { - s/"oid"/"_oid"/g; - print STDERR "WARNING: table $table uses column \"oid\" which is renamed to \"_oid\"\nYou should fix application manually! Press return to continue."; - my $wait=<STDIN>; - } - s/oid/_oid/i if (/key/i && /oid/i); # fix oid in key - $create_sql.=$_; -*/ - } # END of if ($create_sql ne "") i.e. were inside create table statement so processed datatypes - else { # not inside create table - #---- fix data in inserted data: (from MS world) - # FIX: disabled for now -/* if (00 && /insert into/i) { - s!\x96!-!g; # -- - s!\x93!"!g; # `` - s!\x94!"!g; # '' - s!\x85!... !g; # \ldots - s!\x92!`!g; - } -*/ - # fix dates '0000-00-00 00:00:00' (should be null) -/* s/'0000-00-00 00:00:00'/null/gi; - s/'0000-00-00'/null/gi; - s/'00:00:00'/null/gi; - s/([12]\d\d\d)([01]\d)([0-3]\d)([0-2]\d)([0-6]\d)([0-6]\d)/'$1-$2-$3 $4:$5:$6'/; - - if (/create\s+table\s+(\w+)/i) { - $create_sql = $_; - /create\s*table\s*(\w+)/i; - $table=$1 if (defined($1)); - } else { - print OUT $_; - } -*/ - } # end of if inside create_table + if (preg_match('/^#/i',$line) || preg_match('/^$/i',$line) || preg_match('/^--/i',$line)) + { + return $line; + } + if ($create_sql != "") + { # we are inside create table statement so lets process datatypes + if (preg_match('/(ISAM|innodb)/i',$line)) { # end of create table sequence + $line=preg_replace('/\) *type=(MyISAM|innodb);/i',');'); + $line=preg_replace('/\) *engine=(MyISAM|innodb);/i',');'); + } + + # int, auto_increment -> serial + // } elsif (/^[\s\t]*(\w*)\s*.*int.*auto_increment/i) { + // $seq = qq~${table}_${1}_seq~; + // s/[\s\t]*([a-zA-Z_0-9]*)\s*.*int.*auto_increment[^,]*/ $1 SERIAL PRIMARY KEY/ig; + // $create_sql.=$_; + + # int type conversion + /* } elsif (/(\w*)int\(\d+\)/i) { + $size=$1; + $size =~ tr [A-Z] [a-z]; + if ($size eq "tiny" || $size eq "small") { + $out = "int2"; + } elsif ($size eq "big") { + $out = "int8"; + } else { + $out = "int4"; + } + s/\w*int\(\d+\)/$out/g; + } + */ + $line=str_replace('tinyint','smallint',$line); + + # nuke unsigned + if (preg_replace('/(int\w+|smallint)\s+unsigned/i','smallint',$reg)) + { + $line=preg_replace('/(int\w+|smallint)\s+unsigned/i',$reg[1]); + } + + + # blob -> text + $line=preg_replace('/\w*blob/i','text'); + + # tinytext/mediumtext -> text + $line=preg_replace('/tinytext/i','text'); + $line=preg_replace('/mediumtext/i','text'); + + # char -> varchar + # PostgreSQL would otherwise pad with spaces as opposed + # to MySQL! Your user interface may depend on this! + // s/(\s+)char/${1}varchar/gi; + + # nuke date representation (not supported in PostgreSQL) + // s/datetime default '[^']+'/datetime/i; + // s/date default '[^']+'/datetime/i; + // s/time default '[^']+'/datetime/i; + + # change not null datetime field to null valid ones + # (to support remapping of "zero time" to null + $line=preg_replace('/datetime not null/i','datetime'); + $line=preg_replace('/datetime/i','timestamp'); + + # nuke size of timestamp + // s/timestamp\([^)]*\)/timestamp/i; + + # double -> real + // s/^double/real/i; + // s/(\s*)double/${1}real/i; + + # unique key(field1,field2) + /* if (/unique key\s*\((\w+\s*,\s*\w+)\)/i) { + s/unique key\s*\((\w+\s*,\s*\w+)\)/UNIQUE\($1\)/i; + $create_sql.=$_; + next; + } + */ + # unique index(field1,field2) + /* if (/unique index\s*\((\w+\s*,\s*\w+)\)/i) { + s/unique index\s*\((\w+\s*,\s*\w+)\)/UNIQUE\($1\)/i; + $create_sql.=$_; + next; + } + */ + # unique key [name] (field) + /* if (/unique key\s*(\w*)\s*\((\w+)\)/i) { + s/unique key\s*(\w*)\s*\((\w+)\)/UNIQUE\($2\)/i; + my $idxname=($1?"$1":"idx_${table}_$2"); + $create_sql.=$_; + $create_index .= "CREATE INDEX $idxname ON $table ($2);\n"; + next; + } + */ + # unique index [name] (field) + /* if (/unique index\s*(\w*)\s*\((\w+)\)/i) { + s/unique index\s*(\w*)\s*\((\w+)\)/UNIQUE\($2\)/i; + my $idxname=($1?"$1":"idx_${table}_$2"); + $create_sql.=$_; + $create_index .= "CREATE INDEX $idxname ON $table ($2);\n"; + next; + } + */ + # unique (field) et unique (field1, field2 ...) + /* if (/unique\s*\(([\w,\s]+)\)/i) { + s/unique\s*\(([\w,\s]+)\)/UNIQUE\($1\)/i; + my $fieldlist="$1"; + my $idxname="idx_${table}_${fieldlist}"; + $idxname =~ s/\W/_/g; $idxname =~ tr/_/_/s; + $create_sql.=$_; + $create_index .= "CREATE INDEX $idxname ON $table ($fieldlist);\n"; + next; + } + */ + # index(field) + /* if (/index\s*(\w*)\s*\((\w+)\)/i) { + my $idxname=($1?"$1":"idx_${table}_$2"); + $create_index .= "CREATE INDEX $idxname ON $table ($2);\n"; + next; + } + */ + # primary key + /* if (/\bkey\b/i && !/^\s+primary key\s+/i) { + s/KEY(\s+)[^(]*(\s+)/$1 UNIQUE $2/i; # hack off name of the non-primary key + } + */ + # key(xxx) + /* if (/key\s*\((\w+)\)/i) { + my $idxname="idx_${table}_$1"; + $create_index .= "CREATE INDEX $idxname ON $table ($1);\n"; + next; + } + */ + # Quote column names + /* s/(^\s*)([^\s\-\(]+)(\s*)/$1"$2"$3/gi if (!/\bkey\b/i); + */ + # Remap colums with names of existing system attribute + /* if (/"oid"/i) { + s/"oid"/"_oid"/g; + print STDERR "WARNING: table $table uses column \"oid\" which is renamed to \"_oid\"\nYou should fix application manually! Press return to continue."; + my $wait=<STDIN>; + } + s/oid/_oid/i if (/key/i && /oid/i); # fix oid in key + $create_sql.=$_; + */ + } # END of if ($create_sql ne "") i.e. were inside create table statement so processed datatypes + else { # not inside create table + #---- fix data in inserted data: (from MS world) + # FIX: disabled for now + /* if (00 && /insert into/i) { + s!\x96!-!g; # -- + s!\x93!"!g; # `` + s!\x94!"!g; # '' + s!\x85!... !g; # \ldots + s!\x92!`!g; + } + */ + # fix dates '0000-00-00 00:00:00' (should be null) + /* s/'0000-00-00 00:00:00'/null/gi; + s/'0000-00-00'/null/gi; + s/'00:00:00'/null/gi; + s/([12]\d\d\d)([01]\d)([0-3]\d)([0-2]\d)([0-6]\d)([0-6]\d)/'$1-$2-$3 $4:$5:$6'/; + + if (/create\s+table\s+(\w+)/i) { + $create_sql = $_; + /create\s*table\s*(\w+)/i; + $table=$1 if (defined($1)); + } else { + print OUT $_; + } + */ + } # end of if inside create_table return $line; } - /** - * \brief Selectionne une database. - * \param database nom de la database - * \return boolean true si ok, false si ko - * \remarks Ici postgresql n'a aucune fonction equivalente de mysql_select_db - * \remarks On compare juste manuellement si la database choisie est bien celle activee par la connexion - */ - function select_db($database) - { - if ($database == $this->database_name) - return true; - else - return false; - } - - /** - * \brief Connection vers le serveur - * \param host addresse de la base de donnees - * \param login nom de l'utilisateur autorise - * \param passwd mot de passe - * \param name nom de la database (ne sert pas sous mysql, sert sous pgsql) - * \param port Port of database server - * \return resource handler d'acces a la base - */ - function connect($host, $login, $passwd, $name, $port=0) - { - if (!$name){ - $name="postgres"; - } - $con_string = "host=$host port=$port dbname=$name user=$login password=$passwd"; - $this->db = pg_connect($con_string); - if ($this->db) - { - $this->database_name = $name; - } - return $this->db; - } - - /** - * \brief Renvoie la version du serveur - * \return string Chaine version - */ - function getVersion() - { - $resql=$this->query('SHOW server_version'); - $liste=$this->fetch_array($resql); - return $liste['server_version']; - } - - /** - * \brief Renvoie la version du serveur sous forme de nombre - * \return string Chaine version - */ - function getIntVersion() + /** + * \brief Selectionne une database. + * \param database nom de la database + * \return boolean true si ok, false si ko + * \remarks Ici postgresql n'a aucune fonction equivalente de mysql_select_db + * \remarks On compare juste manuellement si la database choisie est bien celle activee par la connexion + */ + function select_db($database) + { + if ($database == $this->database_name) + return true; + else + return false; + } + + /** + * \brief Connection vers le serveur + * \param host addresse de la base de donnees + * \param login nom de l'utilisateur autorise + * \param passwd mot de passe + * \param name nom de la database (ne sert pas sous mysql, sert sous pgsql) + * \param port Port of database server + * \return resource handler d'acces a la base + */ + function connect($host, $login, $passwd, $name, $port=0) + { + if (!$name){ + $name="postgres"; + } + $con_string = "host=$host port=$port dbname=$name user=$login password=$passwd"; + $this->db = pg_connect($con_string); + if ($this->db) + { + $this->database_name = $name; + } + return $this->db; + } + + /** + * \brief Renvoie la version du serveur + * \return string Chaine version + */ + function getVersion() + { + $resql=$this->query('SHOW server_version'); + $liste=$this->fetch_array($resql); + return $liste['server_version']; + } + + /** + * \brief Renvoie la version du serveur sous forme de nombre + * \return string Chaine version + */ + function getIntVersion() { $version = $this->getVersion(); $vlist = preg_split('/[.-]/',$version); @@ -397,212 +397,212 @@ class DoliDb return $vlist[0].$vlist[1].$vlist[2]; } - /** - * \brief Renvoie la version du serveur dans un tableau - * \return array Tableau de chaque niveau de version - */ - function getVersionArray() - { - return explode('.',$this->getVersion()); - } - - /** - * \brief Fermeture d'une connexion vers une database. - * \return resource - */ - function close() - { + /** + * \brief Renvoie la version du serveur dans un tableau + * \return array Tableau de chaque niveau de version + */ + function getVersionArray() + { + return explode('.',$this->getVersion()); + } + + /** + * \brief Fermeture d'une connexion vers une database. + * \return resource + */ + function close() + { dol_syslog("DoliDB::disconnect",LOG_DEBUG); - return pg_close($this->db); - } - - /** - * \brief Debut d'une transaction. - * \return int 1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur - */ - function begin() - { - if (! $this->transaction_opened) - { - $ret=$this->query("BEGIN;"); - if ($ret) + return pg_close($this->db); + } + + /** + * \brief Debut d'une transaction. + * \return int 1 si ouverture transaction ok ou deja ouverte, 0 en cas d'erreur + */ + function begin() + { + if (! $this->transaction_opened) + { + $ret=$this->query("BEGIN;"); + if ($ret) { $this->transaction_opened++; dol_syslog("BEGIN Transaction",LOG_DEBUG); } - return $ret; - } - else - { - $this->transaction_opened++; - return 1; - } - } - - /** - * \brief Validation d'une transaction - * \return int 1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur - */ - function commit() - { - if ($this->transaction_opened<=1) - { - $ret=$this->query("COMMIT;"); + return $ret; + } + else + { + $this->transaction_opened++; + return 1; + } + } + + /** + * \brief Validation d'une transaction + * \return int 1 si validation ok ou niveau de transaction non ouverte, 0 en cas d'erreur + */ + function commit() + { + if ($this->transaction_opened<=1) + { + $ret=$this->query("COMMIT;"); if ($ret) { $this->transaction_opened=0; dol_syslog("COMMIT Transaction",LOG_DEBUG); } - return $ret; - } - else - { - $this->transaction_opened--; - return 1; - } - } - - /** - * \brief Annulation d'une transaction et retour aux anciennes valeurs - * \return int 1 si annulation ok ou transaction non ouverte, 0 en cas d'erreur - */ - function rollback() - { - if ($this->transaction_opened<=1) - { - $ret=$this->query("ROLLBACK;"); + return $ret; + } + else + { + $this->transaction_opened--; + return 1; + } + } + + /** + * \brief Annulation d'une transaction et retour aux anciennes valeurs + * \return int 1 si annulation ok ou transaction non ouverte, 0 en cas d'erreur + */ + function rollback() + { + if ($this->transaction_opened<=1) + { + $ret=$this->query("ROLLBACK;"); $this->transaction_opened=0; dol_syslog("ROLLBACK Transaction",LOG_DEBUG); - return $ret; - } - else - { - $this->transaction_opened--; - return 1; - } - } - - - /** - * \brief Effectue une requete et renvoi le resultset de reponse de la base - * \param query Contenu de la query - * \return resource Resultset de la reponse - */ - function query($query) - { - $query = trim($query); + return $ret; + } + else + { + $this->transaction_opened--; + return 1; + } + } + + + /** + * \brief Effectue une requete et renvoi le resultset de reponse de la base + * \param query Contenu de la query + * \return resource Resultset de la reponse + */ + function query($query) + { + $query = trim($query); if ($this->forcecharset=="UTF-8"){ - $buffer=utf8_encode ($buffer); + $buffer=utf8_encode ($buffer); } $ret = pg_query($this->db, $query); - if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query)) - { - // Si requete utilisateur, on la sauvegarde ainsi que son resultset + if (! eregi("^COMMIT",$query) && ! eregi("^ROLLBACK",$query)) + { + // Si requete utilisateur, on la sauvegarde ainsi que son resultset if (! $ret) { $this->lastqueryerror = $query; - $this->lasterror = $this->error(); - $this->lasterrno = $this->errno(); - } - $this->lastquery=$query; - $this->results = $ret; - } - - return $ret; - } - - /** - * \brief Renvoie la ligne courante (comme un objet) pour le curseur resultset. - * \param resultset Curseur de la requete voulue - * \return resource - */ - function fetch_object($resultset=0) - { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion - if (! is_resource($resultset)) { $resultset=$this->results; } - return pg_fetch_object($resultset); - } - - /** - * \brief Renvoie les donnees dans un tableau. - * \param resultset Curseur de la requete voulue - * \return array - */ - function fetch_array($resultset=0) - { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion - if (! is_resource($resultset)) { $resultset=$this->results; } - return pg_fetch_array($resultset); - } - - /** - * \brief Renvoie les donnees comme un tableau. - * \param resultset Curseur de la requete voulue - * \return array - */ - function fetch_row($resultset=0) - { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion - if (! is_resource($resultset)) { $resultset=$this->results; } - return pg_fetch_row($resultset); - } - - /** - * \brief Renvoie le nombre de lignes dans le resultat d'une requete SELECT - * \see affected_rows - * \param resultset Curseur de la requete voulue - * \return int Nombre de lignes - */ - function num_rows($resultset=0) - { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion - if (! is_resource($resultset)) { $resultset=$this->results; } - return pg_num_rows($resultset); - } - - /** - * \brief Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE - * \see num_rows - * \param resultset Curseur de la requete voulue - * \return int Nombre de lignes - */ - function affected_rows($resultset=0) - { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion - if (! is_resource($resultset)) { $resultset=$this->results; } - // pgsql necessite un resultset pour cette fonction contrairement - // a mysql qui prend un link de base - return pg_affected_rows($resultset); - } - - - /** - * \brief Libere le dernier resultset utilise sur cette connexion. - * \param resultset Curseur de la requete voulue - */ - function free($resultset=0) - { - // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion - if (! is_resource($resultset)) { $resultset=$this->results; } - // Si resultset en est un, on libere la m�moire - if (is_resource($resultset)) pg_free_result($resultset); - } - - - /** - * \brief Defini les limites de la requete. - * \param limit nombre maximum de lignes retournees - * \param offset numero de la ligne a partir de laquelle recuperer les lignes - * \return string chaine exprimant la syntax sql de la limite - */ - function plimit($limit=0,$offset=0) - { - global $conf; - if (! $limit) $limit=$conf->liste_limit; - if ($offset > 0) return " LIMIT $offset,$limit "; - else return " LIMIT $limit "; - } + $this->lasterror = $this->error(); + $this->lasterrno = $this->errno(); + } + $this->lastquery=$query; + $this->results = $ret; + } + + return $ret; + } + + /** + * \brief Renvoie la ligne courante (comme un objet) pour le curseur resultset. + * \param resultset Curseur de la requete voulue + * \return resource + */ + function fetch_object($resultset=0) + { + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + if (! is_resource($resultset)) { $resultset=$this->results; } + return pg_fetch_object($resultset); + } + + /** + * \brief Renvoie les donnees dans un tableau. + * \param resultset Curseur de la requete voulue + * \return array + */ + function fetch_array($resultset=0) + { + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + if (! is_resource($resultset)) { $resultset=$this->results; } + return pg_fetch_array($resultset); + } + + /** + * \brief Renvoie les donnees comme un tableau. + * \param resultset Curseur de la requete voulue + * \return array + */ + function fetch_row($resultset=0) + { + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + if (! is_resource($resultset)) { $resultset=$this->results; } + return pg_fetch_row($resultset); + } + + /** + * \brief Renvoie le nombre de lignes dans le resultat d'une requete SELECT + * \see affected_rows + * \param resultset Curseur de la requete voulue + * \return int Nombre de lignes + */ + function num_rows($resultset=0) + { + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + if (! is_resource($resultset)) { $resultset=$this->results; } + return pg_num_rows($resultset); + } + + /** + * \brief Renvoie le nombre de lignes dans le resultat d'une requete INSERT, DELETE ou UPDATE + * \see num_rows + * \param resultset Curseur de la requete voulue + * \return int Nombre de lignes + */ + function affected_rows($resultset=0) + { + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + if (! is_resource($resultset)) { $resultset=$this->results; } + // pgsql necessite un resultset pour cette fonction contrairement + // a mysql qui prend un link de base + return pg_affected_rows($resultset); + } + + + /** + * \brief Libere le dernier resultset utilise sur cette connexion. + * \param resultset Curseur de la requete voulue + */ + function free($resultset=0) + { + // Si le resultset n'est pas fourni, on prend le dernier utilise sur cette connexion + if (! is_resource($resultset)) { $resultset=$this->results; } + // Si resultset en est un, on libere la m�moire + if (is_resource($resultset)) pg_free_result($resultset); + } + + + /** + * \brief Defini les limites de la requete. + * \param limit nombre maximum de lignes retournees + * \param offset numero de la ligne a partir de laquelle recuperer les lignes + * \return string chaine exprimant la syntax sql de la limite + */ + function plimit($limit=0,$offset=0) + { + global $conf; + if (! $limit) $limit=$conf->liste_limit; + if ($offset > 0) return " LIMIT $offset,$limit "; + else return " LIMIT $limit "; + } /** @@ -612,8 +612,8 @@ class DoliDb * \return string chaine exprimant la syntax sql de l'ordre de tri * \TODO A mutualiser dans classe mere */ - function order($sortfield=0,$sortorder=0) - { + function order($sortfield=0,$sortorder=0) + { if ($sortfield) { $return=''; @@ -632,7 +632,7 @@ class DoliDb { return ''; } - } + } /** @@ -640,23 +640,23 @@ class DoliDb * \param stringtoencode String to escape * \return string String escaped */ - function escape($stringtoencode) + function escape($stringtoencode) { return addslashes($stringtoencode); } - /** - * \brief Formatage (par la base de donnees) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS) - * afin de retourner une donnee toujours au format universel date tms unix. - * Fonction a utiliser pour generer les SELECT. - * \param param Date au format text a convertir - * \return date Date au format tms. - */ - function pdate($param) - { - return "unix_timestamp(".$param.")"; - } + /** + * \brief Formatage (par la base de donnees) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS) + * afin de retourner une donnee toujours au format universel date tms unix. + * Fonction a utiliser pour generer les SELECT. + * \param param Date au format text a convertir + * \return date Date au format tms. + */ + function pdate($param) + { + return "unix_timestamp(".$param.")"; + } /** * \brief Convert (by PHP) a GM Timestamp date into a GM string date to insert into a date field. @@ -683,64 +683,64 @@ class DoliDb return $date; } - /** - * \brief Formatage d'un if SQL - * \param test chaine test - * \param resok resultat si test egal - * \param resko resultat si test non egal - * \return string chaine formate SQL - */ - function ifsql($test,$resok,$resko) - { - return 'IF('.$test.','.$resok.','.$resko.')'; - } - - - /** - * \brief Renvoie la derniere requete soumise par la methode query() - * \return lastquery - */ - function lastquery() - { - return $this->lastquery; - } - - /** - * \brief Renvoie la derniere requete en erreur - * \return string lastqueryerror - */ + /** + * \brief Formatage d'un if SQL + * \param test chaine test + * \param resok resultat si test egal + * \param resko resultat si test non egal + * \return string chaine formate SQL + */ + function ifsql($test,$resok,$resko) + { + return 'IF('.$test.','.$resok.','.$resko.')'; + } + + + /** + * \brief Renvoie la derniere requete soumise par la methode query() + * \return lastquery + */ + function lastquery() + { + return $this->lastquery; + } + + /** + * \brief Renvoie la derniere requete en erreur + * \return string lastqueryerror + */ function lastqueryerror() { return $this->lastqueryerror; } - /** - * \brief Renvoie le libelle derniere erreur - * \return string lasterror - */ + /** + * \brief Renvoie le libelle derniere erreur + * \return string lasterror + */ function lasterror() { return $this->lasterror; } - /** - * \brief Renvoie le code derniere erreur - * \return string lasterrno - */ + /** + * \brief Renvoie le code derniere erreur + * \return string lasterrno + */ function lasterrno() { return $this->lasterrno; } - /** - * \brief Renvoie le code erreur generique de l'operation precedente. - * \return error_num (Exemples: DB_ERROR_TABLE_ALREADY_EXISTS, DB_ERROR_RECORD_ALREADY_EXISTS...) - */ - function errno() - { - if (empty($error_regexps)) - { - $error_regexps = array( + /** + * \brief Renvoie le code erreur generique de l'operation precedente. + * \return error_num (Exemples: DB_ERROR_TABLE_ALREADY_EXISTS, DB_ERROR_RECORD_ALREADY_EXISTS...) + */ + function errno() + { + if (empty($error_regexps)) + { + $error_regexps = array( '/(Table does not exist\.|Relation [\"\'].*[\"\'] does not exist|sequence does not exist|class ".+" not found)$/' => 'DB_ERROR_NOSUCHTABLE', '/table [\"\'].*[\"\'] does not exist/' => 'DB_ERROR_NOSUCHTABLE', '/Relation [\"\'].*[\"\'] already exists|Cannot insert a duplicate key into (a )?unique index.*/' => 'DB_ERROR_RECORD_ALREADY_EXISTS', @@ -749,38 +749,38 @@ class DoliDb '/ttribute [\"\'].*[\"\'] not found$|Relation [\"\'].*[\"\'] does not have attribute [\"\'].*[\"\']/' => 'DB_ERROR_NOSUCHFIELD', '/parser: parse error at or near \"/' => 'DB_ERROR_SYNTAX', '/referential integrity violation/' => 'DB_ERROR_CONSTRAINT' - ); - } - foreach ($error_regexps as $regexp => $code) { - if (preg_match($regexp, pg_last_error($this->db))) { - return $code; - } - } - $errno=pg_last_error($this->db); - return ($errno?'DB_ERROR':'0'); - } - - /** - * \brief Renvoie le texte de l'erreur pgsql de l'operation precedente. - * \return error_text - */ - function error() - { - return pg_last_error($this->db); - } - - /** - * \brief Recupere l'id genere par le dernier INSERT. - * \param tab Nom de la table concernee par l'insert. Ne sert pas sous MySql mais requis pour compatibilite avec Postgresql - * \return int id - */ - function last_insert_id($tab) - { - $result = pg_query($this->db,"SELECT MAX(rowid) FROM ".$tab." ;"); - $nbre = pg_num_rows($result); - $row = pg_fetch_result($result,0,0); - return $row; - } + ); + } + foreach ($error_regexps as $regexp => $code) { + if (preg_match($regexp, pg_last_error($this->db))) { + return $code; + } + } + $errno=pg_last_error($this->db); + return ($errno?'DB_ERROR':'0'); + } + + /** + * \brief Renvoie le texte de l'erreur pgsql de l'operation precedente. + * \return error_text + */ + function error() + { + return pg_last_error($this->db); + } + + /** + * \brief Recupere l'id genere par le dernier INSERT. + * \param tab Nom de la table concernee par l'insert. Ne sert pas sous MySql mais requis pour compatibilite avec Postgresql + * \return int id + */ + function last_insert_id($tab) + { + $result = pg_query($this->db,"SELECT MAX(rowid) FROM ".$tab." ;"); + $nbre = pg_num_rows($result); + $row = pg_fetch_result($result,0,0); + return $row; + } /** * \brief Encrypt sensitive data in database @@ -816,43 +816,44 @@ class DoliDb /** - * \brief Renvoie l'id de la connexion - * \return string Id connexion - */ - function DDLGetConnectId() - { - return '?'; - } + * \brief Renvoie l'id de la connexion + * \return string Id connexion + */ + function DDLGetConnectId() + { + return '?'; + } - /** + /** * \brief Create a new database - * \param database Database name to create + * \param database Database name to create * \param charset Charset used to store data * \param collation Charset used to sort data + * \param owner Username of database owner * \return resource resource defined if OK, null if KO * \remarks Ne pas utiliser les fonctions xxx_create_db (xxx=mysql, ...) car elles sont deprecated - */ - function DDLCreateDb($database,$charset='',$collation='') - { + */ + function DDLCreateDb($database,$charset='',$collation='',$owner='') + { if (empty($charset)) $charset=$this->forcecharset; if (empty($collation)) $collation=$this->collation; - $ret=$this->query('CREATE DATABASE '.$database.' OWNER '.$this->db_user.' ENCODING \''.$charset.'\' ;'); - return $ret; - } - - /** - * \brief Liste des tables dans une database. - * \param database Nom de la database - * \return resource - */ - function DDLListTables($database) - { - $this->results = pg_query($this->db, "SHOW TABLES;"); - return $this->results; - } + $ret=$this->query('CREATE DATABASE '.$database.' OWNER '.$owner.' ENCODING \''.$charset.'\''); + return $ret; + } + + /** + * \brief Liste des tables dans une database. + * \param database Nom de la database + * \return resource + */ + function DDLListTables($database) + { + $this->results = pg_query($this->db, "SHOW TABLES"); + return $this->results; + } /** * \brief Liste les informations des champs d'une table. @@ -863,18 +864,18 @@ class DoliDb function DDLInfoTable($table) { /* - $infotables=array(); + $infotables=array(); - $sql="SHOW FULL COLUMNS FROM ".$table.";"; + $sql="SHOW FULL COLUMNS FROM ".$table.";"; - dol_syslog($sql,LOG_DEBUG); - $result = $this->pg_query($this->db,$sql); - while($row = $this->fetch_row($result)) - { + dol_syslog($sql,LOG_DEBUG); + $result = $this->pg_query($this->db,$sql); + while($row = $this->fetch_row($result)) + { $infotables[] = $row; - } - return $infotables; - */ + } + return $infotables; + */ } @@ -958,72 +959,71 @@ class DoliDb * \brief Return charset used to store data in database * \return string Charset */ - function getDefaultCharacterSetDatabase(){ - $resql=$this->query('SHOW SERVER_ENCODING'); - $liste=$this->fetch_array($resql); - return $liste['server_encoding']; + function getDefaultCharacterSetDatabase() + { + $resql=$this->query('SHOW SERVER_ENCODING'); + $liste=$this->fetch_array($resql); + return $liste['server_encoding']; } /** * \brief Return list of available charset that can be used to store data in database * \return array List of Charset */ - function getListOfCharacterSet(){ - $resql=$this->query('SHOW CHARSET'); + function getListOfCharacterSet() + { + $resql=$this->query('SHOW SERVER_ENCODING'); $liste = array(); if ($resql) - { + { $i = 0; while ($obj = $this->fetch_object($resql) ) { - $liste[$i]['charset'] = $obj->Charset; - $liste[$i]['description'] = $obj->Description; + $liste[$i]['charset'] = $obj->server_encoding; + $liste[$i]['description'] = 'Default database charset'; $i++; } - $this->free($resql); - } else { - // version Mysql < 4.1.1 - return null; - } - return $liste; + $this->free($resql); + } else { + // version Mysql < 4.1.1 + return null; + } + return $liste; } /** * \brief Return collation used in database * \return string Collation value */ - function getDefaultCollationDatabase(){ - $resql=$this->query('SHOW VARIABLES LIKE \'collation_database\''); - if (!$resql) - { - // version Mysql < 4.1.1 - return $this->forcecollate; - } - $liste=$this->fetch_array($resql); - return $liste['Value']; + function getDefaultCollationDatabase() + { + $resql=$this->query('SHOW SERVER_ENCODING'); + $liste=$this->fetch_array($resql); + return $liste['lc_collate']; } /** * \brief Return list of available collation that can be used for database * \return array Liste of Collation */ - function getListOfCollation(){ - $resql=$this->query('SHOW COLLATION'); + function getListOfCollation() + { + $resql=$this->query('SHOW LC_COLLATE'); $liste = array(); if ($resql) - { + { $i = 0; while ($obj = $this->fetch_object($resql) ) { - $liste[$i]['collation'] = $obj->Collation; + $liste[$i]['collation'] = $obj->lc_collate; $i++; } - $this->free($resql); - } else { - // version Mysql < 4.1.1 - return null; - } - return $liste; + $this->free($resql); + } else { + // version Mysql < 4.1.1 + return null; + } + return $liste; } }