Fix performance issue at session creation.
authorFlorent Bruneau <florent.bruneau@polytechnique.org>
Sat, 15 Nov 2008 20:00:57 +0000 (21:00 +0100)
committerFlorent Bruneau <florent.bruneau@polytechnique.org>
Sat, 15 Nov 2008 20:00:57 +0000 (21:00 +0100)
Signed-off-by: Florent Bruneau <florent.bruneau@polytechnique.org>
classes/xorgsession.php
core
upgrade/0.9.18/05_logger.sql [new file with mode: 0644]

index 534ed86..1ce6bf7 100644 (file)
@@ -197,25 +197,18 @@ class XorgSession extends PlSession
         $res  = XDB::query("SELECT  u.user_id AS uid, u.hruid, prenom, prenom_ini, nom, nom_ini, nom_usage, perms, promo, promo_sortie,
                                     matricule, password, FIND_IN_SET('femme', u.flags) AS femme,
                                     q.core_mail_fmt AS mail_fmt, UNIX_TIMESTAMP(q.banana_last) AS banana_last, q.watch_last, q.core_rss_hash,
-                                    FIND_IN_SET('watch', u.flags) AS watch_account, q.last_version, g.g_account_name IS NOT NULL AS googleapps
+                                    FIND_IN_SET('watch', u.flags) AS watch_account, q.last_version, g.g_account_name IS NOT NULL AS googleapps,
+                                    UNIX_TIMESTAMP(s.start) AS lastlogin, s.host
                               FROM  auth_user_md5   AS u
                         INNER JOIN  auth_user_quick AS q  USING(user_id)
                          LEFT JOIN  gapps_accounts  AS g  ON (u.user_id = g.l_userid AND g.g_status = 'active')
+                         LEFT JOIN  logger.last_sessions AS ls ON (ls.uid = u.user_id)
+                         LEFT JOIN  logger.sessions AS s  ON(s.id = ls.id)
                              WHERE  u.user_id = {?} AND u.perms IN('admin', 'user')", $uid);
         $sess = $res->fetchOneAssoc();
         $perms = $sess['perms'];
         unset($sess['perms']);
 
-        // Retrieves account usage information (last login, last host).
-        $res = XDB::query('SELECT  UNIX_TIMESTAMP(s.start) AS lastlogin, s.host
-                             FROM  logger.sessions AS s
-                            WHERE  s.uid = {?} AND s.suid = 0
-                         ORDER BY  s.start DESC
-                            LIMIT  1', $uid);
-        if ($res->numRows()) {
-            $sess = array_merge($sess, $res->fetchOneAssoc());
-        }
-
         // Loads the data into the real session.
         $_SESSION = array_merge($_SESSION, $sess);
 
diff --git a/core b/core
index 402a078..7f10bc6 160000 (submodule)
--- a/core
+++ b/core
@@ -1 +1 @@
-Subproject commit 402a0780f42b948525fbef6db2e3c1bfe59b883d
+Subproject commit 7f10bc6153e899a781fb1244c6681252b16887b2
diff --git a/upgrade/0.9.18/05_logger.sql b/upgrade/0.9.18/05_logger.sql
new file mode 100644 (file)
index 0000000..c948992
--- /dev/null
@@ -0,0 +1,17 @@
+use logger;
+
+create table last_sessions (
+  uid int(6) not null,
+  id int(6) not null,
+  primary key uid (uid)
+);
+
+insert into last_sessions
+     select s.uid AS uid, MAX(s.id) AS id
+       from logger.sessions as s
+      where s.suid = 0
+   GROUP BY s.uid;
+
+use x4dat;
+
+# vim:set syntax=mysql: