function wppa_session_start()
{
    global $wpdb;
    global $wppa_session;
    if (is_array($wppa_session)) {
        return true;
    }
    // To prevent dup opens
    // If the session table does not yet exist on activation
    if (!wppa_table_exists(WPPA_SESSION)) {
        $wppa_session['id'] = '0';
        return false;
    }
    // Cleanup first
    $lifetime = 3600;
    // Sessions expire after one hour
    $savetime = 3600;
    // Save session data for 1 hour // 30 days
    $expire = time() - $lifetime;
    $wpdb->query($wpdb->prepare("UPDATE `" . WPPA_SESSION . "` SET `status` = 'expired' WHERE `timestamp` < %s", $expire));
    $purge = time() - $savetime;
    $wpdb->query($wpdb->prepare("DELETE FROM `" . WPPA_SESSION . "` WHERE `timestamp` < %s", $purge));
    // Is session already started?
    $session = $wpdb->get_row($wpdb->prepare("SELECT * FROM `" . WPPA_SESSION . "` WHERE `session` = %s AND `status` = 'valid' LIMIT 1", wppa_get_session_id()), ARRAY_A);
    $data = isset($session['data']) ? $session['data'] : false;
    if ($data === false) {
        $iret = false;
        $tries = '0';
        while (!$iret && $tries < '10') {
            $iret = wppa_create_session_entry(array());
            if (!$iret) {
                sleep(1);
                $tries++;
            }
        }
        if ($tries > '3' && $iret) {
            wppa_log('Debug', 'It took ' . $tries . ' retries to start session ' . $iret);
        }
        if (!$iret) {
            wppa_log('Error', 'Unable to create session.');
            return false;
        }
        $wppa_session['page'] = '1';
        $wppa_session['ajax'] = '0';
        $wppa_session['id'] = $wpdb->get_var($wpdb->prepare("SELECT `id` FROM `" . WPPA_SESSION . "` WHERE `session` = %s LIMIT 1", wppa_get_session_id()));
    } else {
        // Update counter
        $wpdb->query($wpdb->prepare("UPDATE `" . WPPA_SESSION . "` SET `count` = %s WHERE `id` = %s", $session['count'] + '1', $session['id']));
        $wppa_session = unserialize($data);
        $wppa_session['page'] = isset($wppa_session['page']) ? $wppa_session['page'] + '1' : '1';
        $wppa_session['id'] = $session['id'];
    }
    return true;
}
function wppa_session_start()
{
    global $wpdb;
    global $wppa_session;
    // If the session table does not yet exist on activation
    if (!wppa_table_exists(WPPA_SESSION)) {
        $wppa_session['id'] = '0';
        return false;
    }
    $lifetime = 3600;
    // Sessions expire after one hour
    $expire = time() - $lifetime;
    // Is session already started?
    $session = $wpdb->get_row($wpdb->prepare("SELECT * FROM `" . WPPA_SESSION . "` WHERE `session` = %s AND `status` = 'valid' LIMIT 1", wppa_get_session_id()), ARRAY_A);
    // Started but expired?
    if ($session) {
        if ($session['timestamp'] < $expire) {
            $wpdb->query($wpdb->prepare("UPDATE `" . WPPA_SESSION . "` SET `status` = 'expired' WHERE `id` = %s", $session['id']));
            $session = false;
        }
    }
    // Get data if valid session exists
    $data = $session ? $session['data'] : false;
    // No valid session exists, start new
    if ($data === false) {
        $iret = wppa_create_session_entry(array());
        if (!$iret) {
            // Failed, retry after 1 sec.
            sleep(1);
            $iret = wppa_create_session_entry(array());
            if (!$iret) {
                wppa_log('Err', 'Unable to create session for user ' . wppa_get_user());
                // Give up
                return false;
            } else {
                wppa_log('Obs', 'Session ' . $iret . ' created after 1 retry for user ' . wppa_get_user());
            }
        }
        $wppa_session = array();
        $wppa_session['page'] = '0';
        $wppa_session['ajax'] = '0';
        $wppa_session['id'] = $iret;
        $wppa_session['user'] = wppa_get_user();
    } else {
        $wpdb->query($wpdb->prepare("UPDATE `" . WPPA_SESSION . "` SET `count` = %s WHERE `id` = %s", $session['count'] + '1', $session['id']));
        $data_arr = unserialize($data);
        if (is_array($data_arr)) {
            $wppa_session = $data_arr;
        } else {
            $wppa_session = array();
        }
    }
    // Get info for root and sub search
    if (isset($_REQUEST['wppa-search-submit'])) {
        $wppa_session['rootbox'] = wppa_get_get('rootsearch') || wppa_get_post('rootsearch');
        $wppa_session['subbox'] = wppa_get_get('subsearch') || wppa_get_post('subsearch');
        if ($wppa_session['subbox']) {
            if (isset($wppa_session['use_searchstring'])) {
                $t = explode(',', $wppa_session['use_searchstring']);
                foreach (array_keys($t) as $idx) {
                    $t[$idx] .= ' ' . wppa_test_for_search('at_session_start');
                    $t[$idx] = trim($t[$idx]);
                    $v = explode(' ', $t[$idx]);
                    $t[$idx] = implode(' ', array_unique($v));
                }
                $wppa_session['use_searchstring'] = ' ' . implode(',', array_unique($t));
            } else {
                $wppa_session['use_searchstring'] = wppa_test_for_search('at_session_start');
            }
        } else {
            $wppa_session['use_searchstring'] = wppa_test_for_search('at_session_start');
        }
        if (isset($wppa_session['use_searchstring'])) {
            $wppa_session['use_searchstring'] = trim($wppa_session['use_searchstring'], ' ,');
            $wppa_session['display_searchstring'] = str_replace(',', ' &#8746 ', str_replace(' ', ' &#8745 ', $wppa_session['use_searchstring']));
        }
    }
    // Add missing defaults
    $defaults = array('has_searchbox' => false, 'rootbox' => false, 'search_root' => '', 'subbox' => false, 'use_searchstring' => '', 'display_searchstring' => '', 'supersearch' => '', 'superview' => 'thumbs', 'superalbum' => '0', 'page' => '0', 'ajax' => '0', 'user' => '', 'id' => '0', 'uris' => array(), 'isrobot' => false);
    $wppa_session = wp_parse_args($wppa_session, $defaults);
    ksort($wppa_session);
    $wppa_session['page']++;
    if (isset($_SERVER['REQUEST_URI'])) {
        $wppa_session['uris'][] = date_i18n("g:i") . ' ' . $_SERVER['REQUEST_URI'];
        if (stripos($_SERVER['REQUEST_URI'], '/robots.txt') !== false) {
            $wppa_session['isrobot'] = true;
        }
    }
    wppa_save_session();
    return true;
}
function wppa_session_start()
{
    global $wpdb;
    global $wppa_session;
    // If the session table does not yet exist on activation
    if (!wppa_table_exists(WPPA_SESSION)) {
        $wppa_session['id'] = '0';
        return false;
    }
    // Cleanup first
    $lifetime = 3600;
    // Sessions expire after one hour
    $savetime = 3600;
    // Save session data for 1 hour
    $expire = time() - $lifetime;
    $wpdb->query($wpdb->prepare("UPDATE `" . WPPA_SESSION . "` SET `status` = 'expired' WHERE `timestamp` < %s", $expire));
    $purge = time() - $savetime;
    $wpdb->query($wpdb->prepare("DELETE FROM `" . WPPA_SESSION . "` WHERE `timestamp` < %s", $purge));
    // Is session already started?
    $session = $wpdb->get_row($wpdb->prepare("SELECT * FROM `" . WPPA_SESSION . "` WHERE `session` = %s AND `status` = 'valid' LIMIT 1", wppa_get_session_id()), ARRAY_A);
    $data = $session ? $session['data'] : false;
    // Not started yet, setup session
    if ($data === false) {
        $iret = false;
        $tries = '0';
        while (!$iret && $tries < '10') {
            $iret = wppa_create_session_entry(array());
            if (!$iret) {
                sleep(1);
                $tries++;
            }
        }
        if ($tries > '3' && $iret) {
            wppa_log('Debug', 'It took ' . $tries . ' retries to start session ' . $iret);
        }
        if (!$iret) {
            wppa_log('Error', 'Unable to create session.');
            return false;
        }
        $wppa_session = array();
        $wppa_session['page'] = '0';
        $wppa_session['ajax'] = '0';
        $wppa_session['id'] = $wpdb->get_var($wpdb->prepare("SELECT `id` FROM `" . WPPA_SESSION . "` WHERE `session` = %s LIMIT 1", wppa_get_session_id()));
        $wppa_session['user'] = wppa_get_user();
    } else {
        $wpdb->query($wpdb->prepare("UPDATE `" . WPPA_SESSION . "` SET `count` = %s WHERE `id` = %s", $session['count'] + '1', $session['id']));
        $data_arr = unserialize($data);
        if (is_array($data_arr)) {
            $wppa_session = $data_arr;
        } else {
            $wppa_session = array();
        }
    }
    // Get info for root and sub search
    if (isset($_REQUEST['wppa-search-submit'])) {
        $wppa_session['rootbox'] = wppa_get_get('rootsearch') || wppa_get_post('rootsearch');
        $wppa_session['subbox'] = wppa_get_get('subsearch') || wppa_get_post('subsearch');
        if ($wppa_session['subbox']) {
            if (isset($wppa_session['use_searchstring'])) {
                $t = explode(',', $wppa_session['use_searchstring']);
                foreach (array_keys($t) as $idx) {
                    $t[$idx] .= ' ' . wppa_test_for_search('at_session_start');
                    $t[$idx] = trim($t[$idx]);
                    $v = explode(' ', $t[$idx]);
                    $t[$idx] = implode(' ', array_unique($v));
                }
                $wppa_session['use_searchstring'] = ' ' . implode(',', array_unique($t));
            } else {
                $wppa_session['use_searchstring'] = wppa_test_for_search('at_session_start');
            }
        } else {
            $wppa_session['use_searchstring'] = wppa_test_for_search('at_session_start');
        }
        if (isset($wppa_session['use_searchstring'])) {
            $wppa_session['use_searchstring'] = trim($wppa_session['use_searchstring'], ' ,');
            $wppa_session['display_searchstring'] = str_replace(',', ' &#8746 ', str_replace(' ', ' &#8745 ', $wppa_session['use_searchstring']));
        }
    }
    // Add missing defaults
    $defaults = array('has_searchbox' => false, 'rootbox' => false, 'search_root' => '', 'subbox' => false, 'use_searchstring' => '', 'display_searchstring' => '', 'supersearch' => '', 'superview' => 'thumbs', 'superalbum' => '0', 'page' => '0', 'ajax' => '0', 'user' => '', 'id' => $wpdb->get_var($wpdb->prepare("SELECT `id` FROM `" . WPPA_SESSION . "` WHERE `session` = %s LIMIT 1", wppa_get_session_id())));
    $wppa_session = wp_parse_args($wppa_session, $defaults);
    ksort($wppa_session);
    $wppa_session['page']++;
    wppa_save_session();
    return true;
}