Code

- fix import/export regression test for anydbm for latest journal fix
[roundup.git] / roundup / backends / sessions_rdbms.py
index 7ee3bc131603860472ed62a7cfce1b8c4b96eff5..d607f477ce3c3585450cff0bc5f9b1a07f4a6400 100644 (file)
@@ -1,4 +1,4 @@
-#$Id: sessions_rdbms.py,v 1.1 2004-03-18 01:58:45 richard Exp $
+#$Id: sessions_rdbms.py,v 1.8 2008-08-18 05:04:01 richard Exp $
 """This module defines a very basic store that's used by the CGI interface
 to store session and one-time-key information.
 
@@ -21,6 +21,12 @@ class BasicDatabase:
     def clear(self):
         self.cursor.execute('delete from %ss'%self.name)
 
+    def exists(self, infoid):
+        n = self.name
+        self.cursor.execute('select count(*) from %ss where %s_key=%s'%(n,
+            n, self.db.arg), (infoid,))
+        return int(self.cursor.fetchone()[0])
+
     _marker = []
     def get(self, infoid, value, default=_marker):
         n = self.name
@@ -30,7 +36,7 @@ class BasicDatabase:
         if not res:
             if default != self._marker:
                 return default
-            raise KeyError, 'No such %s "%s"'%(self.name, infoid)
+            raise KeyError('No such %s "%s"'%(self.name, infoid))
         values = eval(res[0])
         return values.get(value, None)
 
@@ -40,7 +46,7 @@ class BasicDatabase:
             n, n, self.db.arg), (infoid,))
         res = self.cursor.fetchone()
         if not res:
-            raise KeyError, 'No such %s "%s"'%(self.name, infoid)
+            raise KeyError('No such %s "%s"'%(self.name, infoid))
         return eval(res[0])
 
     def set(self, infoid, **newvalues):
@@ -66,19 +72,29 @@ class BasicDatabase:
             args = (infoid, time.time(), repr(values))
         c.execute(sql, args)
 
+    def list(self):
+        c = self.cursor
+        n = self.name
+        c.execute('select %s_key from %ss'%(n, n))
+        return [res[0] for res in c.fetchall()]
+
     def destroy(self, infoid):
         self.cursor.execute('delete from %ss where %s_key=%s'%(self.name,
             self.name, self.db.arg), (infoid,))
 
     def updateTimestamp(self, infoid):
-        self.cursor.execute('update %ss set %s_time=%s where %s_key=%s'%(
-            self.name, self.name, self.db.arg, self.name, self.db.arg),
-            (time.time(), infoid))
-
-    def clean(self, now):
-        """Age sessions, remove when they haven't been used for a week.
-        """
-        old = now - 60*60*24*7
+        """ don't update every hit - once a minute should be OK """
+        now = time.time()
+        self.cursor.execute('''update %ss set %s_time=%s where %s_key=%s
+            and %s_time < %s'''%(self.name, self.name, self.db.arg,
+            self.name, self.db.arg, self.name, self.db.arg),
+            (now, infoid, now-60))
+
+    def clean(self):
+        ''' Remove session records that haven't been used for a week. '''
+        now = time.time()
+        week = 60*60*24*7
+        old = now - week
         self.cursor.execute('delete from %ss where %s_time < %s'%(self.name,
             self.name, self.db.arg), (old, ))
 
@@ -88,3 +104,4 @@ class Sessions(BasicDatabase):
 class OneTimeKeys(BasicDatabase):
     name = 'otk'
 
+# vim: set et sts=4 sw=4 :