mirror of
https://github.com/EGroupware/egroupware.git
synced 2025-02-08 14:30:05 +01:00
allow to use global db-object (and no clone&set_app), if told so via a separate parameter to the constructor (not by default as the app using so_sql might not be ready for it)
This commit is contained in:
parent
e7d9ca5532
commit
ef43425f7f
@ -6,6 +6,7 @@
|
|||||||
* @package etemplate
|
* @package etemplate
|
||||||
* @link http://www.egroupware.org
|
* @link http://www.egroupware.org
|
||||||
* @author Ralf Becker <RalfBecker@outdoor-training.de>
|
* @author Ralf Becker <RalfBecker@outdoor-training.de>
|
||||||
|
* @copyright 2002-8 by RalfBecker@outdoor-training.de
|
||||||
* @version $Id$
|
* @version $Id$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -61,11 +62,11 @@ class so_sql
|
|||||||
*/
|
*/
|
||||||
var $total = false;
|
var $total = false;
|
||||||
/**
|
/**
|
||||||
* privat instance of the db-object
|
* protected instance or reference (depeding on $no_clone param of constructor) of the db-object
|
||||||
*
|
*
|
||||||
* @var egw_db
|
* @var egw_db
|
||||||
*/
|
*/
|
||||||
var $db;
|
protected $db;
|
||||||
/**
|
/**
|
||||||
* unique keys/index, set by derived class or via so_sql($app,$table)
|
* unique keys/index, set by derived class or via so_sql($app,$table)
|
||||||
*
|
*
|
||||||
@ -94,6 +95,12 @@ class so_sql
|
|||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
var $table_def = array();
|
var $table_def = array();
|
||||||
|
/**
|
||||||
|
* Appname to use in all queries, set via constructor
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
var $app;
|
||||||
/**
|
/**
|
||||||
* holds the content of all columns
|
* holds the content of all columns
|
||||||
*
|
*
|
||||||
@ -129,17 +136,28 @@ class so_sql
|
|||||||
* @param string $table should be set if table-defs to be read from <app>/setup/tables_current.inc.php
|
* @param string $table should be set if table-defs to be read from <app>/setup/tables_current.inc.php
|
||||||
* @param object/db $db database object, if not the one in $GLOBALS['egw']->db should be used, eg. for an other database
|
* @param object/db $db database object, if not the one in $GLOBALS['egw']->db should be used, eg. for an other database
|
||||||
* @param string $colum_prefix='' column prefix to automatic remove from the column-name, if the column name starts with it
|
* @param string $colum_prefix='' column prefix to automatic remove from the column-name, if the column name starts with it
|
||||||
|
* @param boolean $no_clone=false can we avoid to clone the db-object, default no
|
||||||
|
* new code using appnames and foreach(select(...,$app) can set it to avoid an extra instance of the db object
|
||||||
*
|
*
|
||||||
* @return so_sql
|
* @return so_sql
|
||||||
*/
|
*/
|
||||||
function so_sql($app='',$table='',$db=null,$column_prefix='')
|
function so_sql($app='',$table='',$db=null,$column_prefix='',$no_clone=false)
|
||||||
|
{
|
||||||
|
if ($no_clone)
|
||||||
|
{
|
||||||
|
$this->db = is_object($db) ? $db : $GLOBALS['egw']->db;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
$this->db = is_object($db) ? clone($db) : clone($GLOBALS['egw']->db);
|
$this->db = is_object($db) ? clone($db) : clone($GLOBALS['egw']->db);
|
||||||
|
}
|
||||||
$this->db_cols = $this->db_key_cols + $this->db_data_cols;
|
$this->db_cols = $this->db_key_cols + $this->db_data_cols;
|
||||||
|
|
||||||
if ($app)
|
if ($app)
|
||||||
{
|
{
|
||||||
$this->db->set_app($app);
|
$this->app = $app;
|
||||||
|
|
||||||
|
if (!$no_clone) $this->db->set_app($app);
|
||||||
|
|
||||||
if ($table) $this->setup_table($app,$table,$column_prefix);
|
if ($table) $this->setup_table($app,$table,$column_prefix);
|
||||||
}
|
}
|
||||||
@ -369,21 +387,9 @@ class so_sql
|
|||||||
unset($query[$col]);
|
unset($query[$col]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->db->select($this->table_name,'*'.($extra_cols?','.(is_array($extra_cols)?implode(',',$extra_cols):$extra_cols):''),
|
foreach($this->db->select($this->table_name,'*'.($extra_cols?','.(is_array($extra_cols)?implode(',',$extra_cols):$extra_cols):''),
|
||||||
$query,__LINE__,__FILE__,False,'',False,0,$join);
|
$query,__LINE__,__FILE__,False,'',$this->app,0,$join) as $row)
|
||||||
|
|
||||||
if (!($row = $this->db->row(true)))
|
|
||||||
{
|
{
|
||||||
if ($this->autoinc_id)
|
|
||||||
{
|
|
||||||
unset($this->data[$this->db_key_cols[$this->autoinc_id]]);
|
|
||||||
}
|
|
||||||
if ((int) $this->debug >= 4) echo "nothing found !!!</p>\n";
|
|
||||||
|
|
||||||
$this->db2data();
|
|
||||||
|
|
||||||
return False;
|
|
||||||
}
|
|
||||||
$cols = $this->db_cols;
|
$cols = $this->db_cols;
|
||||||
if ($extra_cols) // extra columns to report
|
if ($extra_cols) // extra columns to report
|
||||||
{
|
{
|
||||||
@ -405,6 +411,16 @@ class so_sql
|
|||||||
}
|
}
|
||||||
return $this->data;
|
return $this->data;
|
||||||
}
|
}
|
||||||
|
if ($this->autoinc_id)
|
||||||
|
{
|
||||||
|
unset($this->data[$this->db_key_cols[$this->autoinc_id]]);
|
||||||
|
}
|
||||||
|
if ((int) $this->debug >= 4) echo "nothing found !!!</p>\n";
|
||||||
|
|
||||||
|
$this->db2data();
|
||||||
|
|
||||||
|
return False;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* saves the content of data to the db
|
* saves the content of data to the db
|
||||||
@ -435,7 +451,7 @@ class so_sql
|
|||||||
$data[$db_col] = (string) $this->data[$col] === '' && $this->empty_on_write == 'NULL' ? null : $this->data[$col];
|
$data[$db_col] = (string) $this->data[$col] === '' && $this->empty_on_write == 'NULL' ? null : $this->data[$col];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->db->insert($this->table_name,$data,false,__LINE__,__FILE__);
|
$this->db->insert($this->table_name,$data,false,__LINE__,__FILE__,$this->app);
|
||||||
|
|
||||||
if ($this->autoinc_id)
|
if ($this->autoinc_id)
|
||||||
{
|
{
|
||||||
@ -478,11 +494,11 @@ class so_sql
|
|||||||
}
|
}
|
||||||
if (!$this->autoinc_id) // always try an insert if we have no autoinc_id, as we dont know if the data exists
|
if (!$this->autoinc_id) // always try an insert if we have no autoinc_id, as we dont know if the data exists
|
||||||
{
|
{
|
||||||
$this->db->insert($this->table_name,$data,$keys,__LINE__,__FILE__);
|
$this->db->insert($this->table_name,$data,$keys,__LINE__,__FILE__,$this->app);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$this->db->update($this->table_name,$data,$keys,__LINE__,__FILE__);
|
$this->db->update($this->table_name,$data,$keys,__LINE__,__FILE__,$this->app);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->db2data();
|
$this->db2data();
|
||||||
@ -554,7 +570,7 @@ class so_sql
|
|||||||
{
|
{
|
||||||
$query[$db_col] = $data[$col];
|
$query[$db_col] = $data[$col];
|
||||||
}
|
}
|
||||||
$this->db->delete($this->table_name,$query,__LINE__,__FILE__);
|
$this->db->delete($this->table_name,$query,__LINE__,__FILE__,$this->app);
|
||||||
|
|
||||||
return $this->db->affected_rows();
|
return $this->db->affected_rows();
|
||||||
}
|
}
|
||||||
@ -621,7 +637,15 @@ class so_sql
|
|||||||
|
|
||||||
$table_def = $this->db->get_table_definitions(true,$table);
|
$table_def = $this->db->get_table_definitions(true,$table);
|
||||||
|
|
||||||
$query[] = $db_col.(is_array($val) ? ' IN ' : '=').$this->db->quote($val,$table_def['fd'][$only_col]);
|
if (is_array($val) && count($val) > 1)
|
||||||
|
{
|
||||||
|
array_walk($val,array($this->db,'quote'),$table_def['fd'][$only_col]['type']);
|
||||||
|
$query[] = $sql = $db_col.' IN (' .implode(',',$val).')';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$query[] = $db_col.'='.$this->db->quote(is_array($val)?array_shift($val):$val,$table_def['fd'][$only_col]['type']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -739,11 +763,10 @@ class so_sql
|
|||||||
}
|
}
|
||||||
else // cant do a count, have to run the query without limit
|
else // cant do a count, have to run the query without limit
|
||||||
{
|
{
|
||||||
$this->db->union($union,__LINE__,__FILE__);
|
$this->total = $this->db->union($union,__LINE__,__FILE__)->NumRows();
|
||||||
$this->total = $this->db->num_rows();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->db->union($union,__LINE__,__FILE__,$order_by,$start,$num_rows);
|
$rs = $this->db->union($union,__LINE__,__FILE__,$order_by,$start,$num_rows);
|
||||||
|
|
||||||
$cols = $union_cols;
|
$cols = $union_cols;
|
||||||
$union = $union_cols = array();
|
$union = $union_cols = array();
|
||||||
@ -758,17 +781,15 @@ class so_sql
|
|||||||
}
|
}
|
||||||
elseif (!$need_full_no_count && (!$join || stripos($join,'LEFT JOIN')!==false))
|
elseif (!$need_full_no_count && (!$join || stripos($join,'LEFT JOIN')!==false))
|
||||||
{
|
{
|
||||||
$this->db->select($this->table_name,'COUNT(*)',$query,__LINE__,__FILE__,false,'',false,0,$join);
|
$this->total = $this->db->select($this->table_name,'COUNT(*)',$query,__LINE__,__FILE__,false,'',$this->app,0,$join)->fetchSingle();
|
||||||
$this->total = $this->db->next_record() ? (int) $this->db->f(0) : false;
|
|
||||||
}
|
}
|
||||||
else // cant do a count, have to run the query without limit
|
else // cant do a count, have to run the query without limit
|
||||||
{
|
{
|
||||||
$this->db->select($this->table_name,$colums,$query,__LINE__,__FILE__,false,$order_by,false,0,$join);
|
$this->total = $this->db->select($this->table_name,$colums,$query,__LINE__,__FILE__,false,$order_by,false,0,$join)->NumRows();
|
||||||
$this->total = $this->db->num_rows();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->db->select($this->table_name,$mysql_calc_rows.$colums,$query,__LINE__,__FILE__,
|
$rs = $this->db->select($this->table_name,$mysql_calc_rows.$colums,$query,__LINE__,__FILE__,
|
||||||
$start,$order_by,false,$num_rows,$join);
|
$start,$order_by,$this->app,$num_rows,$join);
|
||||||
|
|
||||||
$cols = $this->_get_columns($only_keys,$extra_cols);
|
$cols = $this->_get_columns($only_keys,$extra_cols);
|
||||||
}
|
}
|
||||||
@ -776,10 +797,10 @@ class so_sql
|
|||||||
|
|
||||||
if ($mysql_calc_rows)
|
if ($mysql_calc_rows)
|
||||||
{
|
{
|
||||||
$this->total = $this->db->Link_ID->GetOne('SELECT FOUND_ROWS()');
|
$this->total = $this->db->query('SELECT FOUND_ROWS()')->fetchSingle();
|
||||||
}
|
}
|
||||||
$arr = array();
|
$arr = array();
|
||||||
for ($n = 0; ($row = $this->db->row(true)); ++$n)
|
if ($rs) foreach($rs as $row)
|
||||||
{
|
{
|
||||||
$data = array();
|
$data = array();
|
||||||
foreach($cols as $db_col => $col)
|
foreach($cols as $db_col => $col)
|
||||||
@ -787,6 +808,7 @@ class so_sql
|
|||||||
$data[$col] = $row[$db_col];
|
$data[$col] = $row[$db_col];
|
||||||
}
|
}
|
||||||
$arr[] = $this->db2data($data);
|
$arr[] = $this->db2data($data);
|
||||||
|
$n++;
|
||||||
}
|
}
|
||||||
return $n ? $arr : False;
|
return $n ? $arr : False;
|
||||||
}
|
}
|
||||||
@ -857,9 +879,10 @@ class so_sql
|
|||||||
* @param string $join='' sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or
|
* @param string $join='' sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or
|
||||||
* "LEFT JOIN table2 ON (x=y)", Note: there's no quoting done on $join!
|
* "LEFT JOIN table2 ON (x=y)", Note: there's no quoting done on $join!
|
||||||
* @param boolean $need_full_no_count=false If true an unlimited query is run to determine the total number of rows, default false
|
* @param boolean $need_full_no_count=false If true an unlimited query is run to determine the total number of rows, default false
|
||||||
|
* @param mixed $only_keys=false, see search
|
||||||
* @return int total number of rows
|
* @return int total number of rows
|
||||||
*/
|
*/
|
||||||
function get_rows($query,&$rows,&$readonlys,$join='',$need_full_no_count=false)
|
function get_rows($query,&$rows,&$readonlys,$join='',$need_full_no_count=false,$only_keys=false)
|
||||||
{
|
{
|
||||||
if ((int) $this->debug >= 4)
|
if ((int) $this->debug >= 4)
|
||||||
{
|
{
|
||||||
@ -873,7 +896,7 @@ class so_sql
|
|||||||
$criteria[$col] = $query['search'];
|
$criteria[$col] = $query['search'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$rows = $this->search($criteria,false,$query['order']?$query['order'].' '.$query['sort']:'',
|
$rows = $this->search($criteria,$only_keys,$query['order']?$query['order'].' '.$query['sort']:'',
|
||||||
'','%',false,'OR',$query['num_rows']?array((int)$query['start'],$query['num_rows']):(int)$query['start'],
|
'','%',false,'OR',$query['num_rows']?array((int)$query['start'],$query['num_rows']):(int)$query['start'],
|
||||||
$query['col_filter'],$join,$need_full_no_count);
|
$query['col_filter'],$join,$need_full_no_count);
|
||||||
|
|
||||||
@ -977,14 +1000,3 @@ class so_sql
|
|||||||
return $cache[$cache_key] =& $ret;
|
return $cache[$cache_key] =& $ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!function_exists("stripos"))
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* stripos for php < 5
|
|
||||||
*/
|
|
||||||
function stripos($str,$needle,$offset=0)
|
|
||||||
{
|
|
||||||
return strpos(strtolower($str),strtolower($needle),$offset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user