/** * Finds informations related to the user identifier. * * @param int $user_id * @param boolean $use_cache * @return array */ function getuserdata($user_id, $use_cache = false) { global $conf; // retrieve basic user data $query = ' SELECT '; $is_first = true; foreach ($conf['user_fields'] as $pwgfield => $dbfield) { if ($is_first) { $is_first = false; } else { $query .= ' , '; } $query .= $dbfield . ' AS ' . $pwgfield; } $query .= ' FROM ' . USERS_TABLE . ' WHERE ' . $conf['user_fields']['id'] . ' = \'' . $user_id . '\''; $row = pwg_db_fetch_assoc(pwg_query($query)); // retrieve additional user data ? if ($conf['external_authentification']) { $query = ' SELECT COUNT(1) AS counter FROM ' . USER_INFOS_TABLE . ' AS ui LEFT JOIN ' . USER_CACHE_TABLE . ' AS uc ON ui.user_id = uc.user_id LEFT JOIN ' . THEMES_TABLE . ' AS t ON t.id = ui.theme WHERE ui.user_id = ' . $user_id . ' GROUP BY ui.user_id ;'; list($counter) = pwg_db_fetch_row(pwg_query($query)); if ($counter != 1) { create_user_infos($user_id); } } // retrieve user info $query = ' SELECT ui.*, uc.*, t.name AS theme_name FROM ' . USER_INFOS_TABLE . ' AS ui LEFT JOIN ' . USER_CACHE_TABLE . ' AS uc ON ui.user_id = uc.user_id LEFT JOIN ' . THEMES_TABLE . ' AS t ON t.id = ui.theme WHERE ui.user_id = ' . $user_id . ' ;'; $result = pwg_query($query); $user_infos_row = pwg_db_fetch_assoc($result); // then merge basic + additional user data $userdata = array_merge($row, $user_infos_row); foreach ($userdata as &$value) { // If the field is true or false, the variable is transformed into a boolean value. if ($value == 'true') { $value = true; } elseif ($value == 'false') { $value = false; } } unset($value); if ($use_cache) { if (!isset($userdata['need_update']) or !is_bool($userdata['need_update']) or $userdata['need_update'] == true) { $userdata['cache_update_time'] = time(); // Set need update are done $userdata['need_update'] = false; $userdata['forbidden_categories'] = calculate_permissions($userdata['id'], $userdata['status']); /* now we build the list of forbidden images (this list does not contain images that are not in at least an authorized category)*/ $query = ' SELECT DISTINCT(id) FROM ' . IMAGES_TABLE . ' INNER JOIN ' . IMAGE_CATEGORY_TABLE . ' ON id=image_id WHERE category_id NOT IN (' . $userdata['forbidden_categories'] . ') AND level>' . $userdata['level']; $forbidden_ids = query2array($query, null, 'id'); if (empty($forbidden_ids)) { $forbidden_ids[] = 0; } $userdata['image_access_type'] = 'NOT IN'; //TODO maybe later $userdata['image_access_list'] = implode(',', $forbidden_ids); $query = ' SELECT COUNT(DISTINCT(image_id)) as total FROM ' . IMAGE_CATEGORY_TABLE . ' WHERE category_id NOT IN (' . $userdata['forbidden_categories'] . ') AND image_id ' . $userdata['image_access_type'] . ' (' . $userdata['image_access_list'] . ')'; list($userdata['nb_total_images']) = pwg_db_fetch_row(pwg_query($query)); // now we update user cache categories $user_cache_cats = get_computed_categories($userdata, null); if (!is_admin($userdata['status'])) { // for non admins we forbid categories with no image (feature 1053) $forbidden_ids = array(); foreach ($user_cache_cats as $cat) { if ($cat['count_images'] == 0) { $forbidden_ids[] = $cat['cat_id']; remove_computed_category($user_cache_cats, $cat); } } if (!empty($forbidden_ids)) { if (empty($userdata['forbidden_categories'])) { $userdata['forbidden_categories'] = implode(',', $forbidden_ids); } else { $userdata['forbidden_categories'] .= ',' . implode(',', $forbidden_ids); } } } // delete user cache $query = ' DELETE FROM ' . USER_CACHE_CATEGORIES_TABLE . ' WHERE user_id = ' . $userdata['id']; pwg_query($query); // Due to concurrency issues, we ask MySQL to ignore errors on // insert. This may happen when cache needs refresh and that Piwigo is // called "very simultaneously". mass_inserts(USER_CACHE_CATEGORIES_TABLE, array('user_id', 'cat_id', 'date_last', 'max_date_last', 'nb_images', 'count_images', 'nb_categories', 'count_categories'), $user_cache_cats, array('ignore' => true)); // update user cache $query = ' DELETE FROM ' . USER_CACHE_TABLE . ' WHERE user_id = ' . $userdata['id']; pwg_query($query); // for the same reason as user_cache_categories, we ignore error on // this insert $query = ' INSERT IGNORE INTO ' . USER_CACHE_TABLE . ' (user_id, need_update, cache_update_time, forbidden_categories, nb_total_images, last_photo_date, image_access_type, image_access_list) VALUES (' . $userdata['id'] . ',\'' . boolean_to_string($userdata['need_update']) . '\',' . $userdata['cache_update_time'] . ',\'' . $userdata['forbidden_categories'] . '\',' . $userdata['nb_total_images'] . ',' . (empty($userdata['last_photo_date']) ? 'NULL' : '\'' . $userdata['last_photo_date'] . '\'') . ',\'' . $userdata['image_access_type'] . '\',\'' . $userdata['image_access_list'] . '\')'; pwg_query($query); } } return $userdata; }
$filter['enabled'] = pwg_get_session_var('filter_enabled', false); } } else { $filter['enabled'] = false; } if ($filter['enabled']) { $filter_key = pwg_get_session_var('filter_check_key', array('user' => 0, 'recent_period' => -1, 'time' => 0, 'date' => '')); if (isset($filter['matches'])) { $filter['recent_period'] = $filter['matches'][1]; } else { $filter['recent_period'] = $filter_key['recent_period'] > 0 ? $filter_key['recent_period'] : $user['recent_period']; } if (!pwg_get_session_var('filter_enabled', false) or $filter_key['time'] <= $user['cache_update_time'] or $filter_key['user'] != $user['id'] or $filter_key['recent_period'] != $filter['recent_period'] or $filter_key['date'] != date('Ymd')) { // Need to compute dats $filter_key = array('user' => (int) $user['id'], 'recent_period' => (int) $filter['recent_period'], 'time' => time(), 'date' => date('Ymd')); $filter['categories'] = get_computed_categories($user, (int) $filter['recent_period']); $filter['visible_categories'] = implode(',', array_keys($filter['categories'])); if (empty($filter['visible_categories'])) { // Must be not empty $filter['visible_categories'] = -1; } $query = ' SELECT distinct image_id FROM ' . IMAGE_CATEGORY_TABLE . ' INNER JOIN ' . IMAGES_TABLE . ' ON image_id = id WHERE '; if (!empty($filter['visible_categories'])) { $query .= ' category_id IN (' . $filter['visible_categories'] . ') and'; } $query .= '