| 
<?php/**
 * Mysqli Driver file
 * @package SODA
 * @ignore
 */
 ini_set('display_errors',1);
 error_reporting(E_ALL);
 /**
 * driver_mysqli.php, extends SODA
 * This class permit to manipulate mysqli databases
 * @package SODA
 * @subpackage drivers
 * @author Salvan Gregory <[email protected]>
 * @version 1.1
 * @copyright Copyright (c) 2008, Gregory Salvan europeaweb.com
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 */
 final class driver_mysqli extends SODA
 {
 /*
 * Protected constructor
 * Because of the singleton pattern $this===parent::$instance
 */
 protected function __construct($nom='',$pw='',$dbname='',$srv='localhost',$opt=array('_persistant'=>false))
 {
 $this->init_this();
 $this->_user=$nom;
 $this->_pwd=$pw;
 $this->_server=$srv;
 $this->_dbname=$dbname;
 $this->_driver='driver_mysqli';
 $this->_dbtype='mysqli';
 if (is_array($opt)){
 foreach ($opt as $key=>$val) {
 $this->$key=$val;
 }
 }
 }
 /*---------------------------------------------------------------
 * overloaded functions:
 ---------------------------------------------------------------*/
 /**
 *  we override the parent static constructor
 *
 */
 public static function create($dbtype='mysqli',$nom='',$pw='',$dbname='',$srv='localhost',$opt=array('_persistant'=>false))
 {
 return parent::create($dbtype,$nom,$pw,$dbname,$srv,$opt);
 }
 /**
 *  Opens the connection to the Data Base
 *
 */
 public function connect()
 {
 $srv=$this->_server;
 $usr=$this->_user;
 $pwd=$this->_pwd;
 $this->_connected=false;
 if ($this->_persistant){
 $this->_connection=@mysqli_pconnect($srv,$usr,$pwd);
 } else {
 $this->_connection=@mysqli_connect($srv,$usr,$pwd);
 }
 if ($this->_connection==false)$this->_connected=false;
 else {
 $this->_connected=true;
 $this->_select_db=@mysqli_select_db($this->_connection,$this->_dbname);
 }
 if (!$this->_connected){
 $this->_errors[]='Connection Error';
 }
 return $this->_connected;
 }
 /**
 *  Closes the connection to the Data Base
 *
 */
 public function close()
 {
 @mysqli_close($this->_connection);
 $this->_connected=false;
 unset($this->_connection);
 $this->_select_db=false;
 }
 /**
 *  Selects a Data Base
 *
 */
 public function select_db($name)
 {
 $this->_dbname=$name;
 if (!$this->connect()) $this->close();
 return $this->_select_db;
 }
 /**
 *  Execute a query and return datas or false
 *  A property with the name or index $rname is created to store the request
 *  @param $sql string sql requests
 *  @param $rname int|string name or index of the request
 *  @param $type string 'array'|'object'|'row'|'field'|'assoc' set the type of returned values
 *  @param $len int 0|1|2 set the type of the property _lengths of the request object
 */
 public function query($sql,$rname=-1,$type='row',$len=0)
 {
 //$dtype is defined 2 times because of dproto uses facilties
 $dtype=array('array'=>'mysqli_fetch_array',
 'object'=>'mysqli_fetch_object','row'=>'mysqli_fetch_row',
 'field'=>'mysqli_fetch_field','assoc'=>'mysqli_fetch_assoc');
 if (array_key_exists($rname,$this->_requests)) {
 $this->_requests[$rname]->reset();
 } else $rname=$this->prepare($sql,$rname,$type,$len);
 //NOTE: take care about _requests because of overloading, $req is binded to it.(= -> &=)
 $req=$this->_requests[$rname];
 $this->connect();
 $req->_result=@mysqli_query($this->_connection,$req->get_sql());
 //the query return true because of INSERT request type
 if ($req->_result===true) $req->_rows=@mysqli_affected_rows($this->_connection);
 elseif($req->_result===false){
 $req->_errors[]=mysqli_error($this->_connection);
 }
 //the query return values because of SELECT request type
 else
 {
 $f=$dtype[$type];
 //for fields fetch $len is always set to 0
 if ($type=='field') $len=0;
 if ($len==1) {
 $req['_lengths']= new Array_Object();
 while ($row = @$f($req->_result)){
 $req['_data'][]=$row;
 $req['_lengths'][]=@mysqli_fetch_lengths($req->_result);
 }
 } elseif($len==2) {
 // this function make the sum of lengths
 function a_sum (&$item,$key,$ar) {
 $item=$ar[$key]+$item;
 }
 $row = @$f($req->_result);
 $req['_data'][]=$row;
 $req['_lengths']=@mysqli_fetch_lengths($req->_result);
 while ($row = @$f($req->_result)) {
 $req['_data'][]=$row;
 array_walk($req->_lengths,'a_sum',@mysqli_fetch_lengths($req->_result));
 }
 } else {
 //$len=0 :
 while ($row = @$f($req->_result)) {
 $req['_data'][]=$row;
 $l=@mysqli_fetch_lengths($req->_result);
 $req['_lengths']+=is_array($l)?array_sum($l):$l;
 }
 }
 $req['_fields']=@mysqli_num_fields($req->_result);
 $req['_rows']=@mysqli_num_rows($req->_result);
 @mysqli_free_result($req->_result);
 $req->_result=true;
 }
 if ($req->_data!=false) $req->_data= new Array_Object($req->_data);
 return $req->_data;
 }
 /**
 *  Prepare one or more queries and return the index or an array of indexes
 *  Parameters can be an array, an object or parameters like query.
 *  A property with the name or index $rname is created to store the request
 *  @param $sql string sql request
 *  @param $rname int|string name or index of the request
 *  @param $type string 'array'|'object'|'row'|'field'|'assoc' set the type of returned values
 *  @param $len int 0|1|2 set the type of the property _lengths of the request object
 */
 public function prepare()
 {
 //$dtype is redefined because of dbproto
 $dtype=array('array'=>'mysqli_fetch_array',
 'object'=>'mysqli_fetch_object','row'=>'mysqli_fetch_row',
 'field'=>'mysqli_fetch_field','assoc'=>'mysqli_fetch_assoc');
 //
 $arg_list = func_get_args();
 if (is_array($arg_list[0]) && count($arg_list[0])>0) {
 $r=array();
 foreach ($arg_list[0] as $key=>$value)
 {
 $sql= isset($value[0])?$value[0]:'';
 $rname = isset($value[1])?$value[1]:-1;
 $type = (isset($value[2]) && array_key_exists($value[2],$dtype))?$value[2]:'row';
 $len = isset($value[3])?$value[3]:0;
 $r[$key]=$this->prepare($sql,$rname,$type,$len);
 }
 return $r;
 } else {
 $sql= isset($arg_list[0])?$arg_list[0]:'';
 $rname = isset($arg_list[1])?$arg_list[1]:-1;
 $type = (isset($arg_list[2])&& array_key_exists($arg_list[2],$dtype))?$arg_list[2]:'row';
 $len = isset($arg_list[3])?$arg_list[3]:0;
 if (!is_string($type) || !array_key_exists($type,$dtype)) $type='row';
 //if $rname isn't set we use an integer index
 if ($rname==-1)$rname=$this->_requests->count_num_index();
 //if the request is set we delete it
 if (isset($this->_requests[$rname]))$this->clean($rname);
 $req=new request();
 $req->_sql=$sql;
 $req->_type=$type;
 $req->_ltype=$len;
 $this->_requests[$rname]=$req;
 return $rname;
 }
 }
 /**
 *  Execute one or more queries and return true if succeed otherwise false
 * Parameter can be an array, an object of requests indexes or a string or int index.
 *  @param $req_id mixed index or indexes of requests if -1 or nothing all prepared requests are executed.
 */
 public function exec($req_id=-1)
 {
 //if $req_id == -1 all requests are executed
 if ($req_id==-1){
 foreach ($this->_requests as $k=>$v){
 $ar[$k]['_sql']=$v->_sql;
 $ar[$k]['_type']=$v->_type;
 $ar[$k]['_ltype']=$v->_ltype;
 }
 //As query modify $this->_requests we can't do it all in once
 foreach($ar as $k=>$v)$this->query($ar[$k]['_sql'],$k,$ar[$k]['_type'],$ar[$k]['_ltype']);
 return true;
 }
 //If $req_id is a valid index we return datas or false if the request isn't set
 elseif (is_int($req_id) || is_string($req_id)) {
 if (isset($this->_requests[$req_id])){
 return $this->query($this->_requests[$req_id]->_sql,$req_id,$this->_requests[$req_id]->_type,$this->_requests[$req_id]->_ltype);
 }
 return false;
 }
 //else we execute all requests givens by the array or object $req_id
 elseif (is_array($req_id) || (is_object($req_id) && (get_class($req_id)=='Array_Object'||get_class($req_id)=='stdClass')))
 {
 foreach ($req_id as $id) {
 $this->query($this->_requests[$id]->_sql,$id,$this->_requests[$id]->_type,$this->_requests[$id]->_ltype);
 }
 return true;
 }
 return false;
 }
 /**
 * Delete one or more queries and return true if succeed otherwise false
 * Parameter can be an array, an object of requests indexes or a string or int index.
 * @param $req_id mixed index or indexes of requests if -1 or nothing all prepared requests are deleted.
 */
 public function clean($req_id=-1)
 {
 $r=true;
 if ($req_id==-1)$this->_requests=new Array_Object();
 elseif (is_int($req_id)||is_string($req_id)) {
 if (isset($this->_requests[$req_id]))unset($this->_requests[$req_id]);
 $r= !isset($this->_requests[$req_id]);
 if (!$r) $this->_errors[]="Can't delete the request $req_id";
 }
 elseif (is_array($req_id))
 {
 foreach ($req_id as $id) {
 $v=$this->clean($id);
 $r=$v==false?false:$r;
 }
 }
 return $r;
 }
 }//end of the class driver_mysqli
 
 
 ?>
 |