Qual: Déplacement des drivers de base de données de /lib dans /lib/databases pour plus de clarté.

New: Ajout du driver mysqli pour accéder à mysql via les fonction mysqli de la 4.1
This commit is contained in:
Laurent Destailleur 2006-08-05 23:55:10 +00:00
parent 0cfbc49ef3
commit 9294334913
29 changed files with 1092 additions and 458 deletions

1
README
View File

@ -125,3 +125,4 @@ This is feature Dolibarr does not support completely yet:
called "Non Perçue Récupérable"). called "Non Perçue Récupérable").
- Accountancy. - Accountancy.
- Dolibarr can manage only one currency. - Dolibarr can manage only one currency.
- Dolibarr does not make coffee (not yet).

View File

@ -6,8 +6,8 @@ Documentation d
1) Installer Dolibarr 1) Installer Dolibarr
2) Mettre à jour Dolibarr depuis une ancienne version 2) Mettre à jour Dolibarr depuis une ancienne version
3) Ce qui est nouveau dans cette version 3) Ce qui est nouveau dans cette version
4) Que peux faire Dolibarr 4) Ce que peux faire Dolibarr
5) Que ne peux pas encore faire Dolibarr 5) Ce que ne peux pas Dolibarr (pas encore)
I - INSTALLER DOLIBARR I - INSTALLER DOLIBARR
@ -120,8 +120,8 @@ Miscellanous:
V - WHAT DOLIBARR CAN'T DO YET (TODO LIST) V - WHAT DOLIBARR CAN'T DO YET (TODO LIST)
------------------------------------------ ------------------------------------------
This is feature Dolibarr does not support completely yet: Voici un liste de fonctionnalité pas encore gérées par Dolibarr:
- "NPR VAT Rate" (French particularity for managing VAT in DOM-TOM - "TVA NPR" (TVA "Non Perçue Récupérable").
called "Non Perçue Récupérable"). - Pas de compta.
- Accountancy. - Dolibarr ne gère qu'une seule monnaie.
- Dolibarr can manage only one currency. - Dolibarr ne fait pas le café (pas encore).

View File

@ -65,7 +65,7 @@ print '<ul>';
print '<li>'; print '<li>';
if (eregi('^fr_',$langs->getDefaultLang())) if (eregi('^fr_',$langs->getDefaultLang()))
{ {
print '<a target="blank" href="http://www.dolibarr.com/">'.$langs->trans("OfficialWebSite").'</a>'; print '<a target="blank" href="http://www.dolibarr.com/">'.$langs->trans("OfficialWebSiteFr").'</a>';
} }
else else
{ {

View File

@ -439,62 +439,6 @@ class Cotisation
} }
} }
/*
* Somme des dons encaissés
*/
function sum_actual()
{
$sql = "SELECT sum(amount)";
$sql .= " FROM ".MAIN_DB_PREFIX."don";
$sql .= " WHERE fk_statut = 3";
if ( $this->db->query( $sql) )
{
$row = $this->db->fetch_row(0);
return $row[0];
}
}
/* Paiement recu en attente d'encaissement
*
*
*/
function sum_pending()
{
$sql = "SELECT sum(amount)";
$sql .= " FROM ".MAIN_DB_PREFIX."don";
$sql .= " WHERE fk_statut = 2";
if ( $this->db->query( $sql) )
{
$row = $this->db->fetch_row(0);
return $row[0];
}
}
/*
* Somme des promesses de dons validées
*
*/
function sum_intent()
{
$sql = "SELECT sum(amount)";
$sql .= " FROM ".MAIN_DB_PREFIX."don";
$sql .= " WHERE fk_statut = 1";
if ( $this->db->query( $sql) )
{
$row = $this->db->fetch_row(0);
return $row[0];
}
}
} }
?> ?>

View File

@ -29,7 +29,7 @@
*/ */
require("./pre.inc.php"); require("./pre.inc.php");
include_once $dolibarr_main_document_root."/lib/".$conf->db->type.".lib.php"; include_once $dolibarr_main_document_root."/lib/databases/".$conf->db->type.".lib.php";
$langs->load("admin"); $langs->load("admin");

View File

@ -29,7 +29,7 @@
*/ */
require("./pre.inc.php"); require("./pre.inc.php");
include_once $dolibarr_main_document_root."/lib/".$conf->db->type.".lib.php"; include_once $dolibarr_main_document_root."/lib/databases/".$conf->db->type.".lib.php";
$langs->load("admin"); $langs->load("admin");

View File

@ -28,7 +28,7 @@
*/ */
require("./pre.inc.php"); require("./pre.inc.php");
include_once $dolibarr_main_document_root."/lib/".$conf->db->type.".lib.php"; include_once $dolibarr_main_document_root."/lib/databases/".$conf->db->type.".lib.php";
$langs->load("admin"); $langs->load("admin");

View File

@ -27,7 +27,7 @@
*/ */
require("./pre.inc.php"); require("./pre.inc.php");
include_once $dolibarr_main_document_root."/lib/".$conf->db->type.".lib.php"; include_once $dolibarr_main_document_root."/lib/databases/".$conf->db->type.".lib.php";
$langs->load("admin"); $langs->load("admin");
$langs->load("user"); $langs->load("user");
@ -84,20 +84,8 @@ print "<br>\n";
// Base de donnée // Base de donnée
print '<table class="noborder" width="100%">'; print '<table class="noborder" width="100%">';
print "<tr class=\"liste_titre\"><td colspan=\"2\">".$langs->trans("Database")."</td></tr>\n"; print "<tr class=\"liste_titre\"><td colspan=\"2\">".$langs->trans("Database")."</td></tr>\n";
print "<tr $bc[0]><td>".$langs->trans("Version")."</td><td>" . $db->getVersion() . "</td></tr>\n";
if ($conf->db->type == 'mysql') print "<tr $bc[1]><td width=\"240\">".$langs->trans("DriverType")."</td><td>" . $conf->db->type . "</td></tr>\n";
{
$sql = "SHOW VARIABLES LIKE 'version'";
}
$result = $db->query($sql);
if ($result)
{
$row = $db->fetch_row();
}
print "<tr $bc[0]><td>".$langs->trans("Version")."</td><td>" . $row[1] . "</td></tr>\n";
print "<tr $bc[1]><td width=\"240\">".$langs->trans("Type")."</td><td>" . $conf->db->type . "</td></tr>\n";
print "<tr $bc[0]><td>".$langs->trans("Host")."</td><td>" . $conf->db->host . "</td></tr>\n"; print "<tr $bc[0]><td>".$langs->trans("Host")."</td><td>" . $conf->db->host . "</td></tr>\n";
print "<tr $bc[1]><td>".$langs->trans("User")."</td><td>" . $conf->db->user . "&nbsp;</td></tr>\n"; print "<tr $bc[1]><td>".$langs->trans("User")."</td><td>" . $conf->db->user . "&nbsp;</td></tr>\n";
print "<tr $bc[0]><td>".$langs->trans("Password")."</td><td>" . ereg_replace(".","*",$conf->db->pass) . "&nbsp;</td></tr>\n"; print "<tr $bc[0]><td>".$langs->trans("Password")."</td><td>" . ereg_replace(".","*",$conf->db->pass) . "&nbsp;</td></tr>\n";

View File

@ -81,25 +81,25 @@ if ($exc->error_message);
print '<table class="notopnoleftnoright" width="100%">'; print '<table class="notopnoleftnoright" width="100%">';
print '<tr><td valign="top" width="30%">'; print '<tr><td valign="top" width="30%">';
$sql = "SELECT count(*) FROM ".MAIN_DB_PREFIX."facturedet"; $sql = "SELECT count(*) as nb FROM ".MAIN_DB_PREFIX."facturedet";
$sql .= " WHERE fk_export_compta = 0"; $sql .= " WHERE fk_export_compta = 0";
$resql = $db->query($sql); $resql = $db->query($sql);
if ($resql) if ($resql)
{ {
$row = $db->fetch_row($resql); $obj = $db->fetch_object($resql);
$nbfac = $row[0]; $nbfac = $obj->nb;
$db->free($resql); $db->free($resql);
} }
$sql = "SELECT count(*) FROM ".MAIN_DB_PREFIX."paiement"; $sql = "SELECT count(*) as nb FROM ".MAIN_DB_PREFIX."paiement";
$sql .= " WHERE fk_export_compta = 0"; $sql .= " WHERE fk_export_compta = 0";
$resql = $db->query($sql); $resql = $db->query($sql);
if ($resql) if ($resql)
{ {
$row = $db->fetch_row($resql); $obj = $db->fetch_object($resql);
$nbp = $row[0]; $nbp = $obj->nb;
$db->free($resql); $db->free($resql);
} }

