diff --git a/bureau/class/config.php b/bureau/class/config.php index ec743f27..28956f34 100644 --- a/bureau/class/config.php +++ b/bureau/class/config.php @@ -114,34 +114,23 @@ if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"]=="on" && $host!=$L_FQDN) { header("Location: https://$L_FQDN/"); } +// Classe h�rit�e de la classe db de la phplib. +/** + * Class for MySQL management in the bureau + * + * This class heriting from the db class of the phplib manages + * the connection to the MySQL database. + */ + +class DB_system extends DB_Sql { + function __construct() { + global $L_MYSQL_HOST,$L_MYSQL_DATABASE,$L_MYSQL_LOGIN,$L_MYSQL_PWD; + parent::__construct($L_MYSQL_DATABASE, $L_MYSQL_HOST, $L_MYSQL_LOGIN, $L_MYSQL_PWD); + } +} -// Classe h�rit�e de la classe db de la phplib. -/** -* Class for MySQL management in the bureau -* -* This class heriting from the db class of the phplib manages -* the connection to the MySQL database. -*/ - -class DB_system extends DB_Sql { - var $Host = null; - var $Database = null; - var $User = null; - var $Password = null; - - /** - * Creator - */ - function DB_system() { - global $L_MYSQL_HOST,$L_MYSQL_DATABASE,$L_MYSQL_LOGIN,$L_MYSQL_PWD; - $this->Host = $L_MYSQL_HOST; - $this->Database = $L_MYSQL_DATABASE; - $this->User = $L_MYSQL_LOGIN; - $this->Password = $L_MYSQL_PWD; - } -} - -$db= new DB_system(); +$db = new DB_system(); +// $db = new Sql($L_MYSQL_DATABASE, $L_MYSQL_HOST, $L_MYSQL_LOGIN, $L_MYSQL_PWD); // Current User ID = the user whose commands are made on behalf of. $cuid=0; diff --git a/bureau/class/db_mysql.php b/bureau/class/db_mysql.php index 39f29fa5..c23d1d72 100644 --- a/bureau/class/db_mysql.php +++ b/bureau/class/db_mysql.php @@ -1,284 +1,242 @@ query($query); + * Constructor + */ + function __construct($db, $host, $user, $passwd) { + + $dsn = sprintf('mysql:dbname=%s;host=%s', $db, $host); + + try { + $this->pdo_instance = new PDO($dsn, $user, $passwd); + } catch (PDOException $e) { + echo "Mysql", "PDO instance", $e->getMessage(); + return FALSE; + } } /** - * @return resource class variable Link_ID - */ - function link_id() { - return $this->Link_ID; - } - - /** - * @return integer class variable Query_ID - */ - function query_id() { - return $this->Query_ID; - } - - /** - * function for MySQL database connection management - * - * This function manages the connection to the MySQL database. - * - * @param $Database name of the database - * @param $Host DNS of the MySQL hosting server - * @param $User the user's name - * @param $Password the user's password - * - * @return the class variable $Link_ID - */ + * function for MySQL database connection management + * + * This function manages the connection to the MySQL database. + * + * @param $Database name of the database + * @param $Host DNS of the MySQL hosting server + * @param $User the user's name + * @param $Password the user's password + * + * @return the class variable $Link_ID + */ function connect($Database = "", $Host = "", $User = "", $Password = "") { - /* Handle defaults */ - if ("" == $Database) - $Database = $this->Database; - if ("" == $Host) - $Host = $this->Host; - if ("" == $User) - $User = $this->User; - if ("" == $Password) - $Password = $this->Password; - - /* establish connection, select database */ - if ( 0 == $this->Link_ID ) { - - $this->Link_ID=mysql_connect($Host, $User, $Password); - if (!$this->Link_ID) { - $this->halt("connect($Host, $User, \$Password) failed."); - return 0; - } + global $err; + $this->halt('Mysql::connect() : This function should no longer be used'); + /* Handle defaults */ + if ("" == $Database) + $Database = $this->Database; + if ("" == $Host) + $Host = $this->Host; + if ("" == $User) + $User = $this->User; + if ("" == $Password) + $Password = $this->Password; + + if (!$this->pdo_instance) { + $dsn = sprintf('mysql:dbname=%s;host=%s', $Database, $Host); - if (!@mysql_select_db($Database,$this->Link_ID)) { - $this->halt("cannot use database ".$this->Database); - return 0; - } + try { + $this->pdo_instance = new PDO($dsn, $User, $Password); + } catch (PDOException $e) { + $this->halt("Mysql::PDO_instance" . $e->getMessage()); + return FALSE; + } } - - //persistent connection don't conserve database selection - //if needed do a correct database selection - $db_connected = @mysql_fetch_array(@mysql_query("SELECT DATABASE();",$this->Link_ID)); - if ($db_connected[0] != $this->Database) - mysql_select_db($Database,$this->Link_ID); - return $this->Link_ID; + return True; } /** - * Discard the query result - * - * This function discards the last query result. - */ + * Discard the query result + * + * This function discards the last query result. + */ function free() { - @mysql_free_result($this->Query_ID); - $this->Query_ID = 0; + $this->pdo_query->closeCursor(); } + function is_connected() { + return $this->pdo_instance != FALSE; + } + + function last_error() { + return $this->Error; + } /** - * Perform a query - * - * This function performs the MySQL query described in the string parameter - * - * @param a string describing the MySQL query - * @return the $Query_ID class variable (null if fails) - */ - function query($Query_String) { - global $debug_alternc; + * Perform a query + * + * This function performs the MySQL query described in the string parameter + * + * @param a string describing the MySQL query + * @param arguments is an optionnal array for future use with PDO parametrized requests + * @return the $Query_ID class variable (null if fails) + */ + function query($Query_String, $arguments = False) { + global $debug_alternc; - /* No empty queries, please, since PHP4 chokes on them. */ - if ($Query_String == "") - /* The empty query string is passed on from the constructor, - * when calling the class without a query, e.g. in situations - * like these: '$db = new DB_Sql_Subclass;' - */ - return 0; + if (empty($Query_String) || !$this->is_connected()) + return FALSE; - if (!$this->connect()) { - return 0; /* we already complained in connect() about that. */ - }; + $this->Query_String = $Query_String; + if ($this->Debug) + printf("Debug: query = %s
\n", $Query_String); - # New query, discard previous result. - if ($this->Query_ID) { - $this->free(); - $this->Query_String = $Query_String; - } + $debug_chrono_start = microtime(true); - if ($this->Debug) - printf("Debug: query = %s
\n", $Query_String); + $this->pdo_query = $this->pdo_instance->prepare($this->Query_String); + $exec_state = ($arguments) ? $this->pdo_query->execute($arguments) + : $this->pdo_query->execute(); + + $debug_chrono_start = (microtime(true) - $debug_chrono_start)*1000; + $this->Row = 0; + + if ($exec_state == FALSE) { + $this->Errno = $this->pdo_query->errorCode(); + $this->Error = $this->pdo_query->errorInfo(); - $debug_chrono_start = microtime(true); - $this->Query_ID = @mysql_query($Query_String,$this->Link_ID); - $debug_chrono_start = (microtime(true) - $debug_chrono_start)*1000; - $this->Row = 0; - $this->Errno = mysql_errno(); - $this->Error = mysql_error(); - if( 0 != $this->Errno ){ if( defined("THROW_EXCEPTIONS") && THROW_EXCEPTIONS ){ - throw new \Exception("Mysql query failed : $this->Error"); + throw new \Exception("Mysql query failed : $this->Error"); } $this->halt("SQL Error: ".$Query_String); return FALSE; - } - if (!$this->Query_ID) { - $this->halt("Invalid SQL: ".$Query_String); - } + } + + if (isset($debug_alternc)) { + $debug_alternc->add("SQL Query : (".substr($debug_chrono_start,0,5)." ms)\t $Query_String"); + $debug_alternc->nb_sql_query++; + $debug_alternc->tps_sql_query += $debug_chrono_start; + } - if (isset($debug_alternc)) { - $debug_alternc->add("SQL Query : (".substr($debug_chrono_start,0,5)." ms)\t $Query_String"); - $debug_alternc->nb_sql_query++; - $debug_alternc->tps_sql_query += $debug_chrono_start; - } - - # Will return nada if it fails. That's fine. - return $this->Query_ID; + return TRUE; } - + /** - * walk result set - * - * This function tests if a new record is available in the current - * query result. - * - * @return TRUE if a new record is available - */ + * walk result set + * + * This function tests if a new record is available in the current + * query result. + * + * @return TRUE if a new record is available + */ function next_record() { - if (!$this->Query_ID) { - $this->halt("next_record called with no query pending."); - return 0; + if (!$this->pdo_query) { + $this->halt("next_record called with no query pending."); + return FALSE; + } + + $this->Record = $this->pdo_query->fetch(PDO::FETCH_BOTH); + $this->Row++; + $this->Errno = $this->pdo_query->errorCode(); + $this->Error = $this->pdo_query->errorInfo(); + + if ($this->Record == FALSE) { + if ($this->Auto_Free) + $this->free(); + return FALSE; } - $this->Record = @mysql_fetch_array($this->Query_ID); - $this->Row += 1; - $this->Errno = mysql_errno(); - $this->Error = mysql_error(); - - $stat = is_array($this->Record); - if (!$stat && $this->Auto_Free) { - $this->free(); - } - return $stat; - } - - /** - * - * public: position in result set - */ - - function seek($pos = 0) { - $status = @mysql_data_seek($this->Query_ID, $pos); - if ($status) - $this->Row = $pos; - else { - $this->halt("seek($pos) failed: result has ".$this->num_rows()." rows"); - - /* half assed attempt to save the day, - * but do not consider this documented or even - * desireable behaviour. - */ - @mysql_data_seek($this->Query_ID, $this->num_rows()); - $this->Row = $this->num_rows; - return 0; - } - - return 1; + return TRUE; } /* public: table locking */ function lock($table, $mode="write") { - $this->connect(); + if (!$this->is_connected()) + return FALSE; - $query="lock tables "; - if (is_array($table)) { - while (list($key,$value)=each($table)) { - if ($key=="read" && $key!=0) { - $query.="$value read, "; - } else { - $query.="$value $mode, "; + $query="lock tables "; + if (is_array($table)) { + while (list($key,$value)=each($table)) { + if ($key=="read" && $key!=0) { + $query.="$value read, "; + } else { + $query.="$value $mode, "; + } } - } - $query=substr($query,0,-2); - } else { - $query.="$table $mode"; - } - $res = @mysql_query($query, $this->Link_ID); - if (!$res) { + $query=substr($query,0,-2); + } else { + $query.="$table $mode"; + } + + + if (!$this->query($query)) { $this->halt("lock($table, $mode) failed."); - return 0; - } - return $res; + return FALSE; + } + + return TRUE; + } function unlock() { - $this->connect(); + if (!$this->is_connected()) + return FALSE; - $res = @mysql_query("unlock tables", $this->Link_ID); - if (!$res) { - $this->halt("unlock() failed."); - return 0; - } - return $res; + if (!$this->query('unlock tables')) { + $this->halt("unlock() failed."); + return FALSE; + } } /* public: evaluate the result (size, width) */ function affected_rows() { - return @mysql_affected_rows($this->Link_ID); + return $this->pdo_query->rowCount(); } function num_rows() { - return @mysql_num_rows($this->Query_ID); + return $this->pdo_query->rowCount(); } function num_fields() { - return @mysql_num_fields($this->Query_ID); + return $this->pdo_query->columnCount(); } /* public: shorthand notation */ @@ -295,201 +253,98 @@ class DB_Sql { * @return integer */ function f($Name) { - if (isset($this->Record[$Name])) - return $this->Record[$Name]; - else - return false; + if (isset($this->Record[$Name])) + return $this->Record[$Name]; + else + return false; + } + + function current_record() { + return $this->Record; } function p($Name) { - print $this->Record[$Name]; + print $this->Record[$Name]; } function lastid() { - return @mysql_insert_id($this->Link_ID); + return $this->pdo_instance->lastInsertId(); } /* public: sequence numbers */ function nextid($seq_name) { - $this->connect(); + if (!$this->is_connected()) + return FALSE; - if ($this->lock($this->Seq_Table)) { - /* get sequence number (locked) and increment */ - $q = sprintf("select nextid from %s where seq_name = '%s'", - $this->Seq_Table, - $seq_name); - $id = @mysql_query($q, $this->Link_ID); - $res = @mysql_fetch_array($id); + if ($this->lock($this->Seq_Table)) { + /* get sequence number (locked) and increment */ + $q = sprintf("select nextid from %s where seq_name = '%s'", + $this->Seq_Table, + $seq_name); + $this->query($q); + $this->next_record(); + + $id = $this->f('nextid'); - /* No current value, make one */ - if (!is_array($res)) { - $currentid = 0; - $q = sprintf("insert into %s values('%s', %s)", - $this->Seq_Table, - $seq_name, - $currentid); - @mysql_query($q, $this->Link_ID); - } else { - $currentid = $res["nextid"]; - } - $nextid = $currentid + 1; - $q = sprintf("update %s set nextid = '%s' where seq_name = '%s'", - $this->Seq_Table, - $nextid, - $seq_name); - @mysql_query($q, $this->Link_ID); - $this->unlock(); - } else { - $this->halt("cannot lock ".$this->Seq_Table." - has it been created?"); - return 0; - } - return $nextid; + /* No current value, make one */ + if (!$id) { + $currentid = 0; + $q = sprintf("insert into %s values('%s', %s)", + $this->Seq_Table, + $seq_name, + $currentid); + $this->query($q); + } else { + $currentid = $id; + } + + $nextid = $currentid + 1; + $q = sprintf("update %s set nextid = '%s' where seq_name = '%s'", + $this->Seq_Table, + $nextid, + $seq_name); + $this->query($q); + $this->unlock(); + } else { + $this->halt("cannot lock ".$this->Seq_Table." - has it been created?"); + return FALSE; + } + + return $nextid; } /* public: return table metadata */ function metadata($table='',$full=false) { - $res = array(); - - /* - * Due to compatibility problems with Table we changed the behavior - * of metadata(); - * depending on $full, metadata returns the following values: - * - * - full is false (default): - * $result[]: - * [0]["table"] table name - * [0]["name"] field name - * [0]["type"] field type - * [0]["len"] field length - * [0]["flags"] field flags - * - * - full is true - * $result[]: - * ["num_fields"] number of metadata records - * [0]["table"] table name - * [0]["name"] field name - * [0]["type"] field type - * [0]["len"] field length - * [0]["flags"] field flags - * ["meta"][field name] index of field named "field name" - * The last one is used, if you have a field name, but no index. - * Test: if (isset($result['meta']['myfield'])) { ... - */ - - // if no $table specified, assume that we are working with a query - // result - if ($table) { - $this->connect(); - $id = @mysql_list_fields($this->Database, $table); - if (!$id) - $this->halt("Metadata query failed."); - } else { - $id = $this->Query_ID; - if (!$id) - $this->halt("No query specified."); - } - - $count = @mysql_num_fields($id); - - // made this IF due to performance (one if is faster than $count if's) - if (!$full) { - for ($i=0; $i<$count; $i++) { - $res[$i]["table"] = @mysql_field_table ($id, $i); - $res[$i]["name"] = @mysql_field_name ($id, $i); - $res[$i]["type"] = @mysql_field_type ($id, $i); - $res[$i]["len"] = @mysql_field_len ($id, $i); - $res[$i]["flags"] = @mysql_field_flags ($id, $i); - } - } else { // full - $res["num_fields"]= $count; - - for ($i=0; $i<$count; $i++) { - $res[$i]["table"] = @mysql_field_table ($id, $i); - $res[$i]["name"] = @mysql_field_name ($id, $i); - $res[$i]["type"] = @mysql_field_type ($id, $i); - $res[$i]["len"] = @mysql_field_len ($id, $i); - $res[$i]["flags"] = @mysql_field_flags ($id, $i); - $res["meta"][$res[$i]["name"]] = $i; - } - } - - // free the result only if we were called on a table - if ($table) @mysql_free_result($id); - return $res; + global $err; + $err->raise('Mysql', 'function is no longer implemented (metadata())'); + return FALSE; } -/********************************************************************************************************/ -// AJOUT PERSO : TEST - -/* public: return table metadata - function retourneNameField($this->Query_ID,$full=false) { - $count = 0; - $id = 0; - $res = array(); - - - $count = @mysql_num_fields($this->Query_ID); - - // made this IF due to performance (one if is faster than $count if's) - if (!$full) { - for ($i=0; $i<$count; $i++) { - $res[$i]["table"] = @mysql_field_table ($id, $i); - $res[$i]["name"] = @mysql_field_name ($id, $i); - $res[$i]["type"] = @mysql_field_type ($id, $i); - $res[$i]["len"] = @mysql_field_len ($id, $i); - $res[$i]["flags"] = @mysql_field_flags ($id, $i); - } - } else { // full - $res["num_fields"]= $count; - - for ($i=0; $i<$count; $i++) { - $res[$i]["table"] = @mysql_field_table ($id, $i); - $res[$i]["name"] = @mysql_field_name ($id, $i); - $res[$i]["type"] = @mysql_field_type ($id, $i); - $res[$i]["len"] = @mysql_field_len ($id, $i); - $res[$i]["flags"] = @mysql_field_flags ($id, $i); - $res["meta"][$res[$i]["name"]] = $i; - } - } - - // free the result only if we were called on a table - if ($table) @mysql_free_result($id); - return $res; - }*/ - -/********************************************************************************************************/ /* private: error handling */ function halt($msg) { - $this->Error = @mysql_error($this->Link_ID); - $this->Errno = @mysql_errno($this->Link_ID); - if ($this->Halt_On_Error == "no") - return; + if ($this->Halt_On_Error == "no") + return; - $this->haltmsg($msg); + $this->haltmsg($msg); - if ($this->Halt_On_Error != "report") - die("Session halted."); + if ($this->Halt_On_Error != "report") + die("Session halted."); } function haltmsg($msg) { - printf("Database error: %s
\n", $msg); - printf("MySQL Error: %s (%s)
\n", - $this->Errno, - $this->Error); + printf("Database error: %s
\n", $msg); + printf("MySQL Error: %s (%s)
\n", + $this->Errno, + implode("\n", $this->Error)); } function table_names() { $this->query("SHOW TABLES"); - $i=0; - $return=array(); - while ($info=mysql_fetch_row($this->Query_ID)) - { - $return[$i]["table_name"]= $info[0]; - $return[$i]["tablespace_name"]=$this->Database; - $return[$i]["database"]=$this->Database; - $i++; - } - return $return; + $return = array(); + while ($this->next_record()) + $return[] = array('table_name' => $this->p(0), 'tablespace_name' => $this->Database, 'database' => $this->Database); + + return $return; } } ?> diff --git a/bureau/class/m_action.php b/bureau/class/m_action.php index 809387a7..6010b8e4 100644 --- a/bureau/class/m_action.php +++ b/bureau/class/m_action.php @@ -197,35 +197,19 @@ class m_action { $err->log("action", "set", $type); $serialized = serialize($parameters); - switch ($type) { - case 'chmod': - $query = "insert into actions values ('','CHMOD','$serialized',now(),'','','$user','');"; - break; - case 'create_file': - $query = "insert into actions values ('','CREATE_FILE','$serialized',now(),'','','$user','');"; - break; - case 'create_dir': - $query = "insert into actions values ('','CREATE_DIR','$serialized',now(),'','','$user','');"; - break; - case 'move': - $query = "insert into actions values ('','MOVE','$serialized',now(),'','','$user','');"; - break; - case 'fix_user': - $query = "insert into actions values ('','FIX_USER','$serialized',now(),'','','$user','');"; - break; - case 'fix_file': - $query = "insert into actions values ('','FIX_FILE','$serialized',now(),'','','$user','');"; - break; - case 'fix_dir': - $query = "insert into actions values ('','FIX_DIR','$serialized',now(),'','','$user','');"; - break; - case 'delete': - $query = "insert into actions values ('','DELETE','$serialized',now(),'','','$user','');"; - break; - default: - return false; - } - + $type = strtoupper($type); + if (in_array($type, array('CREATE_FILE', + 'CREATE_DIR', + 'MOVE', + 'CHMOD', + 'FIX_USER', + 'FIX_FILE', + 'FIX_DIR', + 'DELETE'))) { + $query = "INSERT INTO `actions` (type, parameters, creation, user) VALUES('$type', '$serialized', now(), '$user');"; + } else { + return False; + } if (!$db->query($query)) { $err->raise("action", _("Error setting actions")); return false; diff --git a/phpunit/bootstrap.php b/phpunit/bootstrap.php index 4f9a0e9c..686368ad 100644 --- a/phpunit/bootstrap.php +++ b/phpunit/bootstrap.php @@ -1,5 +1,4 @@ Host = "127.0.0.1"; - $this->Database = $database; - $this->User = $user; - $this->Password = $password; - } -} - +class DB_system extends DB_Sql { + function __construct($database, $user, $password) { + parent::__construct($database, '127.0.0.1', $user, $password); + } +} // Creates database from schema // ********************************************* @@ -175,8 +165,10 @@ global $mysql; global $ftp; global $quota; global $db; -$db = new \DB_system($user,$database,$password); -$db->connect(); + +// this class is defined above ^^^ +$db = new \DB_system($database, $user, $password); + $cuid = 0; $variables = new \m_variables(); $mem = new \m_mem(); diff --git a/phpunit/phpunit.xml b/phpunit/phpunit.xml index c743aacf..cab92584 100644 --- a/phpunit/phpunit.xml +++ b/phpunit/phpunit.xml @@ -1,4 +1,4 @@ - diff --git a/phpunit/tests/bureau/class/m_actionTest.php b/phpunit/tests/bureau/class/m_actionTest.php index 6aebe7d1..72767e14 100644 --- a/phpunit/tests/bureau/class/m_actionTest.php +++ b/phpunit/tests/bureau/class/m_actionTest.php @@ -64,6 +64,7 @@ class m_actionTest extends AlterncTest { */ public function testDo_action() { global $L_INOTIFY_DO_ACTION; + file_put_contents("/tmp/log_fser", "hello world from fser"); $result = $this->object->do_action(); $this->assertTrue($result); $this->assertFileExists($L_INOTIFY_DO_ACTION);