X-Git-Url: http://git.roojs.org/?p=Pman.Admin;a=blobdiff_plain;f=Dump.php;h=4102bc16c3c16f0e8ab41a61d09c687177b31cb1;hp=cb206565022f53b782194ec595846b540c5a0fe6;hb=HEAD;hpb=ac7a6603d41c686c249ec99e78d30f2a694635ae diff --git a/Dump.php b/Dump.php index cb20656..4102bc1 100644 --- a/Dump.php +++ b/Dump.php @@ -50,6 +50,9 @@ require_once 'Pman.php'; class Pman_Admin_Dump extends Pman { + static $cli_desc = "Dump database ?/ needs more info..."; + + function getAuth() { @@ -62,13 +65,16 @@ class Pman_Admin_Dump extends Pman { var $deps = array(); // list of dependants var $out = array(); // list of created sql/shell scripts. - function get($path ) + function get($path, $opts = Array() ) { + ini_set('memory_limit', '256M'); // we need alot of memory + set_time_limit(0); + $argv = $_SERVER['argv']; array_shift($argv); array_shift($argv); - $opts = explode(',', 'table==,where==,dump-dir=='); + $opts = explode(',', 'table==,where==,dump-dir==,debug='); require_once 'Console/Getopt.php'; $go = Console_Getopt::getopt2($argv, '', $opts ); if (is_object($go)) { @@ -80,6 +86,9 @@ class Pman_Admin_Dump extends Pman { } $errs = array(); foreach($opts as $req) { + if (substr($req,-2, 2) != '==') { // skip optional arguments + continue; + } if (empty($args[substr($req,0, -2)])) { $errs[] = "--".substr($req,0, -2) . ' is required'; } @@ -87,7 +96,9 @@ class Pman_Admin_Dump extends Pman { if (!empty($errs)) { die(print_R($errs,true)); } - + if (!empty($args['debug'])) { + DB_DataObject::debugLevel($args['debug']); + } $this->args = $args; $this->out = array(); $this->discoverChildren($this->args['table'], $this->args['where'], true); @@ -116,9 +127,12 @@ class Pman_Admin_Dump extends Pman { if (empty($ar)) { continue; } echo " " .$tbl . ' -> ' . count(array_keys($ar)) . " Records\n"; } + echo "FILES:\n"; + echo " Total : " . $this->filetotal . " files using " . floor($this->filesize/1000000) . "Mb\n"; + echo "GENERATED FILES:\n"; // summary - echo " ". implode(" \n", $this->out). "\n"; + echo " ". implode("\n ", $this->out). "\n"; exit; @@ -130,6 +144,10 @@ class Pman_Admin_Dump extends Pman { var $deletes = array(); // TABLE => [key] => TRUE|FALSE var $dumps = array(); // TABLE => [key] => TRUE|FALSE - if it's been scanned.. var $dscan = array(); // TABLE:COL => [value => TRUE|FALSE] - if its been scanned.. + var $childfiles = array(); // array of [ 'sourcedirectory' , 'subdirectory(s) and filename' ] + var $childthumbs = array(); // array of [ 'filename', 'filename' ,......] + var $filesize = 0; // size of files to be saved. (not total deletd..) + var $filetotal = 0; // number of distinct files to be saved (not total deleted) /** * scan table for * a) what depends on it (eg. child elements) - which will be deleted. @@ -204,6 +222,7 @@ class Pman_Admin_Dump extends Pman { } } + $x->free(); // flag as checked if we where given an array.. - as some links might have been broken. if (is_array($where)) { foreach($where as $k) { @@ -235,12 +254,14 @@ class Pman_Admin_Dump extends Pman { function discoverChildren($table, $where, $col=false ) { + echo "discoverChildren:$table:$col:". (is_array($where) ? (count($where) . " children" ): $where ). "\n"; global $_DB_DATAOBJECT; $do = DB_DataObject::factory($table); if (PEAR::isError($do)) { if (isset($this->dumps[$table])) { unset($this->dumps[$table]); // links to non-existant tables.. } + echo "SKIPPING invalid table $table\n"; return; } if (!isset($this->dumps[$table])) { @@ -263,7 +284,7 @@ class Pman_Admin_Dump extends Pman { static $children = array(); if (!isset($children[$table])) { - + $children[$table] = array(); // force load of linsk $do->links(); foreach($_DB_DATAOBJECT['LINKS'][$do->database()] as $tbl => $links) { @@ -288,22 +309,20 @@ class Pman_Admin_Dump extends Pman { } } + print_R($children); } - if (empty($children[$table])) { - // BLANK deletes??? - return; - } - // DB_DataObject::debugLevel(1); + $do->selectAdd(); $key = $keys[0]; $do->selectAdd($key); - $do->find(); + echo "GOT ". $do->find() ." results\n"; + //DB_DataObject::debugLevel(0); while ($do->fetch()) { $this->dumps[$table][$do->$key] = 0; if (!isset($this->deletes[$table][$do->$key])) { $this->deletes[$table][$do->$key] = 0; } - + foreach($children[$table] as $kv=>$t) { if (!isset($this->dscan[$kv])) { $this->dscan[$kv] = array(); @@ -313,8 +332,8 @@ class Pman_Admin_Dump extends Pman { } } } - - + $do->free(); + // now iterate throught dependants. and scan them. @@ -345,19 +364,44 @@ class Pman_Admin_Dump extends Pman { $target = $this->args['dump-dir'] .'/'. date('Y-m-d').'.delete.sql'; $this->out[] = $target; $fh = fopen($target, 'w'); + + + foreach($this->deletes as $tbl=>$ar) { + $do = DB_DataObject::factory($tbl); + $tbl = $do->tableName(); $keys = $do->keys(); $key = $keys[0]; - foreach($ar as $id => $deleted) { + $do->whereAddIn($keys[0] , array_keys($ar), 'int'); + $do->find(); + $archivePaths = method_exists($do,'archivePaths'); + $listThumbs = method_exists($do,'listThumbs'); + while ($do->fetch()) { + + if ($archivePaths) { + $ct = $do->archivePaths(); + if ($ct) { + $this->childfiles[] = $ct; + } + } + if ($listThumbs) { + $ct = $do->listThumbs(); + if($ct) { + $this->childthumbs[] = $ct; + } + } + $id = $do->$key; + fwrite($fh, "DELETE FROM `$tbl` WHERE `$key` = $id;\n"); // we assume id's and nice column names... } + $do->free(); } fclose($fh); } function generateShell() { - if (empty($this->childfiles)) { + if (empty($this->childfiles) && empty($this->childthumbs)) { return; } $target = $this->args['dump-dir'] .'/'. date('Y-m-d').'.copy.sh'; @@ -372,22 +416,38 @@ class Pman_Admin_Dump extends Pman { $this->out[] = $target; $fh3 = fopen($target, 'w'); - - foreach($this->childfiles as $s=>$v) { - fwrite($fh,"mkdir -p " . escapeshellarg(dirname($args['dump-dir'] .'/'.$v[1])) ."\n" ); - fwrite($fh,"cp " . escapeshellarg($v[0].'/'.$v[1]) . ' ' . escapeshellarg($args['dump-dir'] .'/'.$v[1]) ."\n" ); + + $done = array(); + $donedir = array(); + foreach($this->childfiles as $v) { + + if (isset($done[$v[1]])) { + continue; + } + + $done[$v[1]] = true; - fwrite($fh3,"mkdir -p " . escapeshellarg(dirname($v[0].'/'.$v[1])) ."\n" ); - fwrite($fh3,"cp " . escapeshellarg($args['dump-dir'] .'/'.$v[1]) . ' ' . escapeshellarg($v[0].'/'.$v[1]) . "\n" ); + $this->filesize += filesize($v[0].'/'.$v[1]); + $this->filetotal++; + $fdir = dirname($this->args['dump-dir'] .'/'.$v[1]); + if (!isset($donedir[$fdir])) { + fwrite($fh,"mkdir -p " . escapeshellarg(dirname($this->args['dump-dir'] .'/'.$v[1])) ."\n" ); + } + fwrite($fh,"cp " . escapeshellarg($v[0].'/'.$v[1]) . ' ' . escapeshellarg($this->args['dump-dir'] .'/'.$v[1]) ."\n" ); + if (!isset($donedir[$fdir])) { + fwrite($fh3,"mkdir -p " . escapeshellarg(dirname($v[0].'/'.$v[1])) ."\n" ); + } + $donedir[$fdir] = true; + fwrite($fh3,"cp " . escapeshellarg($this->args['dump-dir'] .'/'.$v[1]) . ' ' . escapeshellarg($v[0].'/'.$v[1]) . "\n" ); fwrite($fh2,"rm " . escapeshellarg($v[0].'/'.$v[1]) ."\n" ); } fclose($fh); fclose($fh3); // restore does not need to bother with thumbnails. + - - foreach($this->childthumbs as $s=>$v) { + foreach($this->childthumbs as $v) { foreach($v as $vv) { fwrite($fh2,"rm " . escapeshellarg($vv). "\n"); } @@ -416,7 +476,7 @@ class Pman_Admin_Dump extends Pman { while ($do->fetch()) { fwrite($fh,$this->toInsert($do)); } - + $do->free(); } fclose($fh);