View File

@ -67,35 +67,37 @@ if (! $mesg) {
$px->draw($filename); $px->draw($filename);
} }
$sql = "SELECT count(*), date_format(datef,'%Y') as dm, sum(total) FROM ".MAIN_DB_PREFIX."facture WHERE fk_statut > 0 "; $sql = "SELECT count(*) as nb, date_format(datef,'%Y') as dm, sum(total) as total FROM ".MAIN_DB_PREFIX."facture WHERE fk_statut > 0 ";
if ($socidp) if ($socidp)
{ {
$sql .= " AND fk_soc = $socidp"; $sql .= " AND fk_soc = $socidp";
} }
$sql .= " GROUP BY dm DESC "; $sql .= " GROUP BY dm DESC ";
if ($db->query($sql)) $result=$db->query($sql);
if ($resql)
{ {
$num = $db->num_rows(); $num = $db->num_rows($resql);
print '<table class="border" width="100%">'; print '<table class="border" width="100%">';
print '<tr><td align="center">'.$langs->trans("Year").'</td><td width="10%" align="center">'.$langs->trans("NumberOfBills").'</td><td align="center">'.$langs->trans("AmountTotal").'</td>'; print '<tr><td align="center">'.$langs->trans("Year").'</td><td width="10%" align="center">'.$langs->trans("NumberOfBills").'</td><td align="center">'.$langs->trans("AmountTotal").'</td>';
print '<td align="center" valign="top" rowspan="'.($num + 1).'">'; print '<td align="center" valign="top" rowspan="'.($num + 1).'">';
if ($mesg) { print $mesg; } if ($mesg) { print $mesg; }
else { print '<img src="'.$fileurl.'" alt="Nombre de factures par mois">'; } else { print '<img src="'.$fileurl.'" alt="Nombre de factures par mois">'; }
print '</td></tr>'; print '</td></tr>';
$i = 0; $i = 0;
while ($i < $num) while ($i < $num)
{ {
$row = $db->fetch_row($i); $obj = $db->fetch_object($resql);
$nbproduct = $row[0]; $nbproduct = $obj->nb;
$year = $row[1]; $year = $obj->dm;
print "<tr>"; $total = price($obj->total);
print '<td align="center"><a href="month.php?year='.$year.'">'.$year.'</a></td><td align="center">'.$nbproduct.'</td><td align="center">'.price($row[2]).'</td></tr>'; print "<tr>";
$i++; print '<td align="center"><a href="month.php?year='.$year.'">'.$year.'</a></td><td align="center">'.$nbproduct.'</td><td align="center">'.$total.'</td></tr>';
} $i++;
}
print '</table>'; print '</table>';
$db->free(); $db->free();
} }
else else
{ {

View File

@ -1,7 +1,7 @@
<?php <?php
/* Copyright (C) 2003-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org> /* Copyright (C) 2003-2004 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2005 Laurent Destailleur <eldy@users.sourceforge.net> * Copyright (C) 2004-2006 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2006 Andre Cianfarani <acianfa@free.fr> * Copyright (C) 2006 Andre Cianfarani <acianfa@free.fr>
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or * the Free Software Foundation; either version 2 of the License, or
@ -573,7 +573,7 @@ else
/* /*
* Contrat * Contrat
*/ */
if ($contrat->brouillon == 1 && $user->rights->contrat->creer) if ($contrat->brouillon && $user->rights->contrat->creer)
{ {
print '<form action="fiche.php?id='.$id.'" method="post">'; print '<form action="fiche.php?id='.$id.'" method="post">';
print '<input type="hidden" name="action" value="setremise">'; print '<input type="hidden" name="action" value="setremise">';
@ -628,11 +628,11 @@ else
print '</td><td colspan="3">'; print '</td><td colspan="3">';
if ($_GET["action"] == "classer") if ($_GET["action"] == "classer")
{ {
$html->form_project("fiche.php?id=$id",$contrat->fk_soc,$contrat->fk_projet,"projetid"); $html->form_project("fiche.php?id=$id",$contrat->socidp,$contrat->fk_projet,"projetid");
} }
else else
{ {
$html->form_project("fiche.php?id=$id",$contrat->fk_soc,$contrat->fk_projet,"none"); $html->form_project("fiche.php?id=$id",$contrat->socidp,$contrat->fk_projet,"none");
} }
print "</td></tr>"; print "</td></tr>";
} }

View File

@ -477,88 +477,55 @@ class Don
} }
} }
/* /*
* \brief Classe le don comme encaissé * \brief Classe le don comme encaissé
* \param rowid id du don à modifier * \param rowid id du don à modifier
* *
*/ */
function set_encaisse($rowid) function set_encaisse($rowid)
{ {
$sql = "UPDATE ".MAIN_DB_PREFIX."don SET fk_statut = 3 WHERE rowid = $rowid AND fk_statut = 2;"; $sql = "UPDATE ".MAIN_DB_PREFIX."don SET fk_statut = 3 WHERE rowid = $rowid AND fk_statut = 2;";
if ( $this->db->query( $sql) ) if ( $this->db->query( $sql) )
{ {
if ( $this->db->affected_rows() ) if ( $this->db->affected_rows() )
{ {
return 1; return 1;
} }
else else
{ {
return 0; return 0;
} }
} }
else else
{ {
dolibarr_print_error($this->db); dolibarr_print_error($this->db);
return 0; return 0;
} }
} }
/* /**
* \brief Somme des dons encaissés * \brief Somme des dons
*/ * \param param 1=promesses de dons validées , 2=xxx, 3=encaissés
function sum_actual() */
{ function sum_donations($param)
$sql = "SELECT sum(amount)"; {
$sql .= " FROM ".MAIN_DB_PREFIX."don"; $result=0;
$sql .= " WHERE fk_statut = 3";
if ( $this->db->query( $sql) ) $sql = "SELECT sum(amount) as total";
{ $sql.= " FROM ".MAIN_DB_PREFIX."don";
$row = $this->db->fetch_row(0); $sql.= " WHERE fk_statut = ".$param;
return $row[0]; $resql=$this->db->query($sql);
if ($resql)
{
$obj = $this->db->fetch_object($resql);
$result=$obj->total;
}
} return $result;
} }
/*
* \brief Paiement recu en attente d'encaissement
*
*/
function sum_pending()
{
$sql = "SELECT sum(amount)";
$sql .= " FROM ".MAIN_DB_PREFIX."don";
$sql .= " WHERE fk_statut = 2";
if ( $this->db->query( $sql) )
{
$row = $this->db->fetch_row(0);
return $row[0];
}
}
/*
* \brief Somme des promesses de dons validées
*
*/
function sum_intent()
{
$sql = "SELECT sum(amount)";
$sql .= " FROM ".MAIN_DB_PREFIX."don";
$sql .= " WHERE fk_statut = 1";
if ( $this->db->query( $sql) )
{
$row = $this->db->fetch_row(0);
return $row[0];
}
}
} }
?> ?>

View File

@ -153,7 +153,7 @@ if ($_POST["action"] == "set")
} }
// Chargement driver acces bases // Chargement driver acces bases
include_once("../lib/".$dolibarr_main_db_type.".lib.php"); include_once("../lib/databases/".$dolibarr_main_db_type.".lib.php");
} }

View File

