Exemple #1
0
/**
* @param string $mode
*
* @return array|bool
*/
function dbcbackup_run($mode = 'auto')
{
    if (defined('DBC_BACKUP_RETURN')) {
        return;
    }
    $cfg = get_option('dbcbackup_options');
    if (!$cfg['active'] and $mode == 'auto') {
        return;
    }
    if (empty($cfg['export_dir'])) {
        return;
    }
    if ($mode == 'auto') {
        dbcbackup_locale();
    }
    require_once 'functions.php';
    //require_once ('inc/functions.php');
    define('DBC_COMPRESSION', $cfg['compression']);
    define('DBC_GZIP_LVL', $cfg['gzip_lvl']);
    define('DBC_BACKUP_RETURN', true);
    $timenow = time();
    $mtime = explode(' ', microtime());
    $time_start = $mtime[1] + $mtime[0];
    $key = substr(md5(md5(DB_NAME . '|' . microtime())), 0, 6);
    $date = date('m.d.y-H.i.s', $timenow);
    list($file, $fp) = dbcbackup_open($cfg['export_dir'] . '/Backup_' . $date . '_' . $key);
    if ($file) {
        $removed = dbcbackup_rotate($cfg, $timenow);
        @set_time_limit(0);
        $sql = mysql_query("SHOW TABLE STATUS FROM " . DB_NAME);
        dbcbackup_write($file, dbcbackup_header());
        while ($row = mysql_fetch_array($sql)) {
            dbcbackup_structure($row['Name'], $file);
            dbcbackup_data($row['Name'], $file);
        }
        dbcbackup_close($file);
        $result = __('Successful', 'dbcbackup');
    } else {
        $result = sprintf(__("Failed To Open: %s.", 'dbcbackup'), $fp);
    }
    $mtime = explode(' ', microtime());
    $time_end = $mtime[1] + $mtime[0];
    $time_total = $time_end - $time_start;
    $cfg['logs'][] = array('file' => $fp, 'size' => @filesize($fp), 'started' => $timenow, 'took' => $time_total, 'status' => $result, 'removed' => $removed);
    update_option('dbcbackup_options', $cfg);
    return $mode == 'auto' ? true : $cfg['logs'];
}
function dbcbackup_data($table, $fp)
{
    $is_safe_mode = ini_get('safe_mode') == '1' ? 1 : 0;
    if (!$is_safe_mode) {
        set_time_limit(600);
    }
    $res = '';
    $res .= "\n";
    $res .= "--\n";
    $res .= "-- Dumping data for table " . dbcbackup_backquote($table) . "\n";
    $res .= "--\n";
    $res .= "\n";
    dbcbackup_write($fp, $res);
    if ($sql = mysql_query("SELECT * FROM " . dbcbackup_backquote($table))) {
        list($numfields, $fields_meta) = dbcbackup_fields($sql);
        //$res = "LOCK TABLES ".dbcbackup_backquote($table)." WRITE;\n";
        $res = '';
        dbcbackup_write($fp, $res);
        $search = array("", "\n", "\r", "");
        //\x08\\x09, not required | Taken from phpMyAdmin.
        $replace = array('\\0', '\\n', '\\r', '\\Z');
        while ($row = mysql_fetch_array($sql)) {
            $res = "INSERT INTO " . dbcbackup_backquote($table) . " VALUES (";
            $fieldcounter = -1;
            $firstfield = 1;
            while (++$fieldcounter < $numfields) {
                if (!$firstfield) {
                    $res .= ', ';
                } else {
                    $firstfield = 0;
                }
                if (!isset($row[$fieldcounter]) || is_null($row[$fieldcounter])) {
                    $res .= 'NULL';
                } elseif ($fields_meta[$fieldcounter]->numeric && $fields_meta[$fieldcounter]->type != 'timestamp' && !$fields_meta[$fieldcounter]->blob) {
                    $res .= $row[$fieldcounter];
                } elseif (stristr($field_flags[$j], 'BINARY') && isset($GLOBALS['hexforbinary']) && $fields_meta[$fieldcounter]->type != 'datetime' && $fields_meta[$fieldcounter]->type != 'date' && $fields_meta[$fieldcounter]->type != 'time' && $fields_meta[$fieldcounter]->type != 'timestamp') {
                    // empty blobs need to be different, but '0' is also empty :-(
                    if (empty($row[$fieldcounter]) && $row[$fieldcounter] != '0') {
                        $res .= '\'\'';
                    } else {
                        $res .= '0x' . bin2hex($row[$fieldcounter]);
                    }
                    // something else -> treat as a string
                } else {
                    $res .= "'" . str_replace($search, $replace, dbcbackup_addslashes($row["{$fieldcounter}"])) . "'";
                }
                // end if
            }
            $res .= ");\n";
            dbcbackup_write($fp, $res);
        }
        //$res = "UNLOCK TABLES;\n";
        $res = '';
        mysql_free_result($sql);
        $status = true;
    } else {
        $tmp = mysql_error();
        $res .= "--" . $tmp;
        $status = false;
    }
    dbcbackup_write($fp, $res);
    return $status;
}