function ScanDays($onlyTable = false)
{
    $q = new mysql_squid_builder(true);
    $ARRAY_DAYS = array();
    $tables = $q->LIST_TABLES_dansguardian_events();
    while (list($tablename, $line) = each($tables)) {
        $dayTime = $q->TIME_FROM_DANSGUARDIAN_EVENTS_TABLE($tablename);
        $day = date("Y-m-d", $dayTime);
        $ARRAY_DAYS[$day] = $dayTime;
        $TABLES[$tablename] = true;
    }
    $tables = $q->LIST_TABLES_HOURS();
    while (list($tablename, $line) = each($tables)) {
        $dayTime = $q->TIME_FROM_HOUR_TABLE($tablename);
        $day = date("Y-m-d", $dayTime);
        $ARRAY_DAYS[$day] = $dayTime;
        $TABLES[$tablename] = true;
    }
    $tables = $q->LIST_TABLES_YOUTUBE_DAYS();
    //youtubeday_
    while (list($tablename, $line) = each($tables)) {
        $dayTime = $q->TIME_FROM_YOUTUBE_DAY_TABLE($tablename);
        $day = date("Y-m-d", $dayTime);
        $ARRAY_DAYS[$day] = $dayTime;
        $TABLES[$tablename] = true;
    }
    $tables = $q->LIST_TABLES_USERSIZED();
    //youtubeday_
    while (list($tablename, $line) = each($tables)) {
        $dayTime = $q->TIME_FROM_USERSIZED_TABLE($tablename);
        $day = date("Y-m-d", $dayTime);
        $ARRAY_DAYS[$day] = $dayTime;
        $TABLES[$tablename] = true;
    }
    $tables = $q->LIST_TABLES_QUOTADAY();
    //youtubeday_
    while (list($tablename, $line) = each($tables)) {
        $dayTime = $q->TIME_FROM_QUOTADAY_TABLE($tablename);
        $day = date("Y-m-d", $dayTime);
        $ARRAY_DAYS[$day] = $dayTime;
        $TABLES[$tablename] = true;
    }
    $tables = $q->LIST_CAT_FAMDAY();
    //youtubeday_
    while (list($tablename, $line) = each($tables)) {
        $dayTime = $q->TIME_FROM_CAT_FAMDAY_TABLE($tablename);
        $day = date("Y-m-d", $dayTime);
        $ARRAY_DAYS[$day] = $dayTime;
        $TABLES[$tablename] = true;
    }
    $prefix = "INSERT IGNORE INTO tables_day (tablename,zDate) VALUES ";
    while (list($day, $dayTime) = each($ARRAY_DAYS)) {
        $tablename = "dansguardian_events_" . date("Ymd", $dayTime);
        $f[] = "('{$tablename}','{$day}')";
    }
    if (count($f) > 0) {
        $q->QUERY_SQL($prefix . @implode(",", $f));
        if (!$q->ok) {
            if ($GLOBALS["VERBOSE"]) {
                echo "Fatal {$q->mysql_error}\n";
            }
            squid_admin_purge(0, "Fatal {$q->mysql_error}", "Backup process cannot be performed", __FILE__, __LINE__);
            ufdbguard_admin_events("Fatal {$q->mysql_error}", __FUNCTION__, __FILE__, __LINE__, "backup");
            return false;
        }
    }
    if ($onlyTable) {
        return $TABLES;
    }
    return true;
}
function updates_retranslation($MAC, $uid)
{
    $GLOBALS["Q"] = new mysql_squid_builder();
    if ($GLOBALS["VERBOSE"]) {
        "echo Loading...\n";
    }
    $unix = new unix();
    if ($GLOBALS["VERBOSE"]) {
        "echo Loading done...\n";
    }
    $pidfile = "/etc/artica-postfix/pids/" . basename(__FILE__) . "." . md5($MAC . $uid) . ".pid";
    $timefile = "/etc/artica-postfix/pids/" . basename(__FILE__) . "." . md5($MAC . $uid) . ".time";
    $pid = @file_get_contents($pidfile);
    if (!$GLOBALS["FORCE"]) {
        if ($pid < 100) {
            $pid = null;
        }
        $unix = new unix();
        if ($unix->process_exists($pid, basename(__FILE__))) {
            if ($GLOBALS["VERBOSE"]) {
                echo "Already executed pid {$pid}\n";
            }
            return;
        }
        $mypid = getmypid();
        @file_put_contents($pidfile, $mypid);
    }
    $q = new mysql_squid_builder();
    $sql = "UPDATE youtube_all SET uid='{$uid}' WHERE MAC='{$MAC}'";
    $q->QUERY_SQL($sql);
    $sql = "UPDATE UserAuthDaysGrouped SET uid='{$uid}' WHERE MAC='{$MAC}'";
    $q->QUERY_SQL($sql);
    $sql = "UPDATE UserAuthDays SET uid='{$uid}' WHERE MAC='{$MAC}'";
    $q->QUERY_SQL($sql);
    $TABLES = $q->LIST_TABLES_QUOTADAY();
    while (list($tablename, $rows) = each($TABLES)) {
        $sql = "UPDATE `{$tablename}` SET uid='{$uid}' WHERE MAC='{$MAC}'";
        $q->QUERY_SQL($sql);
        if (!$q->ok) {
            echo $q->mysql_error;
        }
    }
    $TABLES = $q->LIST_TABLES_QUOTAMONTH();
    while (list($tablename, $rows) = each($TABLES)) {
        $sql = "UPDATE `{$tablename}` SET uid='{$uid}' WHERE MAC='{$MAC}'";
        $q->QUERY_SQL($sql);
        if (!$q->ok) {
            echo $q->mysql_error;
        }
    }
    $TABLES = $q->LIST_TABLES_dansguardian_events();
    while (list($tablename, $rows) = each($TABLES)) {
        $sql = "UPDATE `{$tablename}` SET uid='{$uid}' WHERE MAC='{$MAC}'";
        $q->QUERY_SQL($sql);
        if (!$q->ok) {
            echo $q->mysql_error;
        }
    }
    $TABLES = $q->LIST_TABLES_USERSIZED();
    while (list($tablename, $rows) = each($TABLES)) {
        $sql = "UPDATE `{$tablename}` SET uid='{$uid}' WHERE MAC='{$MAC}'";
        $q->QUERY_SQL($sql);
        if (!$q->ok) {
            echo $q->mysql_error;
        }
    }
    $TABLES = $q->LIST_TABLES_YOUTUBE_HOURS();
    while (list($tablename, $rows) = each($TABLES)) {
        $sql = "UPDATE `{$tablename}` SET uid='{$uid}' WHERE MAC='{$MAC}'";
        $q->QUERY_SQL($sql);
        if (!$q->ok) {
            echo $q->mysql_error;
        }
    }
    $TABLES = $q->LIST_TABLES_YOUTUBE_DAYS();
    while (list($tablename, $rows) = each($TABLES)) {
        $sql = "UPDATE `{$tablename}` SET uid='{$uid}' WHERE MAC='{$MAC}'";
        $q->QUERY_SQL($sql);
        if (!$q->ok) {
            echo $q->mysql_error;
        }
    }
    $TABLES = $q->LIST_TABLES_YOUTUBE_WEEK();
    while (list($tablename, $rows) = each($TABLES)) {
        $sql = "UPDATE `{$tablename}` SET uid='{$uid}' WHERE MAC='{$MAC}'";
        $q->QUERY_SQL($sql);
        if (!$q->ok) {
            echo $q->mysql_error;
        }
    }
    $TABLES = $q->LIST_TABLES_SEARCHWORDS_DAY();
    while (list($tablename, $rows) = each($TABLES)) {
        $sql = "UPDATE `{$tablename}` SET uid='{$uid}' WHERE MAC='{$MAC}'";
        $q->QUERY_SQL($sql);
        if (!$q->ok) {
            echo $q->mysql_error;
        }
    }
    $TABLES = $q->LIST_TABLES_SEARCHWORDS_HOURS();
    while (list($tablename, $rows) = each($TABLES)) {
        $sql = "UPDATE `{$tablename}` SET uid='{$uid}' WHERE MAC='{$MAC}'";
        $q->QUERY_SQL($sql);
        if (!$q->ok) {
            echo $q->mysql_error;
        }
    }
    $TABLES = $q->LIST_TABLES_MONTH();
    while (list($tablename, $rows) = each($TABLES)) {
        $sql = "UPDATE `{$tablename}` SET uid='{$uid}' WHERE MAC='{$MAC}'";
        $q->QUERY_SQL($sql);
        if (!$q->ok) {
            echo $q->mysql_error;
        }
    }
}
function repair_from_sources_tables()
{
    $unix = new unix();
    $pidfile = "/etc/artica-postfix/pids/" . basename(__FILE__) . "." . __FUNCTION__ . ".pid";
    $timefile = "/etc/artica-postfix/pids/" . basename(__FILE__) . "." . __FUNCTION__ . ".time";
    if ($GLOBALS["VERBOSE"]) {
        echo "time: {$timefile}\n";
    }
    $pid = @file_get_contents($pidfile);
    if (!$GLOBALS["VERBOSE"]) {
        if (!$GLOBALS["FORCE"]) {
            if ($unix->process_exists($pid, basename(__FILE__))) {
                if ($GLOBALS["VERBOSE"]) {
                    echo "Already executed pid {$pid}\n";
                }
                return;
            }
            if ($pid < 100) {
                $pid = null;
            }
            $mypid = getmypid();
            @file_put_contents($pidfile, $mypid);
        }
    }
    if ($GLOBALS["FORCE_TIME"]) {
        $timeexec = $unix->file_time_min($timefile);
        if ($timeexec < 240) {
            return;
        }
    }
    @unlink($timefile);
    @file_put_contents($timefile, time());
    $Prefix = "/usr/share/artica-postfix";
    $php5 = $unix->LOCATE_PHP5_BIN();
    $nohup = $unix->find_program("nohup");
    $EXEC_NICE = $unix->EXEC_NICE();
    $q = new mysql_squid_builder();
    $C = 0;
    $array = $q->LIST_TABLES_dansguardian_events();
    $current = "dansguardian_events_" . date("Ymd");
    while (list($tablename, $none) = each($array)) {
        if ($tablename == $current) {
            continue;
        }
        $time = $q->TIME_FROM_DANSGUARDIAN_EVENTS_TABLE($tablename);
        $xtime = date("Y-m-d", $time);
        $hour_table = date("Ymd", $time) . "_hour";
        $member_table = date("Ymd", $time) . "_members";
        $SUM_SOURCE = $q->COUNT_ROWS($tablename);
        if ($SUM_SOURCE == 0) {
            continue;
        }
        $SUM_DEST = $q->COUNT_ROWS($hour_table);
        $PERC = $SUM_DEST / $SUM_SOURCE * 100;
        $PERC = intval($PERC);
        echo "{$xtime}] {$SUM_SOURCE} - {$SUM_DEST} = {$PERC}% - {$tablename}\n";
        if ($PERC < 5) {
            if (!$q->CreateHourTable($hour_table)) {
                echo "{$xtime}] {$tablename} unable to create {$hour_table}\n";
                continue;
            }
            _repair_from_sources_tables($tablename, $hour_table);
            $q->QUERY_SQL("UPDATE tables_day SET `totalsize`='0',`requests`=0,`MembersCount`=0,`month_flow`=0,weekdone=0,weekbdone=0 WHERE tablename='{$tablename}'");
            $C++;
        }
        $ligne1 = mysql_fetch_array($q->QUERY_SQL("SELECT SUM(hits) as hits FROM {$tablename}"));
        if (!$q->ok) {
            echo $q->mysql_error;
        }
        $SumDehits_src = $ligne1["hits"];
        $ligne1 = mysql_fetch_array($q->QUERY_SQL("SELECT SUM(hits) as hits FROM {$member_table}"));
        $SumDehits_dest = $ligne1["hits"];
        $PERC = $SumDehits_dest / $SumDehits_src * 100;
        $PERC = intval($PERC);
        echo "{$xtime}] {$SumDehits_src} - {$SumDehits_dest} = {$PERC}% - {$member_table}\n";
        if ($PERC < 90) {
            if (!$q->CreateMembersDayTable($hour_table)) {
                echo "{$xtime}] {$tablename} unable to create {$hour_table}\n";
                continue;
            }
            _repair_members_sources_tables($tablename, $member_table);
            $C++;
        }
    }
    if ($C > 0) {
        shell_exec(trim("{$EXEC_NICE} {$php5} {$Prefix}/exec.squid.stats.totals.php --repair --byschedule --schedule-id={$GLOBALS["SCHEDULE_ID"]}"));
    }
}
function REPAIR_WORKING_TABLES()
{
    $q = new mysql_squid_builder();
    $LIST_TABLES_DAYS = $q->LIST_TABLES_HOURS();
    events(count($LIST_TABLES_DAYS) . " daily tables");
    while (list($tablename, $ligne) = each($LIST_TABLES_DAYS)) {
        $xtime = $q->TIME_FROM_HOUR_TABLE($tablename);
        $xdate = date("Y-m-d", $xtime);
        $danstable = "dansguardian_events_" . date("Ymd", $xtime);
        if ($GLOBALS["VERBOSE"]) {
            echo "{$tablename}: {$danstable} = {$xdate}\n";
        }
        $q->QUERY_SQL("INSERT IGNORE INTO tables_day (tablename,zDate) VALUES ('{$tablename}','{$xdate}')");
    }
    $currentTABLE = date("Ymd") . "_hour";
    $LIST_TABLES_dansguardian_events = $q->LIST_TABLES_dansguardian_events();
    while (list($tablename, $ligne) = each($LIST_TABLES_dansguardian_events)) {
        $xtime = $q->TIME_FROM_DANSGUARDIAN_EVENTS_TABLE($tablename);
        $hour_table = date("Ymd", $xtime) . "_hour";
        if ($currentTABLE == $hour_table) {
            continue;
        }
        if (!$q->TABLE_EXISTS($hour_table)) {
            events(" ####### WARNING - NO TABLE {$hour_table} #############");
        }
    }
}
function clean_squid_stats_dbs()
{
    $sock = new sockets();
    $DisableArticaProxyStatistics = $sock->GET_INFO("DisableArticaProxyStatistics");
    $CleanArticaSquidDatabases = $sock->GET_INFO("CleanArticaSquidDatabases");
    if (!is_numeric($DisableArticaProxyStatistics)) {
        $DisableArticaProxyStatistics = 0;
    }
    if (!is_numeric($CleanArticaSquidDatabases)) {
        $CleanArticaSquidDatabases = 0;
    }
    if (!$GLOBALS["FORCE"]) {
        if ($CleanArticaSquidDatabases == 0) {
            echo "Option is not activated...\n";
            return;
        }
    }
    $q = new mysql_squid_builder();
    $tables = $q->LIST_TABLES_DAYS();
    $rows = 0;
    $count_tables = 0;
    while (list($num, $table) = each($tables)) {
        $rows = $rows + $q->COUNT_ROWS($table);
        if ($GLOBALS["VERBOSE"]) {
            echo " Delete table {$table} {$rows} rows \n";
        }
        $count_tables++;
        $q->DELETE_TABLE($table);
    }
    $tables = $q->LIST_TABLES_DAYS_BLOCKED();
    while (list($num, $table) = each($tables)) {
        $rows = $rows + $q->COUNT_ROWS($table);
        if ($GLOBALS["VERBOSE"]) {
            echo " Delete table {$table} {$rows} rows \n";
        }
        $count_tables++;
        $q->DELETE_TABLE($table);
    }
    $tables = $q->LIST_TABLES_HOURS();
    while (list($num, $table) = each($tables)) {
        $rows = $rows + $q->COUNT_ROWS($table);
        if ($GLOBALS["VERBOSE"]) {
            echo " Delete table {$table} {$rows} rows \n";
        }
        $count_tables++;
        $q->DELETE_TABLE($table);
    }
    $tables = $q->LIST_TABLES_MEMBERS();
    while (list($num, $table) = each($tables)) {
        $rows = $rows + $q->COUNT_ROWS($table);
        if ($GLOBALS["VERBOSE"]) {
            echo " Delete table {$table} {$rows} rows \n";
        }
        $count_tables++;
        $q->DELETE_TABLE($table);
    }
    $tables = $q->LIST_TABLES_MONTH();
    while (list($num, $table) = each($tables)) {
        $rows = $rows + $q->COUNT_ROWS($table);
        if ($GLOBALS["VERBOSE"]) {
            echo " Delete table {$table} {$rows} rows \n";
        }
        $count_tables++;
        $q->DELETE_TABLE($table);
    }
    $tables = $q->LIST_TABLES_WEEKS();
    while (list($num, $table) = each($tables)) {
        $rows = $rows + $q->COUNT_ROWS($table);
        if ($GLOBALS["VERBOSE"]) {
            echo " Delete table {$table} {$rows} rows \n";
        }
        $count_tables++;
        $q->DELETE_TABLE($table);
    }
    $tables = $q->LIST_TABLES_WORKSHOURS();
    while (list($num, $table) = each($tables)) {
        $rows = $rows + $q->COUNT_ROWS($table);
        if ($GLOBALS["VERBOSE"]) {
            echo " Delete table {$table} {$rows} rows \n";
        }
        $count_tables++;
        $q->DELETE_TABLE($table);
    }
    $tables = $q->LIST_TABLES_BLOCKED_WEEK();
    while (list($num, $table) = each($tables)) {
        $rows = $rows + $q->COUNT_ROWS($table);
        if ($GLOBALS["VERBOSE"]) {
            echo " Delete table {$table} {$rows} rows \n";
        }
        $count_tables++;
        $q->DELETE_TABLE($table);
    }
    $tables = $q->LIST_TABLES_BLOCKED_DAY();
    while (list($num, $table) = each($tables)) {
        $rows = $rows + $q->COUNT_ROWS($table);
        if ($GLOBALS["VERBOSE"]) {
            echo " Delete table {$table} {$rows} rows \n";
        }
        $count_tables++;
        $q->DELETE_TABLE($table);
    }
    $tables = $q->LIST_TABLES_VISITED();
    while (list($num, $table) = each($tables)) {
        $rows = $rows + $q->COUNT_ROWS($table);
        if ($GLOBALS["VERBOSE"]) {
            echo " Delete table {$table} {$rows} rows \n";
        }
        $count_tables++;
        $q->DELETE_TABLE($table);
    }
    $tables = $q->LIST_TABLES_dansguardian_events();
    while (list($num, $table) = each($tables)) {
        $rows = $rows + $q->COUNT_ROWS($table);
        if ($GLOBALS["VERBOSE"]) {
            echo " Delete table {$table} {$rows} rows \n";
        }
        $count_tables++;
        $q->DELETE_TABLE($table);
    }
    $q = new mysql_catz();
    $tables = $q->LIST_TABLES_CATEGORIES();
    while (list($num, $table) = each($tables)) {
        $rows = $rows + $q->COUNT_ROWS($table);
        if ($GLOBALS["VERBOSE"]) {
            echo " Delete table {$table} {$rows} rows \n";
        }
        $count_tables++;
        $q->DELETE_TABLE($table);
    }
    $q = new mysql();
    if ($q->DATABASE_EXISTS("catz")) {
        $q->DELETE_DATABASE("catz");
    }
    if ($count_tables > 0) {
        mysql_admin_mysql(1, "Restarting MySQL service...", null, __FILE__, __LINE__);
        shell_exec("/etc/init.d/mysql restart");
    }
    $sock->TOP_NOTIFY("{$count_tables} statistics tables as been deleted with {$rows} rows", "info");
    //print_r($tables);
}
function macuid()
{
    $pidfile = "/etc/artica-postfix/pids/" . basename(__FILE__) . "." . __FUNCTION__ . ".pid";
    $timefile = "/etc/artica-postfix/pids/" . basename(__FILE__) . "." . __FUNCTION__ . ".time";
    $unix = new unix();
    $pid = @file_get_contents($pidfile);
    if ($unix->process_exists($pid, basename(__FILE__))) {
        if ($GLOBALS["VERBOSE"]) {
            echo "Already executed pid {$pid}\n";
        }
        return;
    }
    $mypid = getmypid();
    @file_put_contents($pidfile, $mypid);
    $q = new mysql_squid_builder();
    $sql = "SELECT * FROM webfilters_nodes WHERE LENGTH(uid)>1";
    $results = $q->QUERY_SQL($sql, "artica_backup");
    while ($ligne = mysql_fetch_assoc($results)) {
        if ($ligne["MAC"] == "00:00:00:00:00:00") {
            continue;
        }
        if (!IsPhysicalAddress($ligne["MAC"])) {
            continue;
        }
        if ($GLOBALS["VERBOSE"]) {
            echo "{$ligne["MAC"]} = {$ligne["uid"]}\n";
        }
        $array[$ligne["MAC"]] = $ligne["uid"];
    }
    $sql = "SELECT * FROM webfilters_ipaddr WHERE LENGTH(uid)>1";
    $results = $q->QUERY_SQL($sql, "artica_backup");
    while ($ligne = mysql_fetch_assoc($results)) {
        $array2[$ligne["ipaddr"]] = $ligne["uid"];
    }
    $tablesBrutes = $q->LIST_TABLES_HOURS();
    while (list($tablename, $none) = each($tablesBrutes)) {
        reset($array);
        while (list($mac, $uid) = each($array)) {
            $uid = mysql_escape_string2($uid);
            if ($GLOBALS["VERBOSE"]) {
                echo "{$tablename}, {$mac} -> {$uid}\n";
            }
            $q->QUERY_SQL("UPDATE {$tablename} SET uid='{$uid}' WHERE MAC='{$mac}'");
        }
        reset($array2);
        while (list($ipaddr, $uid) = each($array)) {
            $uid = mysql_escape_string2($uid);
            if ($GLOBALS["VERBOSE"]) {
                echo "{$tablename}, {$mac} -> {$uid}\n";
            }
            $q->QUERY_SQL("UPDATE {$tablename} SET uid='{$uid}' WHERE client='{$ipaddr}' AND LENGTH(uid)=0");
        }
    }
    $tablesBrutes = $q->LIST_TABLES_dansguardian_events();
    while (list($tablename, $none) = each($tablesBrutes)) {
        reset($array);
        while (list($mac, $uid) = each($array)) {
            $uid = mysql_escape_string2($uid);
            if ($GLOBALS["VERBOSE"]) {
                echo "{$tablename}, {$mac} -> {$uid}\n";
            }
            if (IsCompressed($tablename)) {
                Uncompress($tablename);
            }
            $q->QUERY_SQL("UPDATE {$tablename} SET uid='{$uid}' WHERE MAC='{$mac}'");
        }
        reset($array2);
        while (list($ipaddr, $uid) = each($array)) {
            $uid = mysql_escape_string2($uid);
            if ($GLOBALS["VERBOSE"]) {
                echo "{$tablename}, {$mac} -> {$uid}\n";
            }
            $q->QUERY_SQL("UPDATE {$tablename} SET uid='{$uid}' WHERE CLIENT='{$ipaddr}' AND LENGTH(uid)=0");
        }
    }
    $tablesBrutes = $q->LIST_TABLES_BLOCKED_DAY();
    while (list($tablename, $none) = each($tablesBrutes)) {
        reset($array);
        while (list($mac, $uid) = each($array)) {
            $uid = mysql_escape_string2($uid);
            if ($GLOBALS["VERBOSE"]) {
                echo "{$tablename}, {$mac} -> {$uid}\n";
            }
            if (IsCompressed($tablename)) {
                Uncompress($tablename);
            }
            $q->QUERY_SQL("UPDATE {$tablename} SET uid='{$uid}' WHERE MAC='{$mac}'");
        }
    }
    $tablesBrutes = $q->LIST_TABLES_BLOCKED_WEEK();
    while (list($tablename, $none) = each($tablesBrutes)) {
        reset($array);
        while (list($mac, $uid) = each($array)) {
            if ($GLOBALS["VERBOSE"]) {
                echo "{$tablename}, {$mac} -> {$uid}\n";
            }
            if (IsCompressed($tablename)) {
                Uncompress($tablename);
            }
            $q->QUERY_SQL("UPDATE {$tablename} SET uid='{$uid}' WHERE MAC='{$mac}'");
        }
    }
    $tablesBrutes = $q->LIST_TABLES_YOUTUBE_DAYS();
    while (list($tablename, $none) = each($tablesBrutes)) {
        reset($array);
        while (list($mac, $uid) = each($array)) {
            $uid = mysql_escape_string2($uid);
            if ($GLOBALS["VERBOSE"]) {
                echo "{$tablename}, {$mac} -> {$uid}\n";
            }
            if (IsCompressed($tablename)) {
                Uncompress($tablename);
            }
            $q->QUERY_SQL("UPDATE {$tablename} SET uid='{$uid}' WHERE MAC='{$mac}'");
        }
        reset($array2);
        while (list($ipaddr, $uid) = each($array)) {
            $uid = mysql_escape_string2($uid);
            if ($GLOBALS["VERBOSE"]) {
                echo "{$tablename}, {$mac} -> {$uid}\n";
            }
            $q->QUERY_SQL("UPDATE {$tablename} SET uid='{$uid}' WHERE ipaddr='{$ipaddr}' AND LENGTH(uid)=0");
        }
    }
    $tablesBrutes = $q->LIST_TABLES_YOUTUBE_WEEK();
    while (list($tablename, $none) = each($tablesBrutes)) {
        reset($array);
        while (list($mac, $uid) = each($array)) {
            $uid = mysql_escape_string2($uid);
            if ($GLOBALS["VERBOSE"]) {
                echo "{$tablename}, {$mac} -> {$uid}\n";
            }
            if (IsCompressed($tablename)) {
                Uncompress($tablename);
            }
            $q->QUERY_SQL("UPDATE {$tablename} SET uid='{$uid}' WHERE MAC='{$mac}'");
        }
        reset($array2);
        while (list($ipaddr, $uid) = each($array)) {
            $uid = mysql_escape_string2($uid);
            if ($GLOBALS["VERBOSE"]) {
                echo "{$tablename}, {$mac} -> {$uid}\n";
            }
            $q->QUERY_SQL("UPDATE {$tablename} SET uid='{$uid}' WHERE ipaddr='{$ipaddr}' AND LENGTH(uid)=0");
        }
    }
    uid_resets();
}
function start_export()
{
    $unix = new unix();
    $sock = new sockets();
    $q = new mysql_squid_builder();
    $ArticaProxyStatisticsBackupFolder = $sock->GET_INFO("ArticaProxyStatisticsBackupFolder");
    if ($ArticaProxyStatisticsBackupFolder == null) {
        $ArticaProxyStatisticsBackupFolder = "/home/artica/squid/backup-statistics";
    }
    $ArticaProxyStatisticsBackupFolder = $ArticaProxyStatisticsBackupFolder . "/export";
    $LIST_TABLES_YOUTUBE_HOURS = $q->LIST_TABLES_YOUTUBE_HOURS();
    $LIST_TABLES_SIZEHOURS = $q->LIST_TABLES_SIZEHOURS();
    $LIST_TABLES_QUOTA_HOURS = $q->LIST_TABLES_QUOTA_HOURS();
    $LIST_TABLES_QUOTADAY = $q->LIST_TABLES_QUOTADAY();
    $LIST_TABLES_QUOTAMONTH = $q->LIST_TABLES_QUOTAMONTH();
    $LIST_TABLES_SEARCHWORDS_HOURS = $q->LIST_TABLES_SEARCHWORDS_HOURS();
    $LIST_TABLES_SEARCHWORDS_DAY = $q->LIST_TABLES_SEARCHWORDS_DAY();
    $LIST_TABLES_dansguardian_events = $q->LIST_TABLES_dansguardian_events();
    $LIST_TABLES_HOURS = $q->LIST_TABLES_HOURS();
    $LIST_TABLES_USERSIZED = $q->LIST_TABLES_USERSIZED();
    $LIST_TABLES_YOUTUBE_WEEK = $q->LIST_TABLES_YOUTUBE_WEEK();
    $LIST_TABLES_WEEKS = $q->LIST_TABLES_WEEKS();
    $LIST_TABLES_MEMBERS = $q->LIST_TABLES_MEMBERS();
    $LIST_TABLES_GSIZE = $q->LIST_TABLES_GSIZE();
    $LIST_TABLES_GCACHE = $q->LIST_TABLES_GCACHE();
    $LIST_TABLES_VISITED = $q->LIST_TABLES_VISITED();
    $LIST_TABLES_BLOCKED = $q->LIST_TABLES_BLOCKED();
    $LIST_TABLES_BLOCKED_WEEK = $q->LIST_TABLES_BLOCKED_WEEK();
    $LIST_TABLES_BLOCKED_DAY = $q->LIST_TABLES_BLOCKED_DAY();
    $LIST_TABLES_WWWUID = $q->LIST_TABLES_WWWUID();
    $LIST_CAT_FAMDAY = $q->LIST_CAT_FAMDAY();
    while (list($tablename, $none) = each($LIST_TABLES_YOUTUBE_HOURS)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_SIZEHOURS)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_QUOTADAY)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_QUOTAMONTH)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_SEARCHWORDS_HOURS)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_SEARCHWORDS_DAY)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_QUOTA_HOURS)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_dansguardian_events)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_HOURS)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_USERSIZED)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_BLOCKED_WEEK)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_BLOCKED)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_YOUTUBE_WEEK)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_WEEKS)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_MEMBERS)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_GSIZE)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_GCACHE)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_VISITED)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_BLOCKED_DAY)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_CAT_FAMDAY)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($LIST_TABLES_WWWUID)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_SOURCES[$tablename] = true;
    }
    while (list($tablename, $none) = each($EXPORT_SOURCES)) {
        if (trim($tablename) == null) {
            continue;
        }
        $EXPORT_DESTINATIONS[] = $tablename;
    }
    @mkdir($ArticaProxyStatisticsBackupFolder, 0755, true);
    $target_file = $ArticaProxyStatisticsBackupFolder . "/" . time() . ".sql.gz";
    if (is_file($target_file)) {
        @unlink($target_file);
    }
    $EXPORT_DESTINATIONS[] = "visited_sites";
    $EXPORT_DESTINATIONS[] = "youtube_objects";
    $EXPORT_DESTINATIONS[] = "UserAgents";
    $EXPORT_DESTINATIONS[] = "UserAutDB";
    $EXPORT_DESTINATIONS[] = "UserAuthDays";
    $EXPORT_DESTINATIONS[] = "UserAuthDaysGrouped";
    $EXPORT_DESTINATIONS[] = "UserSizeRTT";
    $EXPORT_DESTINATIONS[] = "allsizes";
    $unix = new unix();
    $mysqldump = $unix->find_program("mysqldump");
    $bzip2 = $unix->find_program("bzip2");
    $bzip2_cmd = "| {$bzip2} ";
    $AllTables = @implode(" ", $EXPORT_DESTINATIONS);
    $cmd = "{$mysqldump} -S /var/run/mysqld/squid-db.sock --single-transaction --skip-add-drop-table --no-create-db --insert-ignore --skip-add-locks --skip-lock-tables squidlogs {$AllTables} {$bzip2_cmd}> {$target_file} 2>&1";
    $t = time();
    $failed = false;
    if ($GLOBALS["VERBOSE"]) {
        echo $cmd . "\n";
    }
    exec($cmd, $results);
    while (list($index, $line) = each($results)) {
        if (preg_match("#Couldn't#", $line)) {
            @unlink($target_file);
            stats_admin_events(0, "Exporting tables failed {$line} took:" . $unix->distanceOfTimeInWords($t, time()), null, __FILE__, __LINE__);
            return;
        }
        if (preg_match("#Error\\s+([0-9]+)#", $line)) {
            @unlink($target_file);
            stats_admin_events(0, "Exporting tables failed {$line} took:" . $unix->distanceOfTimeInWords($t, time()), null, __FILE__, __LINE__);
            return;
        }
        echo "{$line}\n";
    }
    $size = @filesize($target_file);
    if ($size < 10000) {
        @unlink($target_file);
        stats_admin_events(0, "Exporting tables failed {$size}Bytes < 10000bytes took:" . $unix->distanceOfTimeInWords($t, time()), null, __FILE__, __LINE__);
        return;
    }
    if ($GLOBALS["VERBOSE"]) {
        echo "{$target_file} {$size}Bytes " . FormatBytes($size / 1024) . "\n";
    }
    reset($EXPORT_SOURCES);
    while (list($tablename, $none) = each($EXPORT_SOURCES)) {
        $q->QUERY_SQL("DROP TABLE {$tablename}");
        if ($GLOBALS["VERBOSE"]) {
            echo "Removing table {$tablename}\n";
        }
    }
}
function build_report($ID, $nopid = false)
{
    if (!is_numeric($ID)) {
        ufdbguard_admin_events("Not a numeric ID", __FUNCTION__, __FILE__, __LINE__, "reports");
        return;
    }
    $t = time();
    $unix = new unix();
    $tablename = "WebTrackMem{$ID}";
    $tableBlock = "WebTrackMeB{$ID}";
    if (!$nopid) {
        $pidfile = "/etc/artica-postfix/pids/" . basename(__FILE__) . "." . __FUNCTION__ . ".{$ID}.pid";
        $pid = @file_get_contents($pidfile);
        if ($pid < 100) {
            $pid = null;
        }
        if ($unix->process_exists($pid, basename(__FILE__))) {
            ufdbguard_admin_events("Already executed pid {$pid}", __FUNCTION__, __FILE__, __LINE__, "reports");
            if ($GLOBALS["VERBOSE"]) {
                echo "Already executed pid {$pid}\n";
            }
            return;
        }
    }
    if ($GLOBALS["VERBOSE"]) {
        echo "Building report {$ID}\n";
    }
    $q = new mysql_squid_builder();
    if ($q->TABLE_EXISTS($tablename)) {
        $q->DELETE_TABLE($tablename);
    }
    if ($q->TABLE_EXISTS($tableBlock)) {
        $q->DELETE_TABLE($tableBlock);
    }
    if (!$q->CreateMemberReportTable($tablename)) {
        ufdbguard_admin_events("could not create table {$tablename}", __FUNCTION__, __FILE__, __LINE__, "reports");
        return;
    }
    if (!$q->CreateMemberReportBlockTable($tableBlock)) {
        ufdbguard_admin_events("could not create table {$tablename}", __FUNCTION__, __FILE__, __LINE__, "reports");
        return;
    }
    $rp = new squid_report($ID);
    $LIST_TABLES_dansguardian_events = $q->LIST_TABLES_dansguardian_events();
    progress(10, $ID);
    $counttables = count($LIST_TABLES_dansguardian_events);
    $prefix = "INSERT IGNORE INTO {$tablename} (`zMD5`,`sitename`,`familysite`,`{$rp->userfield}`,`zDate`,`size`,`hits`,`category`) VALUES ";
    while (list($sourcetable, $ligne) = each($LIST_TABLES_dansguardian_events)) {
        $c++;
        $sql = $rp->BuildQuery($sourcetable);
        $results = $q->QUERY_SQL($sql);
        if (!$q->ok) {
            ufdbguard_admin_events("{$q->mysql_error}\n{$sql}", __FUNCTION__, __FILE__, __LINE__, "reports");
            return;
        }
        if ($GLOBALS["VERBOSE"]) {
            echo "Parsing {$sourcetable} \n{$sql}\n-> `" . mysql_num_rows($results) . "` rows\n";
        }
        if (mysql_num_rows($results) == 0) {
            continue;
        }
        $purc = round($c / $counttables, 2) * 100;
        progress($purc, $ID);
        $f = array();
        while ($ligne = @mysql_fetch_array($results, MYSQL_ASSOC)) {
            $md5 = md5(serialize($ligne));
            $sitename = $ligne["sitename"];
            $familysite = $q->GetFamilySites($sitename);
            if (!isset($GLOBALS["CATEGORY"][$sitename])) {
                $GLOBALS["CATEGORY"][$sitename] = $q->GET_CATEGORIES($sitename);
            }
            $category = $GLOBALS["CATEGORY"][$sitename];
            $source = addslashes($ligne["source"]);
            $zDate = $ligne["zDate"];
            $size = $ligne["size"];
            $hits = $ligne["hits"];
            $category = addslashes($category);
            $f[] = "('{$md5}','{$sitename}','{$familysite}','{$source}','{$zDate}','{$size}','{$hits}','{$category}')";
        }
        if (count($f) == 0) {
            continue;
        }
        $q->QUERY_SQL($prefix . @implode(",", $f));
        if (!$q->ok) {
            ufdbguard_admin_events("{$q->mysql_error}", __FUNCTION__, __FILE__, __LINE__, "reports");
            return;
        }
        if (system_is_overloaded(__FILE__)) {
            sleep(5);
        }
    }
    if ($rp->csv == 1) {
        SaveCSV($ID);
    }
    $LIST_TABLES_BLOCKED = $q->LIST_TABLES_BLOCKED();
    $prefix = "INSERT IGNORE INTO {$tableBlock} (`zMD5`,`zDate`,`hits`,`website`,`category`,`rulename`,`event`,`why`,`explain`,`blocktype`,`{$rp->userfield}`) VALUES ";
    while (list($sourcetable, $ligne) = each($LIST_TABLES_BLOCKED)) {
        $c++;
        if ($GLOBALS["VERBOSE"]) {
            echo "Parsing {$sourcetable}\n";
        }
        $sql = $rp->BuildQueryBlock($sourcetable);
        if (!$q->FIELD_EXISTS("{$sourcetable}", "uid")) {
            $q->QUERY_SQL("ALTER TABLE `{$sourcetable}` ADD `uid` VARCHAR( 128 ) NOT NULL ,ADD INDEX ( `uid` )");
        }
        $results = $q->QUERY_SQL($sql);
        if (!$q->ok) {
            ufdbguard_admin_events("{$q->mysql_error}\n{$sql}", __FUNCTION__, __FILE__, __LINE__, "reports");
            return;
        }
        if (mysql_num_rows($results) == 0) {
            continue;
        }
        $purc = round($c / $counttables, 2) * 100;
        progress($purc, $ID);
        $f = array();
        while ($ligne = @mysql_fetch_array($results, MYSQL_ASSOC)) {
            $zMD5 = md5(serialize($ligne));
            $sitename = $ligne["sitename"];
            $category = $ligne["category"];
            if ($category == null) {
                if (!isset($GLOBALS["CATEGORY"][$sitename])) {
                    $GLOBALS["CATEGORY"][$sitename] = $q->GET_CATEGORIES($sitename);
                }
                $category = $GLOBALS["CATEGORY"][$sitename];
            }
            $source = addslashes($ligne["source"]);
            $zDate = $ligne["zDate"];
            $hits = $ligne["hits"];
            $rulename = $ligne["rulename"];
            $event = $ligne["event"];
            $why = $ligne["why"];
            $explain = $ligne["explain"];
            $blocktype = $ligne["blocktype"];
            $category = addslashes($category);
            $f[] = "('{$zMD5}','{$zDate}','{$hits}','{$sitename}','{$category}','{$rulename}','{$event}','{$why}','{$explain}','{$blocktype}','{$source}')";
        }
        if (system_is_overloaded(__FILE__)) {
            sleep(5);
        }
    }
    $myisamchk = $unix->find_program("myisamchk");
    $myisampack = $unix->find_program("myisampack");
    $mysql_data = $unix->MYSQL_DATA_DIR();
    echo "OPTIMIZE TABLE {$tableBlock}\n";
    $q->QUERY_SQL("OPTIMIZE TABLE {$tableBlock}");
    echo "OPTIMIZE TABLE {$tablename}\n";
    $q->QUERY_SQL("OPTIMIZE TABLE {$tablename}");
    echo "LOCK TABLE {$tablename}\n";
    $q->QUERY_SQL("LOCK TABLE {$tablename} WRITE");
    echo "LOCK TABLE {$tableBlock}\n";
    $q->QUERY_SQL("LOCK TABLE {$tableBlock} WRITE");
    $q->QUERY_SQL("FLUSH TABLE {$tableBlock}");
    $q->QUERY_SQL("FLUSH TABLE {$tablename}");
    echo "myisamchk {$tablename}\n";
    shell_exec("{$myisamchk} -cFU {$mysql_data}/squidlogs/{$tablename}.MYI");
    echo "myisamchk {$tableBlock}\n";
    shell_exec("{$myisamchk} -cFU {$mysql_data}/squidlogs/{$tableBlock}.MYI");
    echo "myisampack {$tablename}\n";
    shell_exec("{$myisampack} -f {$mysql_data}/squidlogs/{$tablename}.MYI");
    echo "myisampack {$tableBlock}\n";
    shell_exec("{$myisampack} -f {$mysql_data}/squidlogs/{$tableBlock}.MYI");
    $q->QUERY_SQL("FLUSH TABLE {$tablename}");
    $q->QUERY_SQL("FLUSH TABLE {$tableBlock}");
    $rp->set_duration($unix->distanceOfTimeInWords($t, time(), true));
    progress(100, $ID);
}
function clean_empty_tables()
{
    $unix = new unix();
    ///etc/artica-postfix/pids/exec.squid.stats.hours.php.clean_empty_tables.time
    $pidfile = "/etc/artica-postfix/pids/" . basename(__FILE__) . "." . __FUNCTION__ . ".pid";
    $timefile = "/etc/artica-postfix/pids/" . basename(__FILE__) . "." . __FUNCTION__ . ".time";
    if ($GLOBALS["VERBOSE"]) {
        echo "Time File: {$timefile}\n";
    }
    $pid = @file_get_contents($pidfile);
    if ($GLOBALS["FORCE"]) {
        ToSyslog("macscan(): Executed in --force mode");
    }
    if (!$GLOBALS["FORCE"]) {
        if ($pid < 100) {
            $pid = null;
        }
        $unix = new unix();
        if ($unix->process_exists($pid, basename(__FILE__))) {
            if ($GLOBALS["VERBOSE"]) {
                echo "Already executed pid {$pid}\n";
            }
            ToSyslog("clean_empty_tables(): already executed pid {$pid}");
            return;
        }
        $timeexec = $unix->file_time_min($timefile);
        if ($timeexec < 30) {
            return;
        }
        $mypid = getmypid();
        @file_put_contents($pidfile, $mypid);
    }
    @unlink($timefile);
    @file_put_contents($timefile, time());
    $q = new mysql_squid_builder();
    $TABLES = $q->LIST_TABLES_HOURS_TEMP();
    $current = "squidhour_" . date("YmdH");
    while (list($tablename, $none) = each($TABLES)) {
        if ($tablename == $current) {
            continue;
        }
        if ($q->COUNT_ROWS($tablename) > 0) {
            continue;
        }
        $q->QUERY_SQL("DROP TABLE `{$tablename}`");
    }
    $TABLES = $q->LIST_TABLES_SIZEHOURS();
    $current = "sizehour_" . date("YmdH");
    while (list($tablename, $none) = each($TABLES)) {
        if ($tablename == $current) {
            continue;
        }
        if ($q->COUNT_ROWS($tablename) > 0) {
            continue;
        }
        $q->QUERY_SQL("DROP TABLE `{$tablename}`");
    }
    $TABLES = $q->LIST_TABLES_dansguardian_events();
    $current = " dansguardian_events_" . date("Ymd");
    while (list($tablename, $none) = each($TABLES)) {
        if ($tablename == $current) {
            continue;
        }
        if ($q->COUNT_ROWS($tablename) > 0) {
            continue;
        }
        $q->QUERY_SQL("DROP TABLE `{$tablename}`");
    }
}