@ -27,6 +27,11 @@
*/ */
include_once("./inc.php"); include_once("./inc.php");
if (file_exists($conffile)) include_once($conffile);
if (! isset($dolibarr_main_db_prefix) || ! $dolibarr_main_db_prefix) $dolibarr_main_db_prefix='llx_';
define('MAIN_DB_PREFIX',$dolibarr_main_db_prefix);
require_once($dolibarr_main_document_root . "/lib/databases/".$dolibarr_main_db_type.".lib.php");
require_once($dolibarr_main_document_root . "/conf/conf.class.php");
$etape = 2; $etape = 2;
$ok = 0; $ok = 0;
@ -45,29 +50,15 @@ $langs->setDefaultLang($setuplang);
$langs->load("admin"); $langs->load("admin");
$langs->load("install"); $langs->load("install");
if ($dolibarr_main_db_type == "mysql") $choix=1;
if ($dolibarr_main_db_type == "mysqli") $choix=1;
if ($dolibarr_main_db_type == "pqsql") $choix=2;
pHeader($langs->trans("CreateDatabaseObjects"),"etape4"); pHeader($langs->trans("CreateDatabaseObjects"),"etape4");
if (file_exists($conffile))
{
include_once($conffile);
}
if($dolibarr_main_db_type == "mysql")
{
require_once($dolibarr_main_document_root . "/lib/mysql.lib.php");
$choix=1;
}
else
{
require_once($dolibarr_main_document_root . "/lib/pgsql.lib.php");
$choix=2;
}
require_once($dolibarr_main_document_root . "/conf/conf.class.php");
if ($_POST["action"] == "set") if ($_POST["action"] == "set")
{ {
print '<h2>'.$langs->trans("Database").'</h2>'; print '<h2>'.$langs->trans("Database").'</h2>';

View File

@ -30,6 +30,12 @@
include_once("./inc.php"); include_once("./inc.php");
if (file_exists($conffile)) include_once($conffile);
if (! isset($dolibarr_main_db_prefix) || ! $dolibarr_main_db_prefix) $dolibarr_main_db_prefix='llx_';
define('MAIN_DB_PREFIX',$dolibarr_main_db_prefix);
require_once($dolibarr_main_document_root . "/lib/databases/".$dolibarr_main_db_type.".lib.php");
require_once($dolibarr_main_document_root . "/conf/conf.class.php");
$setuplang=isset($_POST["selectlang"])?$_POST["selectlang"]:(isset($_GET["selectlang"])?$_GET["selectlang"]:'auto'); $setuplang=isset($_POST["selectlang"])?$_POST["selectlang"]:(isset($_GET["selectlang"])?$_GET["selectlang"]:'auto');
$langs->setDefaultLang($setuplang); $langs->setDefaultLang($setuplang);
@ -40,19 +46,7 @@ $langs->load("install");
pHeader($langs->trans("AdminAccountCreation"),"etape5"); pHeader($langs->trans("AdminAccountCreation"),"etape5");
if (file_exists($conffile))
{
include_once($conffile);
}
if($dolibarr_main_db_type == "mysql")
require_once($dolibarr_main_document_root . "/lib/mysql.lib.php");
else
require_once($dolibarr_main_document_root . "/lib/pgsql.lib.php");
require_once($dolibarr_main_document_root . "/conf/conf.class.php");
print '<table cellspacing="0" cellpadding="2" width="100%">'; print '<table cellspacing="0" cellpadding="2" width="100%">';

View File

@ -29,6 +29,11 @@
*/ */
include_once("./inc.php"); include_once("./inc.php");
if (file_exists($conffile)) include_once($conffile);
if (! isset($dolibarr_main_db_prefix) || ! $dolibarr_main_db_prefix) $dolibarr_main_db_prefix='llx_';
define('MAIN_DB_PREFIX',$dolibarr_main_db_prefix);
require_once($dolibarr_main_document_root . "/lib/databases/".$dolibarr_main_db_type.".lib.php");
require_once($dolibarr_main_document_root . "/conf/conf.class.php");
$setuplang=isset($_POST["selectlang"])?$_POST["selectlang"]:(isset($_GET["selectlang"])?$_GET["selectlang"]:'auto'); $setuplang=isset($_POST["selectlang"])?$_POST["selectlang"]:(isset($_GET["selectlang"])?$_GET["selectlang"]:'auto');
$langs->setDefaultLang($setuplang); $langs->setDefaultLang($setuplang);
@ -36,26 +41,10 @@ $langs->setDefaultLang($setuplang);
$langs->load("admin"); $langs->load("admin");
$langs->load("install"); $langs->load("install");
dolibarr_install_syslog("Entering etape5.php page");
$success=0; $success=0;
if (file_exists($conffile))
{
include($conffile);
if (! isset($dolibarr_main_db_prefix) || ! $dolibarr_main_db_prefix) $dolibarr_main_db_prefix='llx_';
define('MAIN_DB_PREFIX',$dolibarr_main_db_prefix);
}
dolibarr_install_syslog("Entering etape5.php page");
if($dolibarr_main_db_type == "mysql")
require_once($dolibarr_main_document_root . "/lib/mysql.lib.php");
else
require_once($dolibarr_main_document_root . "/lib/pgsql.lib.php");
require_once($dolibarr_main_document_root . "/conf/conf.class.php");
if ($_POST["action"] == "set" || $_POST["action"] == "upgrade") if ($_POST["action"] == "set" || $_POST["action"] == "upgrade")

View File

@ -143,8 +143,8 @@ print $dolibarr_main_url_root;
<?php <?php
print $langs->trans("Examples").":<br>"; print $langs->trans("Examples").":<br>";
?> ?>
<li>http://dolibarr.lafrere.net</li> <li>http://localhost/</li>
<li>http://www.lafrere.net/dolibarr</li> <li>http://www.myserver.com:8180/dolibarr</li>
</tr> </tr>
<tr> <tr>
@ -161,12 +161,58 @@ $dolibarr_main_db_host = "localhost";
<tr> <tr>
<!-- moi--> <!-- moi-->
<td valign="top" class="label"> <td valign="top" class="label">
<?php echo $langs->trans("DatabaseType"); ?> <?php echo $langs->trans("DriverType"); ?>
</td> </td>
<td class="label"><select name='db_type'> <td class="label">
<option value='mysql'<?php echo (! isset($dolibarr_main_db_type) || $dolibarr_main_db_type=='mysql')?" selected":"" ?>>MySql</option> <select name='db_type'>
<option value='pgsql'<?php echo (isset($dolibarr_main_db_type) && $dolibarr_main_db_type=='pgsql')?" selected":"" ?>>PostgreSQL <?php echo $langs->trans("Experimental"); ?></option> <?php
$defaultype=isset($dolibarr_main_db_type)?$dolibarr_main_db_type:'mysql';
// Scan les drivers
$dir=DOL_DOCUMENT_ROOT.'/lib/databases';
$handle=opendir($dir);
$modules = array();
$nbok = $nbko = 0;
while (($file = readdir($handle))!==false)
{
if (is_readable($dir."/".$file) && eregi('^(.*)\.lib\.php',$file,$reg))
{
$type=$reg[1];
$modName = 'DoliDb';
//print "file=$file "; print "type=$type "; print "modName=$modName";
/*
include_once($dir."/".$file);
$objMod = new $modName();
if ($objMod)
{
}
*/
// Version min de la base
$versionmin=array();
if ($type=='mysql') $versionmin=array(3,1,0);
if ($type=='mysqli') $versionmin=array(4,1,0);
if ($type=='pgsql') $versionmin=array(8,1,0);
// Remarques
$note='';
if ($type=='mysql') $note='(Mysql >= '.versiontostring($versionmin).')';
if ($type=='mysqli') $note='(Mysql >= '.versiontostring($versionmin).')';
if ($type=='pgsql') $note='(Postgresql >= '.versiontostring($versionmin).')';
// Affiche ligne dans liste
print '<option value="'.$type.'" '.($defaultype==$type?" selected":"").'>';
print $type;
if ($note) print ' '.$note;
print '</option>';
}
}
?>
</select> </select>
&nbsp; &nbsp;
</td> </td>

View File

@ -27,6 +27,11 @@
*/ */
include_once("./inc.php"); include_once("./inc.php");
if (file_exists($conffile)) include_once($conffile);
if (! isset($dolibarr_main_db_prefix) || ! $dolibarr_main_db_prefix) $dolibarr_main_db_prefix='llx_';
define('MAIN_DB_PREFIX',$dolibarr_main_db_prefix);
require_once($dolibarr_main_document_root . "/lib/databases/".$dolibarr_main_db_type.".lib.php");
require_once($dolibarr_main_document_root . "/conf/conf.class.php");
$migfile='^2.0.0-2.1.0.sql$'; $migfile='^2.0.0-2.1.0.sql$';
$grant_query=''; $grant_query='';
@ -47,35 +52,16 @@ $langs->setDefaultLang($setuplang);
$langs->load("admin"); $langs->load("admin");
$langs->load("install"); $langs->load("install");
if ($dolibarr_main_db_type == "mysql") $choix=1;
if ($dolibarr_main_db_type == "mysqli") $choix=1;
if ($dolibarr_main_db_type == "pgsql") $choix=2;
dolibarr_install_syslog("Entering upgrade.php page"); dolibarr_install_syslog("Entering upgrade.php page");
pHeader($langs->trans("DatabaseMigration"),"upgrade2","upgrade"); pHeader($langs->trans("DatabaseMigration"),"upgrade2","upgrade");
if (file_exists($conffile))
{
include_once($conffile);
if (! isset($dolibarr_main_db_prefix) || ! $dolibarr_main_db_prefix) $dolibarr_main_db_prefix='llx_';
define('MAIN_DB_PREFIX',$dolibarr_main_db_prefix);
}
if($dolibarr_main_db_type == "mysql")
{
require_once($dolibarr_main_document_root . "/lib/mysql.lib.php");
$choix=1;
}
else
{
require_once($dolibarr_main_document_root . "/lib/pgsql.lib.php");
require_once($dolibarr_main_document_root . "/lib/grant.postgres.php");
$choix=2;
}
require_once($dolibarr_main_document_root . "/conf/conf.class.php");
if (! isset($_GET["action"]) || $_GET["action"] == "upgrade") if (! isset($_GET["action"]) || $_GET["action"] == "upgrade")
{ {
print '<h2>'.$langs->trans("DatabaseMigration").'</h2>'; print '<h2>'.$langs->trans("DatabaseMigration").'</h2>';

View File

@ -27,6 +27,11 @@
*/ */
include_once('./inc.php'); include_once('./inc.php');
if (file_exists($conffile)) include_once($conffile);
if (! isset($dolibarr_main_db_prefix) || ! $dolibarr_main_db_prefix) $dolibarr_main_db_prefix='llx_';
define('MAIN_DB_PREFIX',$dolibarr_main_db_prefix);
require_once($dolibarr_main_document_root . "/lib/databases/".$dolibarr_main_db_type.".lib.php");
require_once($dolibarr_main_document_root . "/conf/conf.class.php");
include_once('../facture.class.php'); include_once('../facture.class.php');
include_once('../propal.class.php'); include_once('../propal.class.php');
include_once('../commande/commande.class.php'); include_once('../commande/commande.class.php');
@ -52,6 +57,10 @@ $langs->load('install');
$langs->load("bills"); $langs->load("bills");
$langs->load("suppliers"); $langs->load("suppliers");
if ($dolibarr_main_db_type == 'mysql') $choix=1;
if ($dolibarr_main_db_type == 'mysqli') $choix=1;
if ($dolibarr_main_db_type == 'pgsql') $choix=2;
dolibarr_install_syslog("Entering upgrade2.php page"); dolibarr_install_syslog("Entering upgrade2.php page");
@ -59,29 +68,6 @@ dolibarr_install_syslog("Entering upgrade2.php page");
pHeader($langs->trans('DataMigration'),'etape5','upgrade'); pHeader($langs->trans('DataMigration'),'etape5','upgrade');
if (file_exists($conffile))
{
include_once($conffile);
if (! isset($dolibarr_main_db_prefix) || ! $dolibarr_main_db_prefix) $dolibarr_main_db_prefix='llx_';
define('MAIN_DB_PREFIX',$dolibarr_main_db_prefix);
}
if($dolibarr_main_db_type == 'mysql')
{
require_once($dolibarr_main_document_root . '/lib/mysql.lib.php');
$choix=1;
}
else
{
require_once($dolibarr_main_document_root . '/lib/pgsql.lib.php');
require_once($dolibarr_main_document_root . '/lib/grant.postgres.php');
$choix=2;
}
require_once($dolibarr_main_document_root . '/conf/conf.class.php');
if (isset($_POST['action']) && $_POST['action'] == 'upgrade') if (isset($_POST['action']) && $_POST['action'] == 'upgrade')
{ {
print '<h2>'.$langs->trans('DataMigration').'</h2>'; print '<h2>'.$langs->trans('DataMigration').'</h2>';
@ -522,7 +508,7 @@ function migrate_paiementfourn_facturefourn($db,$langs,$conf)
$nb=0; $nb=0;
$select_sql = 'SELECT rowid, fk_facture_fourn, amount '; $select_sql = 'SELECT rowid, fk_facture_fourn, amount ';
$select_sql .= ' FROM '.MAIN_DB_PREFIX.'paiementfourn '; $select_sql .= ' FROM '.MAIN_DB_PREFIX.'paiementfourn ';
$select_sql .= ' WHERE fk_facture_fourn IS NOT NULL ;'; $select_sql .= ' WHERE fk_facture_fourn IS NOT NULL';
$select_resql = $db->query($select_sql); $select_resql = $db->query($select_sql);
if ($select_resql) if ($select_resql)
{ {
@ -531,7 +517,7 @@ function migrate_paiementfourn_facturefourn($db,$langs,$conf)
$var = true; $var = true;
// Pour chaque paiement fournisseur, on insère une ligne dans paiementfourn_facturefourn // Pour chaque paiement fournisseur, on insère une ligne dans paiementfourn_facturefourn
while ($i < $select_num && ! $error) while (($i < $select_num) && (! $error))
{ {
$var = !$var; $var = !$var;
$select_obj = $db->fetch_object($select_resql); $select_obj = $db->fetch_object($select_resql);
@ -544,7 +530,7 @@ function migrate_paiementfourn_facturefourn($db,$langs,$conf)
if ($check_resql) if ($check_resql)
{ {
$check_num = $db->num_rows($check_resql); $check_num = $db->num_rows($check_resql);
if ($check_num === 0) if ($check_num == 0)
{ {
if ($nb == 0) if ($nb == 0)
{ {

View File

@ -62,7 +62,8 @@ Feature=Feature
DolibarrLicense=License DolibarrLicense=License
DolibarrProjectLeader=Project leader DolibarrProjectLeader=Project leader
OtherDeveloppers=Other developers/contributors OtherDeveloppers=Other developers/contributors
OfficialWebSite=Official web site OfficialWebSite=Internationnal official web site
OfficialWebSiteFr=French official web site
ModuleSetup=Module setup ModuleSetup=Module setup
ModuleFamilyBase=System ModuleFamilyBase=System
ModuleFamilyCrm=Customer Ressource Management (CRM) ModuleFamilyCrm=Customer Ressource Management (CRM)
@ -316,6 +317,7 @@ NbOfRecord=Nb of records
Constraints=Constraints Constraints=Constraints
ConstraintsType=Constraint's type ConstraintsType=Constraint's type
Host=Server Host=Server
DriverType=Driver type
SummarySystem=System information summary SummarySystem=System information summary
SummaryConst=List of all Dolibarr setup parameters SummaryConst=List of all Dolibarr setup parameters
SystemUpdate=System update SystemUpdate=System update

View File

@ -20,6 +20,7 @@ URLRoot=URL Root
DolibarrDatabase=Dolibarr Database DolibarrDatabase=Dolibarr Database
DatabaseChoice=Database choice DatabaseChoice=Database choice
DatabaseType=Database type DatabaseType=Database type
DriverType=Driver type
Server=Server Server=Server
ServerAddressDescription=Name or ip address for database server, usually 'localhost' when database server is hosted on same server than web server ServerAddressDescription=Name or ip address for database server, usually 'localhost' when database server is hosted on same server than web server
DatabaseName=Database name DatabaseName=Database name

View File

@ -61,8 +61,9 @@ Passwords=Mots de passe
Feature=Fonction Feature=Fonction
DolibarrLicense=Licence DolibarrLicense=Licence
DolibarrProjectLeader=Chef de projet DolibarrProjectLeader=Chef de projet
OtherDeveloppers=autres développeurs/contributeurs OtherDeveloppers=Autres développeurs/contributeurs
OfficialWebSite=site web officiel francophone OfficialWebSite=Site web officiel internationnal
OfficialWebSiteFr=Site web officiel francophone
ModuleSetup=Configuration du module ModuleSetup=Configuration du module
ModuleFamilyBase=Système ModuleFamilyBase=Système
ModuleFamilyCrm=Gestion client (CRM) ModuleFamilyCrm=Gestion client (CRM)
@ -316,6 +317,7 @@ NbOfRecord=Nb d'enr.
Constraints=Contraintes Constraints=Contraintes
ConstraintsType=Type de contrainte ConstraintsType=Type de contrainte
Host=Serveur Host=Serveur
DriverType=Type du driver
SummarySystem=Résumé des informations systèmes Dolibarr SummarySystem=Résumé des informations systèmes Dolibarr
SummaryConst=Liste de tous les paramètres de configuration Dolibarr SummaryConst=Liste de tous les paramètres de configuration Dolibarr
SystemUpdate=Mise à jour du système SystemUpdate=Mise à jour du système

View File

@ -20,6 +20,7 @@ URLRoot=URL Racine
DolibarrDatabase=Base de données Dolibarr DolibarrDatabase=Base de données Dolibarr
DatabaseChoice=Choix de la base de données DatabaseChoice=Choix de la base de données
DatabaseType=Type de la base de données DatabaseType=Type de la base de données
DriverType=Type du driver
Server=Serveur Server=Serveur
ServerAddressDescription=Nom ou adresse ip du serveur de base de données, généralement 'localhost' quand le serveur est installé sur la même machine que le serveur web ServerAddressDescription=Nom ou adresse ip du serveur de base de données, généralement 'localhost' quand le serveur est installé sur la même machine que le serveur web
DatabaseName=Nom de la base de données DatabaseName=Nom de la base de données

View File

@ -43,6 +43,7 @@ class DoliDb
var $type='mysql'; // Nom du gestionnaire var $type='mysql'; // Nom du gestionnaire
var $forcecharset='latin1'; var $forcecharset='latin1';
var $forcecollate='latin1_swedish_ci'; var $forcecollate='latin1_swedish_ci';
var $versionmin=array(4,1,0);
var $results; // Resultset de la dernière requete var $results; // Resultset de la dernière requete
@ -107,8 +108,8 @@ class DoliDb
{ {
$this->connected = 0; $this->connected = 0;
$this->ok = 0; $this->ok = 0;
$this->error="Mysql PHP functions are not available in this version of PHP"; $this->error="Mysql PHP functions for using MySql driver are not available in this version of PHP";
dolibarr_syslog("DoliDB::DoliDB : Mysql PHP functions are not available in this version of PHP"); dolibarr_syslog("DoliDB::DoliDB : Mysql PHP functions for using Mysql driver are not available in this version of PHP");
return $this->ok; return $this->ok;
} }
@ -203,9 +204,10 @@ class DoliDb
*/ */
function getVersion() function getVersion()
{ {
$resql=$this->query('SELECT VERSION()'); // $resql=$this->query('SELECT VERSION()');
$row=$this->fetch_row($resql); // $row=$this->fetch_row($resql);
return $row[0]; // return $row[0];
return mysql_get_server_info($this->db);
} }
@ -356,149 +358,11 @@ class DoliDb
return mysql_fetch_object($resultset); return mysql_fetch_object($resultset);
} }
// Next function are not required. Only minor features use them.
/**
\brief Renvoie l'id de la connection
\return string Id connection
*/
function getConnectId()
{
$resql=$this->query('SELECT CONNECTION_ID()');
$row=$this->fetch_row($resql);
return $row[0];
}
/**
\brief Renvoie la commande sql qui donne les droits sur les tables
\return string Requete sql
*/
function getGrantForUserQuery($databaseuser)
{
return '';
}
/**
\brief Crée une table
\param table Nom de la table
\param fields tableau associatif [nom champ][tableau des descriptions]
\param primary_key Nom du champ qui sera la clef primaire
\param unique_keys tableau associatifs Nom de champs qui seront clef unique => valeur
\param fulltext tableau des Nom de champs qui seront indexés en fulltext
\param key tableau des champs clés noms => valeur
\param type type de la table
\return true/false selon si requête a provoqué un erreur mysql ou pas
*/
function create_table($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="")
{
// clés recherchées dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra
// ex. : $fields['rowid'] = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
$sql = "create table ".$table."(";
$i=0;
foreach($fields as $field_name => $field_desc)
{
$sqlfields[$i] = $field_name." ";
$sqlfields[$i] .= $field_desc['type'];
if( eregi("^[^ ]",$field_desc['value']))
$sqlfields[$i] .= "(".$field_desc['value'].")";
else if( eregi("^[^ ]",$field_desc['attribute']))
$sqlfields[$i] .= " ".$field_desc['attribute'];
else if( eregi("^[^ ]",$field_desc['default']))
{
if(eregi("null",$field_desc['default']))
$sqlfields[$i] .= " default ".$field_desc['default'];
else
$sqlfields[$i] .= " default '".$field_desc['default']."'";
}
else if( eregi("^[^ ]",$field_desc['null']))
$sqlfields[$i] .= " ".$field_desc['null'];
else if( eregi("^[^ ]",$field_desc['extra']))
$sqlfields[$i] .= " ".$field_desc['extra'];
$i++;
}
if($primary_key != "")
$pk = "primary key(".$primary_key.")";
if($unique_keys != "")
{
$i = 0;
foreach($unique_keys as $key => $value)
{
$sqluq[$i] = "UNIQUE KEY '".$key."' ('".$value."')";
$i++;
}
}
if($keys != "")
{
$i = 0;
foreach($keys as $key => $value)
{
$sqlk[$i] = "KEY ".$key." (".$value.")";
$i++;
}
}
$sql .= implode(',',$sqlfields);
if($primary_key != "")
$sql .= ",".$pk;
if($unique_keys != "")
$sql .= ",".implode(',',$sqluq);
if($keys != "")
$sql .= ",".implode(',',$sqlk);
$sql .=") type=".$type;
// dolibarr_syslog($sql);
if(! $this -> query($sql))
return false;
else
return true;
}
/**
\brief Insère un nouveau champ dans une table
\param table Nom de la table
\param field_name Nom du champ à insérer
\param field_desc tableau associatif de description duchamp à insérer[nom du paramètre][valeur du paramètre]
\param field_position Optionnel ex.: "after champtruc"
\return true/false selon si requête a provoqué un erreur mysql ou pas
*/
function add_field($table,$field_name,$field_desc,$field_position="")
{
// clés recherchées dans le tableau des descriptions (field_desc) : type,value,attribute,null,default,extra
// ex. : $field_desc = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
$sql= "ALTER TABLE ".$table." ADD ".$field_name." ";
$sql .= $field_desc['type'];
if( eregi("^[^ ]",$field_desc['value']))
$sql .= "(".$field_desc['value'].")";
if( eregi("^[^ ]",$field_desc['attribute']))
$sql .= " ".$field_desc['attribute'];
if( eregi("^[^ ]",$field_desc['null']))
$sql .= " ".$field_desc['null'];
if( eregi("^[^ ]",$field_desc['default']))
if(eregi("null",$field_desc['default']))
$sql .= " default ".$field_desc['default'];
else
$sql .= " default '".$field_desc['default']."'";
if( eregi("^[^ ]",$field_desc['extra']))
$sql .= " ".$field_desc['extra'];
$sql .= " ".$field_position;
if(! $this -> query($sql))
return false;
else
return true;
}
/** /**
\brief Renvoie les données dans un tableau. \brief Renvoie les données dans un tableau.
\param resultset Curseur de la requete voulue \param resultset Curseur de la requete voulue
\return array \return array
*/ */
function fetch_array($resultset=0) function fetch_array($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion
@ -506,12 +370,12 @@ class DoliDb
return mysql_fetch_array($resultset); return mysql_fetch_array($resultset);
} }
/** /**
\brief Renvoie les données comme un tableau. \brief Renvoie les données comme un tableau.
\param resultset Curseur de la requete voulue \param resultset Curseur de la requete voulue
\return array \return array
*/ */
function fetch_row($resultset=0) function fetch_row($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion
@ -538,7 +402,6 @@ class DoliDb
\param resultset Curseur de la requete voulue \param resultset Curseur de la requete voulue
\return int Nombre de lignes \return int Nombre de lignes
*/ */
function affected_rows($resultset=0) function affected_rows($resultset=0)
{ {
// Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion // Si le resultset n'est pas fourni, on prend le dernier utilisé sur cette connexion
@ -694,6 +557,143 @@ class DoliDb
return mysql_insert_id($this->db); return mysql_insert_id($this->db);
} }
// Next function are not required. Only minor features use them.
//--------------------------------------------------------------
/**
\brief Renvoie l'id de la connection
\return string Id connection
*/
function getConnectId()
{
$resql=$this->query('SELECT CONNECTION_ID()');
$row=$this->fetch_row($resql);
return $row[0];
}
/**
\brief Renvoie la commande sql qui donne les droits sur les tables
\return string Requete sql
*/
function getGrantForUserQuery($databaseuser)
{
return '';
}
/**
\brief Crée une table
\param table Nom de la table
\param fields tableau associatif [nom champ][tableau des descriptions]
\param primary_key Nom du champ qui sera la clef primaire
\param unique_keys tableau associatifs Nom de champs qui seront clef unique => valeur
\param fulltext tableau des Nom de champs qui seront indexés en fulltext
\param key tableau des champs clés noms => valeur
\param type type de la table
\return true/false selon si requête a provoqué un erreur mysql ou pas
*/
function create_table($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="")
{
// clés recherchées dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra
// ex. : $fields['rowid'] = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
$sql = "create table ".$table."(";
$i=0;
foreach($fields as $field_name => $field_desc)
{
$sqlfields[$i] = $field_name." ";
$sqlfields[$i] .= $field_desc['type'];
if( eregi("^[^ ]",$field_desc['value']))
$sqlfields[$i] .= "(".$field_desc['value'].")";
else if( eregi("^[^ ]",$field_desc['attribute']))
$sqlfields[$i] .= " ".$field_desc['attribute'];
else if( eregi("^[^ ]",$field_desc['default']))
{
if(eregi("null",$field_desc['default']))
$sqlfields[$i] .= " default ".$field_desc['default'];
else
$sqlfields[$i] .= " default '".$field_desc['default']."'";
}
else if( eregi("^[^ ]",$field_desc['null']))
$sqlfields[$i] .= " ".$field_desc['null'];
else if( eregi("^[^ ]",$field_desc['extra']))
$sqlfields[$i] .= " ".$field_desc['extra'];
$i++;
}
if($primary_key != "")
$pk = "primary key(".$primary_key.")";
if($unique_keys != "")
{
$i = 0;
foreach($unique_keys as $key => $value)
{
$sqluq[$i] = "UNIQUE KEY '".$key."' ('".$value."')";
$i++;
}
}
if($keys != "")
{
$i = 0;
foreach($keys as $key => $value)
{
$sqlk[$i] = "KEY ".$key." (".$value.")";
$i++;
}
}
$sql .= implode(',',$sqlfields);
if($primary_key != "")
$sql .= ",".$pk;
if($unique_keys != "")
$sql .= ",".implode(',',$sqluq);
if($keys != "")
$sql .= ",".implode(',',$sqlk);
$sql .=") type=".$type;
// dolibarr_syslog($sql);
if(! $this -> query($sql))
return false;
else
return true;
}
/**
\brief Insère un nouveau champ dans une table
\param table Nom de la table
\param field_name Nom du champ à insérer
\param field_desc tableau associatif de description duchamp à insérer[nom du paramètre][valeur du paramètre]
\param field_position Optionnel ex.: "after champtruc"
\return true/false Selon si requête a provoqué un erreur mysql ou pas
*/
function add_field($table,$field_name,$field_desc,$field_position="")
{
// clés recherchées dans le tableau des descriptions (field_desc) : type,value,attribute,null,default,extra
// ex. : $field_desc = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
$sql= "ALTER TABLE ".$table." ADD ".$field_name." ";
$sql .= $field_desc['type'];
if( eregi("^[^ ]",$field_desc['value']))
$sql .= "(".$field_desc['value'].")";
if( eregi("^[^ ]",$field_desc['attribute']))
$sql .= " ".$field_desc['attribute'];
if( eregi("^[^ ]",$field_desc['null']))
$sql .= " ".$field_desc['null'];
if( eregi("^[^ ]",$field_desc['default']))
if(eregi("null",$field_desc['default']))
$sql .= " default ".$field_desc['default'];
else
$sql .= " default '".$field_desc['default']."'";
if( eregi("^[^ ]",$field_desc['extra']))
$sql .= " ".$field_desc['extra'];
$sql .= " ".$field_position;
if(! $this -> query($sql))
return false;
else
return true;
}
/** /**
\brief Retourne le dsn pear \brief Retourne le dsn pear
\return dsn \return dsn
@ -713,10 +713,11 @@ class DoliDb
$this->results = mysql_list_tables($database, $this->db); $this->results = mysql_list_tables($database, $this->db);
return $this->results; return $this->results;
} }
/**
/**
\brief décrit une table dans une database. \brief décrit une table dans une database.
\param table Nom de la table \param table Nom de la table
\param field Optionnel : Nom du champ si l'on veut la desc d'un champ \param field Optionnel : Nom du champ si l'on veut la desc d'un champ
\return resource \return resource
*/ */
function desc_table($table,$field="") function desc_table($table,$field="")

View File

@ -0,0 +1,732 @@
<?php
/* Copyright (C) 2001 Fabien Seisen <seisen@linuxfr.org>
* Copyright (C) 2002-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
* Copyright (C) 2004-2006 Laurent Destailleur <eldy@users.sourceforge.net>
* Copyright (C) 2006 Andre Cianfarani <acianfa@free.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* $Id$
* $Source$
*/
/**
\file htdocs/lib/mysql.lib.php
\brief Fichier de la classe permettant de gérer une base mysql
\author Fabien Seisen
\author Rodolphe Quiedeville.
\author Laurent Destailleur.
\version $Revision$
*/
/**
\class DoliDb
\brief Classe permettant de gérér la database de dolibarr
*/
class DoliDb
{
var $db; // Handler de base
var $type='mysqli'; // Nom du gestionnaire
var $forcecharset='latin1';
var $forcecollate='latin1_swedish_ci';
var $results; // Resultset de la dernière requete
var $connected; // 1 si connecté, 0 sinon
var $database_selected; // 1 si base sélectionné, 0 sinon
var $database_name; // Nom base sélectionnée
var $transaction_opened; // 1 si une transaction est en cours, 0 sinon
var $lastquery; // Derniere requete exécutée
var $lastqueryerror; // Derniere requete exécutée avec echec
var $lasterror; // Message erreur mysql
var $lasterrno; // Message erreur mysql
var $ok;
var $error;
// Constantes pour conversion code erreur MySql en code erreur générique
var $errorcode_map = array(
1004 => 'DB_ERROR_CANNOT_CREATE',
1005 => 'DB_ERROR_CANNOT_CREATE',
1006 => 'DB_ERROR_CANNOT_CREATE',
1007 => 'DB_ERROR_ALREADY_EXISTS',
1008 => 'DB_ERROR_CANNOT_DROP',
1025 => 'DB_ERROR_NO_FOREIGN_KEY_TO_DROP',
1046 => 'DB_ERROR_NODBSELECTED',
1048 => 'DB_ERROR_CONSTRAINT',
1050 => 'DB_ERROR_TABLE_ALREADY_EXISTS',
1051 => 'DB_ERROR_NOSUCHTABLE',
1054 => 'DB_ERROR_NOSUCHFIELD',
1060 => 'DB_ERROR_COLUMN_ALREADY_EXISTS',
1061 => 'DB_ERROR_KEY_NAME_ALREADY_EXISTS',
1062 => 'DB_ERROR_RECORD_ALREADY_EXISTS',
1064 => 'DB_ERROR_SYNTAX',
1075 => 'DB_ERROR_CANT_DROP_PRIMARY_KEY',
1091 => 'DB_ERROR_NOSUCHFIELD',
1100 => 'DB_ERROR_NOT_LOCKED',
1136 => 'DB_ERROR_VALUE_COUNT_ON_ROW',
1146 => 'DB_ERROR_NOSUCHTABLE',
1216 => 'DB_ERROR_NO_PARENT',
1217 => 'DB_ERROR_CHILD_EXISTS'
);
/**
\brief Ouverture d'une connection vers le serveur et éventuellement une database.
\param type Type de base de données (mysql ou pgsql)
\param host Addresse de la base de données
\param user Nom de l'utilisateur autorisé
\param pass Mot de passe
\param name Nom de la database
\param newlink ???
\return int 1 en cas de succès, 0 sinon
*/
function DoliDb($type='mysqli', $host, $user, $pass, $name='', $newlink=0)
{
global $conf,$langs;
$this->transaction_opened=0;
//print "Name DB: $host,$user,$pass,$name<br>";
if (! function_exists("mysqli_connect"))
{
$this->connected = 0;
$this->ok = 0;
$this->error="Mysql PHP functions are not available in this version of PHP";
dolibarr_syslog("DoliDB::DoliDB : Mysql PHP functions are not available in this version of PHP");
return $this->ok;
}
if (! $host)
{
$this->connected = 0;
$this->ok = 0;
$this->error=$langs->trans("ErrorWrongHostParameter");
dolibarr_syslog("DoliDB::DoliDB : Erreur Connect, wrong host parameters");
return $this->ok;
}
// Essai connexion serveur
$this->db = $this->connect($host, $user, $pass, $name, $newlink);
if ($this->db)
{
// Si client connecté avec charset different de celui de Dolibarr
if (mysqli_client_encoding ( $this->db ) != $this->forcecharset)
{
$this->query("SET NAMES '".$this->forcecharset."'", $this->db);
}
$this->connected = 1;
$this->ok = 1;
}
else
{
// host, login ou password incorrect
$this->connected = 0;
$this->ok = 0;
dolibarr_syslog("DoliDB::DoliDB : Erreur Connect");
}
// Si connexion serveur ok et si connexion base demandée, 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();
dolibarr_syslog("DoliDB::DoliDB : Erreur Select_db");
}
}
else
{
// Pas de selection de base demandée, ok ou ko
$this->database_selected = 0;
}
return $this->ok;
}
/**
\brief Selectionne une database.
\param database Nom de la database
\return boolean true si ok, false si ko
*/
function select_db($database)
{
return mysqli_select_db($this->db,$database);
}
/**
\brief Connection vers le serveur
\param host addresse de la base de données
\param login nom de l'utilisateur autoris
\param passwd mot de passe
\param name nom de la database (ne sert pas sous mysql, sert sous pgsql)
\return resource handler d'accès à la base
*/
function connect($host, $login, $passwd, $name)
{
$this->db = @mysqli_connect($host, $login, $passwd);
//print "Resultat fonction connect: ".$this->db;
return $this->db;
}
/**
\brief Renvoie la version du serveur
\return string Chaine version
*/
function getVersion()
{
// $resql=$this->query('SELECT VERSION()');
// $row=$this->fetch_row($resql);
// return $row[0];
return mysqli_get_server_info($this->db);
}
/**
\brief Renvoie la version du serveur dans un tableau
\return array Tableau de chaque niveau de version
*/
function getVersionArray()
{
return split('\.',$this->getVersion());
}
/**
\brief Création d'une nouvelle base de donnée
\param database nom de la database à créer
\return resource resource définie si ok, null si ko
\remarks Ne pas utiliser les fonctions xxx_create_db (xxx=mysql, ...) car elles sont deprecated
*/
function create_db($database)
{
$sql = 'CREATE DATABASE '.$database;
$sql.= ' DEFAULT CHARACTER SET '.$this->forcecharset.' DEFAULT COLLATE '.$this->forcecollate;
$ret=$this->query($sql);
if (! $ret)
{
// On réessaie pour compatibilité avec Mysql < 5.0
$sql = 'CREATE DATABASE '.$database;
$ret=$this->query($sql);
}
//print "database=".$this->database_name." ret=".$ret." mysqlerror=".mysqli_error($this->db);
return $ret;
}
/**
\brief Fermeture d'une connection vers une database.
\return resource
*/
function close()
{
return mysqli_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++;
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;
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;
return $ret;
}
else
{
$this->transaction_opened--;
return 1;
}
}
/**
\brief Effectue une requete et renvoi le resultset de réponse de la base
\param query Contenu de la query
\return resource Resultset de la reponse
*/
function query($query)
{
$query = trim($query);
if (! $this->database_name)
{
// Ordre SQL ne nécessitant pas de connexion à une base (exemple: CREATE DATABASE)
$ret = mysqli_query($this->db,$query);
}
else
{
$ret = mysqli_query($this->db,$query);
}
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 utilisé sur cette connexion
if (! is_object($resultset)) { $resultset=$this->results; }
return mysqli_fetch_object($resultset);
}
// Next function are not required. Only minor features use them.
/**
\brief Renvoie l'id de la connection
\return string Id connection
*/
function getConnectId()
{
$resql=$this->query('SELECT CONNECTION_ID()');
$row=$this->fetch_row($resql);
return $row[0];
}
/**
\brief Renvoie la commande sql qui donne les droits sur les tables
\return string Requete sql
*/
function getGrantForUserQuery($databaseuser)
{
return '';
}
/**
\brief Crée une table
\param table Nom de la table
\param fields tableau associatif [nom champ][tableau des descriptions]
\param primary_key Nom du champ qui sera la clef primaire
\param unique_keys tableau associatifs Nom de champs qui seront clef unique => valeur
\param fulltext tableau des Nom de champs qui seront indexés en fulltext
\param key tableau des champs clés noms => valeur
\param type type de la table
\return true/false selon si requête a provoqué un erreur mysql ou pas
*/
function create_table($table,$fields,$primary_key,$type,$unique_keys="",$fulltext_keys="",$keys="")
{
// clés recherchées dans le tableau des descriptions (fields) : type,value,attribute,null,default,extra
// ex. : $fields['rowid'] = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
$sql = "create table ".$table."(";
$i=0;
foreach($fields as $field_name => $field_desc)
{
$sqlfields[$i] = $field_name." ";
$sqlfields[$i] .= $field_desc['type'];
if( eregi("^[^ ]",$field_desc['value']))
$sqlfields[$i] .= "(".$field_desc['value'].")";
else if( eregi("^[^ ]",$field_desc['attribute']))
$sqlfields[$i] .= " ".$field_desc['attribute'];
else if( eregi("^[^ ]",$field_desc['default']))
{
if(eregi("null",$field_desc['default']))
$sqlfields[$i] .= " default ".$field_desc['default'];
else
$sqlfields[$i] .= " default '".$field_desc['default']."'";
}
else if( eregi("^[^ ]",$field_desc['null']))
$sqlfields[$i] .= " ".$field_desc['null'];
else if( eregi("^[^ ]",$field_desc['extra']))
$sqlfields[$i] .= " ".$field_desc['extra'];
$i++;
}
if($primary_key != "")
$pk = "primary key(".$primary_key.")";
if($unique_keys != "")
{
$i = 0;
foreach($unique_keys as $key => $value)
{
$sqluq[$i] = "UNIQUE KEY '".$key."' ('".$value."')";
$i++;
}
}
if($keys != "")
{
$i = 0;
foreach($keys as $key => $value)
{
$sqlk[$i] = "KEY ".$key." (".$value.")";
$i++;
}
}
$sql .= implode(',',$sqlfields);
if($primary_key != "")
$sql .= ",".$pk;
if($unique_keys != "")
$sql .= ",".implode(',',$sqluq);
if($keys != "")
$sql .= ",".implode(',',$sqlk);
$sql .=") type=".$type;
// dolibarr_syslog($sql);
if(! $this -> query($sql))
return false;
else
return true;
}
/**
\brief Insère un nouveau champ dans une table
\param table Nom de la table
\param field_name Nom du champ à insérer
\param field_desc tableau associatif de description duchamp à insérer[nom du paramètre][valeur du paramètre]
\param field_position Optionnel ex.: "after champtruc"
\return true/false selon si requête a provoqué un erreur mysql ou pas
*/
function add_field($table,$field_name,$field_desc,$field_position="")
{
// clés recherchées dans le tableau des descriptions (field_desc) : type,value,attribute,null,default,extra
// ex. : $field_desc = array('type'=>'int','value'=>'11','null'=>'not null','extra'=> 'auto_increment');
$sql= "ALTER TABLE ".$table." ADD ".$field_name." ";
$sql .= $field_desc['type'];
if( eregi("^[^ ]",$field_desc['value']))
$sql .= "(".$field_desc['value'].")";
if( eregi("^[^ ]",$field_desc['attribute']))
$sql .= " ".$field_desc['attribute'];
if( eregi("^[^ ]",$field_desc['null']))
$sql .= " ".$field_desc['null'];
if( eregi("^[^ ]",$field_desc['default']))
if(eregi("null",$field_desc['default']))
$sql .= " default ".$field_desc['default'];
else
$sql .= " default '".$field_desc['default']."'";
if( eregi("^[^ ]",$field_desc['extra']))
$sql .= " ".$field_desc['extra'];
$sql .= " ".$field_position;
if(! $this -> query($sql))
return false;
else
return true;
}
/**
\brief Renvoie les données 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 utilisé sur cette connexion
if (! is_object($resultset)) { $resultset=$this->results; }
return mysqli_fetch_array($resultset);
}
/**
\brief Renvoie les données 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 utilisé sur cette connexion
if (! is_object($resultset)) { $resultset=$this->results; }
return mysqli_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 utilisé sur cette connexion
if (! is_object($resultset)) { $resultset=$this->results; }
return mysqli_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 utilisé sur cette connexion
if (! is_object($resultset)) { $resultset=$this->results; }
// mysql necessite un link de base pour cette fonction contrairement
// a pqsql qui prend un resultset
return mysqli_affected_rows($this->db);
}
/**
\brief Libère le dernier resultset utilisé 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 utilisé sur cette connexion
if (! is_object($resultset)) { $resultset=$this->results; }
// Si resultset en est un, on libere la mémoire
if (is_object($resultset)) mysqli_free_result($resultset);
}
/**
\brief Défini les limites de la requète.
\param limit nombre maximum de lignes retournées
\param offset numéro de la ligne à partir de laquelle recupérer 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 ";
}
/**
\brief Formatage (par la base de données) d'un champ de la base au format tms ou Date (YYYY-MM-DD HH:MM:SS)
afin de retourner une donnée toujours au format universel date tms unix.
Fonction à utiliser pour générer les SELECT.
\param param Date au format text à convertir
\return date Date au format tms.
*/
function pdate($param)
{
return "unix_timestamp(".$param.")";
}
/**
\brief Formatage (par PHP) de la date en texte qui s'insere dans champ date.
Fonction à utiliser pour générer les INSERT.
\param param Date tms à convertir
\return date Date au format text YYYYMMDDHHMMSS.
*/
function idate($param)
{
return strftime("%Y%m%d%H%M%S",$param);
}
/**
\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 formaté 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
*/
function lasterror()
{
return $this->lasterror;
}
/**
\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 (! $this->connected) {
// Si il y a eu echec de connection, $this->db n'est pas valide.
return 'DB_ERROR_FAILED_TO_CONNECT';
}
else {
if (isset($this->errorcode_map[mysqli_errno($this->db)])) {
return $this->errorcode_map[mysqli_errno($this->db)];
}
$errno=mysqli_errno($this->db);
return ($errno?'DB_ERROR_'.$errno:'0');
}
}
/**
\brief Renvoie le texte de l'erreur mysql de l'operation precedente.
\return error_text
*/
function error()
{
if (! $this->connected) {
// Si il y a eu echec de connection, $this->db n'est pas valide pour mysqli_error.
return 'Not connected. Check setup parameters in conf/conf.php file and your mysql client and server versions';
}
else {
return mysqli_error($this->db);
}
}
/**
\brief Récupère l'id genéré par le dernier INSERT.
\param tab Nom de la table concernée par l'insert. Ne sert pas sous MySql mais requis pour compatibilité avec Postgresql
\return int id
*/
function last_insert_id($tab)
{
return mysqli_insert_id($this->db);
}
/**
\brief Retourne le dsn pear
\return dsn
*/
function getdsn($db_type,$db_user,$db_pass,$db_host,$db_name)
{
return $db_type.'://'.$db_user.':'.$db_pass.'@'.$db_host.'/'.$db_name;
}
/**
\brief Liste des tables dans une database.
\param database Nom de la database
\return resource
*/
function list_tables($database)
{
$this->results = mysqli_list_tables($database, $this->db);
return $this->results;
}
/**
\brief décrit une table dans une database.
\param table Nom de la table
\param field Optionnel : Nom du champ si l'on veut la desc d'un champ
\return resource
*/
function desc_table($table,$field="")
{
// $this->results = $this->query("DESC ".$table." ".$field);
$this->results = $this->query("DESC ".$table." ".$field);
return $this->results;
}
}
?>

View File

@ -44,6 +44,7 @@ class DoliDb
{ {
var $db; // Handler de base var $db; // Handler de base
var $type='pgsql'; // Nom du gestionnaire var $type='pgsql'; // Nom du gestionnaire
var $versionmin=array(8,1,0);
var $results; // Resultset de la dernière requete var $results; // Resultset de la dernière requete

View File

@ -102,7 +102,7 @@ require_once(DOL_DOCUMENT_ROOT ."/lib/functions.inc.php");
require_once(DOL_DOCUMENT_ROOT ."/user.class.php"); require_once(DOL_DOCUMENT_ROOT ."/user.class.php");
require_once(DOL_DOCUMENT_ROOT ."/menu.class.php"); require_once(DOL_DOCUMENT_ROOT ."/menu.class.php");
require_once(DOL_DOCUMENT_ROOT ."/html.form.class.php"); require_once(DOL_DOCUMENT_ROOT ."/html.form.class.php");
require_once(DOL_DOCUMENT_ROOT ."/lib/".$conf->db->type.".lib.php"); require_once(DOL_DOCUMENT_ROOT ."/lib/databases/".$conf->db->type.".lib.php");
/* /*
* Creation objet $db * Creation objet $db

View File

@ -218,7 +218,7 @@ if ($_GET["action"] == 'create' && $user->rights->projet->creer)
print '<tr><td>'.$langs->trans("Ref").'</td><td><input name="ref" value="'.$projet->ref.'"></td></tr>'; print '<tr><td>'.$langs->trans("Ref").'</td><td><input name="ref" value="'.$projet->ref.'"></td></tr>';
print '<tr><td>'.$langs->trans("Label").'</td><td><input name="title" value="'.$projet->title.'"></td></tr>'; print '<tr><td>'.$langs->trans("Label").'</td><td><input name="title" value="'.$projet->title.'"></td></tr>';
print '<tr><td>'.$langs->trans("Company").'</td><td>'.$projet->societe->$projet->societe->getNomUrl(1).'</td></tr>'; print '<tr><td>'.$langs->trans("Company").'</td><td>'.$projet->societe->getNomUrl(1).'</td></tr>';
print '<tr><td align="center" colspan="2"><input name="update" class="button" type="submit" value="'.$langs->trans("Modify").'"> &nbsp; <input type="submit" class="button" name="cancel" Value="'.$langs->trans("Cancel").'"></td></tr>'; print '<tr><td align="center" colspan="2"><input name="update" class="button" type="submit" value="'.$langs->trans("Modify").'"> &nbsp; <input type="submit" class="button" name="cancel" Value="'.$langs->trans("Cancel").'"></td></tr>';
print '</table>'; print '</table>';
print '</form>'; print '</form>';

View File

@ -72,9 +72,9 @@ if (file_exists ($thermlib))
$dontherm = new Don($dbt); $dontherm = new Don($dbt);
$actualValue = $dontherm->sum_actual(); $intentValue = $dontherm->sum_donations(1);
$pendingValue = $dontherm->sum_pending(); $pendingValue = $dontherm->sum_donations(2);
$intentValue = $dontherm->sum_intent(); $actualValue = $dontherm->sum_donations(3);
$dbt->close(); $dbt->close();
} }