piwigo/plugins/grum_plugins_classes-2/tables.class.inc.php
grum 7ebed79726 Asked by rvelices on this topic
http://forum.phpwebgallery.net/viewtopic.php?pid=92097#p92097

A plugin to integrate the menu class
 see test_menu directory

A plugin to show how to use the menu class
 see AMenuManager directory

And common classes needed for the AMenuManager plugin
 see grum_plugins_classes-2 directory

See topic http://forum.phpwebgallery.net/viewtopic.php?pid=92637#p92637 for more
informations 

git-svn-id: http://piwigo.org/svn/trunk@2466 68402e56-0260-453c-a942-63ccdbb3a9ee
2008-08-03 07:48:39 +00:00

447 lines
No EOL
11 KiB
PHP
Executable file

<?php
/* -----------------------------------------------------------------------------
class name: manage_tables
class version: 1.3
date: 2007-12-02
------------------------------------------------------------------------------
author: grum at grum.dnsalias.com
<< May the Little SpaceFrog be with you >>
------------------------------------------------------------------------------
this class provides base functions to manage tables while plugin installation
- constructor manage_tables($tables)
- (public) function create_tables($tables_def)
- (public) function update_tables_fields($tables_alteration)
- (public) function drop_tables()
- (public) function rename_tables($list) -v1.1
- (public) function tables_exists() -v1.1
- (public) function export($filename, $options, $tables, $infos) -v1.3
- (public) function multi_queries($queries) -v1.3
- (public) function import($filename) -v1.3
------------------------------------------------------------------------------
v1.1 + add rename_tables($list) function
+ add tables_exists() function
v1.2 + add export($filename, $options, $tables) function
v1.3 + modify export($filename, $options, $tables, $infos, $resultboolean) function
+ new parameters '$infos' allows to add some information on the
exported file
+ add 'delete' and 'colnames' options
+ $resultbooelan option for return
+ add multi_queries($queries) function
+ add import($filename) function
-------------------------------------------------------------------------- */
class manage_tables
{
var $tables; //array of tables names
var $version = "1.3";
function manage_tables($tables)
{
$this->tables = $tables;
}
/*
create tables
$tables_def is an array of SQL CREATE queries
return true if everything is ok, otherwise tablename
*/
function create_tables($tables_def)
{
//deleting tables if exists
$this->drop_tables();
for($i=0;$i<count($tables_def);$i++)
{
$result=pwg_query($tables_def[$i]);
if(!$result)
{
//if an error occurs, deleting created tables
$this->drop_tables();
return(false);
}
}
return(true);
}
/* update tables definition
$tables_alteration : array of arrays
example :
$tables_alteration['table1']=array(
"attribute1" => " ADD COLUMN `attribute1` text null default ''",
"attribute2" => " ADD COLUMN `attribute2` text null default ''"));
$tables_alteration['table2']=array(
"attribute1" => " ADD COLUMN `attribute1` text null default ''",
"attribute2" => " ADD COLUMN `attribute2` text null default ''"));
return true if no error, otherwise return table.fields of error
*/
function update_tables_fields($tables_alteration)
{
if(!is_array($tables_alteration))
{
return('');
}
reset($tables_alteration);
while (list($key, $val) = each($tables_alteration))
{
$sql="SHOW COLUMNS FROM $key";
$result=pwg_query($sql);
if($result)
{
$columns=array();
while($row=mysql_fetch_assoc($result))
{
array_push($columns, $row['Field']);
}
reset($val);
while (list($attname, $sql) = each($val))
{
if(!in_array($attname, $columns))
{
$result=pwg_query("ALTER TABLE `$key` ".$sql);
if(!$result)
{
return($key.".".$attname);
}
}
}
}
}
return(true);
}
/*
delete tables listed in $this->tables_list
*/
function drop_tables()
{
foreach($this->tables as $key => $table_name)
{
$sql="DROP TABLE IF EXISTS ".$table_name;
$result=pwg_query($sql);
}
}
/*
rename tables name of list
$list is an array('old_name' => 'new_name')
return true if ok, else old table name
*/
function rename_tables($list)
{
$tmplist=array_flip($this->tables);
foreach($list as $key => $val)
{
if(isset($tmplist[$key]))
{
$this->tables[$tmplist[$key]] = $val;
$sql="ALTER TABLE `$key` RENAME TO `$val`";
if(!pwg_query($sql))
{
return($key);
}
}
else
{
return($key);
}
}
return(true);
}
/*
return true if all listed tables exists
*/
function tables_exists()
{
$list=array_flip($this->tables);
$sql="SHOW TABLES";
$result=pwg_query($sql);
if($result)
{
while($row=mysql_fetch_row($result))
{
if(isset($list[$row[0]]))
{
array_splice($list, $row[0],1);
}
}
}
if(count($list)>0)
{
return(false);
}
else
{
return(true);
}
}
/*
export all tables as SQL in a text file
each query end with a " -- EOQ" ; it's just a method to increase parsing for
import function
$filename : name of the file
$options : array of options like
array(
'drop' => true/false, //add DROP TABLE statements
'create' => true/false, //add CREATE TABLE statements
'insert' => true/false, //add INSERT statements
'delete' => true/false, //add delete statements
'colnames' => true/false, //add columns names for inserts statements
)
$tables : array of tables names to export
array('tablename1', 'tablenamen', 'tablename3', ...)
if empty, assume that all tables have to be exported
$infos : additional info written in exported file (as comment)
$resultboolean : if true, result is true/false ;
if false, if result, return a string with nfo about export
*/
function export($filename, $options=array(), $tables=array(), $infos="", $resultboolean=true)
{
$defaultopt=array(
'drop' => true,
'create' => true,
'insert' => true,
'delete' => false,
'colnames' => false
);
if(!isset($options['drop']))
{
$options['drop']=$defaultopt['drop'];
}
if(!isset($options['create']))
{
$options['create']=$defaultopt['create'];
}
if(!isset($options['insert']))
{
$options['insert']=$defaultopt['insert'];
}
if(!isset($options['delete']))
{
$options['delete']=$defaultopt['delete'];
}
if(!isset($options['colnames']))
{
$options['colnames']=$defaultopt['colnames'];
}
if(count($tables)==0)
{
$tables=$this->tables;
}
$resultnfo='';
$returned=true;
$text='
-- *************************************************************** -- EOQ
-- * SQL export made with Grum Plugins Classes (Export tool r'.$this->version.') -- EOQ
-- * Export date :'.date('Y-m-d H:i:s').' -- EOQ
-- * Export options :';
if($options['drop']){$text.=' [drop]';}
if($options['delete']){$text.=' [delete]';}
if($options['create']){$text.=' [create]';}
if($options['insert']){$text.=' [insert]';}
if($options['colnames']){$text.=' [colnames]';}
$text.=" -- EOQ";
if($infos!="")
{
$text.='
-- * '.$infos." -- EOQ";
}
$text.='
-- *************************************************************** -- EOQ
';
foreach($tables as $key => $val)
{
$countelems=0;
$text.="
-- *************************************************************** -- EOQ
-- * Statements for ".$this->tables[$key]." table -- EOQ
-- *************************************************************** -- EOQ
";
if($options['drop'])
{
$text.=sprintf("DROP TABLE `%s`; -- EOQ\n", $this->tables[$key]);
}
if($options['delete'])
{
$text.=sprintf("DELETE FROM `%s`; -- EOQ\n", $this->tables[$key]);
}
if($options['create'])
{
$sql='SHOW CREATE TABLE '.$this->tables[$key];
$result=pwg_query($sql);
if($result)
{
while($row=mysql_fetch_row($result))
{
$text.=sprintf("%s; -- EOQ\n", $row[1]);
}
}
else
{
$returned=false;
}
}
if($options['insert'])
{
$colnames="";
if($options['colnames'])
{
$sql='SHOW COLUMNS FROM `'.$this->tables[$key].'`';
$result=pwg_query($sql);
if($result)
{
$tmp=array();
while($row=mysql_fetch_row($result))
{
$tmp[]=$row[0];
}
}
$colnames='('.implode(',', $tmp).')';
}
$sql='SELECT * FROM '.$this->tables[$key];
$result=pwg_query($sql);
if($result)
{
while($row=mysql_fetch_row($result))
{
foreach($row as $key2 => $val2)
{
$row[$key2]="'".addslashes($val2)."'";
}
$text.=sprintf("INSERT INTO `%s` %s VALUES(%s); -- EOQ\n", $this->tables[$key], $colnames, implode(', ', $row));
$countelems++;
}
}
else
{
$returned=false;
}
$resultnfo.=$key.':'.$countelems.'@';
}
}
$fhandle=fopen($filename, 'wb');
if($fhandle)
{
fwrite($fhandle, $text);
fclose($fhandle);
}
else
{
$returned=false;
}
if(($resultboolean==false)&&($returned))
{
$returned=$resultnfo;
}
return($returned);
}
/*
import an .sql file
$filename : name of the file
'errors' : -1 file don't exists
-2 can't open file
*/
function import($filename)
{
$return = array(
'numinsert'=>0,
'numdelete'=>0,
'numdrop'=>0,
'numcreate'=>0,
'errors'=>array(),
'total_ok'=>0
);
if(file_exists($filename))
{
$fhandle=fopen($filename, 'r');
if($fhandle)
{
$queries=fread($fhandle, filesize($filename));
fclose($fhandle);
$return=$this->multi_queries($queries);
}
else
{
$return['errors']=-2;
}
}
else
{
$return['errors']=-1;
}
return($return);
}
/*
execute multiple query
each query have to be separated by a "-- EOQ\n"
$queries : sql queries
*/
function multi_queries($queries)
{
$queries_list=preg_split(
'/\s*;?\s*--\s+EOQ[\r\n]{1}/i', $queries, -1, PREG_SPLIT_NO_EMPTY);
$return = array(
'numinsert'=>0,
'numdelete'=>0,
'numdrop'=>0,
'numcreate'=>0,
'errors'=>array(),
'total_ok'=>0
);
$i=0;
foreach($queries_list as $key => $sql)
{
$i++;
@$result=pwg_query($sql);
if($result)
{
$return['total_ok']++;
if(preg_match('/\b[\s]*insert[\s]+/i', $sql)>0)
{$return['numinsert']++;}
elseif(preg_match('/\b[\s]*drop[\s]+/i', $sql)>0)
{$return['numdrop']++;}
elseif(preg_match('/\b[\s]*delete[\s]+/i', $sql)>0)
{$return['numdelete']++;}
elseif(preg_match('/\b[\s]*create[\s]+/i',$sql)>0)
{$return['numcreate']++;}
}
else
{
array_push($return['errors'], '['.$i.'] '.$sql);
}
}
return($return);
}
} //class
?>